Merge remote-tracking branch 'temp/nyc-dev' into nyc-dev
diff --git a/InCallUI/proguard.flags b/InCallUI/proguard.flags
new file mode 100644
index 0000000..4e8310c
--- /dev/null
+++ b/InCallUI/proguard.flags
@@ -0,0 +1,14 @@
+-keep class com.android.incallui.widget.multiwaveview.* {
+ *;
+}
+
+# Keep names that are used only by animation framework.
+-keepclasseswithmembers class com.android.incallui.AnimationUtils$CrossFadeDrawable {
+ *** setCrossFadeAlpha(...);
+}
+
+# Any class or method annotated with NeededForTesting or NeededForReflection.
+-keepclassmembers class * {
+@com.android.contacts.common.test.NeededForTesting *;
+@com.android.incallui.NeededForReflection *;
+}
diff --git a/InCallUI/res/anim/activity_open_enter.xml b/InCallUI/res/anim/activity_open_enter.xml
new file mode 100644
index 0000000..303b9dd
--- /dev/null
+++ b/InCallUI/res/anim/activity_open_enter.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shareInterpolator="false"
+ android:zAdjustment="top">
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:interpolator="@anim/decelerate_cubic"
+ android:fillEnabled="true"
+ android:fillBefore="false" android:fillAfter="true"
+ android:duration="300"/>
+ <scale android:fromXScale=".8" android:toXScale="1.0"
+ android:fromYScale=".8" android:toYScale="1.0"
+ android:pivotX="50%p" android:pivotY="50%p"
+ android:interpolator="@anim/decelerate_cubic"
+ android:fillEnabled="true"
+ android:fillBefore="false" android:fillAfter="true"
+ android:duration="300"/>
+</set>
\ No newline at end of file
diff --git a/InCallUI/res/anim/activity_open_exit.xml b/InCallUI/res/anim/activity_open_exit.xml
new file mode 100644
index 0000000..afa7c5e
--- /dev/null
+++ b/InCallUI/res/anim/activity_open_exit.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, 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.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:background="#ff000000" android:zAdjustment="normal">
+ <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
+ android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
+ android:interpolator="@anim/decelerate_quint"
+ android:duration="300"/>
+</set>
\ No newline at end of file
diff --git a/InCallUI/res/anim/call_status_pulse.xml b/InCallUI/res/anim/call_status_pulse.xml
new file mode 100644
index 0000000..abda25b
--- /dev/null
+++ b/InCallUI/res/anim/call_status_pulse.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+ android:fromAlpha="0.5"
+ android:toAlpha="1"
+ android:duration="600"
+ android:repeatCount="infinite"
+ android:repeatMode="reverse" />
diff --git a/InCallUI/res/anim/decelerate_cubic.xml b/InCallUI/res/anim/decelerate_cubic.xml
new file mode 100644
index 0000000..f988091
--- /dev/null
+++ b/InCallUI/res/anim/decelerate_cubic.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, 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.
+*/
+-->
+
+<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:factor="1.5" />
diff --git a/InCallUI/res/anim/decelerate_quint.xml b/InCallUI/res/anim/decelerate_quint.xml
new file mode 100644
index 0000000..ff2d5a9
--- /dev/null
+++ b/InCallUI/res/anim/decelerate_quint.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, 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.
+*/
+-->
+
+<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:factor="2.5" />
diff --git a/InCallUI/res/color/ota_title_color.xml b/InCallUI/res/color/ota_title_color.xml
new file mode 100644
index 0000000..14a283a
--- /dev/null
+++ b/InCallUI/res/color/ota_title_color.xml
@@ -0,0 +1,21 @@
+<?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
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#FFA6C839"/>
+</selector>
+
diff --git a/InCallUI/res/color/selectable_icon_tint.xml b/InCallUI/res/color/selectable_icon_tint.xml
new file mode 100644
index 0000000..b8aad13
--- /dev/null
+++ b/InCallUI/res/color/selectable_icon_tint.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@color/button_disabled_color" android:state_enabled="false" />
+ <item android:color="@color/incall_accent_color" android:state_selected="true" />
+ <item android:color="@color/incall_accent_color" android:state_pressed="true" />
+ <item android:color="@color/button_default_color" />
+</selector>
+
diff --git a/InCallUI/res/drawable-hdpi/fab_blue.png b/InCallUI/res/drawable-hdpi/fab_blue.png
new file mode 100644
index 0000000..8ff3d29
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_ic_call.png b/InCallUI/res/drawable-hdpi/fab_ic_call.png
new file mode 100644
index 0000000..548a391
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_ic_end_call.png b/InCallUI/res/drawable-hdpi/fab_ic_end_call.png
new file mode 100644
index 0000000..b7f54d3
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_ic_message.png b/InCallUI/res/drawable-hdpi/fab_ic_message.png
new file mode 100644
index 0000000..a1cf2ad
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_red.png b/InCallUI/res/drawable-hdpi/fab_red.png
new file mode 100644
index 0000000..497cc79
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png
new file mode 100644
index 0000000..d10ebb7
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.png
new file mode 100644
index 0000000..757d339
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.png
new file mode 100644
index 0000000..4e3dbf5
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_call_white_24dp.png
new file mode 100644
index 0000000..1902e72
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_forward_white_24dp.png
new file mode 100644
index 0000000..a0711d3
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_hd_24dp.png b/InCallUI/res/drawable-hdpi/ic_hd_24dp.png
new file mode 100644
index 0000000..35bf51a
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png
new file mode 100644
index 0000000..7c281c3
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 0000000..983c45e
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 0000000..a2177f5
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.png
new file mode 100644
index 0000000..f3581d1
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-hdpi/ic_toolbar_add_call.png
new file mode 100644
index 0000000..06603f2
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 0000000..ea02daa
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 0000000..05e19bc
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 0000000..413fdff
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 0000000..90ee1fb
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.png
new file mode 100644
index 0000000..69ece11
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-hdpi/ic_toolbar_hold.png
new file mode 100644
index 0000000..f32d6d5
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-hdpi/ic_toolbar_merge.png
new file mode 100644
index 0000000..2871555
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.png
new file mode 100644
index 0000000..b142ca8
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 0000000..c934b13
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-hdpi/ic_toolbar_swap.png
new file mode 100644
index 0000000..e673f32
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_video.png b/InCallUI/res/drawable-hdpi/ic_toolbar_video.png
new file mode 100644
index 0000000..cef47aa
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-hdpi/ic_toolbar_video_off.png
new file mode 100644
index 0000000..968ded7
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.png
new file mode 100644
index 0000000..cdd623d
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_business.png b/InCallUI/res/drawable-hdpi/img_business.png
new file mode 100644
index 0000000..f706342
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_conference.png b/InCallUI/res/drawable-hdpi/img_conference.png
new file mode 100644
index 0000000..3d9f683
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_no_image.png b/InCallUI/res/drawable-hdpi/img_no_image.png
new file mode 100644
index 0000000..fd0ab32
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_phone.png b/InCallUI/res/drawable-hdpi/img_phone.png
new file mode 100644
index 0000000..748312e
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-land/rounded_call_card_background.xml b/InCallUI/res/drawable-land/rounded_call_card_background.xml
new file mode 100644
index 0000000..f41ecda
--- /dev/null
+++ b/InCallUI/res/drawable-land/rounded_call_card_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ 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
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/incall_call_banner_background_color" />
+ <corners
+ android:radius="4dp" />
+</shape>
\ No newline at end of file
diff --git a/InCallUI/res/drawable-mdpi/fab_blue.png b/InCallUI/res/drawable-mdpi/fab_blue.png
new file mode 100644
index 0000000..2ca6b4b
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_ic_call.png b/InCallUI/res/drawable-mdpi/fab_ic_call.png
new file mode 100644
index 0000000..ff7b345
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_ic_end_call.png b/InCallUI/res/drawable-mdpi/fab_ic_end_call.png
new file mode 100644
index 0000000..76ce397
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_ic_message.png b/InCallUI/res/drawable-mdpi/fab_ic_message.png
new file mode 100644
index 0000000..74876fe
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_red.png b/InCallUI/res/drawable-mdpi/fab_red.png
new file mode 100644
index 0000000..c9e76a0
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png
new file mode 100644
index 0000000..7b9227c
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.png
new file mode 100644
index 0000000..17eb482
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.png
new file mode 100644
index 0000000..cb7ee1f
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_call_white_24dp.png
new file mode 100644
index 0000000..d4e5f5d
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_forward_white_24dp.png
new file mode 100644
index 0000000..65f7329
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_hd_24dp.png b/InCallUI/res/drawable-mdpi/ic_hd_24dp.png
new file mode 100644
index 0000000..30938fe
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png
new file mode 100644
index 0000000..933eb51
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 0000000..056c3f1
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 0000000..7dc920b
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.png
new file mode 100644
index 0000000..501ee84
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-mdpi/ic_toolbar_add_call.png
new file mode 100644
index 0000000..1ee2fb1
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 0000000..c39990d
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 0000000..a6634ed
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 0000000..b387e85
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 0000000..b4d887c
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.png
new file mode 100644
index 0000000..9baa21b
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-mdpi/ic_toolbar_hold.png
new file mode 100644
index 0000000..c837273
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-mdpi/ic_toolbar_merge.png
new file mode 100644
index 0000000..2fba865
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.png
new file mode 100644
index 0000000..c6b02b8
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 0000000..008e245
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-mdpi/ic_toolbar_swap.png
new file mode 100644
index 0000000..acc9850
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_video.png b/InCallUI/res/drawable-mdpi/ic_toolbar_video.png
new file mode 100644
index 0000000..3f13f9c
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-mdpi/ic_toolbar_video_off.png
new file mode 100644
index 0000000..64a69f2
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.png
new file mode 100644
index 0000000..6d097c9
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_business.png b/InCallUI/res/drawable-mdpi/img_business.png
new file mode 100644
index 0000000..90738a7
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_conference.png b/InCallUI/res/drawable-mdpi/img_conference.png
new file mode 100644
index 0000000..0694dbd
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_no_image.png b/InCallUI/res/drawable-mdpi/img_no_image.png
new file mode 100644
index 0000000..014a1c4
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_phone.png b/InCallUI/res/drawable-mdpi/img_phone.png
new file mode 100644
index 0000000..41a1d33
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_blue.png b/InCallUI/res/drawable-xhdpi/fab_blue.png
new file mode 100644
index 0000000..300b07e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_ic_call.png b/InCallUI/res/drawable-xhdpi/fab_ic_call.png
new file mode 100644
index 0000000..2bff65e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_ic_end_call.png b/InCallUI/res/drawable-xhdpi/fab_ic_end_call.png
new file mode 100644
index 0000000..1c95e17
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_ic_message.png b/InCallUI/res/drawable-xhdpi/fab_ic_message.png
new file mode 100644
index 0000000..5e3334a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_red.png b/InCallUI/res/drawable-xhdpi/fab_red.png
new file mode 100644
index 0000000..373e49e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png
new file mode 100644
index 0000000..e563045
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.png
new file mode 100644
index 0000000..b00d82e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.png
new file mode 100644
index 0000000..218cb12
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_call_white_24dp.png
new file mode 100644
index 0000000..cde9cea
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.png
new file mode 100644
index 0000000..7a5df52
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_hd_24dp.png b/InCallUI/res/drawable-xhdpi/ic_hd_24dp.png
new file mode 100644
index 0000000..4c954d8
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 0000000..814ca8d
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 0000000..cbd039a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 0000000..a8becf4
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.png
new file mode 100644
index 0000000..2e27936
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.png
new file mode 100644
index 0000000..b251d6b
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 0000000..cdaa79d
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 0000000..88f6bb9
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 0000000..1acfcaf
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 0000000..0ba8f1e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.png
new file mode 100644
index 0000000..cf803d1
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_hold.png
new file mode 100644
index 0000000..8fecf75
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_merge.png
new file mode 100644
index 0000000..777483e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.png
new file mode 100644
index 0000000..cf2041a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 0000000..5b5831c
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_swap.png
new file mode 100644
index 0000000..38917cb
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_video.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_video.png
new file mode 100644
index 0000000..b20f504
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.png
new file mode 100644
index 0000000..1b269a6
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.png
new file mode 100644
index 0000000..fae6bfd
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_business.png b/InCallUI/res/drawable-xhdpi/img_business.png
new file mode 100644
index 0000000..7b04d95
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_conference.png b/InCallUI/res/drawable-xhdpi/img_conference.png
new file mode 100644
index 0000000..b0dbcc2
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_no_image.png b/InCallUI/res/drawable-xhdpi/img_no_image.png
new file mode 100644
index 0000000..4022207
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_phone.png b/InCallUI/res/drawable-xhdpi/img_phone.png
new file mode 100644
index 0000000..2e0ceec
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_blue.png b/InCallUI/res/drawable-xxhdpi/fab_blue.png
new file mode 100644
index 0000000..76d68ac
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_ic_call.png b/InCallUI/res/drawable-xxhdpi/fab_ic_call.png
new file mode 100644
index 0000000..a756b95
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_ic_end_call.png b/InCallUI/res/drawable-xxhdpi/fab_ic_end_call.png
new file mode 100644
index 0000000..37e8264
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_ic_message.png b/InCallUI/res/drawable-xxhdpi/fab_ic_message.png
new file mode 100644
index 0000000..66984b1
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_red.png b/InCallUI/res/drawable-xxhdpi/fab_red.png
new file mode 100644
index 0000000..92eb979
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png
new file mode 100644
index 0000000..7dfc8dc
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.png
new file mode 100644
index 0000000..aeabe4a
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.png
new file mode 100644
index 0000000..5ea5777
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.png
new file mode 100644
index 0000000..b761bc4
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.png
new file mode 100644
index 0000000..7bd5b16
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_hd_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_hd_24dp.png
new file mode 100644
index 0000000..dd08bbb
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 0000000..078b10d
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 0000000..c0edd91
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 0000000..baf0cf2
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.png
new file mode 100644
index 0000000..bfc7273
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.png
new file mode 100644
index 0000000..6e343c7
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 0000000..7377040
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 0000000..b8a385d
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 0000000..62d0ae3
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 0000000..0e88501
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.png
new file mode 100644
index 0000000..a754f68
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.png
new file mode 100644
index 0000000..f3757a8
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.png
new file mode 100644
index 0000000..5d04600
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.png
new file mode 100644
index 0000000..ae41d5c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 0000000..d1bbb09
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.png
new file mode 100644
index 0000000..ea9127e
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_video.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video.png
new file mode 100644
index 0000000..5c52dd6
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.png
new file mode 100644
index 0000000..898b7c0
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.png
new file mode 100644
index 0000000..4380a47
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_business.png b/InCallUI/res/drawable-xxhdpi/img_business.png
new file mode 100644
index 0000000..c17e4c9
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_conference.png b/InCallUI/res/drawable-xxhdpi/img_conference.png
new file mode 100644
index 0000000..a8dba5e
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_no_image.png b/InCallUI/res/drawable-xxhdpi/img_no_image.png
new file mode 100644
index 0000000..2cf7f23
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_phone.png b/InCallUI/res/drawable-xxhdpi/img_phone.png
new file mode 100644
index 0000000..4eaaba5
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_blue.png b/InCallUI/res/drawable-xxxhdpi/fab_blue.png
new file mode 100644
index 0000000..1dd8a92
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_ic_call.png b/InCallUI/res/drawable-xxxhdpi/fab_ic_call.png
new file mode 100644
index 0000000..7af3396
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.png b/InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.png
new file mode 100644
index 0000000..aabdade
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_ic_message.png b/InCallUI/res/drawable-xxxhdpi/fab_ic_message.png
new file mode 100644
index 0000000..c5a108a
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_red.png b/InCallUI/res/drawable-xxxhdpi/fab_red.png
new file mode 100644
index 0000000..f1b36f7
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png
new file mode 100644
index 0000000..c9aea72
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.png
new file mode 100644
index 0000000..a6e8a7b
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.png
new file mode 100644
index 0000000..600cec8
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.png
new file mode 100644
index 0000000..428009c
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.png
new file mode 100644
index 0000000..3f87b88
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 0000000..8bcb6f6
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.png
new file mode 100644
index 0000000..b94f4df
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.png
new file mode 100644
index 0000000..c97e4bb
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 0000000..1c11c5d
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 0000000..f7fa12c
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 0000000..8199701
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 0000000..ee14ea6
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.png
new file mode 100644
index 0000000..e537112
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.png
new file mode 100644
index 0000000..883d0d6
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.png
new file mode 100644
index 0000000..4b64375
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.png
new file mode 100644
index 0000000..2d8f279
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 0000000..0560bb2
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.png
new file mode 100644
index 0000000..6f03b3f
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.png
new file mode 100644
index 0000000..0797fd0
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.png
new file mode 100644
index 0000000..63f742b
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.png
new file mode 100644
index 0000000..77ff73c
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_business.png b/InCallUI/res/drawable-xxxhdpi/img_business.png
new file mode 100644
index 0000000..88f14e9
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_conference.png b/InCallUI/res/drawable-xxxhdpi/img_conference.png
new file mode 100644
index 0000000..eb42b55
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_no_image.png b/InCallUI/res/drawable-xxxhdpi/img_no_image.png
new file mode 100644
index 0000000..2165742
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_phone.png b/InCallUI/res/drawable-xxxhdpi/img_phone.png
new file mode 100644
index 0000000..7cbfbd7
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable/btn_add.xml b/InCallUI/res/drawable/btn_add.xml
new file mode 100644
index 0000000..7d5e90f
--- /dev/null
+++ b/InCallUI/res/drawable/btn_add.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_add_call"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_background.xml b/InCallUI/res/drawable/btn_background.xml
new file mode 100644
index 0000000..5978858
--- /dev/null
+++ b/InCallUI/res/drawable/btn_background.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Background resource for "compound buttons" in the in-call UI.
+ These buttons have two states (checked and unchecked), and
+ show a blue bar along the bottom edge when checked. -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/incall_accent_color">
+ <item>
+ <selector>
+
+ <item android:state_focused="true"
+ android:drawable="@drawable/btn_unselected_focused" />
+
+ <item android:drawable="@drawable/btn_unselected" />
+
+ </selector>
+ </item>
+</ripple>
diff --git a/InCallUI/res/drawable/btn_change_to_video.xml b/InCallUI/res/drawable/btn_change_to_video.xml
new file mode 100644
index 0000000..a26cee3
--- /dev/null
+++ b/InCallUI/res/drawable/btn_change_to_video.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_video"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_change_to_voice.xml b/InCallUI/res/drawable/btn_change_to_voice.xml
new file mode 100644
index 0000000..86a7f21
--- /dev/null
+++ b/InCallUI/res/drawable/btn_change_to_voice.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_audio_phone"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_compound_audio.xml b/InCallUI/res/drawable/btn_compound_audio.xml
new file mode 100644
index 0000000..25a64a6
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_audio.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Layers used to render the in-call "Audio mode" compound button.
+
+ This is a multi-mode button:
+
+ - If no bluetooth headset is connected, it behaves like a simple
+ "compound button" that switches the speaker on and off. (This is why
+ the button itself is a ToggleButton instance.)
+
+ - But if a bluetooth headset is connected, this becomes a simple
+ action button (with no concept of a "checked" state) that brings
+ up a popup menu offering you a 3-way choice between earpiece /
+ speaker / bluetooth.
+
+ See InCallTouchUi.updateAudioButton() for the corresponding code. -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background, used to distinguish
+ between the "checked" and "unchecked" states when this button is
+ simply an on/off toggle for the speaker.
+ (In states where the audio button *not* a toggle, we explicitly
+ hide this layer.) -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- The little triangle that indicates that this isn't a plain
+ button, but will instead pop up a menu. This layer is *not*
+ shown when the audio button is simply an on/off toggle. -->
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full
+ size of the button. -->
+ <item android:id="@+id/moreIndicatorItem">
+ <bitmap android:src="@drawable/ic_toolbar_arrow_whitespace"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+ <!-- Finally, the button icon.
+
+ When the audio button is simply an on/off toggle for the speaker,
+ the icon is a "speakerphone" regardless of whether the speaker is
+ active. (Instead, the "on/off" indication comes from the
+ btn_compound_background selector.)
+
+ But when the audio button is connected to the 3-way popup menu,
+ we use the button's icon to indicate the current audio mode
+ (i.e. one of { earpiece (or wired headset) , speaker , bluetooth }).
+
+ Here we have separate layers for each possible foreground icon,
+ and in InCallTouchUi.updateAudioButton() we hide them all
+ *except* the one needed for the current state. -->
+
+ <!-- These all use an explicit <bitmap> to avoid scaling the icon up
+ to the full size of the button. -->
+
+ <!-- Bluetooth is active -->
+ <item android:id="@+id/bluetoothItem">
+ <bitmap android:src="@drawable/ic_toolbar_audio_bluetooth"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+
+ <!-- Handset earpiece is active -->
+ <item android:id="@+id/handsetItem">
+ <bitmap android:src="@drawable/ic_toolbar_audio_phone"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+ <!-- Speakerphone icon showing 'speaker on' state -->
+ <item android:id="@+id/speakerphoneItem">
+ <bitmap android:src="@drawable/ic_toolbar_speaker_on"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_background.xml b/InCallUI/res/drawable/btn_compound_background.xml
new file mode 100644
index 0000000..20e2a30
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_background.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Background resource for "compound buttons" in the in-call UI.
+ These buttons have two states (selected and unselected). -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/incall_accent_color">
+ <item>
+ <selector>
+ <item android:state_selected="true" android:state_focused="true"
+ android:drawable="@drawable/btn_selected_focused" />
+
+ <item android:state_focused="true"
+ android:drawable="@drawable/btn_unselected_focused" />
+
+ <item android:state_selected="true"
+ android:drawable="@drawable/btn_selected" />
+
+ <item android:drawable="@drawable/btn_unselected" />
+ </selector>
+ </item>
+</ripple>
diff --git a/InCallUI/res/drawable/btn_compound_dialpad.xml b/InCallUI/res/drawable/btn_compound_dialpad.xml
new file mode 100644
index 0000000..1b78ead
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_dialpad.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Layers used to render the in-call "Dialpad" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- ...and the actual icon on top. Use an explicit <bitmap> to avoid scaling
+ the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_dialpad"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_hold.xml b/InCallUI/res/drawable/btn_compound_hold.xml
new file mode 100644
index 0000000..7974efa
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_hold.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Layers used to render the in-call "Hold" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- ...and the actual icon on top. Use an explicit <bitmap> to avoid scaling
+ the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_hold"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_mute.xml b/InCallUI/res/drawable/btn_compound_mute.xml
new file mode 100644
index 0000000..86708fb
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_mute.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Layers used to render the in-call "Mute" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_mic_off"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_video_off.xml b/InCallUI/res/drawable/btn_compound_video_off.xml
new file mode 100644
index 0000000..b942cd0
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_video_off.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Layers used to render the in-call "Mute" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_video_off"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_video_switch.xml b/InCallUI/res/drawable/btn_compound_video_switch.xml
new file mode 100644
index 0000000..f811186
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_video_switch.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Layers used to render the in-call "Mute" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_video_switch"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_merge.xml b/InCallUI/res/drawable/btn_merge.xml
new file mode 100644
index 0000000..2b4818a
--- /dev/null
+++ b/InCallUI/res/drawable/btn_merge.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_merge"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_overflow.xml b/InCallUI/res/drawable/btn_overflow.xml
new file mode 100644
index 0000000..2eb26cc
--- /dev/null
+++ b/InCallUI/res/drawable/btn_overflow.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_overflow_menu"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_selected.xml b/InCallUI/res/drawable/btn_selected.xml
new file mode 100644
index 0000000..1446e41
--- /dev/null
+++ b/InCallUI/res/drawable/btn_selected.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item>
+ <shape android:shape="oval">
+ <solid android:color="@color/button_selected_color" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_selected_focused.xml b/InCallUI/res/drawable/btn_selected_focused.xml
new file mode 100644
index 0000000..2eda9bf
--- /dev/null
+++ b/InCallUI/res/drawable/btn_selected_focused.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/btn_selected" />
+
+ <item>
+ <shape android:shape="oval" >
+ <stroke
+ android:width="4dp"
+ android:color="@color/focus_color" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_swap.xml b/InCallUI/res/drawable/btn_swap.xml
new file mode 100644
index 0000000..5d6c8ec
--- /dev/null
+++ b/InCallUI/res/drawable/btn_swap.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_swap"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_unselected.xml b/InCallUI/res/drawable/btn_unselected.xml
new file mode 100644
index 0000000..aed995c
--- /dev/null
+++ b/InCallUI/res/drawable/btn_unselected.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item>
+ <shape android:shape="oval">
+ <solid android:color="@color/incall_background_color" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_unselected_focused.xml b/InCallUI/res/drawable/btn_unselected_focused.xml
new file mode 100644
index 0000000..66075d4
--- /dev/null
+++ b/InCallUI/res/drawable/btn_unselected_focused.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/btn_unselected" />
+ <item>
+ <shape android:shape="oval" >
+ <stroke
+ android:width="4dp"
+ android:color="@color/focus_color" />
+ </shape>
+ </item>
+</layer-list>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/conference_ripple.xml b/InCallUI/res/drawable/conference_ripple.xml
new file mode 100644
index 0000000..4e4a213
--- /dev/null
+++ b/InCallUI/res/drawable/conference_ripple.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/ripple_light">
+ <!-- Constrain the ripple to a rectangular area -->
+ <item>
+ <shape android:shape="rectangle">
+ <solid android:color="@color/background_dialer_white" />
+ </shape>
+ </item>
+</ripple>
\ No newline at end of file
diff --git a/InCallUI/res/drawable/end_call_background.xml b/InCallUI/res/drawable/end_call_background.xml
new file mode 100644
index 0000000..c43deac
--- /dev/null
+++ b/InCallUI/res/drawable/end_call_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Background drawable used to render the "end call" button. -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/end_call_touch_feedback_tint">
+ <item android:id="@android:id/mask">
+ <shape android:shape="oval">
+ <solid android:color="@android:color/white" />
+ </shape>
+ </item>
+</ripple>
diff --git a/InCallUI/res/drawable/ic_incall_audio_handle.xml b/InCallUI/res/drawable/ic_incall_audio_handle.xml
new file mode 100644
index 0000000..2e71a5b
--- /dev/null
+++ b/InCallUI/res/drawable/ic_incall_audio_handle.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<!-- Touch handle for the GlowPadView widget on the incoming call screen -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Audio call icon on tinted floating action bar background. -->
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="false">
+ <layer-list>
+ <item>
+ <bitmap
+ android:src="@drawable/fab_blue"
+ android:tint="@color/glowpad_incoming_widget_background_tint" />
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_call"
+ android:tint="@color/glowpad_incoming_widget_tint" />
+ </item>
+ </layer-list>
+ </item>
+
+</selector>
diff --git a/InCallUI/res/drawable/ic_incall_video_handle.xml b/InCallUI/res/drawable/ic_incall_video_handle.xml
new file mode 100644
index 0000000..a24e305
--- /dev/null
+++ b/InCallUI/res/drawable/ic_incall_video_handle.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Touch handle for the GlowPadView widget on the incoming call screen -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Video call icon on tinted floating action bar background. -->
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="false">
+ <layer-list>
+ <item>
+ <bitmap
+ android:src="@drawable/fab_blue"
+ android:tint="@color/glowpad_incoming_widget_background_tint" />
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_videocam"
+ android:tint="@color/glowpad_incoming_widget_tint" />
+ </item>
+ </layer-list>
+ </item>
+
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer.xml b/InCallUI/res/drawable/ic_lockscreen_answer.xml
new file mode 100644
index 0000000..3184111
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml
new file mode 100644
index 0000000..f22b87e
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_green"/>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_call"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml
new file mode 100644
index 0000000..31b884f
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_call"
+ android:tint="@color/glowpad_call_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_video.xml b/InCallUI/res/drawable/ic_lockscreen_answer_video.xml
new file mode 100644
index 0000000..0557797
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_video.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_video_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_video_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_video_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml
new file mode 100644
index 0000000..7895e1b
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_blue" />
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_videocam"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml
new file mode 100644
index 0000000..793a36e
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_videocam"
+ android:tint="@color/glowpad_call_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline.xml b/InCallUI/res/drawable/ic_lockscreen_decline.xml
new file mode 100644
index 0000000..6643816
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_normal_layer" />
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_decline_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml
new file mode 100644
index 0000000..096c32b
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_red" />
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_end_call"
+ android:tint="@color/glowpad_widget_active_color" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml
new file mode 100644
index 0000000..4da5f8d
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_end_call"
+ android:tint="@color/glowpad_end_call_widget_normal_tint" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_video.xml b/InCallUI/res/drawable/ic_lockscreen_decline_video.xml
new file mode 100644
index 0000000..cedd497
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_video.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_video_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_video_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_decline_video_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml
new file mode 100644
index 0000000..0790aed
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_red" />
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_toolbar_video_off"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml
new file mode 100644
index 0000000..e3b89b9
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_toolbar_video_off"
+ android:tint="@color/glowpad_end_call_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_outerring.xml b/InCallUI/res/drawable/ic_lockscreen_outerring.xml
new file mode 100644
index 0000000..489515f
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_outerring.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <size android:height="@dimen/glowpadview_outerring_diameter"
+ android:width="@dimen/glowpadview_outerring_diameter" />
+ <stroke android:color="@color/glowpad_outer_ring_color" android:width="1dp" />
+</shape>
diff --git a/InCallUI/res/drawable/ic_lockscreen_text.xml b/InCallUI/res/drawable/ic_lockscreen_text.xml
new file mode 100644
index 0000000..f9caac8
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_text.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_text_normal_layer" />
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_text_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_text_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml
new file mode 100644
index 0000000..a74e36b
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <stroke android:color="@color/glowpad_text_widget_ring_color" android:width="1dp"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_message"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml
new file mode 100644
index 0000000..be32d0b
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_message"
+ android:tint="@color/glowpad_text_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/img_conference_automirrored.xml b/InCallUI/res/drawable/img_conference_automirrored.xml
new file mode 100644
index 0000000..fa1fd49
--- /dev/null
+++ b/InCallUI/res/drawable/img_conference_automirrored.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/img_conference"
+ android:autoMirrored="true" />
\ No newline at end of file
diff --git a/InCallUI/res/drawable/img_no_image_automirrored.xml b/InCallUI/res/drawable/img_no_image_automirrored.xml
new file mode 100644
index 0000000..f0cf0db
--- /dev/null
+++ b/InCallUI/res/drawable/img_no_image_automirrored.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/img_no_image"
+ android:autoMirrored="true" />
\ No newline at end of file
diff --git a/InCallUI/res/drawable/incoming_sms_background.xml b/InCallUI/res/drawable/incoming_sms_background.xml
new file mode 100644
index 0000000..81ff21c
--- /dev/null
+++ b/InCallUI/res/drawable/incoming_sms_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners
+ android:topLeftRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:topRightRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomRightRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomLeftRadius="@dimen/person_contact_context_message_background_accent_radius"/>
+ <solid android:color="@color/person_contact_context_message_background_color" />
+</shape>
diff --git a/InCallUI/res/drawable/outgoing_sms_background.xml b/InCallUI/res/drawable/outgoing_sms_background.xml
new file mode 100644
index 0000000..e4f868f
--- /dev/null
+++ b/InCallUI/res/drawable/outgoing_sms_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners
+ android:topLeftRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:topRightRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomLeftRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomRightRadius="@dimen/person_contact_context_message_background_accent_radius"/>
+ <solid android:color="@color/person_contact_context_message_background_color" />
+</shape>
diff --git a/InCallUI/res/drawable/subject_bubble.xml b/InCallUI/res/drawable/subject_bubble.xml
new file mode 100644
index 0000000..adab678
--- /dev/null
+++ b/InCallUI/res/drawable/subject_bubble.xml
@@ -0,0 +1,22 @@
+<!--
+ ~ 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
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#ffffff" />
+ <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
+ <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
+ android:bottomLeftRadius="0dp" android:bottomRightRadius="6dp"/>
+</shape>
\ No newline at end of file
diff --git a/InCallUI/res/layout-land/call_card_fragment.xml b/InCallUI/res/layout-land/call_card_fragment.xml
new file mode 100644
index 0000000..c71cf07
--- /dev/null
+++ b/InCallUI/res/layout-land/call_card_fragment.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+ <LinearLayout
+ android:id="@+id/primary_call_info_container"
+ android:layout_centerVertical="true"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:elevation="@dimen/primary_call_elevation"
+ android:background="@drawable/rounded_call_card_background"
+ android:paddingTop="@dimen/call_banner_primary_call_container_top_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:alpha="0.9"
+ android:layout_margin="10dp">
+
+ <include layout="@layout/primary_call_info" />
+
+ <fragment android:name="com.android.incallui.CallButtonFragment"
+ android:id="@+id/callButtonFragment"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_marginBottom="@dimen/call_buttons_bottom_margin" />
+
+ <!-- Secondary "Call info" block, for the background ("on hold") call. -->
+ <include layout="@layout/secondary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom" />
+
+ </LinearLayout>
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1">
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/call_card_content">
+
+ <ImageView android:id="@+id/photoLarge"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:contentDescription="@string/contactPhoto"
+ android:background="@color/incall_photo_background_color"
+ android:src="@drawable/img_no_image_automirrored" />
+
+ <!-- Call context -->
+ <LinearLayout
+ android:id="@+id/contact_context"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@color/incall_background_color"
+ android:visibility="gone">
+ <TextView android:id="@+id/contactContextTitle"
+ android:textSize="@dimen/contact_context_title_text_size"
+ android:textColor="@color/contact_context_title_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="@dimen/contact_context_title_margin_bottom" />
+ <ListView android:id="@+id/contactContextInfo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"
+ android:dividerHeight="@dimen/contact_context_list_item_padding" />
+ </LinearLayout>
+
+ </FrameLayout>
+
+ <include layout="@layout/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/photoLarge" />
+
+ <!-- Progress spinner, useful for indicating pending operations such as upgrade to video. -->
+ <FrameLayout
+ android:id="@+id/progressSpinner"
+ android:background="#63000000"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:visibility="gone" >
+
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.ProgressBar"
+ android:layout_gravity="center"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:indeterminate="true" />
+
+ </FrameLayout>
+
+ <fragment android:name="com.android.incallui.VideoCallFragment"
+ android:layout_alignParentStart="true"
+ android:layout_gravity="start|center_vertical"
+ android:id="@+id/videoCallFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- Placeholder for the dialpad which is replaced with the dialpad fragment when shown. -->
+ <FrameLayout
+ android:id="@+id/answer_and_dialpad_container"
+ android:layout_gravity="bottom"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <FrameLayout
+ android:id="@+id/floating_end_call_action_button_container"
+ android:layout_width="@dimen/end_call_floating_action_button_diameter"
+ android:layout_height="@dimen/end_call_floating_action_button_diameter"
+ android:background="@drawable/fab_red"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_marginBottom="@dimen/end_call_button_margin_bottom">
+
+ <ImageButton android:id="@+id/floating_end_call_action_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/end_call_background"
+ android:src="@drawable/fab_ic_end_call"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText" />
+
+ </FrameLayout>
+
+ </FrameLayout>
+
+</LinearLayout>
diff --git a/InCallUI/res/layout/accessible_answer_fragment.xml b/InCallUI/res/layout/accessible_answer_fragment.xml
new file mode 100644
index 0000000..90fe577
--- /dev/null
+++ b/InCallUI/res/layout/accessible_answer_fragment.xml
@@ -0,0 +1,104 @@
+<?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
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal"
+ android:background="@color/glowpad_background_color">
+ <RelativeLayout
+ android:id="@+id/accessible_answer_fragment_answer"
+ android:orientation="vertical"
+ android:layout_width="120dp"
+ android:layout_height="120dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp">
+ <ImageView
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:src="@drawable/ic_lockscreen_answer_activated_layer"
+ android:layout_centerInParent="true">
+ </ImageView>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/description_target_answer"
+ android:textSize="12sp"
+ android:textColor="@color/accessible_answer_hint_text_color"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="8dp"/>
+ </RelativeLayout>
+ <RelativeLayout
+ android:id="@+id/accessible_answer_fragment_decline"
+ android:orientation="vertical"
+ android:layout_width="120dp"
+ android:layout_height="120dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ android:layout_alignParentLeft="true"
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp">
+ <ImageView
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:src="@drawable/ic_lockscreen_decline_activated_layer"
+ android:layout_centerInParent="true">
+ </ImageView>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/description_target_decline"
+ android:textSize="12sp"
+ android:textColor="@color/accessible_answer_hint_text_color"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="8dp"/>
+ </RelativeLayout>
+ <LinearLayout
+ android:id="@+id/accessible_answer_fragment_text"
+ android:orientation="vertical"
+ android:layout_width="92dp"
+ android:layout_height="92dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ android:layout_alignParentEnd="false"
+ android:layout_alignParentStart="false"
+ android:layout_above="@+id/accessible_answer_fragment_decline"
+ android:layout_alignWithParentIfMissing="false"
+ android:layout_alignParentTop="false"
+ android:layout_alignParentLeft="false"
+ android:layout_alignParentBottom="false"
+ android:layout_alignParentRight="false"
+ android:layout_centerHorizontal="true"
+ android:contentDescription="@string/description_target_send_sms"
+ android:gravity="center">
+ <ImageView
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:src="@drawable/ic_lockscreen_text">
+ </ImageView>
+ </LinearLayout>
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/answer_fragment.xml b/InCallUI/res/layout/answer_fragment.xml
new file mode 100644
index 0000000..ec6ef30
--- /dev/null
+++ b/InCallUI/res/layout/answer_fragment.xml
@@ -0,0 +1,42 @@
+<?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
+ -->
+
+<com.android.incallui.GlowPadWrapper
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:dc="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/glow_pad_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:focusable="true"
+ android:layout_centerHorizontal="true"
+ android:gravity="center"
+ android:background="@color/glowpad_background_color"
+ android:layout_marginBottom="@dimen/glowpadview_margin_bottom"
+
+ dc:targetDrawables="@array/incoming_call_widget_audio_with_sms_targets"
+ dc:targetDescriptions="@array/incoming_call_widget_audio_with_sms_target_descriptions"
+ dc:directionDescriptions="@array/incoming_call_widget_audio_with_sms_direction_descriptions"
+ dc:handleDrawable="@drawable/ic_incall_audio_handle"
+ dc:outerRingDrawable="@drawable/ic_lockscreen_outerring"
+ dc:outerRadius="@dimen/glowpadview_target_placement_radius"
+ dc:innerRadius="@dimen/glowpadview_inner_radius"
+ dc:snapMargin="@dimen/glowpadview_snap_margin"
+ dc:feedbackCount="1"
+ dc:vibrationDuration="20"
+ dc:glowRadius="@dimen/glowpadview_glow_radius"
+ dc:pointDrawable="@drawable/ic_lockscreen_glowdot"
+ dc:allowScaling="true" />
diff --git a/InCallUI/res/layout/business_contact_context_list_header.xml b/InCallUI/res/layout/business_contact_context_list_header.xml
new file mode 100644
index 0000000..9052118
--- /dev/null
+++ b/InCallUI/res/layout/business_contact_context_list_header.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingEnd="@dimen/business_contact_context_end_padding">
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@dimen/contact_context_title_image_size"
+ android:layout_height="@dimen/contact_context_title_image_size"
+ android:layout_marginLeft="@dimen/contact_context_title_image_side_padding"
+ android:layout_marginRight="@dimen/contact_context_title_image_side_padding"
+ android:layout_gravity="center"
+ android:scaleType="center"
+ android:src="@drawable/ic_business_white_24dp"
+ android:tint="@color/business_contact_context_text_color"
+ android:alpha="0.8"
+ android:importantForAccessibility="no"/>
+ <TextView android:id="@+id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:text="@string/business_contact_context_title"
+ android:textSize="@dimen/business_contact_context_detail_font_size"
+ android:textColor="@color/business_contact_context_text_color"
+ android:fontFamily="sans-serif-medium"/>
+ </LinearLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/business_context_info_list_item.xml b/InCallUI/res/layout/business_context_info_list_item.xml
new file mode 100644
index 0000000..616d219
--- /dev/null
+++ b/InCallUI/res/layout/business_context_info_list_item.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingEnd="@dimen/business_contact_context_end_padding">
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@dimen/business_contact_context_image_size"
+ android:layout_height="@dimen/business_contact_context_image_size"
+ android:layout_marginLeft="@dimen/business_contact_context_image_padding"
+ android:layout_marginRight="@dimen/business_contact_context_image_padding"
+ android:layout_gravity="center"
+ android:scaleType="centerCrop"
+ android:tint="@color/business_contact_context_text_color"
+ android:alpha="0.8"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:orientation="vertical">
+ <TextView android:id="@+id/heading"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="@dimen/business_contact_context_heading_font_size"
+ android:textColor="@color/business_contact_context_text_color"
+ android:fontFamily="sans-serif-medium"/>
+ <TextView android:id="@+id/detail"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="@dimen/business_contact_context_detail_font_size"
+ android:textColor="@color/business_contact_context_text_color"
+ android:fontFamily="sans-serif-medium"/>
+ </LinearLayout>
+ </LinearLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/call_button_fragment.xml b/InCallUI/res/layout/call_button_fragment.xml
new file mode 100644
index 0000000..db75764
--- /dev/null
+++ b/InCallUI/res/layout/call_button_fragment.xml
@@ -0,0 +1,171 @@
+<?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
+ -->
+
+<!-- In-call onscreen touch UI elements, used on some platforms.
+
+ This layout is a fullscreen overlay, drawn on top of the
+ non-touch-sensitive parts of the in-call UI (i.e. the call card).
+
+ The top-level View here is a InCallTouchUi (FrameLayout) with 2 children:
+ (1) inCallControls: the widgets visible while a regular call (or calls) is in progress
+ (2) incomingCallWidget: the UI displayed while an incoming call is ringing
+ In usual cases, one of these is visible at any given moment.
+ One exception is when incomingCallWidget is fading-out. At that moment, we show
+ inCallControls beneath incomingCallWidget for smoother transition.
+ -->
+
+<!-- Main cluster of onscreen buttons on the lower part of the screen. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/bottomButtons"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_margin="0dp"
+ android:padding="0dp"
+ android:background="@color/button_background_color"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:animateLayoutChanges="true" >
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="bottom|center_horizontal"
+ android:baselineAligned="false">
+
+ <!-- This row only ever shows either 4 or 5 buttons. This may depend on whether the device
+ supports "Hold" (i.e. 4 buttons on CDMA devices, 5 buttons on GSM devices.) or whether
+ it is in a video call.
+
+ There are a couple of *pairs* of buttons that share a single "slot", namely Hold/Swap
+ and Add/Merge. For these, the code in InCallTouchUi is responsible for making sure
+ that at any point exactly one of the pair is VISIBLE and the other is GONE.
+
+ If there are more than 5 buttons eligible to be shown, the presenter is responsible for
+ collapsing those options into an overflow menu, which appears as one of the buttons
+ in the row instead. -->
+
+ <!-- FAR LEFT SLOT ===================================================================== -->
+
+ <!-- "Audio mode". this is a multi-mode button that can behave either like a simple
+ "compound button" with two states *or* like an action button that brings up a popup
+ menu; see btn_compound_audio.xml and CallButtonFragment.updateAudioButtons(). -->
+ <ToggleButton android:id="@+id/audioButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_audio"
+ android:contentDescription="@string/audio_mode_speaker" />
+
+ <!-- MIDDLE LEFT SLOT ================================================================== -->
+
+ <!-- "Mute" -->
+ <ToggleButton android:id="@+id/muteButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_mute"
+ android:contentDescription="@string/onscreenMuteText" />
+
+ <!-- CENTER SLOT ======================================================================= -->
+
+ <!-- "Dialpad" -->
+ <ToggleButton android:id="@+id/dialpadButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_dialpad"
+ android:contentDescription="@string/onscreenShowDialpadText" />
+
+ <!-- MIDDLE RIGHT SLOT ================================================================= -->
+
+ <!-- This slot is either "Hold" or "Swap", depending on the state of the call. One or the
+ other of these must always be set to GONE. -->
+
+ <!-- "Hold" -->
+ <ToggleButton android:id="@+id/holdButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_hold"
+ android:contentDescription="@string/onscreenHoldText_unselected" />
+
+ <!-- "Swap" (or "Manage calls" in some CDMA states) -->
+ <ImageButton android:id="@+id/swapButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_swap"
+ android:contentDescription="@string/onscreenSwapCallsText"
+ android:visibility="gone" />
+
+ <!-- "Change to video call" -->
+ <ImageButton android:id="@+id/changeToVideoButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_change_to_video"
+ android:contentDescription="@string/onscreenVideoCallText"
+ android:visibility="gone" />
+
+ <!-- "Switch camera" for video calls. -->
+ <ToggleButton android:id="@+id/switchCameraButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_video_switch"
+ android:contentDescription="@string/onscreenSwitchCameraText"
+ android:visibility="gone" />
+
+ <!-- FAR RIGHT SLOT ==================================================================== -->
+
+ <!-- This slot is either "Add" or "Merge", depending on the state of the call. One or the
+ other of these must always be set to GONE. -->
+
+ <!-- "Turn off camera" for video calls. -->
+ <ToggleButton android:id="@+id/pauseVideoButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_video_off"
+ android:contentDescription="@string/onscreenPauseVideoText"
+ android:visibility="gone" />
+
+ <!-- "Change to audio call" for video calls. -->
+ <ImageButton android:id="@+id/changeToVoiceButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_change_to_voice"
+ android:contentDescription="@string/onscreenChangeToVoiceText"
+ android:visibility="gone" />
+
+ <!-- "Add Call" -->
+ <ImageButton android:id="@+id/addButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_add"
+ android:contentDescription="@string/onscreenAddCallText"
+ android:visibility="gone" />
+
+ <!-- "Merge calls". This button is used only on GSM devices, where we know that "Add" and
+ "Merge" are never available at the same time. The "Merge" button for CDMA devices is
+ "cdmaMergeButton" above. -->
+ <ImageButton android:id="@+id/mergeButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_merge"
+ android:contentDescription="@string/onscreenMergeCallsText"
+ android:visibility="gone" />
+
+ <!-- "Overflow" -->
+ <ImageButton android:id="@+id/overflowButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_overflow"
+ android:contentDescription="@string/onscreenOverflowText"
+ android:visibility="gone" />
+
+ <!-- "Manage conference button (Video Call) " -->
+ <ImageButton android:id="@+id/manageVideoCallConferenceButton"
+ style="@style/InCallButton"
+ android:background="@drawable/ic_group_white_24dp"
+ android:contentDescription="@string/onscreenManageConferenceText"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/InCallUI/res/layout/call_card_fragment.xml b/InCallUI/res/layout/call_card_fragment.xml
new file mode 100644
index 0000000..760e4e2
--- /dev/null
+++ b/InCallUI/res/layout/call_card_fragment.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- Primary "call card" block, for the foreground call. -->
+ <LinearLayout
+ android:id="@+id/primary_call_info_container"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:elevation="@dimen/primary_call_elevation"
+ android:background="@color/incall_call_banner_background_color"
+ android:paddingTop="@dimen/call_banner_primary_call_container_top_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:gravity="bottom">
+
+ <include layout="@layout/primary_call_info"
+ android:layout_centerHorizontal="true" />
+
+ <fragment android:name="com.android.incallui.CallButtonFragment"
+ android:id="@+id/callButtonFragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <TextView android:id="@+id/connectionServiceMessage"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:visibility="gone"
+ android:padding="@dimen/call_banner_side_padding"
+ android:background="@android:color/white" />
+
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="2">
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/call_card_content">
+
+ <!-- Contact photo for primary call info -->
+ <ImageView android:id="@+id/photoLarge"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:importantForAccessibility="no"
+ android:background="@color/incall_photo_background_color"
+ android:src="@drawable/img_no_image_automirrored" />
+
+ <!-- Call context -->
+ <LinearLayout
+ android:id="@+id/contact_context"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@color/incall_background_color"
+ android:visibility="gone">
+ <TextView android:id="@+id/contactContextTitle"
+ android:textSize="@dimen/contact_context_title_text_size"
+ android:textColor="@color/contact_context_title_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="@dimen/contact_context_title_margin_bottom"/>
+ <ListView android:id="@+id/contactContextInfo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"
+ android:dividerHeight="@dimen/contact_context_list_item_padding"/>
+ </LinearLayout>
+ </FrameLayout>
+
+ <fragment android:name="com.android.incallui.VideoCallFragment"
+ android:id="@+id/videoCallFragment"
+ android:layout_alignParentTop="true"
+ android:layout_gravity="top|center_horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- Progress spinner, useful for indicating pending operations such as upgrade to video. -->
+ <FrameLayout
+ android:id="@+id/progressSpinner"
+ android:background="#63000000"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:visibility="gone">
+
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.ProgressBar"
+ android:layout_gravity="center"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:indeterminate="true" />
+
+ </FrameLayout>
+
+
+ <include layout="@layout/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <!-- Placeholder for various fragments that are added dynamically underneath the caller info. -->
+ <FrameLayout
+ android:id="@+id/answer_and_dialpad_container"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:elevation="@dimen/dialpad_elevation" />
+
+ <FrameLayout
+ android:id="@+id/floating_end_call_action_button_container"
+ android:layout_width="@dimen/end_call_floating_action_button_diameter"
+ android:layout_height="@dimen/end_call_floating_action_button_diameter"
+ android:background="@drawable/fab_red"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/end_call_button_margin_bottom">
+
+ <ImageButton android:id="@+id/floating_end_call_action_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/end_call_background"
+ android:src="@drawable/fab_ic_end_call"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText" />
+
+ </FrameLayout>
+
+ </RelativeLayout>
+
+ </LinearLayout>
+ <!-- Secondary "Call info" block, for the background ("on hold") call. -->
+ <include layout="@layout/secondary_call_info" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/caller_in_conference.xml b/InCallUI/res/layout/caller_in_conference.xml
new file mode 100644
index 0000000..ac78096
--- /dev/null
+++ b/InCallUI/res/layout/caller_in_conference.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="64dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="8dp">
+
+ <!-- Caller information -->
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+
+ <ImageView android:id="@+id/callerPhoto"
+ android:layout_width="@dimen/contact_browser_list_item_photo_size"
+ android:layout_height="@dimen/contact_browser_list_item_photo_size" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:orientation="vertical"
+ android:layout_marginStart="16dp"
+ android:paddingBottom="2dp">
+
+ <!-- Name or number of this caller -->
+ <TextView android:id="@+id/conferenceCallerName"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="16sp"
+ android:textColor="@color/conference_call_manager_caller_name_text_color"
+ android:singleLine="true"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="2dp" />
+
+ <!-- Number of this caller if name is supplied above -->
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:gravity="bottom">
+
+ <!-- Number -->
+ <TextView
+ android:id="@+id/conferenceCallerNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="14sp"
+ android:ellipsize="marquee"
+ android:textColor="@color/conference_call_manager_secondary_text_color"
+ android:singleLine="true"
+ android:layout_marginEnd="8dp" />
+
+ <!-- Number type -->
+ <TextView
+ android:id="@+id/conferenceCallerNumberType"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="12sp"
+ android:textColor="@color/conference_call_manager_secondary_text_color"
+ android:ellipsize="marquee"
+ android:singleLine="true"
+ android:textAllCaps="true"
+ android:gravity="start" />
+
+ </LinearLayout> <!-- End of caller number -->
+
+ </LinearLayout> <!-- End of caller information -->
+
+ </LinearLayout>
+
+ <!-- "Separate" (i.e. "go private") button for this caller -->
+ <ImageView android:id="@+id/conferenceCallerSeparate"
+ android:src="@drawable/ic_call_split_white_24dp"
+ android:layout_width="@dimen/conference_call_manager_button_dimension"
+ android:layout_height="@dimen/conference_call_manager_button_dimension"
+ android:scaleType="center"
+ android:contentDescription="@string/goPrivate"
+ android:tint="@color/conference_call_manager_icon_color"
+ android:background="@drawable/conference_ripple"
+ android:clickable="true" />
+
+ <!-- "Disconnect" button which terminates the connection with this caller. -->
+ <ImageButton
+ android:id="@+id/conferenceCallerDisconnect"
+ android:layout_width="@dimen/conference_call_manager_button_dimension"
+ android:layout_height="@dimen/conference_call_manager_button_dimension"
+ android:layout_marginStart="8dp"
+ android:src="@drawable/ic_call_end_white_24dp"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText"
+ android:tint="@color/conference_call_manager_icon_color"
+ android:background="@drawable/conference_ripple"
+ android:clickable="true" />
+
+</LinearLayout> <!-- End of single list element -->
diff --git a/InCallUI/res/layout/conference_manager_fragment.xml b/InCallUI/res/layout/conference_manager_fragment.xml
new file mode 100644
index 0000000..7350bee
--- /dev/null
+++ b/InCallUI/res/layout/conference_manager_fragment.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<!-- The "Manage conference" UI. This panel is displayed (instead of
+ the inCallPanel) when the user clicks the "Manage conference"
+ button while on a conference call. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/manageConferencePanel"
+ android:background="@color/conference_call_manager_background_color"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="@dimen/conference_call_manager_padding_top" >
+ <!-- List of conference participants. -->
+ <ListView
+ android:id="@+id/participantList"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:listSelector="@null"
+ android:background="@color/background_dialer_white"
+ android:divider="@null"
+ android:focusableInTouchMode="true"
+ android:focusable="true"/>
+</FrameLayout>
diff --git a/InCallUI/res/layout/incall_dialpad_fragment.xml b/InCallUI/res/layout/incall_dialpad_fragment.xml
new file mode 100644
index 0000000..b567dbb
--- /dev/null
+++ b/InCallUI/res/layout/incall_dialpad_fragment.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 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.
+-->
+
+<view class="com.android.incallui.DialpadFragment$DialpadSlidingLinearLayout"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/dtmf_twelve_key_dialer_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <include layout="@layout/dialpad_view"/>
+</view>
diff --git a/InCallUI/res/layout/incall_screen.xml b/InCallUI/res/layout/incall_screen.xml
new file mode 100644
index 0000000..3922ea0
--- /dev/null
+++ b/InCallUI/res/layout/incall_screen.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<!-- In-call Phone UI; see InCallActivity.java. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@android:color/black"
+ android:id="@+id/main" >
+</FrameLayout>
diff --git a/InCallUI/res/layout/manage_conference_call_button.xml b/InCallUI/res/layout/manage_conference_call_button.xml
new file mode 100644
index 0000000..3b5ef99
--- /dev/null
+++ b/InCallUI/res/layout/manage_conference_call_button.xml
@@ -0,0 +1,61 @@
+<?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
+ -->
+
+<!-- This button is used only on GSM and IMS devices, during a conference call. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/incall_banner_secondary_background_color"
+ android:focusable="true"
+ android:contentDescription="@string/onscreenManageConferenceText">
+
+ <Space android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/secondary_call_info_divider_highlight_color" />
+
+ <!-- This LinearLayout nested immediately in a FrameLayout is necessary to apply both a
+ background color and ripple to the button. -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingEnd="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingTop="@dimen/secondary_call_info_vertical_padding"
+ android:paddingBottom="@dimen/secondary_call_info_vertical_padding"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView android:id="@+id/manageConferenceButtonImage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_group_white_24dp"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"
+ android:importantForAccessibility="no" />
+
+ <TextView android:id="@+id/manageConferenceButtonLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:text="@string/onscreenManageConferenceText"
+ android:importantForAccessibility="no" />
+
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/InCallUI/res/layout/outgoing_call_animation.xml b/InCallUI/res/layout/outgoing_call_animation.xml
new file mode 100644
index 0000000..69ba3d3
--- /dev/null
+++ b/InCallUI/res/layout/outgoing_call_animation.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/outgoing_call_animation_circle"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/incall_background_color" />
\ No newline at end of file
diff --git a/InCallUI/res/layout/person_context_info_list_item.xml b/InCallUI/res/layout/person_context_info_list_item.xml
new file mode 100644
index 0000000..4f973d5
--- /dev/null
+++ b/InCallUI/res/layout/person_context_info_list_item.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingRight="@dimen/person_contact_context_horizontal_padding"
+ android:paddingLeft="@dimen/person_contact_context_horizontal_padding">
+ <TextView android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/person_contact_context_message_horizontal_padding"
+ android:paddingRight="@dimen/person_contact_context_message_horizontal_padding"
+ android:paddingTop="@dimen/person_contact_context_message_vertical_padding"
+ android:paddingBottom="@dimen/person_contact_context_message_vertical_padding"
+ android:textSize="@dimen/person_contact_context_message_text_size"
+ android:textColor="@color/person_contact_context_message_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:background="@drawable/incoming_sms_background"/>
+ <TextView android:id="@+id/detail"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/person_contact_context_detail_padding_top"
+ android:textSize="@dimen/person_contact_context_detail_text_size"
+ android:textColor="@color/person_contact_context_detail_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_below="@id/message"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/primary_call_info.xml b/InCallUI/res/layout/primary_call_info.xml
new file mode 100644
index 0000000..5dcebd0
--- /dev/null
+++ b/InCallUI/res/layout/primary_call_info.xml
@@ -0,0 +1,232 @@
+<?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
+ -->
+
+<!-- "Call Banner" for primary call, the foregound or ringing call. The "call banner" is a block
+ of info about a single call, including the contact name, phone number, call time counter, and
+ other status info. This info is shown as a "banner" overlaid across the top of contact photo.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:orientation="horizontal"
+ android:minHeight="@dimen/call_banner_height"
+ android:paddingStart="@dimen/call_banner_side_padding"
+ android:paddingEnd="@dimen/call_banner_side_padding"
+ android:animateLayoutChanges="true"
+ android:gravity="center">
+
+ <LinearLayout
+ android:id="@+id/primary_call_banner"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:gravity="center">
+
+ <LinearLayout android:id="@+id/callSubjectLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <TextView android:id="@+id/callSubject"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_background_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:background="@drawable/subject_bubble"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:singleLine="false"
+ android:visibility="gone" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/callStateButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <ImageView android:id="@+id/workProfileIcon"
+ android:src="@drawable/ic_work_profile"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:layout_marginEnd="8dp"
+ android:baselineAlignBottom="true"
+ android:tint="@color/incall_accent_color"
+ android:scaleType="center"
+ android:visibility="gone" />
+
+ <!-- Subscription provider or WiFi calling icon displayed to the left of the label -->
+ <ImageView android:id="@+id/callStateIcon"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="10dp"
+ android:tint="@color/incall_accent_color"
+ android:alpha="0.0"
+ android:scaleType="fitCenter"
+ android:visibility="gone" />
+
+ <ImageView android:id="@+id/videoCallIcon"
+ android:src="@drawable/ic_toolbar_video"
+ android:layout_width="16dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="16dp"
+ android:baselineAlignBottom="true"
+ android:tint="@color/incall_accent_color"
+ android:scaleType="center"
+ android:visibility="gone" />
+
+ <com.android.phone.common.widget.ResizingTextTextView
+ xmlns:ex="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/callStateLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textColor="@color/incall_accent_color"
+ android:textSize="@dimen/call_status_text_size"
+ android:alpha="0.7"
+ android:singleLine="true"
+ android:gravity="start"
+ android:ellipsize="end"
+ ex:resizing_text_min_size="@dimen/call_status_text_min_size" />
+
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <!-- Name (or the phone number, if we don't have a name to display). -->
+ <com.android.phone.common.widget.ResizingTextTextView
+ xmlns:ex="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-5dp"
+ android:fontFamily="sans-serif-light"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="@dimen/call_name_text_size"
+ android:singleLine="true"
+ ex:resizing_text_min_size="@dimen/call_name_text_min_size" />
+
+ <!-- Contact photo for primary call info -->
+ <ImageView android:id="@+id/photoSmall"
+ android:layout_width="@dimen/contact_context_small_photo_size"
+ android:layout_height="@dimen/contact_context_small_photo_size"
+ android:layout_centerVertical="true"
+ android:layout_alignParentEnd="true"
+ android:scaleType="centerCrop"
+ android:importantForAccessibility="no"
+ android:src="@drawable/img_no_image_automirrored" />
+ </RelativeLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <ImageView android:id="@+id/hdAudioIcon"
+ android:src="@drawable/ic_hd_24dp"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="8dp"
+ android:tint="@color/incall_call_banner_subtext_color"
+ android:scaleType="fitCenter"
+ android:visibility="gone" />
+
+ <ImageView android:id="@+id/forwardIcon"
+ android:src="@drawable/ic_forward_white_24dp"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="8dp"
+ android:tint="@color/incall_call_banner_subtext_color"
+ android:scaleType="fitCenter"
+ android:visibility="gone" />
+
+ <!-- Label (like "Mobile" or "Work", if present) and phone number, side by side -->
+ <LinearLayout android:id="@+id/labelAndNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="horizontal">
+
+ <TextView android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_subtext_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:singleLine="true"
+ android:textDirection="ltr"
+ android:visibility="gone" />
+
+ <TextView android:id="@+id/phoneNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginStart="6dp"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_subtext_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:singleLine="false"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <!-- Elapsed time indication for a call in progress. -->
+ <TextView android:id="@+id/elapsedTime"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:textAlignment="viewEnd"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_subtext_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:singleLine="true"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <!-- Call type indication: a special label and/or branding
+ for certain kinds of calls (like "SIP call" for a SIP call.) -->
+ <TextView android:id="@+id/callTypeLabel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:visibility="gone" />
+
+ </LinearLayout>
+</LinearLayout> <!-- End of call_banner -->
diff --git a/InCallUI/res/layout/secondary_call_info.xml b/InCallUI/res/layout/secondary_call_info.xml
new file mode 100644
index 0000000..e866795
--- /dev/null
+++ b/InCallUI/res/layout/secondary_call_info.xml
@@ -0,0 +1,105 @@
+<?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.
+-->
+
+<!-- XML resource file for secondary call info, which will be used by CallCard. -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/secondary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:background="@color/incall_banner_secondary_background_color"
+ android:visibility="gone">
+
+ <Space android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/secondary_call_info_divider_highlight_color" />
+
+ <!-- This LinearLayout nested immediately in a FrameLayout is necessary to apply both a
+ background color and ripple to the button. -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:paddingStart="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingEnd="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingTop="@dimen/secondary_call_info_vertical_padding"
+ android:paddingBottom="@dimen/secondary_call_info_vertical_padding"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView android:id="@+id/secondaryCallVideoCallIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_toolbar_video"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"/>
+
+ <ImageView android:id="@+id/secondaryCallConferenceCallIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_group_white_24dp"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"/>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <!-- Name (or the phone number, if we don't have a name to display). -->
+ <TextView android:id="@+id/secondaryCallName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:textAlignment="viewStart"
+ android:ellipsize="marquee"
+ android:singleLine="true"/>
+
+ <!-- Provider, e.g. AT&T, that a call is associated with -->
+ <LinearLayout android:id="@+id/secondary_call_provider_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:visibility="gone" >
+
+ <TextView android:id="@+id/secondaryCallProviderLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:textAlignment="viewStart"
+ android:singleLine="true"/>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <!-- Call status of the background call, usually the string "On hold". -->
+ <TextView android:id="@+id/secondaryCallStatus"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:paddingEnd="18dp"
+ android:text="@string/onHold"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:singleLine="true" />
+
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/InCallUI/res/layout/video_call_fragment.xml b/InCallUI/res/layout/video_call_fragment.xml
new file mode 100644
index 0000000..d5e11ef
--- /dev/null
+++ b/InCallUI/res/layout/video_call_fragment.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <ViewStub
+ android:id="@+id/videoCallViewsStub"
+ android:inflatedId="@+id/videoCallViews"
+ android:layout="@layout/video_call_views"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</FrameLayout>
\ No newline at end of file
diff --git a/InCallUI/res/layout/video_call_views.xml b/InCallUI/res/layout/video_call_views.xml
new file mode 100644
index 0000000..b0c6ce2
--- /dev/null
+++ b/InCallUI/res/layout/video_call_views.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <TextureView
+ android:id="@+id/incomingVideo"
+ android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ <!-- The width and height are replaced at runtime based on the selected camera. -->
+ <FrameLayout
+ android:id="@+id/previewVideoContainer"
+ android:layout_width="70dp"
+ android:layout_height="120dp"
+ android:layout_gravity="bottom|right"
+ android:layout_margin="@dimen/video_preview_margin" >
+
+ <!-- The video preview surface, where the user's outgoing video is shown. -->
+ <TextureView
+ android:id="@+id/previewVideo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- The user's profile photo, shown when the user's camera is shut off. -->
+ <ImageView
+ android:id="@+id/previewProfilePhoto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:adjustViewBounds="false"
+ android:contentDescription="@string/profile_photo_description"
+ android:background="@android:color/black"
+ android:visibility="gone" />
+
+ <!-- The "camera off" icon, shown when the user's camera is shut off. -->
+ <ImageView
+ android:id="@+id/previewCameraOff"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|right"
+ android:layout_marginEnd="10dp"
+ android:layout_marginBottom="10dp"
+ android:scaleType="centerCrop"
+ android:contentDescription="@string/camera_off_description"
+ android:src="@drawable/ic_toolbar_video_off"
+ android:visibility="gone" />
+ </FrameLayout>
+</FrameLayout>
diff --git a/InCallUI/res/menu/incall_audio_mode_menu.xml b/InCallUI/res/menu/incall_audio_mode_menu.xml
new file mode 100644
index 0000000..070c181
--- /dev/null
+++ b/InCallUI/res/menu/incall_audio_mode_menu.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 Google Inc.
+
+ 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.
+-->
+
+<!-- "Audio mode" popup menu for the in-call UI. -->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- TODO: Need final icon assets. Also, PopupMenu currently ignores the
+ android:icon attribute anyway(!) -->
+ <item android:id="@+id/audio_mode_speaker"
+ android:icon="@drawable/ic_toolbar_speaker_on"
+ android:title="@string/audio_mode_speaker" />
+
+ <!-- We display *either* "earpiece" or "wired headset", never both,
+ depending on whether a wired headset is physically plugged in
+ (see InCallTouchUi.showAudioModePopup().) -->
+ <item android:id="@+id/audio_mode_earpiece"
+ android:icon="@drawable/ic_toolbar_audio_phone"
+ android:title="@string/audio_mode_earpiece" />
+
+ <item android:id="@+id/audio_mode_wired_headset"
+ android:icon="@drawable/ic_toolbar_audio_headphones"
+ android:title="@string/audio_mode_wired_headset" />
+
+ <item android:id="@+id/audio_mode_bluetooth"
+ android:icon="@drawable/ic_toolbar_audio_bluetooth"
+ android:title="@string/audio_mode_bluetooth" />
+</menu>
diff --git a/InCallUI/res/values-af/strings.xml b/InCallUI/res/values-af/strings.xml
new file mode 100644
index 0000000..a3c413e
--- /dev/null
+++ b/InCallUI/res/values-af/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Foon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Hou aan"</string>
+ <string name="unknown" msgid="6878797917991465859">"Onbekend"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privaat nommer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefoonhokkie"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferensie-oproep"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Oproep is ontkoppel"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Luidspreker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Selfoonoorstuk"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Bedraade kopfoon"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Stuur die volgende tone?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Stuur luitone\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Stuur"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nee"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Vervang die plekhouerkarakter met"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferensie-oproep <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Stemboodskapnommer"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Bel"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Herbel tans"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferensie-oproep"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Inkomende oproep"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Inkomende werkoproep"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Oproep beëindig"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Hou aan"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Lui af"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"In oproep"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"My nommer is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Koppel tans video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video-oproep"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Versoek tans video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Kan nie video-oproep koppel nie"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videoversoek is verwerp"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Jou terugbelnommer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Jou noodterugbelnommer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Bel"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Gemiste oproep"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Gemiste oproepe"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepe"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Gemiste oproep van <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Oproep aan die gang"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Voortdurende werkoproep"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Voortdurende Wi-Fi-oproep"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Voortdurende Wi-Fi-werkoproep"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Hou aan"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Inkomende oproep"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Inkomende werkoproep"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Inkomende Wi-Fi-oproep"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Inkomende Wi-Fi-werkoproep"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Inkomende video-oproep"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Inkomende videoversoek"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nuwe stemboodskap"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nuwe stemboodskap (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Bel <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Stemboodskapnommer onbekend"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Geen diens nie"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Gekose netwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nie beskikbaar nie"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Antwoord"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Lui af"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Stem"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Aanvaar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Maak toe"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Bel terug"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Boodskap"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Om \'n oproep te maak, skakel eers vliegtuigmodus af."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nie geregistreer op netwerk nie."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Sellulêre netwerk nie beskikbaar nie."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Voer \'n geldige nommer in om \'n oproep te maak."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Kan nie bel nie."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Begin MMI-volgorde…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Diens word nie gesteun nie."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan nie oproepe wissel nie."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan nie oproep skei nie."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Kan nie deurskakel nie."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Kan nie konferensieoproep maak nie."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Kan nie oproep verwerp nie."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Kan nie oproep(e) vrystel nie."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-oproep"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Noodoproep"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Skakel tans radio aan…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Geen sein nie. Probeer tans weer …"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Kan nie bel nie. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is nie \'n noodnommer nie."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Kan nie bel nie. Skakel \'n noodnommer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Gebruik sleutelbord om te bel"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Hou oproep"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Hervat oproep"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Beëindig oproep"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Nommerbord"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Demp"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Voeg oproep by"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Voeg oproepe saam"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Ruil"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Bestuur oproepe"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Bestuur konferensie-oproep"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Oudio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video-oproep"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Verander na stemoproep"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Wissel kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Laat video wag"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Meer opsies"</string>
+ <string name="player_started" msgid="6046262510243983589">"Speler begin"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Speler gestop"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera is nie gereed nie"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera is gereed"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Onbekende oproepsessiegebeurtenis"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Diens"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Opstelling"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nie gestel nie>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Ander oproepinstellings"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Bel via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Inkomend via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontakfoto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"gaan privaat"</string>
+ <string name="selectContact" msgid="781975788478987237">"kies kontak"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skryf jou eie..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Kanselleer"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Stuur"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Antwoord"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Stuur SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Wys af"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Antwoord as video-oproep"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Antwoord as oudio-oproep"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Aanvaar videoversoek"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Keur videoversoek af"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Aanvaar videoversendversoek"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Weier videoversendversoek"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Aanvaar video-ontvangversoek"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Weier video-ontvangversoek"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Gly op vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Gly regs vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Gly af vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibreer"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibreer"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Klank"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Verstek klank (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Foon-luitoon"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibreer wanneer lui"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Luitoon en vibreer"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Bestuur konferensie-oproep"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Noodnommer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekondes</item>
+ <item quantity="one">1 sekonde</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="one">1 minuut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> uur</item>
+ <item quantity="one">1 uur</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profielfoto"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera af"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota is gestuur"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Onlangse boodskappe"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Besigheidinligting"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> myl ver"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km ver"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Maak môre om <xliff:g id="OPEN_TIME">%s</xliff:g> oop"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Maak vandag om <xliff:g id="OPEN_TIME">%s</xliff:g> oop"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Maak om <xliff:g id="CLOSE_TIME">%s</xliff:g> toe"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Het vandag om <xliff:g id="CLOSE_TIME">%s</xliff:g> toegemaak"</string>
+ <string name="open_now" msgid="6439301193613349163">"Nou oop"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Nou gesluit"</string>
+</resources>
diff --git a/InCallUI/res/values-am/strings.xml b/InCallUI/res/values-am/strings.xml
new file mode 100644
index 0000000..5346322
--- /dev/null
+++ b/InCallUI/res/values-am/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ስልክ"</string>
+ <string name="onHold" msgid="9035493194749959955">"ያዝናቆይ"</string>
+ <string name="unknown" msgid="6878797917991465859">"ያልታወቀ"</string>
+ <string name="private_num" msgid="6713286113000232309">"የግል ቁጥር"</string>
+ <string name="payphone" msgid="4793877574636445118">"የሕዝብ ስልክ"</string>
+ <string name="confCall" msgid="1904840547188336828">"የስብሰባ ጥሪ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ጥሪው ተቋርጧል።"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"ድምጽ ማጉያ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"የስልክ እጀታ ጆሮማዳመጫ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"ባለ ገመድ የጆሮ ማዳመጫ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ብሉቱዝ"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"የሚከተሉትንድምፆች ላክ?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ድምፆች በመላክ ላይ \n"</string>
+ <string name="send_button" msgid="4106860097497818751">" ላክ"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"አዎ"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"አይ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"የልቅ ምልክት ተካ በ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"የስብሰባ ጥሪ<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"የድምፅ መልዕክት ቁጥር"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"በመደወል ላይ"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ዳግም በመደወል ላይ"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"የስብሰባ ጥሪ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ገቢ ጥሪ"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ገቢ የሥራ ጥሪ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ጥሪ አብቅቷል"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ያዝናቆይ"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"በመዝጋት ላይ"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ጥሪ ላይ"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"ቁጥሬ<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ነው"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ቪድዮ በማገናኘት ላይ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"የቪዲዮ ጥሪ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ቪድዮ በመጠየቅ ላይ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"የቪዲዮ ጥሪን ማገናኘት አልተቻለም"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"የቪዲዮ ጥያቄ ውድቅ ተደርጓል"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"የእርስዎ የመልሶ መደወያ ቁጥር\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"የእርስዎ የድንገተኛ አደጋ መልሶ መደወያ ቁጥር\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"በመደወል ላይ"</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_ongoing_call" msgid="7068688957273482989">"እየተካሄደ ያለ ጥሪ"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"በሂደት ላይ ያለ የሥራ ጥሪ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"በሂደት ላይ ያለ የWi-Fi ጥሪ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"በሂደት ላይ ያለ የWi-Fi የሥራ ጥሪ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ያዝናቆይ"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ገቢ ጥሪ"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ገቢ የሥራ ጥሪ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"ገቢ የWi-Fi ጥሪ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ገቢ የWi-Fi የሥራ ጥሪ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ገቢ የቪዲዮ ጥሪ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ገቢ የቪዲዮ ጥያቄ"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"አዲስ የድምፅ መልዕክት"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"አዲስ የድምፅ መልዕክት<xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"ደውል <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"የማይታወቅ የድምፅ መልዕክት ቁጥር"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"ምንም አገልግሎት የለም"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"የተመረጠ አውታረመረብ(<xliff:g id="OPERATOR_NAME">%s</xliff:g>) የለም"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"መልስ"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"ዝጋ"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ቪድዮ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ድምፅ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ተቀበል"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"አሰናብት"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"መልሰህ ደውል"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"መልዕክት"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ለመደወል፣ መጀመሪያየአውሮፕላኑን ሁነታ አጥፋ።"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"በአውታረ መረቡ ላይ አልተመዘገበም።"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"የተንቀሳቃሽ ስልክ አውታረ መረብ አይገኝም።"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"አንድ ጥሪ ለማድረግ የሚሰራ ቁጥር ያስገቡ።"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"መደወል አልተቻለም።"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"የMMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"አገልግሎት አይደገፍም።"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ጥሪዎችን መቀያየር አልተቻለም።"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ጥሪን መለየት አልተቻለም።"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"ማስተላለፍ አልተቻለም።"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"የጉባዔ ጥሪ ማድረግ አልተቻለም።"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ጥሪውን መዝጋት አልተቻለም።"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ጥሪ(ዎች)ን መልቀቅ አልተቻለም።"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"የSIP ጥሪ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"የአደጋ ጊዜ ጥሪ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ሬዲዮ ክፈት"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"ምንም አገልግሎት የለም። ዳግም በመሞከር ላይ…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"መደወል አልተቻለም። <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> የአስቸኳይ አደጋ ቁጥር አይደለም።"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"መደወል አልተቻለም። ወደ የአስቸኳይ አደጋ ቁጥር ይደውሉ።"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ለመደወል የሰሌዳ ቁልፍ ተጠቀም"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ጥሪ አቆይ"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ጥሪ ቀጥል"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ጥሪ ጨርስ"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"የመደወያ ሰሌዳ"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ድምፀ-ከል አድርግ"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ጥሪ ያክሉ"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ጥሪዎችን አዋህድ"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"ማገላበጥ"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ጥሪዎችን አደራጅ"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"የስብሰባ ስልክ ጥሪ አቀናብር"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ኦዲዮ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"የቪዲዮ ጥሪ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ወደ ድምጽ ጥሪ ይለውጡ"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ካሜራ ቀይር"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ቪድዮ ለአፍታ አቁም"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"ተጨማሪ አማራጮች"</string>
+ <string name="player_started" msgid="6046262510243983589">"አጫዋች ጀምሯል"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"አጫዋች ቆሟል"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ካሜራ ዝግጁ አይደለም"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ካሜራ ዝግጁ ነው"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"ያልታወቀ የጥሪ ክፍለጊዜ ክስተት"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"አገልግሎት"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"አዋቅር"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<አልተዘጋጀም >"</string>
+ <string name="other_settings" msgid="3672912580359716394">"ሌላ ጥሪ ቅንብሮች"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"በ<xliff:g id="PROVIDER_NAME">%s</xliff:g> በኩል በመደወል ላይ"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"በ<xliff:g id="PROVIDER_NAME">%s</xliff:g> በኩል የመጣ"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"የዕውቂያ ፎቶ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ወደ ብሕታዊነት ሂድ"</string>
+ <string name="selectContact" msgid="781975788478987237">"ዕውቂያ ምረጥ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"የእራስዎን ይጻፉ..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ይቅር"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ላክ"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"መልስ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS ላክ"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"አትቀበል"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"እንደ ቪድዮ ጥሪ ይመልሱ"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"እንደ ድምጽ ጥሪ ይመልሱ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"የቪዲዮ ጥያቄ ተቀበል"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"የቪዲዮ ጥያቄ አትቀበል"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"የቪዲዮ አስተላልፍ ጥያቄን ተቀበል"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"የቪዲዮ አስተላልፍ ጥያቄን ውድቅ አድርግ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"የቪዲዮ ተቀበል ጥያቄን ተቀበል"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"የቪዲዮ ተቀበል ጥያቄን ውድቅ አድርግ"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ላይ ያንሸራትቱ።"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ ያንሸራትቱ።"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ቀኝ ያንሸራትቱ።"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ታች ያንሸራትቱ።"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"ንዘር"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"ንዘር"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ድምፅ"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ነባሪ ድምጽ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"የስልክ ጥሪ ድምፅ"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"በሚደወልበት ጊዜ ንዘር"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"የደወል ቅላጼ እና ንዘረት"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"የስብሰባስልክ ጥሪ አደራጅ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"የአደጋ ጊዜ ቁጥር"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ሰከንዶች</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ሰከንዶች</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ደቂቃዎች</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ደቂቃዎች</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ሰዓቶች</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ሰዓቶች</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"መገለጫ ፎቶ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ካሜራ ጠፍቷል"</string>
+ <string name="child_number" msgid="7437330400723805538">"በ<xliff:g id="CHILD_NUMBER">%s</xliff:g> በኩል"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ማስታወሻ ተልኳል"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"የቅርብ ጊዜ መልዕክቶች"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"የንግድ መረጃ"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> ማይል ርቀት ላይ"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> ኪሜ ርቀት ላይ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>፣ <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>፣ <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"ነገ <xliff:g id="OPEN_TIME">%s</xliff:g> ላይ ይከፈታል"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ዛሬ <xliff:g id="OPEN_TIME">%s</xliff:g> ላይ ይከፈታል"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ላይ ይዘጋል"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ዛሬ <xliff:g id="CLOSE_TIME">%s</xliff:g> ላይ ተዘግቷል"</string>
+ <string name="open_now" msgid="6439301193613349163">"አሁን ክፍት ነው"</string>
+ <string name="closed_now" msgid="9175774453982778909">"አሁን ዝግ ነው"</string>
+</resources>
diff --git a/InCallUI/res/values-ar/strings.xml b/InCallUI/res/values-ar/strings.xml
new file mode 100644
index 0000000..8731e32
--- /dev/null
+++ b/InCallUI/res/values-ar/strings.xml
@@ -0,0 +1,204 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"الهاتف"</string>
+ <string name="onHold" msgid="9035493194749959955">"معلقة"</string>
+ <string name="unknown" msgid="6878797917991465859">"غير معروف"</string>
+ <string name="private_num" msgid="6713286113000232309">"رقم خاص"</string>
+ <string name="payphone" msgid="4793877574636445118">"هاتف يعمل بالعملة"</string>
+ <string name="confCall" msgid="1904840547188336828">"مكالمة جماعية"</string>
+ <string name="call_lost" msgid="6183862117003999578">"تم قطع المكالمة"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"السماعة"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"سماعة الأذن للهاتف"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"سماعة رأس سلكية"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"بلوتوث"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"هل تريد إرسال النغمات التالية؟\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"إرسال النغمات\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"إرسال"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"نعم"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"لا"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"استبدال حرف البدل بـ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"مكالمة جماعية <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"رقم البريد الصوتي"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"طلب"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"جارٍ إعادة الطلب"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"مكالمة جماعية"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"مكالمة واردة"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"مكالمة عمل واردة"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"تم إنهاء الاتصال"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"معلقة"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"إنهاء المكالمة"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"قيد الاتصال"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"رقمي هو <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"جارٍ الاتصال بالفيديو"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"مكالمة فيديو"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"جارٍ طلب الفيديو"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"يتعذر إجراء مكالمة فيديو"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"تم رفض طلب مكالمة الفيديو"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"رقم معاودة الاتصال\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"رقم معاودة اتصال الطوارئ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"جارٍ الطلب"</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_ongoing_call" msgid="7068688957273482989">"مكالمة حالية"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"مكالمة عمل جارية"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"اتصال جارٍ عبر Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"مكالمة عمل جارية عبر اتصال Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"معلقة"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"مكالمة واردة"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"مكالمة عمل واردة"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"اتصال وارد عبر Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"مكالمة عمل واردة عبر اتصال Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"مكالمة فيديو واردة"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"طلب فيديو وارد"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"بريد صوتي جديد"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"بريد صوتي جديد (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"طلب <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"رقم البريد الصوتي غير معروف"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"لا خدمة"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"الشبكة المحددة (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) غير متاحة"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"الرد"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"قطع الاتصال"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"فيديو"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"الصوت"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"قبول"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"تجاهل"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"معاودة الاتصال"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"رسالة"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"لإجراء مكالمة، أوقف تشغيل وضع الطائرة أولاً."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"غير مسجل على الشبكة."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"شبكة الجوّال غير متاحة."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"لإجراء مكالمة، أدخل رقمًا صالحًا."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"يتعذر الاتصال."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"جارٍ بدء تسلسل MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"الخدمة ليست متوفرة."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"يتعذر تبديل المكالمات."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"يتعذر فصل المكالمة."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"يتعذر النقل."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"يتعذر إجراء مكالمة جماعية."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"يتعذر رفض المكالمة."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"يتعذر تحرير المكالمات."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"مكالمة SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"مكالمة الطوارئ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"جارٍ تشغيل اللاسلكي..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"لا تتوفر خدمة. جارٍ إعادة المحاولة…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"يتعذر الاتصال. لا يعد <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> رقم طوارئ."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"يتعذر الاتصال. يمكنك طلب رقم طوارئ."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"استخدام لوحة المفاتيح للطلب"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"تعطيل المكالمة مؤقتًا"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"استئناف المكالمة"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"إنهاء المكالمة"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"لوحة الاتصال"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"كتم الصوت"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"إضافة مكالمة"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"دمج المكالمات"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"تبديل"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"إدارة المكالمات"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"إدارة مكالمة جماعية"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"الصوت"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"مكالمة فيديو"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"التغيير إلى مكالمة صوتية"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"تبديل الكاميرا"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"إيقاف الفيديو مؤقتًا"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"خيارات أخرى"</string>
+ <string name="player_started" msgid="6046262510243983589">"تم بدء المشغّل"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"تم إيقاف المشغّل"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"الكاميرا غير جاهزة"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"الكاميرا جاهزة"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"حدث جلسة اتصال غير معروف"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"الخدمة"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"الإعداد"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<لم يتم التعيين>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"اعدادات المكالمات الاخرى"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"الاتصال عبر <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"واردة عبر <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"صورة جهة الاتصال"</string>
+ <string name="goPrivate" msgid="865837794424530980">"انتقال إلى مكالمة خاصة"</string>
+ <string name="selectContact" msgid="781975788478987237">"تحديد جهة اتصال"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"اكتب ردك..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"إلغاء"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"إرسال"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"رد"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"إرسال رسائل قصيرة SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"رفض"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"الرد بمكالمة فيديو"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"الرد بمكالمة صوتية"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"قبول طلب الفيديو"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"رفض طلب الفيديو"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"قبول طلب بث الفيديو"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"رفض طلب بث الفيديو"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"قبول طلب استلام مكالمة الفيديو"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"رفض طلب استلام مكالمة الفيديو"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"تمرير لأعلى لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"تمرير لليمين لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"تمرير لأسفل لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"الاهتزاز"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"الاهتزاز"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"الصوت"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"الصوت الافتراضي (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"نغمة رنين الهاتف"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"اهتزاز عند الرنين"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"نغمة الرنين والاهتزاز"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"إدارة مكالمة جماعية"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"رقم الطوارئ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="zero">أقل من ثانية (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="two">ثانيتان (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ثوانٍ</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> ثانية</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> من الثواني</item>
+ <item quantity="one">ثانية واحدة</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="zero">أقل من دقيقة (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="two">دقيقتان (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> دقائق</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> دقيقة</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> من الدقائق</item>
+ <item quantity="one">دقيقة واحدة</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="zero">أقل من ساعة (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="two">ساعتان (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ساعات</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> ساعة</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> من الساعات</item>
+ <item quantity="one">ساعة واحدة</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"صورة الملف الشخصي"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"تم إيقاف الكاميرا"</string>
+ <string name="child_number" msgid="7437330400723805538">"عبر <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"تم إرسال الملاحظة"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"الرسائل الأخيرة"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"معلومات النشاط التجاري"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"على بُعد <xliff:g id="DISTANCE">%.1f</xliff:g> ميل"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"على بُعد <xliff:g id="DISTANCE">%.1f</xliff:g> كم"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>، <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>، <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"مفتوح غدًا في <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"مفتوح اليوم في <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"مغلق في <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"مغلق اليوم في <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"مفتوح الآن"</string>
+ <string name="closed_now" msgid="9175774453982778909">"مغلق الآن"</string>
+</resources>
diff --git a/InCallUI/res/values-az-rAZ/strings.xml b/InCallUI/res/values-az-rAZ/strings.xml
new file mode 100644
index 0000000..be1a0ab
--- /dev/null
+++ b/InCallUI/res/values-az-rAZ/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Gözləmə mövqeyində"</string>
+ <string name="unknown" msgid="6878797917991465859">"Naməlum"</string>
+ <string name="private_num" msgid="6713286113000232309">"Şəxsi nömrə"</string>
+ <string name="payphone" msgid="4793877574636445118">"Taksofon"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konfrans zəngi"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Zəng bitdi"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Dinamik"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Dəstək qulaqlığı"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Simli qulaqlıq"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Aşağıdakı tonlar göndərilsin?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Tonlar göndərilir\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Göndər"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Bəli"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Xeyr"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Joker simvolları əvəz edin"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konfrans zəngi <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Səsli poçt nömrəsi"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Nömrə yığılır"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Yenidən yığır"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konfrans zəngi"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Gələn zəng"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Daxil olan iş çağrısı"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Zəng sona çatdı"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Gözləmədədir"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Dəstək asılır"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"zəngdadır"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mənim nömrəm <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Video qoşulur"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video zəng"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Video sorğusu göndərilir"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Video zəngə qoşulmaq mümkün deyil"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video sorğusu rədd edildi"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Cavab zəngi üçün nömrə\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Təcili cavab zəngi nömrəniz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Nömrə yığılır"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Buraxılmış zəng"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Buraxılmış zənglər"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> buraxılmış zənglər"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> tərəfindən zəng buraxılıb"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Davam edən zəng"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Davam edən iş çağrısı"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Davam edən Wi-Fi zəngi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Davam edən Wi-Fi iş çağrısı"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Gözləmə mövqeyində"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Zəng gəlir"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Daxil olan iş çağrısı"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Gələn Wi-Fi zəngi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Daxil olan Wi-Fi iş çağrısı"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Gələn video zəng"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Gələn video çağrı"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Yeni səsli poçt"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Yeni səsli poçt (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Yığın <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Səsli poçt nömrəsi naməlumdur"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Xidmət yoxdur"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Seçilmiş (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) şəbəkə əlçatmazdır"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Cavab"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Dəstəyi qoyun"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Videolar"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Səs"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Qəbul edin"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Kənarlaşdırın"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Geriyə zəng"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mesaj"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Zəng etmək üçün ilk olaraq Uçuş Rejimini söndürün."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Şəbəkədə qeydə alınmayıb."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobil şəbəkə əlçatan deyil"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Zəngi yerləşdirmək üçün düzgün nömrə daxil edin."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Zəng etmək mümkün deyil."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI başlanma ardıcıllığı…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Xidmət dəstəklənmir."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Zəngləri keçirmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Zəngi ayırmaq mümkün deyil."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Ötürmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konfrans keçirmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Zəngi rədd etmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Zəngləri buraxmaq mümkün deyil."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP çağrısı"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Təcili zəng"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Radio yandırılır ..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Xidmət yoxdur. Yenidən cəhd edilir…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Zəng etmək mümkün deyil. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> fövqəladə nömrə deyil."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Zəng etmək mümkün deyil. Fövqəladə nömrəni yığ."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Yığmaq üçün klaviatura istifadə edin"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Zəngi gözlədin"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Zəngə davam edin"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Zəngi bitirin"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Yığım paneli"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Susdurun"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Zəng əlavə edin"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Zəngləri birləşdirin"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Dəyişdirin"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Zəngləri idarə edin"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Konfrans çağrısını idarə edin"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video zəng"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Səsli çağrıya dəyişin"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Kameraya keçin"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Videonu durdurun"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Daha çox seçim"</string>
+ <string name="player_started" msgid="6046262510243983589">"Pleyer Başladıldı"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Pleyer Dayandırıldı"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera hazır deyil"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera hazırdır"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Naməlum zəng sessiyası"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Xidmət"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Quraşdırma"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ayarlanmayıb>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Digər zəng parametrləri"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> üzərindən"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> vasitəsilə gələn"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontakt fotosu"</string>
+ <string name="goPrivate" msgid="865837794424530980">"şəxsi rejimə keçin"</string>
+ <string name="selectContact" msgid="781975788478987237">"kontakt seçin"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Özünüzünkünü yazın"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Ləğv et"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Göndər"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Cavab"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS göndər"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rədd et"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Video çağrı olaraq cavab verin"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Audio çağrı olaraq cavab verin"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Video ötürmə sorğusunu qəbul edin"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Video ötürmə sorğusunu ləğv edin"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Video qəbuletmə sorğusunu qəbul edin"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Video qəbuletmə sorğusunu ləğv edin"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdürün."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdürün."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrasiya"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrasiya"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Səs"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Defolt səs (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefon zəng səsi"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Zəng çalanda vibrasiya olsun"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Zəng səsi & Vibrasiya"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Konfrans zəngini idarə edin"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Təcili nömrə"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saniyə</item>
+ <item quantity="one">1 saniyə</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> dəqiqə</item>
+ <item quantity="one">1 dəqiqə</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saat</item>
+ <item quantity="one">1 saat</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profil fotosu"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera deaktivdir"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> vasitəsilə"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Qeyd göndərildi"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Son mesajlar"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Biznes məlumatı"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil uzaqlıqda"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km uzaqlıqda"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Sabah saat <xliff:g id="OPEN_TIME">%s</xliff:g> açılır"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Bu gün saat <xliff:g id="OPEN_TIME">%s</xliff:g> açılır"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Saat <xliff:g id="CLOSE_TIME">%s</xliff:g> bağlanır"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Bu gün saat <xliff:g id="CLOSE_TIME">%s</xliff:g> bağlanıb"</string>
+ <string name="open_now" msgid="6439301193613349163">"İndi açın"</string>
+ <string name="closed_now" msgid="9175774453982778909">"İndi bağlandı"</string>
+</resources>
diff --git a/InCallUI/res/values-b+sr+Latn/strings.xml b/InCallUI/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 0000000..7ef80b4
--- /dev/null
+++ b/InCallUI/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,195 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Na čekanju"</string>
+ <string name="unknown" msgid="6878797917991465859">"Nepoznato"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privatan broj"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefonska govornica"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferencijski poziv"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Poziv je prekinut"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Zvučnik"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Slušalica telefona"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Žičane slušalice"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Želite li da pošaljete sledeće tonove?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Tonovi slanja\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Pošalji"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Da"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ne"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Zamenite džoker znak sa"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferencijski poziv <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Broj govorne pošte"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Poziva se"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Ponovno biranje"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferencijski poziv"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Dolazni poziv"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Dolazni poziv za Work"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Poziv je završen"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Na čekanju"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Prekid veze"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"U pozivu"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Moj broj je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Povezivanje sa video pozivom"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video poziv"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Zahtevanje video poziva"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Povezivanje video poziva nije uspelo"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Zahtev za video poziv je odbijen"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Broj za povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Broj za hitan povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Biranje"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Propušten poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Broj propuštenih poziva: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Propušten poziv od: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Aktuelni poziv"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Tekući poziv za Work"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Tekući Wi-Fi poziv"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Tekući poziv za Work preko Wi-Fi-ja"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Na čekanju"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Dolazni poziv"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Dolazni poziv za Work"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Dolazni Wi-Fi poziv"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Dolazni poziv za Work preko Wi-Fi-ja"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Dolazni video poziv"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Zahtev za dolazni video poziv"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nova govorna pošta"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nova govorna pošta (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Pozovi <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nepoznat broj govorne pošte"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nema usluge"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Izabrana mreža (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nije dostupna"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Odgovori"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Prekini vezu"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Glasovni"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Prihvati"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Odbij"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Uzvrati poziv"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Poruka"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Da biste uputili poziv, prvo isključite režim rada u avionu."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nije registrovano na mreži."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilna mreža nije dostupna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Da biste uputili poziv, unesite važeći broj."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Poziv nije uspeo."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Pokretanje MMI sekvence"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Usluga nije podržana."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Zamena poziva nije uspela."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Razdvajanje poziva nije uspelo."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Prebacivanje nije uspelo."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferencijski poziv nije uspeo."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Odbijanje poziva nije uspelo."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Uspostavljanje poziva nije uspelo."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP poziv"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Hitan poziv"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Uključivanje radija…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nema mreže. Ponovni pokušaj…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Poziv nije uspeo. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nije broj za hitne slučajeve."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Poziv nije uspeo. Pozovite broj za hitne slučajeve."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Koristite tastaturu za pozivanje"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Stavi poziv na čekanje"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Nastavi poziv"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Završi poziv"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Numerička tastatura"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Isključi zvuk"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Dodaj poziv"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Objedini pozive"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Zameni"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Upravljajte pozivima"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Upravljaj konf. pozivom"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video poz."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Promeni u glasovni poziv"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Promeni kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pauziraj video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Još opcija"</string>
+ <string name="player_started" msgid="6046262510243983589">"Plejer je pokrenut"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Plejer je zaustavljen"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera nije spremna"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera je spremna"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Nepoznat događaj sesije poziva"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Usluga"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Podešavanje"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nije podešeno>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Druga podešavanja poziva"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Pozivanje preko <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Dolazna preko <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografija kontakta"</string>
+ <string name="goPrivate" msgid="865837794424530980">"idi na privatno"</string>
+ <string name="selectContact" msgid="781975788478987237">"izaberite kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite sami…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Otkaži"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Pošalji"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Odgovori"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Pošalji SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Odbij"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Odgovorite video pozivom"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Odgovorite audio-pozivom"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Prihvati zahtev za video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Odbij zahtev za video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Prihvati zahtev za odlazni video poziv"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Odbij zahtev za odlazni video poziv"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Prihvati zahtev za dolazni video poziv"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Odbij zahtev za dolazni video poziv"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Prevucite nagore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Prevucite ulevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Prevucite udesno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Prevucite nadole za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibracija"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibracija"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Zvuk"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Podrazumevani zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Melodija zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibriraj kada zvoni"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Melodija zvona i vibracija"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Upravljanje konferencijskim pozivom"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Broj za hitne slučajeve"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sat</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sata</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sati</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Slika profila"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera je isključena"</string>
+ <string name="child_number" msgid="7437330400723805538">"na <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Beleška je poslata"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nedavne poruke"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informacije o preduzeću"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Udaljenost je <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Udaljenost je <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Otvara se sutra u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Otvara se danas u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Zatvara se u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Zatvorilo se danas u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Trenutno otvoreno"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Trenutno zatvoreno"</string>
+</resources>
diff --git a/InCallUI/res/values-bg/strings.xml b/InCallUI/res/values-bg/strings.xml
new file mode 100644
index 0000000..64c17e0
--- /dev/null
+++ b/InCallUI/res/values-bg/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"Задържане на обаждането"</string>
+ <string name="unknown" msgid="6878797917991465859">"Неизвестен номер"</string>
+ <string name="private_num" msgid="6713286113000232309">"Частен номер"</string>
+ <string name="payphone" msgid="4793877574636445118">"Обществен телефон"</string>
+ <string name="confCall" msgid="1904840547188336828">"Конферентно обаждане"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Обаждането бе прекъснато"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Говорител"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Телефонна слушалка"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Слушалки с кабел"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Да се изпратят ли следните мелодии? \n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Мелодиите се изпращат\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Изпращане"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Да"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Не"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Замяна на заместващия символ със:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Конферентно обаждане<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Номер за гласова поща"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Набиране"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Набира се отново"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Конферентно обаждане"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Вх. обаждане"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Входящо служебно обаждане"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Обаждането завърши"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Задържане на обаждането"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Приключване на разговора"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Вх. обаждане"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Моят номер е <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Установява се видеовръзка"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Видеообаждане"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Заявява се видеовръзка"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Видеообаждането не може да се осъществи"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Заявката за видео е отхвърлена"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Номер за обратно обаждане\n– <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Номер за спешно обратно обаждане\n– <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Набира се"</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_ongoing_call" msgid="7068688957273482989">"Текущо обаждане"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Текущо служебно обаждане"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Текущо обаждане през Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Текущо служебно обаждане през Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Задържане на обаждането"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Входящо обаждане"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Входящо служебно обаждане"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Входящо обаждане през Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Входящо служебно обаждане през Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Входящо видеообаждане"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Входяща заявка за видеовръзка"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Нова гласова поща"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Нова гласова поща на (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Набиране на <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Неизвестен номер за гласова поща"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Няма покритие"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Избраната мрежа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) не е налична"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Отговор"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Затваряне"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Видеообаждане"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Гласово обаждане"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Приемам"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Отхвърляне"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Обратно обаждане"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Съобщение"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Първо изключете самолетния режим, за да може да осъществите обаждане."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Няма регистрация в мрежата."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Няма достъп до клетъчната мрежа."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"За да извършите обаждане, въведете валиден номер."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Не може да се извърши обаждане."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Стартира се последователността MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Услугата не се поддържа."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Обажданията не могат да се превключат."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Обаждането не може да се отдели."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Не може да се прехвърли."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Не може да се извърши конферентно обаждане."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Обаждането не може да се отхвърли."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Обаждането или съответно обажданията не могат да се освободят."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Обаждане чрез SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Спешно обаждане"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Радиото се включва…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Няма услуга. Извършва се нов опит…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Не може да се извърши обаждане. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не е номер за спешни случаи."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Не може да се извърши обаждане. Наберете номер за спешни случаи."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Използвайте клавиатурата за набиране"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Задържане на обаждането"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Възобновяване на обаждането"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Край на обаждането"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Клавиатура за набиране"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Без звук"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Добавяне на обаждане"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Обединяване на обаждания"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Размяна"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Управление на обажданията"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Упр. на конф. обаждане"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видеообаждане"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Преминаване към гласово обаждане"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Превключване на камерата"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Поставяне на видеовръзката на пауза"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Още опции"</string>
+ <string name="player_started" msgid="6046262510243983589">"Плейърът е стартиран"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Плейърът е спрян"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камерата не е в готовност"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камерата е в готовност"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Неизвестно събитие в сесията на обаждане"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Услуга"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Настройка"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Не е зададено>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Други настройки за обаждане"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Обаждане чрез <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Входящо обаждане чрез <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"снимка на контакта"</string>
+ <string name="goPrivate" msgid="865837794424530980">"към частно"</string>
+ <string name="selectContact" msgid="781975788478987237">"избиране на контакта"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишете свой собствен..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Отказ"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Изпращане"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Отговор"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Изпращане на SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Отхвърлям"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Приемане като видеообаждане"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Приемане като аудиообаждане"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Приемане на заявката за видеовръзка"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Отхвърляне на заявката за видеовръзка"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Приемане на заявката за предаване на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Отхвърляне на заявката за предаване на видео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Приемане на заявката за получаване на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Отхвърляне на заявката за получаване на видео"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Плъзнете нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Плъзнете надясно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Плъзнете надолу за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Вибриране"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Вибриране"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Звук"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Стандартен звук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Мелодия на телефона"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Вибриране при звънене"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Мелодия и вибриране"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Управление на конферентно обаждане"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Спешен номер"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ <item quantity="one">1 секунда</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минути</item>
+ <item quantity="one">1 минута</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ <item quantity="one">1 час</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Снимка на потребителския профил"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камерата е изключена"</string>
+ <string name="child_number" msgid="7437330400723805538">"чрез <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Бележката е изпратена"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Скорошни съобщения"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Бизнес информация"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"На <xliff:g id="DISTANCE">%.1f</xliff:g> мили"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"На <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>; <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Отваря утре в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Отваря днес в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Затваря в <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Затворено днес в <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"В момента работи"</string>
+ <string name="closed_now" msgid="9175774453982778909">"В момента не работи"</string>
+</resources>
diff --git a/InCallUI/res/values-bn-rBD/strings.xml b/InCallUI/res/values-bn-rBD/strings.xml
new file mode 100644
index 0000000..171a246
--- /dev/null
+++ b/InCallUI/res/values-bn-rBD/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ফোন"</string>
+ <string name="onHold" msgid="9035493194749959955">"সাময়িকভাবে স্থগিত রাখা হয়েছে"</string>
+ <string name="unknown" msgid="6878797917991465859">"অজানা"</string>
+ <string name="private_num" msgid="6713286113000232309">"ব্যক্তিগত নম্বর"</string>
+ <string name="payphone" msgid="4793877574636445118">"পে ফোন"</string>
+ <string name="confCall" msgid="1904840547188336828">"কনফারেন্স কল"</string>
+ <string name="call_lost" msgid="6183862117003999578">"কল সমাপ্ত হয়েছে"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"স্পিকার"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"হ্যান্ডসেট ইয়ারপিস"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"তারযুক্ত হেডসেট"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"নিম্নলিখিত টোনগুলি পাঠাবেন?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"টোনগুলি পাঠানো হচ্ছে\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"পাঠান"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"হ্যাঁ"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"না"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ওয়াইল্ড অক্ষরগুলিকে এর মাধ্যমে প্রতিস্থাপিত করুন"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"কনফারেন্স কল <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ভয়েসমেল নম্বর"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ডায়াল করা হচ্ছে"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"পুনরায় ডায়াল করা হচ্ছে"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"কনফারেন্স কল"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ইনকামিং কল"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"আগত কাজের কল"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"কল সমাপ্ত হয়েছে"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"সাময়িকভাবে স্থগিত রাখা হয়েছে"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"কল নামিয়ে রাখা হচ্ছে"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"কল চলছে"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"আমার নম্বর হল <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ভিডিও সংযুক্ত করছে"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ভিডিও কল"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ভিডিওর অনুরোধ করছে"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ভিডিও কলে সংযোগ করা যাচ্ছে না"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ভিডিওর অনুরোধ প্রত্যাখ্যান করা হয়েছে"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"আপনার কলব্যাক নম্বর\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"আপনার জরুরী কলব্যাক নম্বর\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ডায়াল করা হচ্ছে"</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_ongoing_call" msgid="7068688957273482989">"চালু থাকা কল"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"চলমান কাজের কল"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"চলমান Wi-Fi কল"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"চলমান Wi-Fi কাজের কল"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"সাময়িকভাবে স্থগিত রাখা হয়েছে"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ইনকামিং কল"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"আগত কাজের কল"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"আগত Wi-Fi কল"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"আগত Wi-Fi কাজের কল"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ইনকামিং ভিডিও কল"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"আগত ভিডিও অনুরোধ"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"নতুন ভয়েসমেল"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"নতুন ভয়েসমেল (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> এ ডায়াল করুন"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ভয়েসমেল নম্বর অজানা"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"কোনো পরিষেবা নেই"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"নির্বাচিত নেটওয়ার্ক (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) অনুপলব্ধ"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"উত্তর"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"কল নামিয়ে রাখুন"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ভিডিও"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ভয়েস"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"স্বীকার করুন"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"খারিজ করুন"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"কল ব্যাক করুন"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"বার্তা"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"একটি কল করতে, প্রথমে বিমান মোড বন্ধ করুন৷"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"নেটওয়ার্কে নিবন্ধিত নয়৷"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"সেলুলার নেটওয়ার্ক উপলব্ধ নয়।"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"কোনো কল স্থাপন করতে, একটি বৈধ নম্বর লিখুন৷"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"কল করা যাবে না৷"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI ক্রম চালু হচ্ছে…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"পরিষেবা সমর্থিত নয়৷"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"কলগুলি স্যুইচ করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"কল আলাদা করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"হস্তান্তর করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"কনফারেন্স করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"কল প্রত্যাখ্যান কলা যাবে না৷"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"কল(গুলি) কাটা যাবে না৷"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP কল"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"জরুরি কল"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"রেডিও চালু করা হচ্ছে…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"কোন পরিষেবা নেই৷ আবার চেষ্টা করা হচ্ছে..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"কল করা যাবে না৷ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> কোনো জরুরী নম্বর নয়৷"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"কল করা যাবে না৷ কোনো জরুরী নম্বর ডায়াল করুন৷"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ডায়াল করতে কীবোর্ড ব্যবহার করুন"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"কল হোল্ডে রাখুন"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"কল পুনরায় শুরু করুন"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"কল শেষ করুন"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ডায়ালপ্যাড"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"নিঃশব্দ করুন"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"কল যোগ করুন"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"কলগুলি মার্জ করুন"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"সোয়াপ করুন"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"কলগুলি পরিচালনা করুন"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"কনফারেন্স কল পরিচালনা করুন"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"অডিও"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ভিডিও কল"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ভয়েস কলে পরিবর্তন করুন"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ক্যামেরা স্যুইচ করুন"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ভিডিও বিরাম দিন"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"আরো বিকল্প"</string>
+ <string name="player_started" msgid="6046262510243983589">"প্লেয়ার শুরু হয়েছে"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"প্লেয়ার বন্ধ হয়ে গেছে"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ক্যামেরা প্রস্তুত নেই"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ক্যামেরা প্রস্তুত"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"অজ্ঞাত কল অধিবেশনের ইভেন্ট"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"পরিষেবা"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"সেটআপ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<সেট করা নেই>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"অন্যান্য কল সেটিংস"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> এর দ্বারা কল হচ্ছে"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> এর মাধ্যমে ইনকামিং কল"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"পরিচিতির ফটো"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ব্যক্তিগতভাবে কাজ করুন"</string>
+ <string name="selectContact" msgid="781975788478987237">"পরিচিতি নির্বাচন করুন"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"আপনার নিজের পছন্দ মতো লিখুন…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"বাতিল করুন"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"পাঠান"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"উত্তর"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS পাঠান"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"অস্বীকার করুন"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ভিডিও কল হিসেবে উত্তর দিন"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"অডিও কল হিসেবে উত্তর দিন"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ভিডিওর অনুরোধ গ্রহণ করুন"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ভিডিওর অনুরোধ প্রত্যাখ্যান করুন"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ভিডিও প্রেরণ করার অনুরোধ স্বীকার করুন"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ভিডিও প্রেরণ করার অনুরোধ প্রত্যাখ্যান করুন"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ভিডিও গ্রহণ করার অনুরোধ স্বীকার করুন"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ভিডিও গ্রহণ করার অনুরোধ প্রত্যাখ্যান করুন"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাম দিকে স্লাইড করুন৷"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য ডান দিকে স্লাইড করুন৷"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য নীচের দিকে স্লাইড করুন৷"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"কম্পন"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"কম্পন"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"শব্দ"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ডিফল্ট শব্দ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ফোন রিংটোন"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"রিং হওয়ার সময় কম্পন হবে"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"রিংটোন ও কম্পন"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"কনফারেন্স কল পরিচালনা করুন"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"জরুরি নম্বর"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ড</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ড</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> মিনিট</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> মিনিট</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ঘন্টা</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ঘন্টা</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"প্রোফাইল ফটো"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ক্যামেরা বন্ধ"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> এর মাধ্যমে"</string>
+ <string name="note_sent" msgid="3548700178238244595">"নোট পাঠানো হয়েছে"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"সাম্প্রতিক বার্তাগুলি"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ব্যবসার তথ্য"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> মাইল দূরে"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> কিলোমিটার দূরে"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"আগামীকাল <xliff:g id="OPEN_TIME">%s</xliff:g>\'টায় খুলবে"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"আজ <xliff:g id="OPEN_TIME">%s</xliff:g>\'টায় খুলবে"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g>\'টায় বন্ধ হয়"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"আজ <xliff:g id="CLOSE_TIME">%s</xliff:g>\'টায় বন্ধ হয়েছে"</string>
+ <string name="open_now" msgid="6439301193613349163">"এখন খোলা রয়েছে"</string>
+ <string name="closed_now" msgid="9175774453982778909">"এখন বন্ধ রয়েছে"</string>
+</resources>
diff --git a/InCallUI/res/values-ca/strings.xml b/InCallUI/res/values-ca/strings.xml
new file mode 100644
index 0000000..7ba18af
--- /dev/null
+++ b/InCallUI/res/values-ca/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telèfon"</string>
+ <string name="onHold" msgid="9035493194749959955">"En espera"</string>
+ <string name="unknown" msgid="6878797917991465859">"Desconegut"</string>
+ <string name="private_num" msgid="6713286113000232309">"Número privat"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telèfon públic"</string>
+ <string name="confCall" msgid="1904840547188336828">"Trucada de conferència"</string>
+ <string name="call_lost" msgid="6183862117003999578">"La trucada s\'ha interromput."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altaveu"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Auricular de microtelèfon"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Auricular amb cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Voleu enviar els codis següents?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"S\'estan enviant els tons\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Envia"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Sí"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Substitueix el caràcter comodí per"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Trucada de conferència <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número de la bústia de veu"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"S\'està marcant"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"S\'està tornant a marcar"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Trucada de conferència"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Trucada entrant"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Trucada de feina entrant"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Trucada finalitzada"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"S\'està penjant"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"En una trucada"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"El meu número és <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"S\'està connectant el vídeo"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videotrucada"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"S\'està sol·licitant el vídeo"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"No es pot connectar la videotrucada"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"S\'ha rebutjat la sol·licitud de vídeo"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Número de devolució de trucada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Número de devolució de trucada d\'emergència\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Marcatge"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Trucada perduda"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Trucades perdudes"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> trucades perdudes"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Trucada perduda de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Trucada en procés"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Trucada de feina en curs"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Trucada Wi-Fi en curs"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Trucada de feina per Wi-Fi en curs"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"En espera"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Trucada entrant"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Trucada de feina entrant"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Trucada Wi-Fi entrant"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Trucada de feina per Wi-Fi entrant"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Videotrucada entrant"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Sol·licitud de vídeo entrant"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Missatge de veu nou"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Bústia de veu nou (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marca <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número de la bústia de veu desconegut"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Sense servei"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"La xarxa seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no està disponible"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Respon"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Penja"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Veu"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accepta"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ignora"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Torna la trucada"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Missatge"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Per fer una trucada, primer apagueu el mode d\'avió."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"No registrat a la xarxa."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"La xarxa mòbil no està disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Per realitzar una trucada, introdueix un número vàlid."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"No es pot trucar."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"S\'està iniciant la seqüència MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"El servei no és compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"No es pot canviar de trucada."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"No es pot separar la trucada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"No es poden realitzar transferències."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"No es pot establir la conferència."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"No es pot rebutjar la trucada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"No es poden alliberar trucades."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Trucada de SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Trucada d\'emergència"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"S\'està activant el senyal mòbil..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"No hi ha servei. S\'està tornant a provar..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"No es pot trucar. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no és un número d\'emergència."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"No es pot trucar. Marca un número d\'emergència."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilitzeu el teclat per marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Posa la trucada en espera"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Reprèn la trucada"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Finalitza la trucada"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclat"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Silencia"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Afegeix una trucada"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Combina les trucades"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Canvia"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gestiona les trucades"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gestiona la conferència"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Àudio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videotrucada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Canvia a trucada"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Canvia la càmera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Posa en pausa el vídeo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Més opcions"</string>
+ <string name="player_started" msgid="6046262510243983589">"S\'ha iniciat el reproductor"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"S\'ha aturat el reproductor"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"La càmera no està preparada"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"La càmera està preparada"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Esdeveniment de sessió de trucada desconeguda"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Servei"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuració"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<No definit>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Altres opcions de trucades"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Trucada amb <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Entrant mitjançant <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto de contacte"</string>
+ <string name="goPrivate" msgid="865837794424530980">"passa a privat"</string>
+ <string name="selectContact" msgid="781975788478987237">"selecciona el contacte"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escriu la teva…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancel·la"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Envia"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Resposta"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Envia SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rebutja"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Respon amb una trucada de vídeo."</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Respon amb una trucada d\'àudio."</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accepta la sol·licitud de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Rebutja la sol·licitud de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accepta la sol·licitud per transmetre vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Rebutja la sol·licitud per transmetre vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accepta la sol·licitud per rebre vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Rebutja la sol·licitud per rebre vídeo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Llisca cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Llisca cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Llisca cap a la dreta per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Llisca cap avall per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibra"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibra"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"So"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"So predeterminat (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"So de trucada"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar en sonar"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"So i vibració"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gestiona la trucada de conferència"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Número d\'emergència"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segons</item>
+ <item quantity="one">1 segon</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuts</item>
+ <item quantity="one">1 minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hores</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Càmera desactivada"</string>
+ <string name="child_number" msgid="7437330400723805538">"mitjançant <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"S\'ha enviat la nota"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Missatges recents"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informació de l\'empresa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi de distància"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km de distància"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Obre demà a les <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Obre avui a les <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Tanca a les <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Avui ha tancat a les <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Ara és obert"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Ara és tancat"</string>
+</resources>
diff --git a/InCallUI/res/values-cs/strings.xml b/InCallUI/res/values-cs/strings.xml
new file mode 100644
index 0000000..88df118
--- /dev/null
+++ b/InCallUI/res/values-cs/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Přidržený hovor"</string>
+ <string name="unknown" msgid="6878797917991465859">"Neznámý volající"</string>
+ <string name="private_num" msgid="6713286113000232309">"Soukromé číslo"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefonní automat"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferenční hovor"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Volání zrušeno"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Reproduktor"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Sluchátko"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kabelová náhlavní soupr."</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Odeslat následující tóny?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Odesílání tónů\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Odeslat"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ano"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ne"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Nahradit zástupné znaky jinými znaky"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferenční hovor <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Číslo hlasové schránky"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Vytáčení"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Opakované vytáčení"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenční hovor"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Příchozí hovor"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Příchozí pracovní hovor"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Hovor ukončen"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Přidržený hovor"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Ukončování hovoru"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Probíhá hovor"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Moje číslo je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Navazování spojení pro video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videohovor"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Požadování videa"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videohovor nelze zahájit"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Žádost o video byla zamítnuta"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Vaše číslo pro zpětné volání\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Vaše číslo pro tísňové zpětné volání\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Vytáčení"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Zmeškaný hovor"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Zmeškané hovory"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>."</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Zmeškaný hovor od volajícího <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>."</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Probíhající hovor"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Probíhající pracovní hovor"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Probíhající volání přes Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Probíhající pracovní hovor (Wi-Fi)"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Přidržený hovor"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Příchozí hovor"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Příchozí pracovní hovor"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Příchozí volání přes Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Příchozí pracovní hovor (Wi-Fi)"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Příchozí videohovor"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Příchozí žádost o videohovor"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nová hlasová zpráva"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nová hlasová zpráva (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Volat hlasovou schránku <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Číslo hlasové schránky je neznámé."</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Žádný signál"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Vybraná síť (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) není k dispozici"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Přijmout"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Zavěsit"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Hlasový hovor"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Přijmout"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Zavřít"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Zavolat zpět"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Zpráva"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Chcete-li telefonovat, vypněte nejprve režim Letadlo."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Přihlášení k síti nebylo úspěšné."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilní síť je nedostupná."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Chcete-li uskutečnit hovor, zadejte platné telefonní číslo."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Hovor nelze uskutečnit."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Spouštění sekvence MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Služba není podporována."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Hovory nelze přepnout."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Hovor nelze rozdělit."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Hovor nelze předat."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferenční hovor nelze uskutečnit."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Hovor nelze odmítnout."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Hovor nelze ukončit."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Volání SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Tísňové volání"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Zapínání rádia..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Služba je nedostupná. Probíhá další pokus…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Hovor nelze uskutečnit. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> není číslo tísňového volání."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Hovor nelze uskutečnit. Vytočte číslo tísňového volání."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Číslo vytočíte pomocí klávesnice."</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Podržet hovor"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Obnovit hovor"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Ukončit hovor"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Číselník"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Ztlumit"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Přidat hovor"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Spojit hovory"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Zaměnit"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Spravovat hovory"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Správa konf. hovoru"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Zvuk"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videohovor"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Změnit na hlasové volání"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Přepnout fotoaparát"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pozastavit video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Další možnosti"</string>
+ <string name="player_started" msgid="6046262510243983589">"Přehrávač spuštěn"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Přehrávač zastaven"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Fotoaparát není připraven"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Fotoaparát je připraven"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Neznámá událost relace volání"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Služba"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfigurace"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nenastaveno>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Další nastavení hovorů"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Volání přes <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Příchozí hovor přes poskytovatele <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografie kontaktu"</string>
+ <string name="goPrivate" msgid="865837794424530980">"přepnout na soukromé"</string>
+ <string name="selectContact" msgid="781975788478987237">"vybrat kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napsat vlastní odpověď..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Zrušit"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Odeslat"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Odpověď"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Odeslat SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Odmítnout"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Přijmout jako videohovor"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Přijmout jako hlasový hovor"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Přijmout žádost o videhovor"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Odmítnout žádost o videohovor"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Přijmout žádost o odesílání videa"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Odmítnout žádost o odesílání videa"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Přijmout žádost o příjem videa"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Odmítnout žádost o příjem videa"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Přejeďte prstem nahoru: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Přejeďte prstem doleva: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Přejeďte prstem doprava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Přejeďte prstem dolů: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrace"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrace"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Zvuk"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Výchozí zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Vyzváněcí tón telefonu"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrace při vyzvánění"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Vyzvánění a vibrace"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Spravovat konferenční hovor"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Číslo tísňové linky"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ <item quantity="one">1 sekunda</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="one">1 minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hodin</item>
+ <item quantity="one">1 hodina</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilová fotka"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Fotoaparát je vypnutý"</string>
+ <string name="child_number" msgid="7437330400723805538">"pomocí čísla <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Poznámka odeslána"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nejnovější zprávy"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informace o firmě"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Vzdálenost: <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Vzdálenost: <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Zítra otevírá v <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Dnes otevírá v <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Zavírá v <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Dnes zavřeno od <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Nyní otevřeno"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Nyní zavřeno"</string>
+</resources>
diff --git a/InCallUI/res/values-da/strings.xml b/InCallUI/res/values-da/strings.xml
new file mode 100644
index 0000000..d27f2e9
--- /dev/null
+++ b/InCallUI/res/values-da/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Opkald"</string>
+ <string name="onHold" msgid="9035493194749959955">"Ventende"</string>
+ <string name="unknown" msgid="6878797917991465859">"Ukendt"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privat nummer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Mønttelefon"</string>
+ <string name="confCall" msgid="1904840547188336828">"Telefonmøde"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Opkaldet blev droppet."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Højttaler"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Ørestykke til håndsæt"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Headset med ledning"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Send følgende toner?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sender toner\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Send"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nej"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Erstat jokertegnet med"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Telefonmøde <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Telefonsvarernummer"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Ringer op"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Ringer op igen"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonmøde"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Indgående opkald"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Indgående arbejdsopkald"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Opkaldet er afsluttet"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Ventende"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Lægger på"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Opkald i gang"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mit nummer er <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Opretter forbindelse til video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videoopkald"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Anmoder om video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Kan ikke forbinde videoopkald"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videoanmodningen blev afvist"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Dit tilbagekaldsnummer\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Dit tilbagekaldsnummer til nødopkald\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Ringer op"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ubesvarede opkald"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Ubesvarede opkald"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ubesvarede opkald"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Ubesvarede opkald fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Igangværende opkald"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Igangværende opkald i forbindelse med arbejde"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Igangværende opkald via Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Igangværende Wi-Fi-opkald i forbindelse med arbejde"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Ventende"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Indgående opkald"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Indgående opkald i forbindelse med arbejde"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Indgående opkald via Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Indgående Wi-Fi-opkald i forbindelse med arbejde"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Indgående videoopkald"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Indgående videoanmodning"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny telefonsvarerbesked"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nye telefonsvarerbeskeder (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring til <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Telefonsvarernummeret er ukendt"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen dækning"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Det valgte netværk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ikke tilgængeligt"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Svar"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Læg på"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Tale"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Besvar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Afvis"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Ring tilbage"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Besked"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Slå Flytilstand fra først for at foretage et opkald."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ikke registreret på netværk."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilnetværket er ikke tilgængeligt."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Indtast et gyldigt nummer for at foretage et opkald."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Kan ikke ringe op."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Starter MMI-sekvens ..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Tjenesten er ikke understøttet."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan ikke skifte opkald."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan ikke adskille opkald."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Kan ikke overføre."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Kan ikke oprette telefonmøde."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Kan ikke afvise opkaldet."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Kan ikke frigive et eller flere opkald."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-opkald"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Nødopkald"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Tænder for radio ..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ingen tjeneste. Prøver igen..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Kan ikke ringe op. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et alarmnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Kan ikke ringe op. Ring til et alarmnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Brug tastatur til at ringe op"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Sæt opkald i venteposition"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Genoptag opkald"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Afslut opkald"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Nummerblok"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Lyd fra"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Tilføj opkald"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Slå opkald sammen"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Skift"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrer opkald"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Administrer telefonmøde"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Lyd"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videoopkald"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Skift til stemmeopkald"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Skift kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Sæt video på pause"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Flere valgmuligheder"</string>
+ <string name="player_started" msgid="6046262510243983589">"Afspilleren er startet"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Afspilleren er stoppet"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kameraet er ikke klar"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kameraet er klar"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Ukendt opkaldsbegivenhed"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Tjeneste"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfiguration"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ikke angivet>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Andre indstillinger for opkald"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Opkald via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Indgående opkald via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"billede af kontaktperson"</string>
+ <string name="goPrivate" msgid="865837794424530980">"gør privat"</string>
+ <string name="selectContact" msgid="781975788478987237">"vælg kontaktperson"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv dit eget svar..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Annuller"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Send"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Svar"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Send sms"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Afvis"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Besvar som videoopkald"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Besvar som lydopkald"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Acceptér videoanmodning"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Afvis videoanmodning"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Acceptér anmodning om udgående videoopkald"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Afvis anmodning om udgående videoopkald"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Acceptér anmodning om indgående videoopkald"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Afvis anmodning om indgående videoopkald"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Skub op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Skub til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Skub til højre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Glid ned for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibration"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibration"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Lyd"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Standardlyd (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ringetone for opkald"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrer ved opringning"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringetone og vibration"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Administrer telefonmøde"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Nødnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minutter</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutter</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> timer</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> timer</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilfoto"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Sluk kamera"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Noten er sendt"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Seneste beskeder"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Virksomhedsoplysninger"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil væk"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km væk"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>-<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Åbner i morgen kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Åbner i dag kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Lukker kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Lukkede i dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Åbent nu"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Lukket for i dag"</string>
+</resources>
diff --git a/InCallUI/res/values-de/strings.xml b/InCallUI/res/values-de/strings.xml
new file mode 100644
index 0000000..7b186f5
--- /dev/null
+++ b/InCallUI/res/values-de/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Gehaltener Anruf"</string>
+ <string name="unknown" msgid="6878797917991465859">"Unbekannt"</string>
+ <string name="private_num" msgid="6713286113000232309">"Private Nummer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Münztelefon"</string>
+ <string name="confCall" msgid="1904840547188336828">"Telefonkonferenz"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Verbindung unterbrochen"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Lautsprecher"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Handy-Kopfhörer"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kabelgebundenes Headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Folgende Töne senden?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Töne werden gesendet.\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Senden"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nein"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Platzhalter ersetzen durch"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Telefonkonferenz <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Mailboxnummer"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Rufaufbau"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Wahlwiederholung"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonkonferenz"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Eingehender Anruf"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Eingehender geschäftlicher Anruf"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Anruf beendet"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Gehaltener Anruf"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Auflegen"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Anruf"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Meine Nummer lautet <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>."</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Videoverbindung wird hergestellt."</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videoanruf"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Videoanfrage wird gesendet."</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videoanruf kann nicht verbunden werden."</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videoanfrage abgelehnt"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Deine Rückrufnummer:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Deine Notrufnummer:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Verbindung wird aufgebaut..."</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Entgangener Anruf"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Entgangene Anrufe"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> entgangene Anrufe"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Entgangener Anruf von <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Aktueller Anruf"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Aktueller geschäftlicher Anruf"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Aktiver WLAN-Anruf"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Aktueller geschäftlicher WLAN-Anruf"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Gehaltener Anruf"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Eingehender Anruf"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Eingehender geschäftlicher Anruf"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Eingehender WLAN-Anruf"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Eingehender geschäftlicher WLAN-Anruf"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Eingehender Videoanruf"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Eingehende Videoanfrage"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Neue Nachricht"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Neue Nachricht (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> wählen"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Mailboxnummer unbekannt"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"kein Dienst"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Ausgewähltes Netzwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nicht verfügbar"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Annehmen"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Beenden"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Videoanruf"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Nur Audio"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Akzeptieren"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ablehnen"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Zurückrufen"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Nachricht"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Deaktiviere zunächst den Flugmodus, um einen Anruf zu tätigen."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nicht in Netzwerk registriert."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilfunknetz nicht verfügbar"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Gib eine gültige Nummer ein."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Anruf nicht möglich."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI-Sequenz wird gestartet..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Dienst wird nicht unterstützt."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Anruf kann nicht gewechselt werden."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Anruf kann nicht getrennt werden."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Anruf kann nicht übergeben werden."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferenzschaltung nicht möglich."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Anruf kann nicht abgelehnt werden."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Anrufe können nicht freigegeben werden."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-Anruf"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Notruf"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Mobilfunkverbindung wird aktiviert..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Kein Service. Erneuter Versuch..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Anruf nicht möglich. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ist keine Notrufnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Anruf nicht möglich. Wähle eine Notrufnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Zum Wählen Tastatur verwenden"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Anruf halten"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Anruf fortsetzen"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Anruf beenden"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Wähltasten"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Ton aus"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Anruf hinzufügen"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Anrufe verbinden"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Wechseln"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Anrufe verwalten"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Konferenz verwalten"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videoanruf"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Zu Sprachanruf wechseln"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Kamera wechseln"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Video pausieren"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Weitere Optionen"</string>
+ <string name="player_started" msgid="6046262510243983589">"Videoübertragung gestartet"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Videoübertragung gestoppt"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera nicht bereit"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera bereit"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Unbekanntes Ereignis während eines Anrufs"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Dienst"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Einrichtung"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nicht festgelegt>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Sonstige Anrufeinstellungen"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Anruf über <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Eingehender Anruf über <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"Kontaktbild"</string>
+ <string name="goPrivate" msgid="865837794424530980">"privat sprechen"</string>
+ <string name="selectContact" msgid="781975788478987237">"Kontakt wählen"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Eigene Antwort schreiben..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Abbrechen"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Senden"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Annehmen"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS senden"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Ablehnen"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Als Videoanruf annehmen"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Als normalen Anruf annehmen"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Videoanfrage akzeptieren"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Videoanfrage ablehnen"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Anfrage für ausgehenden Videoanruf akzeptieren"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Anfrage für ausgehenden Videoanruf ablehnen"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Anfrage für eingehenden Videoanruf akzeptieren"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Anfrage für eingehenden Videoanruf ablehnen"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach rechts schieben"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach unten schieben"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibration"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibration"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Töne"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Standardklingelton (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Klingelton"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Beim Klingeln vibrieren"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Klingelton & Vibration"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Telefonkonferenz verwalten"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Notrufnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> Sekunden</item>
+ <item quantity="one">1 Sekunde</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> Minuten</item>
+ <item quantity="one">1 Minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> Stunden</item>
+ <item quantity="one">1 Stunde</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilfoto"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera aus"</string>
+ <string name="child_number" msgid="7437330400723805538">"über <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Notiz gesendet"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Zuletzt eingegangene Nachrichten"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Geschäftsinformationen"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> Meilen entfernt"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> Kilometer entfernt"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> bis <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Öffnet morgen um <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Öffnet heute um <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Schließt um <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Hat heute um <xliff:g id="CLOSE_TIME">%s</xliff:g> geschlossen"</string>
+ <string name="open_now" msgid="6439301193613349163">"Jetzt geöffnet"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Jetzt geschlossen"</string>
+</resources>
diff --git a/InCallUI/res/values-el/strings.xml b/InCallUI/res/values-el/strings.xml
new file mode 100644
index 0000000..cdff358
--- /dev/null
+++ b/InCallUI/res/values-el/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Τηλέφωνο"</string>
+ <string name="onHold" msgid="9035493194749959955">"Σε αναμονή"</string>
+ <string name="unknown" msgid="6878797917991465859">"Άγνωστος"</string>
+ <string name="private_num" msgid="6713286113000232309">"Απόκρυψη"</string>
+ <string name="payphone" msgid="4793877574636445118">"Τηλέφωνο με χρέωση"</string>
+ <string name="confCall" msgid="1904840547188336828">"Κλήση συνδιάσκεψης"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Η κλήση απορρίφθηκε"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Ηχείο"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Ακουστικό"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Ενσύρ. ακουστ."</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Αποστολή των παρακάτω τόνων;\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Τόνοι αποστολής\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Αποστολή"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ναι"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Όχι"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Αντικατάσταση του χαρακτήρα μπαλαντέρ με"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Κλήση συνδιάσκεψης <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Αριθμός αυτόματου τηλεφωνητή"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Κλήση"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Επανάκληση"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Κλήση συνδιάσκεψης"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Εισερχόμενη κλήση"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Εισερχόμενη κλήση εργασίας"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Η κλήση τερματίστηκε"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Σε αναμονή"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Κλείσιμο γραμμής"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Σε κλήση"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Ο αριθμός μου είναι <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Σύνδεση βίντεο"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Βιντεοκλήση"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Αίτημα βίντεο"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Δεν είναι δυνατή η σύνδεση βιντεοκλησης"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Το αίτημα βίντεο απορρίφθηκε"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Αριθμός επανάκλησης\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Αριθμός επανάκλησης έκτακτης ανάγκης\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Κλήση"</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_ongoing_call" msgid="7068688957273482989">"Κλήση σε εξέλιξη"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Κλήση εργασίας σε εξέλιξη"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Κλήση Wi-Fi σε εξέλιξη"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Κλήση εργασίας μέσω Wi-Fi σε εξέλιξη"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Σε αναμονή"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Εισερχόμενη κλήση"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Εισερχόμενη κλήση εργασίας"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Εισερχόμενη κλήση μέσω Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Εισερχόμενη κλήση εργασίας μέσω Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Εισερχόμενη βιντεοκλήση"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Αίτημα εισερχόμενου βίντεο"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Νέο μήνυμα στον αυτόματο τηλεφωνητή"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Νέο μήνυμα στον αυτόματο τηλεφωνητή (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Καλέστε <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Ο αριθμός αυτόματου τηλεφωνητή είναι άγνωστος"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Δίκτυο μη διαθέσιμο"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Επιλεγμένο δίκτυο (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) μη διαθέσιμο"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Απάντηση"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Τερματισμός κλήσης"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Βίντεο"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Φωνητική κλήση"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Αποδοχή"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Παράβλεψη"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Επανάκληση"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Μήνυμα"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Για να πραγματοποιήσετε μια κλήση, απενεργοποιήστε πρώτα τη λειτουργία πτήσης."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Δεν έχετε εγγραφεί στο δίκτυο."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Το δίκτυο κινητής τηλεφωνίας δεν είναι διαθέσιμο."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Για να πραγματοποιήσετε κλήση, εισαγάγετε έναν έγκυρο αριθμό."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Δεν είναι δυνατή η κλήση."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Έναρξη ακολουθίας MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Η υπηρεσία δεν υποστηρίζεται."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Δεν είναι δυνατή η εναλλαγή κλήσεων."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Δεν είναι δυνατός ο διαχωρισμός της κλήσης."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Δεν είναι δυνατή η μεταφορά."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Δεν είναι δυνατή η συνδιάσκεψη."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Δεν είναι δυνατή η απόρριψη της κλήσης."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Δεν είναι δυνατή η πραγματοποίηση κλήσεων."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Κλήση SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Κλήσεις επείγουσας ανάγκης"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ενεργοποίηση πομπού..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Δεν υπάρχει υπηρεσία. Νέα προσπάθεια…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Δεν είναι δυνατή η κλήση. Το <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> δεν είναι αριθμός έκτακτης ανάγκης."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Δεν είναι δυνατή η κλήση. Πληκτρολογήστε έναν αριθμό έκτακτης ανάγκης."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Χρησιμοποιήστε το πληκτρολόγιο για να πραγματοποιήσετε καλέσετε έναν αριθμό"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Αναμονή κλήσης"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Συνέχιση κλήσης"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Τερματισμός κλήσης"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Πληκτρολόγιο κλήσης"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Σίγαση"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Προσθήκη κλήσης"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Συγχώνευση κλήσεων"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Ανταλλαγή"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Διαχείριση κλήσεων"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Διαχ.κλήσης συνδ."</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Ήχος"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Κλήση βίντεο"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Αλλαγή σε φωνητική κλήση"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Εναλλαγή κάμερας"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Παύση βίντεο"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Περισσότερες επιλογές"</string>
+ <string name="player_started" msgid="6046262510243983589">"Το πρόγραμμα αναπαραγωγής βίντεο ξεκίνησε"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Το πρόγραμμα αναπαραγωγής βίντεο διακόπηκε"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Η κάμερα δεν είναι έτοιμη"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Η κάμερα είναι έτοιμη"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Άγνωστο συμβάν περιόδου σύνδεσης κλήσης"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Υπηρεσία"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Ρυθμίσεις"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Δεν έχει οριστεί>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Άλλες ρυθμίσεις κλήσης"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Κλήση μέσω <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Εισερχόμενη κλήση μέσω <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"φωτογραφία επαφής"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ιδιωτική χρήση"</string>
+ <string name="selectContact" msgid="781975788478987237">"επιλογή επαφής"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Συντάξτε τη δική σας…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Ακύρωση"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Αποστολή"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Απάντηση"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Αποστολή SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Απόρριψη"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Απάντηση ως βιντεοκλήση"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Απάντηση ως φωνητική κλήση"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Αποδοχή αιτήματος βίντεο"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Απόρριψη αιτήματος βίντεο"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Αποδοχή αιτήματος μετάδοσης βίντεο"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Απόρριψη αιτήματος μετάδοσης βίντεο"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Αποδοχή αιτήματος λήψης βίντεο"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Απόρριψη αιτήματος λήψης βίντεο"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Κύλιση προς τα επάνω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Κύλιση προς τα δεξιά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Κύλιση προς τα κάτω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Δόνηση"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Δόνηση"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Ήχος"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Προεπιλεγμένος ήχος (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ήχος κλήσης τηλεφώνου"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Δόνηση κατά το κουδούνισμα"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ήχος κλήσης & δόνηση"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Διαχείριση κλήσης συνδιάσκεψης"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Αριθμός έκτακτης ανάγκης"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα</item>
+ <item quantity="one">1 δευτερόλεπτο</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> λεπτά</item>
+ <item quantity="one">1 λεπτό</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ώρες</item>
+ <item quantity="one">1 ώρα</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Φωτογραφία προφίλ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Απενεργοποίηση κάμερας"</string>
+ <string name="child_number" msgid="7437330400723805538">"μέσω <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Η σημείωση εστάλη"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Πρόσφατα μηνύματα"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Πληροφορίες επιχείρησης"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> μίλια μακριά"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> χιλιόμετρα μακριά"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Ανοίγει αύριο στις <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Ανοίγει σήμερα στις <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Κλείνει στις <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Έκλεισε σήμερα στις <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Ανοιχτό τώρα"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Κλειστό τώρα"</string>
+</resources>
diff --git a/InCallUI/res/values-en-rAU/strings.xml b/InCallUI/res/values-en-rAU/strings.xml
new file mode 100644
index 0000000..4300363
--- /dev/null
+++ b/InCallUI/res/values-en-rAU/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Phone"</string>
+ <string name="onHold" msgid="9035493194749959955">"On hold"</string>
+ <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
+ <string name="private_num" msgid="6713286113000232309">"Private number"</string>
+ <string name="payphone" msgid="4793877574636445118">"Payphone"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conference call"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Call dropped"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Wired headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Send the following tones?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sending tones\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Send"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Yes"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Replace wild character with"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Voicemail number"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Dialling"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Redialling"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Incoming call"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Incoming work call"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Call ended"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"On hold"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Hanging up"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"In call"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"My number is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Connecting video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Requesting video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Can\'t connect video call"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video request rejected"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Your callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Your emergency callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Dialling"</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_ongoing_call" msgid="7068688957273482989">"On-going call"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Ongoing work call"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ongoing Wi-Fi call"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Ongoing Wi-Fi work call"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"On hold"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Incoming call"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Incoming work call"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Incoming Wi-Fi call"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Incoming Wi-Fi work call"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Incoming video call"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Incoming video request"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"New voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"New voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Dial <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemail number unknown"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"No service"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Selected network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) unavailable"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Answer"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Hang up"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"In-stream video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voice"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accept"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Message"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"To place a call, first turn off Aeroplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Not registered on network."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobile network not available."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"To place a call, enter a valid number."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Can\'t call."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Starting MMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Service not supported."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Can\'t switch calls."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Can\'t separate call."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Can\'t transfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Can\'t conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Can\'t reject call."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Can\'t release call(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP call"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Emergency call"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Turning on radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"No service. Trying again…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Can\'t call. Dial an emergency number."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Use keyboard to dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Hold Call"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Resume Call"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"End Call"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Dial pad"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Mute"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Add call"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Merge calls"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Swap"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Manage calls"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Manage conference call"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Change to voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Switch camera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pause video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"More options"</string>
+ <string name="player_started" msgid="6046262510243983589">"Player Started"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Player Stopped"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Camera not ready"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Camera ready"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Unknown call session event"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Service"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Setup"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Not set>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Other call settings"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Calling via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Incoming via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"contact photo"</string>
+ <string name="goPrivate" msgid="865837794424530980">"go private"</string>
+ <string name="selectContact" msgid="781975788478987237">"select contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancel"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Send"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Answer"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Send SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Decline"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Answer as video call"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Answer as audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accept video transmit request"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Decline video transmit request"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accept video receive request"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Decline video receive request"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sound"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Default sound (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Phone ringtone"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrate when ringing"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringtone & Vibrate"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Manage conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Emergency number"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">1 second</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ <item quantity="one">1 minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hours</item>
+ <item quantity="one">1 hour</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profile photo"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Camera off"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Note sent"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Recent messages"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Business info"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi away"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km away"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Opens tomorrow at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Opens today at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Closes at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Closed today at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Open now"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Closed now"</string>
+</resources>
diff --git a/InCallUI/res/values-en-rGB/strings.xml b/InCallUI/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..4300363
--- /dev/null
+++ b/InCallUI/res/values-en-rGB/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Phone"</string>
+ <string name="onHold" msgid="9035493194749959955">"On hold"</string>
+ <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
+ <string name="private_num" msgid="6713286113000232309">"Private number"</string>
+ <string name="payphone" msgid="4793877574636445118">"Payphone"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conference call"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Call dropped"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Wired headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Send the following tones?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sending tones\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Send"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Yes"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Replace wild character with"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Voicemail number"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Dialling"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Redialling"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Incoming call"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Incoming work call"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Call ended"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"On hold"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Hanging up"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"In call"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"My number is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Connecting video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Requesting video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Can\'t connect video call"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video request rejected"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Your callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Your emergency callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Dialling"</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_ongoing_call" msgid="7068688957273482989">"On-going call"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Ongoing work call"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ongoing Wi-Fi call"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Ongoing Wi-Fi work call"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"On hold"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Incoming call"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Incoming work call"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Incoming Wi-Fi call"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Incoming Wi-Fi work call"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Incoming video call"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Incoming video request"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"New voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"New voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Dial <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemail number unknown"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"No service"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Selected network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) unavailable"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Answer"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Hang up"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"In-stream video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voice"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accept"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Message"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"To place a call, first turn off Aeroplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Not registered on network."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobile network not available."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"To place a call, enter a valid number."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Can\'t call."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Starting MMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Service not supported."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Can\'t switch calls."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Can\'t separate call."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Can\'t transfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Can\'t conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Can\'t reject call."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Can\'t release call(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP call"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Emergency call"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Turning on radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"No service. Trying again…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Can\'t call. Dial an emergency number."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Use keyboard to dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Hold Call"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Resume Call"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"End Call"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Dial pad"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Mute"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Add call"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Merge calls"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Swap"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Manage calls"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Manage conference call"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Change to voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Switch camera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pause video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"More options"</string>
+ <string name="player_started" msgid="6046262510243983589">"Player Started"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Player Stopped"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Camera not ready"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Camera ready"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Unknown call session event"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Service"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Setup"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Not set>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Other call settings"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Calling via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Incoming via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"contact photo"</string>
+ <string name="goPrivate" msgid="865837794424530980">"go private"</string>
+ <string name="selectContact" msgid="781975788478987237">"select contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancel"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Send"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Answer"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Send SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Decline"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Answer as video call"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Answer as audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accept video transmit request"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Decline video transmit request"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accept video receive request"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Decline video receive request"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sound"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Default sound (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Phone ringtone"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrate when ringing"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringtone & Vibrate"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Manage conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Emergency number"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">1 second</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ <item quantity="one">1 minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hours</item>
+ <item quantity="one">1 hour</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profile photo"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Camera off"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Note sent"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Recent messages"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Business info"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi away"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km away"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Opens tomorrow at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Opens today at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Closes at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Closed today at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Open now"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Closed now"</string>
+</resources>
diff --git a/InCallUI/res/values-en-rIN/strings.xml b/InCallUI/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..4300363
--- /dev/null
+++ b/InCallUI/res/values-en-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Phone"</string>
+ <string name="onHold" msgid="9035493194749959955">"On hold"</string>
+ <string name="unknown" msgid="6878797917991465859">"Unknown"</string>
+ <string name="private_num" msgid="6713286113000232309">"Private number"</string>
+ <string name="payphone" msgid="4793877574636445118">"Payphone"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conference call"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Call dropped"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Wired headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Send the following tones?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sending tones\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Send"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Yes"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Replace wild character with"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Voicemail number"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Dialling"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Redialling"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Incoming call"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Incoming work call"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Call ended"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"On hold"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Hanging up"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"In call"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"My number is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Connecting video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Requesting video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Can\'t connect video call"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video request rejected"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Your callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Your emergency callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Dialling"</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_ongoing_call" msgid="7068688957273482989">"On-going call"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Ongoing work call"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ongoing Wi-Fi call"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Ongoing Wi-Fi work call"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"On hold"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Incoming call"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Incoming work call"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Incoming Wi-Fi call"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Incoming Wi-Fi work call"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Incoming video call"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Incoming video request"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"New voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"New voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Dial <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemail number unknown"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"No service"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Selected network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) unavailable"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Answer"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Hang up"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"In-stream video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voice"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accept"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Message"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"To place a call, first turn off Aeroplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Not registered on network."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobile network not available."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"To place a call, enter a valid number."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Can\'t call."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Starting MMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Service not supported."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Can\'t switch calls."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Can\'t separate call."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Can\'t transfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Can\'t conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Can\'t reject call."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Can\'t release call(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP call"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Emergency call"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Turning on radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"No service. Trying again…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Can\'t call. Dial an emergency number."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Use keyboard to dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Hold Call"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Resume Call"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"End Call"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Dial pad"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Mute"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Add call"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Merge calls"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Swap"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Manage calls"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Manage conference call"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Change to voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Switch camera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pause video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"More options"</string>
+ <string name="player_started" msgid="6046262510243983589">"Player Started"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Player Stopped"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Camera not ready"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Camera ready"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Unknown call session event"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Service"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Setup"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Not set>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Other call settings"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Calling via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Incoming via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"contact photo"</string>
+ <string name="goPrivate" msgid="865837794424530980">"go private"</string>
+ <string name="selectContact" msgid="781975788478987237">"select contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancel"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Send"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Answer"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Send SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Decline"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Answer as video call"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Answer as audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accept video transmit request"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Decline video transmit request"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accept video receive request"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Decline video receive request"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sound"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Default sound (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Phone ringtone"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrate when ringing"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringtone & Vibrate"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Manage conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Emergency number"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">1 second</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ <item quantity="one">1 minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hours</item>
+ <item quantity="one">1 hour</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profile photo"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Camera off"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Note sent"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Recent messages"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Business info"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi away"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km away"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Opens tomorrow at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Opens today at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Closes at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Closed today at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Open now"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Closed now"</string>
+</resources>
diff --git a/InCallUI/res/values-es-rUS/strings.xml b/InCallUI/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..f365ecf
--- /dev/null
+++ b/InCallUI/res/values-es-rUS/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Teléfono"</string>
+ <string name="onHold" msgid="9035493194749959955">"En espera"</string>
+ <string name="unknown" msgid="6878797917991465859">"Desconocida"</string>
+ <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
+ <string name="payphone" msgid="4793877574636445118">"Teléfono público"</string>
+ <string name="confCall" msgid="1904840547188336828">"Llamada en conferencia"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Se interrumpió la llamada."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altavoz"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Auricular"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Auriculares con cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"¿Deseas enviar los siguientes tonos?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Enviando tono\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Sí"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Reemplazar el carácter comodín con"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Llamada en conferencia <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Correo de voz"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Marcando"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Volviendo a marcar"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Llamada en conferencia"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Llamada entrante"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Llamada entrante: trabajo"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Llamada finalizada"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Colgando"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"En llamada"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mi número es <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Conectando video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videollamada"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Solicitando video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"No se puede conectar la videollamada."</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Se rechazó la solicitud de videollamada."</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Número de devolución de llamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Número de devolución de llamada de emergencia\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Marcando"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Llamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Llamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Se perdieron las llamadas de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Llamada en curso"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Llamada de trabajo en curso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Llamada por Wi-Fi en curso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Llamada de trabajo con Wi-Fi en curso"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"En espera"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Llamada entrante"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Llamada de trabajo entrante"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Llamada por Wi-Fi entrante"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Llamada de trabajo con Wi-Fi entrante"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Videollamada entrante"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Solicitud de videollamada entrante"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Correo de voz nuevo"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Correo de voz nuevo (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número de correo de voz desconocido"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Sin servicio"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Responder"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Colgar"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video:"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voz"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Aceptar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Descartar"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Llamar"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mensaje"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Para realizar una llamada, primero debes desactivar el modo avión."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"No registrado en la red."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Red móvil no disponible"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar una llamada, ingresa un número válido."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"No se puede realizar la llamada."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciar la secuencia de MMI"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Servicio no admitido"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"No se puede cambiar llamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"No se puede desviar la llamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"No se puede transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"No se puede realizar la conferencia."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"No se puede rechazar la llamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"No se puede liberar llamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Llamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Llamada de emergencia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Encendiendo radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"No hay servicio. Vuelve a intentarlo."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"No se puede realizar la llamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"No se puede realizar la llamada. Marca un número de emergencia."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizar teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Retener llamada"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Reanudar llamada"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Finalizar llamada"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado telefónico"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Silenciar"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Agreg. Llam."</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Combinar llamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Cambiar"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrar llamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Adminis. conferencia"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videollamada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Cambiar a llamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Cambiar cámara"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pausar video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Más opciones"</string>
+ <string name="player_started" msgid="6046262510243983589">"Se inició el reproductor."</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Se detuvo el reproductor."</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"La cámara no está lista."</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Cámara lista"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Evento de sesión de llamada desconocido"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Servicio"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuración"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Sin configurar>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Otras configuraciones de llamada"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Llamada vía <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Recibidas a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto de contacto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"pasar a modo privado"</string>
+ <string name="selectContact" msgid="781975788478987237">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe tu propia respuesta..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancelar"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Enviar"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Responder"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Enviar un mensaje SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rechazar"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Responder como videollamada"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Responder como llamada de audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Aceptar solicitud de video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Rechazar solicitud de video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Aceptar solicitud de transmisión de video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Rechazar solicitud de transmisión de video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Aceptar solicitud de recepción de video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Rechazar solicitud de recepción de video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Deslízate hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Deslízate hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Deslízate hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Deslízate hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sonido"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sonido predeterminado (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Tono del dispositivo"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar al sonar"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Tono y vibración"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Administrar conferencia telefónica"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Número de emergencia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Cámara desactivada"</string>
+ <string name="child_number" msgid="7437330400723805538">"a través del <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Se envió la nota"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mensajes recientes"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Información de la empresa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"A <xliff:g id="DISTANCE">%.1f</xliff:g> millas"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g> y <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Abre mañana a la hora <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Abre hoy a la hora <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Cierra a la hora <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Cerró hoy a la hora <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Abierto ahora"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Cerrado ahora"</string>
+</resources>
diff --git a/InCallUI/res/values-es/strings.xml b/InCallUI/res/values-es/strings.xml
new file mode 100644
index 0000000..df7563c
--- /dev/null
+++ b/InCallUI/res/values-es/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Teléfono"</string>
+ <string name="onHold" msgid="9035493194749959955">"En espera"</string>
+ <string name="unknown" msgid="6878797917991465859">"Desconocido"</string>
+ <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
+ <string name="payphone" msgid="4793877574636445118">"Teléfono público"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conferencia telefónica"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Llamada perdida"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altavoz"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Auricular"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Auriculares"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"¿Quieres enviar los siguientes tonos?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Enviando tonos\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Sí"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Sustituir el carácter comodín por"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conferencia telefónica<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número del buzón de voz"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Llamando"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Marcando otra vez"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conferencia telefónica"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Llamada entrante"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Llamada trabajo entrante"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Llamada finalizada"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Colgando"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Llamada entrante"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mi número es <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>."</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Conectando videollamada"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videollamada"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Solicitando videollamada"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"No se puede establecer la videollamada"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Solicitud de vídeo rechazada"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Tu número de devolución de llamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Tu número de devolución de llamada de emergencia\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Llamando..."</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Llamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Llamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Llamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Llamada en curso"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Llamada de trabajo en curso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Llamada Wi-Fi en curso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Llamada Wi-Fi de trabajo en curso"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"En espera"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Llamada entrante"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Llamada de trabajo entrante"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Llamada Wi-Fi entrante"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Llamada Wi-Fi de trabajo entrante"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Videollamada entrante"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Solicitud de videollamada entrante"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nuevo mensaje de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Buzón de voz nuevo (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número del buzón de voz desconocido"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Sin servicio"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible."</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Responder"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Colgar"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voz"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Aceptar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ignorar"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Llamar"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mensaje"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Para realizar una llamada, primero debes desactivar el modo avión."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"No se ha podido conectar a la red"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"La red móvil no está disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar una llamada, introduce un número válido."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"No se puede establecer la llamada."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciando secuencia MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Servicio no admitido."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"No se pueden intercambiar llamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"No se pueden separar llamadas."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"No se puede transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"No se puede establecer la conferencia."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"No se puede rechazar la llamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"No se pueden hacer llamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Llamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Llamada de emergencia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Activando señal móvil…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Sin servicio. Reintentado…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"No se puede establecer la llamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"No se puede establecer la llamada. Marcar un número de emergencia."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizar teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Retener llamada"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Reanudar llamada"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Finalizar llamada"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Silenciar"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Añadir llamada"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Llamada a tres"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Cambiar"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrar llamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Administrar llamada"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videollamada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Cambiar a llamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Cambiar cámara"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Más opciones"</string>
+ <string name="player_started" msgid="6046262510243983589">"Reproductor iniciado"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Reproductor detenido"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Cámara no preparada"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Cámara preparada"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Evento de sesión de llamada desconocido"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Servicio"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuración"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<No definido>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Otras opciones de llamada"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Llamada vía <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Recibidas a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto de contacto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"llamada privada"</string>
+ <string name="selectContact" msgid="781975788478987237">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe tu propia respuesta..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancelar"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Enviar"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Responder"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rechazar"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Responder como videollamada"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Responder como llamada de audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Aceptar solicitud de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Rechazar solicitud de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Aceptar solicitud de transmisión de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Rechazar solicitud de transmisión de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Aceptar solicitud de recepción de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Rechazar solicitud de recepción de vídeo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Desliza el dedo hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Desliza el dedo hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sonido"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sonido predeterminado (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Tono del teléfono"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar al sonar"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Tono y vibración"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Administrar conferencia telefónica"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Número de emergencia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Cámara apagada"</string>
+ <string name="child_number" msgid="7437330400723805538">"a través de <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mensajes recientes"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Información de la empresa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Abre mañana a las <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Abre hoy a las <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Cierra hoy a las <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Cerrado hoy a las <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Abierto ahora"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Cerrado ahora"</string>
+</resources>
diff --git a/InCallUI/res/values-et-rEE/strings.xml b/InCallUI/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..af7eb2e
--- /dev/null
+++ b/InCallUI/res/values-et-rEE/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Ootel"</string>
+ <string name="unknown" msgid="6878797917991465859">"Tundmatu"</string>
+ <string name="private_num" msgid="6713286113000232309">"Varjatud number"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefoniautomaat"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konverentskõne"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Kõne katkes"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Kõlar"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Käsitelefoni peatelefon"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Juhtmega peakomplekt"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Kas saata järgmised toonid?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Toonide saatmine\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Saada"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Jah"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ei"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Pane metamärgi asemele"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konverentskõne <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Kõnepostinumber"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Valimine"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Uuestivalimine"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konverentskõne"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Sissetulev kõne"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Sissetulev töökõne"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Kõne lõppes"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Ootel"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Lõpetamisel"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Kõne"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Minu number on <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Video ühendamine"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videokõne"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Video taotlemine"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videokõnet ei õnnestu ühendada"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videotaotlus lükati tagasi"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Teie tagasihelistamise number\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Teie hädaabikõne tagasihelistamise number\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Valimine"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Vastamata kõne"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Vastamata kõned"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> vastamata kõnet"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Vastamata kõne helistajalt <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Käimasolev kõne"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Käimasolev töökõne"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Pooleliolev WiFi-kõne"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Käimasolev töökõne WiFi kaudu"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Ootel"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Sissetulev kõne"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Sissetulev töökõne"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Sissetulev WiFi-kõne"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Sissetulev töökõne WiFi kaudu"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Sissetulev videokõne"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Sissetulev videotaotlus"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Uus kõnepost"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Uus kõnepost (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Valige <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Kõneposti number teadmata"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Teenus puudub"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Valitud võrk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) pole saadaval"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Vasta"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Lõpeta kõne"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Hääl"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Nõustu"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Loobumine"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Helista tagasi"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Sõnum"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Helistamiseks lülitage lennurežiim välja."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ei ole võrku registreeritud."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobiilsidevõrk pole saadaval."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Helistamiseks sisestage kehtiv number."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Ei saa helistada."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI-jada alustamine ..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Teenust ei toetata."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kõnesid ei saa vahetada."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kõnet ei saa eraldada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Ei saa üle kanda."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konverentskõnet ei saa pidada."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Kõnet ei saa tagasi lükata."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Kõnet (kõnesid) ei saa vabastada."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-kõne"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Hädaabikõne"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Raadioside sisselülitamine ..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Teenus puudub. Uuesti proovimine ..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Ei saa helistada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ei ole hädaabikõne number."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Ei saa helistada. Valige hädaabinumber."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Kasutage valimiseks klaviatuuri"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Kõne ootele"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Jätka kõnet"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Lõpeta kõne"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Numbriklahvistik"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Summuta"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Lisa kõne"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Ühenda kõned"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Vaheta"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Halda kõnesid"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Halda konverentskõn."</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Heli"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videokõne"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Mine üle häälkõnele"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Vaheta kaamerat"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Peata video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Rohkem valikuid"</string>
+ <string name="player_started" msgid="6046262510243983589">"Pleier käivitati"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Pleier peatati"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kaamera pole valmis"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kaamera on valmis"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Tundmatu kõneseansi sündmus"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Teenus"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Seadistus"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Määramata>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Muud kõneseaded"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Kõne edastab <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Sissetulev kõne teenuse <xliff:g id="PROVIDER_NAME">%s</xliff:g> kaudu"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontakti foto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"aktiveeri privaatrežiim"</string>
+ <string name="selectContact" msgid="781975788478987237">"vali kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kirjutage ise …"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Tühista"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Saada"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Vastamine"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS-i saatmine"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Keeldumine"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Vastamine videokõnena"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Vastamine helikõnena"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Võta videotaotlus vastu"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Lükka videotaotlus tagasi"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Video edastamise taotluse aktsepteerimine"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Video edastamise taotluse tagasilükkamine"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Video vastuvõtmise taotluse aktsepteerimine"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Video vastuvõtmise taotluse tagasilükkamine"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Lohistage üles <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Lohistage vasakule <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Lohistage paremale <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Lohistage alla: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibreerimine"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibreerimine"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Heli"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Vaikeheli (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefonihelin"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibreerimine helina ajal"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Helin ja vibratsioon"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Konverentskõne haldamine"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Hädaabinumber"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundit</item>
+ <item quantity="one">1 sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutit</item>
+ <item quantity="one">1 minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> tundi</item>
+ <item quantity="one">1 tund</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profiilifoto"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kaamera lülitatakse välja"</string>
+ <string name="child_number" msgid="7437330400723805538">"numbri <xliff:g id="CHILD_NUMBER">%s</xliff:g> kaudu"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Märkus on saadetud"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Viimased sõnumid"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Ettevõtte teave"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> miili kaugusel"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km kaugusel"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Avatakse homme kell <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Avatakse täna kell <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Suletakse kell <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Suleti täna kell <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Praegu avatud"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Praegu suletud"</string>
+</resources>
diff --git a/InCallUI/res/values-eu-rES/strings.xml b/InCallUI/res/values-eu-rES/strings.xml
new file mode 100644
index 0000000..fba47c8
--- /dev/null
+++ b/InCallUI/res/values-eu-rES/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefonoa"</string>
+ <string name="onHold" msgid="9035493194749959955">"Zain"</string>
+ <string name="unknown" msgid="6878797917991465859">"Ezezaguna"</string>
+ <string name="private_num" msgid="6713286113000232309">"Zenbaki pribatua"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefono publikoa"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferentzia-deia"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Deia eten da"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Bozgorailua"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Aurikularrak"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kabledun entzungailua"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Ondorengo tonuak bidali?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Tonuak bidaltzen\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Bidali"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Bai"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ez"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Ordeztu komodina honekin:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferentzia-deiaren iraupena: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Erantzungailuaren zenbakia"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Deitzen"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Berriro markatzen"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferentzia-deia"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Sarrerako deia"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Laneko dei bat jaso da"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Deia amaitu da"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Zain"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Deia amaitzen"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Deia abian"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Nire zenbakia <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> da"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Bideoa konektatzen"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Bideo-deia"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Bideoa eskatzen"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Ezin da konektatu bideo-deia"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Baztertu egin da bideo-eskaera"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Deiak itzultzeko zenbakia:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Larrialdi-deiak itzultzeko zenbakia:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Markatzen"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Dei galdua"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Dei galduak"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> dei galdu"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Deitzaile honen dei galdua: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Abian den deia"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Laneko dei bat abian da"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi deia abian"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Wi-Fi bidezko laneko dei bat abian da"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Zain"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Sarrerako deia"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Laneko dei bat jaso da"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Sarrerako Wi-Fi deia"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Wi-Fi bidezko laneko dei bat jaso da"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Sarrerako bideo-deia"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Sarrerako bideo-eskaera"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Ahots-mezu berria"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Ahots-mezu berriak (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Markatu <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Erantzungailuaren zenbakia ezezaguna da"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ez dago zerbitzurik"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Hautatutako sarea (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ez dago erabilgarri"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Erantzun"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Amaitu deia"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Bideoa"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Ahotsa"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Onartu"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Baztertu"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Erantzun deiari"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mezua"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Dei bat egiteko, Hegaldi modua desaktibatu behar duzu."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ez dago sarean erregistratuta."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Sare mugikorra ez dago erabilgarri."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Deitzeko, idatzi balio duen zenbaki bat."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Ezin da deitu."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI sekuentzia hasten…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Ez da onartzen."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Ezin da deiz aldatu."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ezin da deia bereizi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Ezin da transferitu."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Ezin da konferentzia-deirik egin."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Ezin da deia baztertu."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Ezin dira deiak bereizi."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP deia"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Larrialdi-deia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Irratia pizten…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ez dago zerbitzurik. Berriro saiatzen…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Ezin da deitu. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ez da larrialdietarako zenbakia."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Ezin da deitu. Markatu larrialdietarako zenbakia."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Erabili teklatua markatzeko"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Utzi deia zain"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Berrekin deiari"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Amaitu deia"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Markagailua"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Desaktibatu audioa"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Gehitu deia"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Bateratu deiak"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Trukatu"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Kudeatu deiak"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Kudeatu deia"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audioa"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Bideo-deia"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Aldatu ahots-deira"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Aldatu kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pausatu bideoa"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Aukera gehiago"</string>
+ <string name="player_started" msgid="6046262510243983589">"Abian da erreproduzigailua"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Gelditu da erreproduzigailua"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Ez dago prest kamera"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Prest dago kamera"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Dei-saioko gertaera ezezaguna"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Zerbitzua"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfigurazioa"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ezarri gabe>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Deien beste ezarpen batzuk"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> bidez deitzen"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> bidez jasotzen"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontaktuaren argazkia"</string>
+ <string name="goPrivate" msgid="865837794424530980">"bihurtu pribatu"</string>
+ <string name="selectContact" msgid="781975788478987237">"hautatu kontaktua"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Idatzi zeure erantzuna…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Utzi"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Bidali"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Erantzun"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Bidali SMS mezua"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Baztertu"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Erantzun bideo-dei moduan"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Erantzun audio-dei moduan"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Onartu bideo-eskaera"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Ukatu bideo-eskaera"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Onartu bideoa transmititzeko eskaera"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Baztertu bideoa transmititzeko eskaera"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Onartu bideoa jasotzeko eskaera"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Baztertu bideoa jasotzeko eskaera"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Lerratu gora hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Lerratu eskuinera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Lerratu behera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Egin dar-dar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Egin dar-dar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Soinua"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Soinu lehenetsia (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefonoaren tonua"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Egin dar-dar tonua jotzean"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Tonua eta dardara"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Kudeatu konferentzia-deia"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Larrialdietarako zenbakia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundo</item>
+ <item quantity="one">segundo bat</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutu</item>
+ <item quantity="one">minutu bat</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ordu</item>
+ <item quantity="one">ordubete</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profileko argazkia"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamara desaktibatuta dago"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> zenbakitik"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Bidali da oharra"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Azken mezuak"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Enpresaren informazioa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Hemendik <xliff:g id="DISTANCE">%.1f</xliff:g> miliara"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Hemendik <xliff:g id="DISTANCE">%.1f</xliff:g> km-ra"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"<xliff:g id="OPEN_TIME">%s</xliff:g> da biharko irekitze-ordua"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"<xliff:g id="OPEN_TIME">%s</xliff:g> da gaurko irekitze-ordua"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> da itxiera-ordua"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"<xliff:g id="CLOSE_TIME">%s</xliff:g> da gaurko itxiera-ordua"</string>
+ <string name="open_now" msgid="6439301193613349163">"Irekita dago"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Itxita dago"</string>
+</resources>
diff --git a/InCallUI/res/values-fa/strings.xml b/InCallUI/res/values-fa/strings.xml
new file mode 100644
index 0000000..5fc437d
--- /dev/null
+++ b/InCallUI/res/values-fa/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"گوشی"</string>
+ <string name="onHold" msgid="9035493194749959955">"در انتظار"</string>
+ <string name="unknown" msgid="6878797917991465859">"ناشناس"</string>
+ <string name="private_num" msgid="6713286113000232309">"شماره خصوصی"</string>
+ <string name="payphone" msgid="4793877574636445118">"تلفن عمومی"</string>
+ <string name="confCall" msgid="1904840547188336828">"تماس کنفرانسی"</string>
+ <string name="call_lost" msgid="6183862117003999578">"تماس قطع شد"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"بلندگو"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"گوشی"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"هدست سیمی"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"صداهای زیر ارسال شود؟\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"تونهای ارسالی\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"ارسال"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"بله"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"نه"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"جایگزینی نویسه عمومی با"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"تماس کنفرانسی <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"شماره پست صوتی"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"شماره گیری"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"در حال شمارهگیری مجدد"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"تماس کنفرانسی"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"تماس ورودی"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"تماس کاری ورودی"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"تماس پایان یافت"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"در انتظار"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"قطع تماس"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"در تماس"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"شماره من <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> است"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"در حال برقراری تماس ویدیویی"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"تماس ویدیویی"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"درحال درخواست تماس ویدیویی"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"اتصال تماس ویدیویی ممکن نیست"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"درخواست ویدیو رد شد"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"شماره پاسخ تماس شما\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"شماره پاسخ تماس اضطراری شما\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"شمارهگیری"</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_ongoing_call" msgid="7068688957273482989">"تماس جاری"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"تماس کاری خروجی"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"تماس از طریق Wi-Fi در حال انجام است"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"تماس کاری Wi-Fi خروجی"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"در انتظار"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"تماس ورودی"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"تماس کاری ورودی"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"تماس Wi-Fi ورودی"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"تماس کاری Wi-Fi ورودی"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"تماس ویدیویی ورودی"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"درخواست تماس ویدیویی ورودی"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"پست صوتی جدید"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"پست صوتی جدید (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"شماره گیری <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"شماره پست صوتی ناشناس"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"بدون سرویس"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"شبکه انتخابی (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) قابل دسترس نیست"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"پاسخ"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"قطع تماس"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ویدیو"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"صدا"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"پذیرفتن"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ردکردن"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"پاسخ تماس"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"پیام"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"برای برقراری یک تماس، ابتدا حالت هواپیما را خاموش کنید."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"در شبکه ثبت نشده است."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"شبکه تلفن همراه در دسترس نیست."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"برای برقراری تماس، یک شماره معتبر وارد کنید."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"نمیتوانید تماس بگیرید."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"شروع ترتیب MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"سرویس پشتیبانی نمیشود."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"نمیتوانید بین تماسها جابجا شوید."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"نمیتوانید تماس را جدا کنید."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"نمیتوانید انتقال دهید."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"نمیتوانید کنفرانس برگزار کنید."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"نمیتوانید تماس را رد کنید."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"نمیتوانید تماس(ها) را آزاد کنید."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"تماس SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"تماس اضطراری"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"در حال روشن کردن رادیو..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"سرویسی در دسترس نیست. دوباره امتحان کنید..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"نمیتوانید تماس بگیرید. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> یک شماره اضطراری نیست."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"نمی توانید تماس بگیرید. یک شماره اضطراری را شمارهگیری کنید."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"استفاده از صفحهکلید برای شماره گیری"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"نگه داشتن تماس"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"از سرگیری تماس"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"پایان تماس"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"دکمههای شماره گیری"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"بیصدا"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"افزودن تماس"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ادغام تماسها"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"تعویض"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"مدیریت تماسها"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"مدیریت تماس کنفرانسی"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"صوتی"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"تماس ویدیویی"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"تغییر به تماس صوتی"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"تغییر دوربین"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"مکث ویدیو"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"گزینههای بیشتر"</string>
+ <string name="player_started" msgid="6046262510243983589">"پخشکننده راهاندازی شد"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"پخشکننده متوقف شد"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"دوربین آماده نیست"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"دوربین آماده است"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"رویداد جلسه تماس ناشناس"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"سرویس"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"تنظیم"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<تنظیم نشده>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"سایر تنظیمات تماس"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"تماس از طریق <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"تماسهای ورودی از طریق <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"عکس مخاطب"</string>
+ <string name="goPrivate" msgid="865837794424530980">"رفتن به خصوصی"</string>
+ <string name="selectContact" msgid="781975788478987237">"انتخاب حساب"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"نوشتن پاسخ خود…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"لغو"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ارسال"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"پاسخ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"ارسال پیامک"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"نپذیرفتن"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"پاسخ به صورت تماس ویدیویی"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"پاسخ به صورت تماس صوتی"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"پذیرفتن درخواست ویدیو"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"نپذیرفتن درخواست ویدیو"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"پذیرفتن درخواست ارسال ویدیو"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"نپذیرفتن درخواست انتقال ویدیو"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"پذیرفتن درخواست دریافت ویدیو"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"نپذیرفتن درخواست دریافت ویدیو"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به بالا بلغزانید."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به چپ بلغزانید."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به راست بلغزانید."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به پایین بلغزانید."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"لرزش"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"لرزش"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"صدا"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"صدای پیشفرض (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"آهنگ زنگ تلفن"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ارتعاش هنگام زنگ زدن"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"آهنگ زنگ و لرزش"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"مدیریت تماس کنفرانس"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"شماره اضطراری"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ثانیه</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ثانیه</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> دقیقه</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> دقیقه</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ساعت</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ساعت</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"عکس نمایه"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"دوربین خاموش"</string>
+ <string name="child_number" msgid="7437330400723805538">"از طریق <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"یادداشت ارسال شد"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"پیامهای جدید"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"اطلاعات کسب و کار"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> مایل دورتر"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> کیلومتر دورتر"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>، <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> تا <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>، <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"فردا ساعت <xliff:g id="OPEN_TIME">%s</xliff:g> باز میشود"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"امروز ساعت <xliff:g id="OPEN_TIME">%s</xliff:g> باز میشود"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"ساعت <xliff:g id="CLOSE_TIME">%s</xliff:g> بسته میشود"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"امروز ساعت <xliff:g id="CLOSE_TIME">%s</xliff:g> بسته شد"</string>
+ <string name="open_now" msgid="6439301193613349163">"اکنون باز است"</string>
+ <string name="closed_now" msgid="9175774453982778909">"اکنون بسته است"</string>
+</resources>
diff --git a/InCallUI/res/values-fi/strings.xml b/InCallUI/res/values-fi/strings.xml
new file mode 100644
index 0000000..c57059c
--- /dev/null
+++ b/InCallUI/res/values-fi/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Puhelin"</string>
+ <string name="onHold" msgid="9035493194749959955">"Pidossa"</string>
+ <string name="unknown" msgid="6878797917991465859">"Tuntematon"</string>
+ <string name="private_num" msgid="6713286113000232309">"Salainen numero"</string>
+ <string name="payphone" msgid="4793877574636445118">"Maksupuhelin"</string>
+ <string name="confCall" msgid="1904840547188336828">"Puhelinneuvottelu"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Puhelu katkaistu"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Kaiutin"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Puhelimen kuuloke"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Langalliset kuulokkeet"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Lähetäänkö seuraavat äänet?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Lähetetään ääniä\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Lähetä"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Kyllä"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ei"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Muuta jokerimerkiksi"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Puhelinneuvottelu <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Puhelinvastaajan numero"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Soitetaan"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Soitetaan uudelleen"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Puhelinneuvottelu"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Uusi puhelu"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Saapuva työpuhelu"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Puhelu loppui"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Pidossa"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Katkaistaan"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Puhelun aikana"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Numeroni on <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Avataan videoyhteys"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videopuhelu"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Videota pyydetään"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videopuhelua ei voi soittaa"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videopyyntö hylättiin."</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Takaisinsoittonumerosi\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Hätäpuhelujen takaisinsoittonumero\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Soitetaan"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Vastaamatta jäänyt puhelu"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Vastaamattomat puhelut"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> vastaamatonta puhelua"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Vastaamatta jäänyt puhelu numerosta <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Käynnissä oleva puhelu"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Käynnissä oleva työpuhelu"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Käynnissä oleva Wi-Fi-puhelu"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Käynnissä oleva Wi-Fi-työpuhelu"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Pidossa"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Uusi puhelu"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Saapuva työpuhelu"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Saapuva Wi-Fi-puhelu"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Saapuva Wi-Fi-työpuhelu"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Saapuva videopuhelu"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Saapuva videopyyntö"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Uusia viestejä vastaajassa"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Uusia viestejä vastaajassa (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Soita numeroon <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Puhelinvastaajan numero tuntematon"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Katvealueella"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Valittu verkko (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ei käytettävissä."</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Vastaa"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Katkaise puhelu"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Äänipuhelu"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Hyväksy"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Hylkää"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Soita"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Viesti"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Poista lentokonetila käytöstä ennen puhelun soittamista."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ei rekisteröity verkkoon."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Matkapuhelinverkko ei ole käytettävissä."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Soita antamalla kelvollinen numero."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Puhelua ei voi soittaa."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Aloitetaan MMI-koodisekvenssiä..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Yhteyttä ei tueta."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Puhelua ei voi vaihtaa."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Puhelua ei voi erottaa."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Puhelua ei voi siirtää."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Puheluja ei voi yhdistää."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Puhelua ei voi hylätä."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Puheluja ei voi vapauttaa."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-puhelu"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Hätäpuhelu"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Käynnistetään radiota…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ei yhteyttä. Yritetään uudelleen…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Puhelua ei voi soittaa. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ei ole hätänumero."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Puhelua ei voi soittaa. Valitse hätänumero."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Valitse numero näppäimistöstä"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Aseta puhelu pitoon"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Jatka puhelua"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Päätä puhelu"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Näppäimistö"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Äänetön"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Lisää puhelu"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Yhdistä puhelut"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Vaihda"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Hallinnoi puheluita"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Hallinnoi puhelinneuvottelua"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Ääni"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videopuh."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Muuta äänipuheluksi"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Vaihda kameraa"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Keskeytä video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Lisää vaihtoehtoja"</string>
+ <string name="player_started" msgid="6046262510243983589">"Soitin käynnistyi"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Soitin pysähtyi"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera ei ole valmis."</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera on valmis."</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Tuntematon puheluistunnon tapahtuma"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Palveluntarjoaja"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Asetukset"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ei asetettu>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Muut puheluasetukset"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Operaattorilla <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Saapuva puhelu (<xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"yhteyshenkilön valokuva"</string>
+ <string name="goPrivate" msgid="865837794424530980">"muuta yksityiseksi"</string>
+ <string name="selectContact" msgid="781975788478987237">"valitse yhteystieto"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kirjoita oma…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Peruuta"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Lähetä"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Vastaa"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Lähetä tekstiviesti"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Hylkää"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Vastaa ja aloita videopuhelu"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Vastaa ja aloita äänipuhelu"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Hyväksy videopyyntö"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Hylkää videopyyntö"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Hyväksy videon lähetyspyyntö"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Hylkää videon lähetyspyyntö"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Hyväksy videon vastaanottopyyntö"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Hylkää videon vastaanottopyyntö"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla ylös."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla vasemmalle."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla oikealle."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla alas."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Värinä"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Värinä"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Ääni"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Oletusääni (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Puhelimen soittoääni"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Käytä värinää"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Soittoääni ja värinä"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Hallinnoi puhelinneuvottelua"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Hätänumero"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekuntia</item>
+ <item quantity="one">1 sekunti</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuuttia</item>
+ <item quantity="one">1 minuutti</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> tuntia</item>
+ <item quantity="one">1 tunti</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profiilikuva"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera on pois käytöstä."</string>
+ <string name="child_number" msgid="7437330400723805538">"nron <xliff:g id="CHILD_NUMBER">%s</xliff:g> kautta"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Muistiinpano lähetettiin."</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Viimeisimmät viestit"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Yrityksen tiedot"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Etäisyys: <xliff:g id="DISTANCE">%.1f</xliff:g> mailia"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Etäisyys: <xliff:g id="DISTANCE">%.1f</xliff:g> kilometriä"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Aukeaa huomenna kello <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Aukeaa tänään kello <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Sulkeutuu tänään kello <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Sulkeutui tänään kello <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Auki nyt"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Suljettu nyt"</string>
+</resources>
diff --git a/InCallUI/res/values-fr-rCA/strings.xml b/InCallUI/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..ef94516
--- /dev/null
+++ b/InCallUI/res/values-fr-rCA/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Téléphone"</string>
+ <string name="onHold" msgid="9035493194749959955">"En attente"</string>
+ <string name="unknown" msgid="6878797917991465859">"Inconnu"</string>
+ <string name="private_num" msgid="6713286113000232309">"Numéro privé"</string>
+ <string name="payphone" msgid="4793877574636445118">"Cabine téléphonique"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conférence téléphonique"</string>
+ <string name="call_lost" msgid="6183862117003999578">"L\'appel a été interrompu"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Haut-parleur"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Écouteur du combiné"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Écouteurs filaires"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Envoyer les tonalités suivantes?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Envoi des tonalités\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Envoyer"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Oui"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Non"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Remplacer le caractère générique par"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conférence téléphonique <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"N° messagerie vocale"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Numérotation en cours…"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Recomposition en cours..."</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conférence téléphonique"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Appel entrant"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Appel entrant - travail"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Fin de l\'appel"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"En attente"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Fin d\'appel"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Appel en cours"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mon numéro est le <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Connexion de la vidéo en cours…"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Appel vidéo"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Demande de vidéo en cours"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Impossible de connecter l\'appel vidéo"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Demande vidéo refusée"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Votre numéro de rappel :\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Votre numéro de rappel d\'urgence :\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Numérotation en cours…"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Appel manqué"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Appels manqués"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Appel manqué de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Appel en cours"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Appel en cours - travail"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Appel Wi-Fi en cours"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Appel Wi-Fi en cours - travail"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"En attente"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Appel entrant"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Appel entrant - travail"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Appel Wi-Fi entrant"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Appel Wi-Fi entrant - travail"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Appel vidéo entrant"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Demande de vidéo reçue"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nouveau message vocal"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nouveaux messages vocaux (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Composer <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Numéro de messagerie vocale inconnu"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Aucun service"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Réseau sélectionné (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponible"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Répondre"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Raccrocher"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vidéo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Vocal"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accepter"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Fermer"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Rappeler"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Message"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Veuillez désactiver le mode Avion avant de passer un appel."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Non enregistré sur le réseau"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Réseau cellulaire non disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Pour faire un appel, entrez un numéro valide."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Impossible d\'appeler."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Lancement de la séquence IHM..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Service non pris en charge."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Impossible de faire des appels."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Impossible de séparer les appels."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Impossible de transférer."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Impossible de créer la conférence."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Impossible de refuser l\'appel."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Impossible de libérer l\'appel ou les appels."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Appel SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Appel d\'urgence"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Activation du signal radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Aucun service. Nouvel essai en cours..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Appel impossible. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> n\'est pas un numéro d\'urgence."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Appel impossible. Composez un numéro d\'urgence."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilisez le clavier pour composer un numéro."</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Mettre l\'appel en attente"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Reprendre l\'appel"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Mettre fin à l\'appel"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Clavier numérique"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Ignorer"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Autre appel"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Fusionner les appels"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Permuter"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gérer les appels"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gérer conf. téléph."</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Appel vidéo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Passer à un appel vocal"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Changer de caméra"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Interrompre la vidéo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Plus d\'options"</string>
+ <string name="player_started" msgid="6046262510243983589">"Le lecteur a démarré"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Le lecteur a arrêté"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"L\'appareil photo n\'est pas prêt"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"L\'appareil photo est prêt"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Événement inconnu de séance d\'appel"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Service"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuration"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Non défini>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Autres paramètres d\'appel"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Appel via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Appel entrant par <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"photo du contact"</string>
+ <string name="goPrivate" msgid="865837794424530980">"mode privé"</string>
+ <string name="selectContact" msgid="781975788478987237">"sélectionner un contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Réponse personnalisée..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Annuler"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Envoyer"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Répondre"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Envoyer un message texte"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Refuser"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Répondre comme appel vidéo"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Répondre comme appel audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accepter la demande d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Refuser la demande d\'appel vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accepter la demande de transmission vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Refuser la demande de transmission vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accepter la demande de réception vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Refuser la demande de réception vidéo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Faites glisser votre doigt vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Faites glisser votre doigt vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Faire glisser le doigt vers le bas : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibreur"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibreur"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Son"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sonnerie par défaut (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Sonnerie du téléphone"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Mode Vibreur lorsque le tél. sonne"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Sonnerie et vibreur"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gérer la conférence téléphonique"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Numéro d\'urgence"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> seconde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> secondes</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> heure</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> heures</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Photo de profil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Appareil photo désactiver"</string>
+ <string name="child_number" msgid="7437330400723805538">"au moyen du <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Note envoyée"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Messages récents"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Renseignements sur l\'entreprise"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"À <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"À <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> à <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Ouvre demain à <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Ouvre aujourd\'hui à <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Ferme à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"A fermé aujourd\'hui à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Ouvert"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Fermé"</string>
+</resources>
diff --git a/InCallUI/res/values-fr/strings.xml b/InCallUI/res/values-fr/strings.xml
new file mode 100644
index 0000000..1eb2e5b
--- /dev/null
+++ b/InCallUI/res/values-fr/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Téléphone"</string>
+ <string name="onHold" msgid="9035493194749959955">"En attente"</string>
+ <string name="unknown" msgid="6878797917991465859">"Inconnu"</string>
+ <string name="private_num" msgid="6713286113000232309">"Numéro privé"</string>
+ <string name="payphone" msgid="4793877574636445118">"Cabine téléphonique"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conférence tél."</string>
+ <string name="call_lost" msgid="6183862117003999578">"Appel interrompu."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Haut-parleur"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Écouteur du combiné"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Écouteurs filaires"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Envoyer les tonalités suivantes ?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Envoi des tonalités\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Envoyer"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Oui"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Non"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Remplacer le caractère générique par"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conférence téléphonique à <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"N° messagerie vocale"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Appel en cours…"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Rappel en cours..."</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conférence téléphonique"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Appel entrant"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Appel professionnel entrant"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Fin de l\'appel"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"En attente"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Fin de l\'appel.."</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Appel en cours"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mon numéro est le <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Connexion de la vidéo en cours…"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Appel vidéo"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Demande de vidéo en cours…"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Impossible d\'établir la connexion de l\'appel vidéo."</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Demande d\'appel vidéo refusée"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Votre numéro de rappel\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Votre numéro de rappel d\'urgence\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Numérotation en cours…"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Appel manqué"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Appels manqués"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Appel manqué de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Appel en cours"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Appel professionnel en cours"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Appel Wi-Fi en cours"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Appel Wi-Fi professionnel en cours"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"En attente"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Appel entrant"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Appel professionnel entrant"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Appel Wi-Fi entrant"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Appel Wi-Fi professionnel entrant"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Appel vidéo entrant"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Demande de vidéo reçue"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nouveau message vocal"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nouveaux messages vocaux (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Composer le <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Numéro de messagerie vocale inconnu"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Aucun service"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Réseau sélectionné (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponible"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Répondre"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Raccrocher"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vidéo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voix"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accepter"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ignorer"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Rappeler"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Message"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Veuillez d\'abord désactiver le mode Avion, afin d\'effectuer un appel."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Non enregistré sur le réseau."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Réseau mobile non disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Pour émettre un appel, veuillez saisir un numéro valide."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Impossible d\'émettre l\'appel."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Lancement de la séquence IHM..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Service non compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Impossible de changer d\'appel."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Impossible d\'isoler l\'appel."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Transfert impossible."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Impossible de lancer une conférence téléphonique."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Impossible de refuser l\'appel."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Impossible de lancer les appels."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Appel SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Appel d\'urgence"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Activation du signal radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Aucun service disponible. Nouvelle tentative en cours…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Impossible d\'émettre l\'appel. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> n\'est pas un numéro d\'urgence."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Impossible d\'émettre l\'appel. Veuillez composer un numéro d\'urgence."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilisez le clavier pour composer un numéro."</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Mettre l\'appel en attente"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Reprendre l\'appel"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Mettre fin à l\'appel"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Clavier"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Silencieux"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Autre appel"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Fusionner les appels"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Permuter"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gérer les appels"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gérer conférence tél."</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Appel vidéo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Passer à un appel vocal"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Changer de caméra"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Interrompre la vidéo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Plus d\'options"</string>
+ <string name="player_started" msgid="6046262510243983589">"Le lecteur a démarré."</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Le lecteur s\'est arrêté."</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"L\'appareil photo n\'est pas prêt."</string>
+ <string name="camera_ready" msgid="1903335385405807324">"L\'appareil photo est prêt."</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Événement de session d\'appel inconnu"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Service"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuration"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Non défini>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Autres paramètres d\'appel"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Appel via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Appel entrant via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"photo du contact"</string>
+ <string name="goPrivate" msgid="865837794424530980">"mode privé"</string>
+ <string name="selectContact" msgid="781975788478987237">"sélectionner un contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Réponse personnalisée..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Annuler"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Envoyer"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Répondre"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Envoyer un SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Refuser"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Répondre via un appel vidéo"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Répondre via un appel audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accepter la demande d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Refuser la demande d\'appel vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accepter la demande de transmission d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Refuser la demande de transmission d\'appel vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accepter la demande de réception d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Refuser la demande de réception d\'appel vidéo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Faites glisser votre doigt vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Faites glisser votre doigt vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Faire glisser le doigt vers le bas : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibreur"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibreur"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sonnerie"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sonnerie par défaut (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Sonnerie du téléphone"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Mode Vibreur lorsque le tél. sonne"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Sonnerie et vibreur"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gérer la conférence téléphonique"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Numéro d\'urgence"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> seconde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> secondes</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> heure</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> heures</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Photo du profil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Caméra désactivée"</string>
+ <string name="child_number" msgid="7437330400723805538">"via le <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"La note a bien été envoyée."</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Messages récents"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informations sur l\'établissement"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"À <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"À <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Ouvre demain à <xliff:g id="OPEN_TIME">%s</xliff:g>."</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Ouvre aujourd\'hui à <xliff:g id="OPEN_TIME">%s</xliff:g>."</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Ferme à <xliff:g id="CLOSE_TIME">%s</xliff:g>."</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Fermé aujourd\'hui à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Ouvert"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Fermé"</string>
+</resources>
diff --git a/InCallUI/res/values-gl-rES/strings.xml b/InCallUI/res/values-gl-rES/strings.xml
new file mode 100644
index 0000000..d7e48e1
--- /dev/null
+++ b/InCallUI/res/values-gl-rES/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Teléfono"</string>
+ <string name="onHold" msgid="9035493194749959955">"En espera"</string>
+ <string name="unknown" msgid="6878797917991465859">"Descoñecido"</string>
+ <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
+ <string name="payphone" msgid="4793877574636445118">"Teléfono público"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conferencia telefónica"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Chamada interrompida"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altofalante"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Auricular do teléfono"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Auriculares con cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Enviar os seguintes tons?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Enviando tons\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Si"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Non"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Substituír carácter comodín por"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conferencia telefónica ás <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número de correo de voz"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Marcación"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Marcando de novo"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conferencia telefónica"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Chamada entrante"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Chamada traballo entrante"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Chamada finalizada"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Desconectando"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Chamada en curso"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"O meu número é <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Conectando vídeo"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Solicitando vídeo"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Non se pode conectar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Rexeitouse a solicitude de chamada vídeo"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Número de devolución de chamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Número de devolución de chamada de emerxencia\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Marcación"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Chamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Chamada en curso"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Chamada de traballo saínte"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Chamada wifi saínte"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Chamada wifi de traballo saínte"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"En espera"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Chamada entrante"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Chamada de traballo entrante"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Chamada wifi entrante"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Chamada wifi de traballo entrante"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Videochamada entrante"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Solicitude de vídeo entrante"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Novo correo de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Novo correo de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar o <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número de correo de voz descoñecido"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Sen servizo"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Rede seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non dispoñible"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Responder"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Colgar"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voz"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Aceptar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Descartar"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Devolver chamada"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mensaxe"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Para facer unha chamada, primeiro desactiva o modo avión."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Sen rexistro na rede"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rece móbil non dispoñible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar unha chamada, introduce un número válido."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Non se pode chamar."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciando secuencia MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Servizo non compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Non se poden cambiar as chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Non se pode separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Non se pode transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Non se pode establecer a conferencia."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Non se pode rexeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Non se poden desconectar as chamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chamada de emerxencia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Activando radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Sen servizo. Tentando de novo…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Non se pode chamar. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> non é un número de emerxencia."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Non se pode chamar. Marcar un número de emerxencia."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utiliza o teclado para chamar"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Poñer a chamada en espera"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Retomar chamada"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Finalizar chamada"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado de marcación"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Silenciar"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Engadir chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Combinar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Cambiar"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Xestionar chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Xest. conferencia"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videochamada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Cambiar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Cambiar cámara"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Máis opcións"</string>
+ <string name="player_started" msgid="6046262510243983589">"Iniciouse o reprodutor"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Detívose o reprodutor"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"A cámara non está preparada"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"A cámara está preparada"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Evento de sesión de chamada descoñecido"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Servizo"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuración"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Sen configurar>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Outras configuracións de chamada"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Chamada mediante <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Chamadas entrantes a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto do contacto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"activar o modo privado"</string>
+ <string name="selectContact" msgid="781975788478987237">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe a túa propia..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancelar"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Enviar"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Responder"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rexeitar"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Responder como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Responder como chamada de audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Acepta a solicitude de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Rexeita a solicitude de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Acepta a solicitude de transmisión de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Rexeita a solicitude de transmisión de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Acepta a solicitude de recepción de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Rexeita a solicitude de recepción de vídeo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Pasa o dedo cara arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Pasa o dedo cara a dereita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Pasa o dedo cara abaixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Son"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Son predeterminado (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ton de chamada do teléfono"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar ao soar"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ton de chamada e vibración"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Xestionar conferencia telefónica"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Número de emerxencia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">Un segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">Un minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">Unha hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Cámara desactivada"</string>
+ <string name="child_number" msgid="7437330400723805538">"a través do <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Enviouse a nota"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mensaxes recentes"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Información da empresa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi de distancia"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km de distancia"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Abre mañá ás <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Abre hoxe ás <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Pecha ás <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Pechou hoxe ás <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Aberto agora"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Pechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-gu-rIN/strings.xml b/InCallUI/res/values-gu-rIN/strings.xml
new file mode 100644
index 0000000..7f35fc6
--- /dev/null
+++ b/InCallUI/res/values-gu-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ફોન"</string>
+ <string name="onHold" msgid="9035493194749959955">"હોલ્ડ પર"</string>
+ <string name="unknown" msgid="6878797917991465859">"અજાણ્યું"</string>
+ <string name="private_num" msgid="6713286113000232309">"ખાનગી નંબર"</string>
+ <string name="payphone" msgid="4793877574636445118">"પેફોન"</string>
+ <string name="confCall" msgid="1904840547188336828">"કોન્ફરન્સ કૉલ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"કૉલ છૂટ્યો"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"સ્પીકર્સ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"હેન્ડસેટ ઇઅરપીસ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"વાયર્ડ હેડસેટ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"નીચે આપેલ ટોન્સ મોકલીએ?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ટોન્સ મોકલી રહ્યાં છે\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"મોકલો"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"હા"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"નહીં"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"પહોળા વર્ણને આની સાથે બદલો"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"કોન્ફરન્સ કૉલ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"વૉઇસમેઇલ નંબર"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ડાયલ કરી રહ્યાં છે"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ફરી ડાયલ કરી રહ્યાં છે"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"કોન્ફરન્સ કૉલ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"આવનાર કૉલ"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ઇનકમિંગ કાર્ય કૉલ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"કૉલ સમાપ્ત થયો"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"હોલ્ડ પર"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"સમાપ્ત કરી રહ્યાં છે"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"કૉલમાં"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"મારો નંબર <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> છે"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"વિડિઓ કનેક્ટ કરી રહ્યાં છે"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"વિડિઓ કૉલ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"વિડિઓની વિનંતી કરી રહ્યાં છે"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"વિડિઓ કૉલ કનેક્ટ કરી શકાતો નથી"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"વિડિઓ વિનંતી નકારી"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"તમારો કૉલબેક નંબર\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"તમારો કટોકટીનો કૉલબેક નંબર\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ડાયલ કરી રહ્યાં છે"</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_ongoing_call" msgid="7068688957273482989">"ચાલી રહેલ કૉલ"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ચાલી રહેલ કાર્ય કૉલ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ચાલુ Wi-Fi કૉલ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ચાલી રહેલ Wi-Fi કાર્ય કૉલ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"હોલ્ડ પર"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"આવનાર કૉલ"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ઇનકમિંગ કાર્ય કૉલ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"આવનાર Wi-Fi કૉલ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ઇનકમિંગ Wi-Fi કાર્ય કૉલ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ઇન્કમિંગ વિડિઓ કૉલ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"આવનાર વિડિઓ વિનંતી"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"નવો વૉઇસમેઇલ"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"નવો વૉઇસમેઇલ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ડાયલ કરો"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"વૉઇસમેઇલ નંબર અજાણ"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"કોઈ સેવા નથી"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"પસંદ કરેલ નેટવર્ક (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) અનુપલબ્ધ"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"જવાબ"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"સમાપ્ત કરો"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"વિડિઓ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"અવાજ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"સ્વીકારો"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"છોડી દો"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"કૉલ બેક"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"સંદેશ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"કૉલ કરવા માટે, પહેલાં એરપ્લેન મોડને બંધ કરો."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"નેટવર્ક પર નોંધણી કરાયેલ નથી."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"સેલ્યુલર નેટવર્ક ઉપલબ્ધ નથી."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"કૉલ કરવા માટે, માન્ય નંબર દાખલ કરો."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"કૉલ કરી શકાતો નથી."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI અનુક્રમ પ્રારંભ કરી રહ્યાં છે…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"સેવા સમર્થિત નથી."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"કૉલ્સ સ્વિચ કરી શકાતા નથી."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"અલગ કૉલ કરી શકાતો નથી."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"સ્થાનાંતર કરી શકાતું નથી."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"કોન્ફરન્સ કરી શકાતી નથી."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"કૉલ નકારી શકાતો નથી."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"કૉલ(લ્સ) રિલીઝ કરી શકતા નથી."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP કૉલ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"કટોકટીનો કૉલ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"રેડિઓ ચાલુ કરી રહ્યાં છે…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"કોઈ સેવા નથી. ફરી પ્રયાસ કરી રહ્યાં છે…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"કૉલ કરી શકાતો નથી. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> એ કટોકટીનો નંબર નથી."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"કૉલ કરી શકાતો નથી. કટોકટીનો નંબર ડાયલ કરો!"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ડાયલ કરવા માટે કીબોર્ડનો ઉપયોગ કરો"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"કૉલ હોલ્ડ કરો"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"કૉલ ફરી શરૂ કરો"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"કૉલ સમાપ્ત કરો"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ડાયલપેડ"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"મ્યૂટ કરો"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"કૉલ ઉમેરો"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"કૉલ્સ મર્જ કરો"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"સ્વેપ"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"કૉલ્સ સંચાલિત કરો"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"કોન્ફરન્સ કૉલ સંચાલિત કરો"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ઑડિઓ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"વિડિઓ કૉલ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"વૉઇસ કૉલ પર બદલો"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"કૅમેરાને સ્વિચ કરો"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"વિડિઓ થોભાવો"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"વધુ વિકલ્પો"</string>
+ <string name="player_started" msgid="6046262510243983589">"પ્લેયર પ્રારંભ કર્યું"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"પ્લેયર બંધ કર્યું"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"કૅમેરો તૈયાર નથી"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"કૅમેરો તૈયાર"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"અજાણી કૉલ સત્ર ઇવેન્ટ"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"સેવા"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"સેટઅપ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<સેટ કરેલ નથી>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"અન્ય કૉલ સેટિંગ્સ"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> મારફતે કૉલ કરે છે"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> મારફતે આવનારા"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"સંપર્ક ફોટો"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ખાનગી જાઓ"</string>
+ <string name="selectContact" msgid="781975788478987237">"સંપર્ક પસંદ કરો"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"તમારો પોતાનો લખો…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"રદ કરો"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"મોકલો"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"જવાબ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS મોકલો"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"નકારો"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"વિડિઓ કૉલ તરીકે જવાબ આપો"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ઑડિઓ કૉલ તરીકે જવાબ આપો"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"વિડિઓ વિનંતી સ્વીકારો"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"વિડિઓ વિનંતી નકારો"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"વિડિઓ ટ્રાંસ્મિટ વિનંતી સ્વીકારો"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"વિડિઓ ટ્રાંસ્મિટ વિનંતી નકારો"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"વિડિઓ પ્રાપ્તિ વિનંતી સ્વીકારો"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"વિડિઓ પ્રાપ્તિ વિનંતી નકારો"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ઉપર સ્લાઇડ કરો."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ડાબે સ્લાઇડ કરો."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે જમણે સ્લાઇડ કરો."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે નીચે સ્લાઇડ કરો"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"વાઇબ્રેટ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"વાઇબ્રેટ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ધ્વનિ"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ડિફોલ્ટ ધ્વનિ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ફોન રિંગટોન"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"જ્યારે રિંગ કરે ત્યારે વાઇબ્રેટ કરો"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"રિંગટોન અને વાઇબ્રેટ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"કોન્ફરન્સ કૉલ સંચાલિત કરો"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"કટોકટીનો નંબર"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> સેકન્ડ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> સેકન્ડ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> મિનિટ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> મિનિટ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> કલાક</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> કલાક</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"પ્રોફાઇલ ફોટો"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"કૅમેરો બંધ"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> મારફતે"</string>
+ <string name="note_sent" msgid="3548700178238244595">"નોંધ મોકલી"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"તાજેતરનાં સંદેશા"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"વ્યવસાયની માહિતી"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> માઇલ દૂર"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> કિમી દૂર"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"આવતીકાલે <xliff:g id="OPEN_TIME">%s</xliff:g> વાગ્યે ખુલશે"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"આજે <xliff:g id="OPEN_TIME">%s</xliff:g> વાગ્યે ખુલશે"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> વાગ્યે બંધ થશે"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"આજે <xliff:g id="CLOSE_TIME">%s</xliff:g> વાગ્યે બંધ થયેલું"</string>
+ <string name="open_now" msgid="6439301193613349163">"હમણાં ખોલો"</string>
+ <string name="closed_now" msgid="9175774453982778909">"અત્યારે બંધ કર્યું"</string>
+</resources>
diff --git a/InCallUI/res/values-hi/strings.xml b/InCallUI/res/values-hi/strings.xml
new file mode 100644
index 0000000..0f5d1ab
--- /dev/null
+++ b/InCallUI/res/values-hi/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"फ़ोन"</string>
+ <string name="onHold" msgid="9035493194749959955">"होल्ड पर"</string>
+ <string name="unknown" msgid="6878797917991465859">"अज्ञात"</string>
+ <string name="private_num" msgid="6713286113000232309">"निजी नंबर"</string>
+ <string name="payphone" msgid="4793877574636445118">"पे-फ़ोन"</string>
+ <string name="confCall" msgid="1904840547188336828">"कॉन्फ़्रेंस कॉल"</string>
+ <string name="call_lost" msgid="6183862117003999578">"कॉल कट गया"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"स्पीकर"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"हैंडसेट ईयरपीस"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"वायर वाला हेडसेट"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ब्लूटूथ"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"निम्न टोन भेजें?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"भेजने वाली टोन\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"भेजें"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"हां"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"नहीं"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"वाइल्ड वर्ण को इससे बदलें:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"कॉन्फ़्रेंस कॉल <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ध्वनिमेल नबंर"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"डायल कर रहा है"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"पुन: डायल हो रहा है"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"कॉन्फ़्रेंस कॉल"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"इनकमिंग कॉल"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"कार्यस्थल की आवक कॉल"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"कॉल समाप्त"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"होल्ड पर"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"कॉल समाप्त हो रहा है"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"कॉल में"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"मेरा नंबर <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> है"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"वीडियो कनेक्ट हो रहा है"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"वीडियो कॉल"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"वीडियो का अनुरोध किया जा रहा है"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"वीडियो कॉल कनेक्ट नहीं किया जा सकता"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"वीडियो अनुरोध अस्वीकार किया गया"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"आपका कॉलबैक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"आपका आपातकालीन कॉलबैक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"डायल हो रहा है"</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_ongoing_call" msgid="7068688957273482989">"चल रही कॉल"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"कार्यस्थल की जारी कॉल"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"चल रहा वाई-फ़ाई कॉल"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"कार्यस्थल की जारी वाई-फ़ाई कॉल"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"होल्ड पर"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"इनकमिंग कॉल"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"कार्यस्थल की आवक कॉल"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"इनकमिंग वाई-फ़ाई कॉल"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"कार्यस्थल की वाई-फ़ाई आवक कॉल"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"इनकमिंग वीडियो कॉल"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"इनकमिंग वीडियो अनुरोध"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"नया वॉयस मेल"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"नई वॉयस मेल (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> डायल करें"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"वॉयस मेल नंबर अज्ञात"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"कोई सेवा नहीं"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"चयनित नेटवर्क (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) अनुपलब्ध"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"उत्तर दें"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"समाप्त करें"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"वीडियो"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ध्वनि"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"स्वीकार करें"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ख़ारिज करें"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"वापस कॉल करें"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"संदेश"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"कॉल करने के लिए, पहले विमान मोड बंद करें."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"नेटवर्क पर पंजीकृत नहीं."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"सेल्युलर नेटवर्क उपलब्ध नहीं."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"कॉल करने के लिए, मान्य नंबर डालें."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"कॉल नहीं किया जा सकता."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI अनुक्रम प्रारंभ हो रहा है…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"सेवा समर्थित नहीं है."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"कॉल स्विच नहीं किए जा सकते."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"कॉल अलग नहीं किया जा सकता."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"ट्रांसफर नहीं किया जा सकता."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"कॉन्फ़्रेंस नहीं की जा सकती."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"कॉल अस्वीकार नहीं किया जा सकता."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"कॉल रिलीज़ नहीं किया जा सकता (किए जा सकते)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP कॉल"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"आपातकालीन कॉल"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"रेडियो चालू कर रहा है..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"कोई सेवा नहीं. पुन: प्रयास किया जा रहा है…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"कॉल नहीं किया जा सकता. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> एक आपातकालीन नंबर नहीं है."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"कॉल नहीं किया जा सकता. आपातकालीन नबर डायल करें."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"डायल करने के लिए कीबोर्ड का उपयोग करें"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"कॉल होल्ड करें"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"कॉल फिर से शुरू करें"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"कॉल समाप्त करें"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"डायलपैड"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"म्यूट करें"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"कॉल जोड़ें"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"कॉल मर्ज करें"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"स्वैप करें"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"कॉल प्रबंधित करें"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"कॉन्फ़्रेंस कॉल प्रबंधित करें"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ऑडियो"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"वीडियो कॉल"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ध्वनि कॉल में बदलें"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"कैमरा स्विच करें"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"वीडियो रोकें"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"अधिक विकल्प"</string>
+ <string name="player_started" msgid="6046262510243983589">"प्लेयर प्रारंभ हो गया"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"प्लेयर रुक गया"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"कैमरा तैयार नहीं है"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"कैमरा तैयार है"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"अज्ञात कॉल सत्र ईवेंट"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"सेवा"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"सेटअप"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<सेट नहीं है>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"अन्य कॉल सेटिंग"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"कॉल <xliff:g id="PROVIDER_NAME">%s</xliff:g> से जा रही है"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> की ओर से इनकमिंग"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"संपर्क का फ़ोटो"</string>
+ <string name="goPrivate" msgid="865837794424530980">"निजी हो जाएं"</string>
+ <string name="selectContact" msgid="781975788478987237">"संपर्क को चुनें"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"अपना स्वयं का लिखें..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"अभी नहीं"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"भेजें"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"उत्तर"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS भेजें"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"अस्वीकार करें"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"वीडियो कॉल के रूप में उत्तर दें"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ऑडियो कॉल के रूप में उत्तर दें"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"वीडियो अनुरोध स्वीकार करें"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"वीडियो अनुरोध अस्वीकार करें"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"वीडियो प्रसारण अनुरोध स्वीकार करें"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"वीडियो प्रसारण अनुरोध अस्वीकार करें"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"वीडियो प्राप्ति अनुरोध स्वीकार करें"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"वीडियो प्राप्ति अनुरोध अस्वीकार करें"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए ऊपर स्लाइड करें."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए बाएं स्लाइड करें."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए दाएं स्लाइड करें."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> के लिए नीचे स्लाइड करें."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"कंपन करें"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"कंपन करें"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ध्वनि"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"डिफ़ॉल्ट ध्वनि (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"फ़ोन रिंगटोन"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"रिंग आने पर कंपन करें"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"रिंगटोन और कंपन"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"कॉन्फ़्रेंस कॉल प्रबंधित करें"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"आपातकालीन नंबर"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> सेकंड</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंड</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> मिनट</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> मिनट</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> घंटे</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> घंटे</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"प्रोफ़ाइल फ़ोटो"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"कैमरा बंद है"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> के द्वारा"</string>
+ <string name="note_sent" msgid="3548700178238244595">"नोट भेज दिया गया है"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"हाल ही के संदेश"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"व्यवसाय जानकारी"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> मील दूर"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> किमी दूर"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"कल <xliff:g id="OPEN_TIME">%s</xliff:g> बजे खुलता है"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"आज <xliff:g id="OPEN_TIME">%s</xliff:g> बजे खुलता है"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> बजे बंद होता है"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> बजे बंद हो गया"</string>
+ <string name="open_now" msgid="6439301193613349163">"अभी खुला है"</string>
+ <string name="closed_now" msgid="9175774453982778909">"अभी बंद है"</string>
+</resources>
diff --git a/InCallUI/res/values-hr/strings.xml b/InCallUI/res/values-hr/strings.xml
new file mode 100644
index 0000000..519af26
--- /dev/null
+++ b/InCallUI/res/values-hr/strings.xml
@@ -0,0 +1,195 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Na čekanju"</string>
+ <string name="unknown" msgid="6878797917991465859">"Nepoznato"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privatni broj"</string>
+ <string name="payphone" msgid="4793877574636445118">"Javna telefonska govornica"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferencijski poziv"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Poziv je prekinut"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Zvučnik"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Slušalice"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Žičane slušalice"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Poslati sljedeće tonove?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Slanje tonova\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Pošalji"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Da"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ne"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Zamijeni zamjenski znak s"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferencijski poziv <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Broj govorne pošte"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Biranje broja"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Ponovno biranje"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferencijski poziv"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Dolazni poziv"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Dolazni poslovni poziv"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Poziv je završio"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Na čekanju"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Prekidanje veze"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Poziv u tijeku"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Moj broj je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Povezivanje videopoziva"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videopoziv"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Zahtijevanje videopiziva"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videopoziv nije uspostavljen"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Zahtjev za videopoziv odbijen"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Vaš broj za povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Vaš broj za povratni poziv za hitne službe\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Biranje broja"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Propušteni poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Broj propuštenih poziva: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Propušten poziv kontakta <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Poziv u tijeku"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Poslovni poziv u tijeku"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi poziv u tijeku"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Poslovni Wi-Fi poziv u tijeku"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Na čekanju"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Dolazni poziv"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Dolazni poslovni poziv"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Dolazni Wi-Fi poziv"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Dolazni poslovni Wi-Fi poziv"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Dolazni videopoziv"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Dolazni zahtjev za videopoziv"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nova govorna pošta"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nova govorna pošta (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Biraj <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nepoznat je broj govorne pošte"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nema usluge"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Odabrana mreža (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) je onemogućena"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Odgovori"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Prekini vezu"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Videozapis"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Glasovno"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Prihvaćam"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Odbaci"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Povratni poziv"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Poruka"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Da biste uspostavili poziv, prvo isključite način rada u zrakoplovu."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nije registrirano na mreži."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilna mreža nije dostupna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Unesite važeći broj da biste uspostavili poziv."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Pozivanje nije moguće."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Pokretanje MMI sekvence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Usluga nije podržana."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Prebacivanje poziva nije moguće."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Odvajanje poziva nije moguće."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Prijenos nije moguć."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferencijski poziv nije moguć."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Odbijanje poziva nije moguće."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Prekidanje poziva nije moguće."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP poziv"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Hitan poziv"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Uključivanje radija…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nema usluge. Pokušavamo ponovo…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Pozivanje nije moguće. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nije broj hitne službe."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Pozivanje nije moguće. Nazovite broj hitne službe."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Birajte pomoću tipkovnice"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Stavi poziv na čekanje"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Nastavi poziv"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Završi poziv"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Površina za biranje brojeva"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Isključi zvuk"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Dodaj poziv"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Spoji pozive"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Zamijeni"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Upravljaj pozivima"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Upravljaj konferencijskim pozivom"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Zvuk"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videopoziv"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Prijeđi na glasovni poziv"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Prebaci se na drugi fotoaparat"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pauziraj video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Više opcija"</string>
+ <string name="player_started" msgid="6046262510243983589">"Igrač je pokrenuo"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Igrač je prekinuo"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Fotoaparat nije spreman"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Fotoaparat je spreman"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Nepoznati događaj sesije poziva"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Usluga"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Postavljanje"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nije postavljeno>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Ostale postavke poziva"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Poziv preko <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Dolazni pozivi putem davatelja <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontakt fotografija"</string>
+ <string name="goPrivate" msgid="865837794424530980">"na privatno"</string>
+ <string name="selectContact" msgid="781975788478987237">"odabir kontakta"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite odgovor..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Odustani"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Pošalji"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Odgovori"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Pošalji SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Odbij"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Prihvati kao videopoziv"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Prihvati kao audiopoziv"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Prihvati zahtjev za videozapis"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Odbij zahtjev za videozapis"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Prihvati zahtjev za slanje videopoziva"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Odbij zahtjev za slanje videopoziva"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Prihvati zahtjev za primanje videopoziva"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Odbij zahtjev za primanje videopoziva"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Kliznite prema gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Kliznite desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Kliznite prema dolje za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibracija"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibracija"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Zvuk"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Zadani zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Melodija zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrira dok zvoni"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Melodija zvona i vibracija"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Upravljanje konferencijskim pozivom"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Broj hitne službe"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sat</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sata</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sati</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Fotografija na profilu"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Fotoaparat je isključen"</string>
+ <string name="child_number" msgid="7437330400723805538">"putem <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Bilješka je poslana"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nedavne poruke"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informacije o tvrtki"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi udaljenosti"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km udaljenosti"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Otvara se sutra u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Otvara se danas u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Zatvara se u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Zatvoreno danas u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Trenutačno otvoreno"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Trenutačno zatvoreno"</string>
+</resources>
diff --git a/InCallUI/res/values-hu/strings.xml b/InCallUI/res/values-hu/strings.xml
new file mode 100644
index 0000000..5c33e12
--- /dev/null
+++ b/InCallUI/res/values-hu/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Tartásban"</string>
+ <string name="unknown" msgid="6878797917991465859">"Ismeretlen"</string>
+ <string name="private_num" msgid="6713286113000232309">"Magántelefonszám"</string>
+ <string name="payphone" msgid="4793877574636445118">"Nyilvános telefon"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferenciahívás"</string>
+ <string name="call_lost" msgid="6183862117003999578">"A hívás megszakadt"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Hangszóró"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Kézibeszélő fülhallgatója"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Vezetékes fülhallgató"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Elküldi a következő hangjelzéseket?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Hangjelzések küldése\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Küldés"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Igen"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nem"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Helyettesítő karakter lecserélése a következővel:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferenciahívás: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Hangposta száma"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Tárcsázás"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Újratárcsázás"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenciahívás"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Bejövő hívás"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Bejövő munkahelyi hívás"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"A hívás befejeződött"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Tartásban"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Megszakítás"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Hívásban"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"A számom: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Videó csatlakoztatása"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videohívás"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Videohívást kér"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"A videohívás létesítése sikertelen"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videokérelem elutasítva"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Visszahívható telefonszáma\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Vészhelyzet esetén visszahívható telefonszáma\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Tárcsázás"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Nem fogadott hívás"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Nem fogadott hívások"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> nem fogadott hívás"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Nem fogadott hívás: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Hívás folyamatban"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Folyamatban lévő munkahelyi hívás"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Folyamatban lévő Wi-Fi-hívás"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Folyamatban lévő munkahelyi hívás Wi-Fin keresztül"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Tartásban"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Bejövő hívás"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Bejövő munkahelyi hívás"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Beérkező Wi-Fi-hívás"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Bejövő munkahelyi hívás Wi-Fin keresztül"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Bejövő videohívás"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Bejövő videokérés"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Új hangposta"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Új hangpostaüzenet (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> tárcsázása"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"A hangposta száma ismeretlen"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nincs szolgáltatás"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"A kiválasztott hálózat (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nem érhető el"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Fogadás"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Hívás befejezése"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Videó"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Hang"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Elfogadás"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Elvetés"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Visszahívás"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Üzenet"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Híváskezdeményezéshez kapcsolja ki a Repülőgép üzemmódot."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nincs regisztrálva a hálózaton."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"A mobilhálózat nem érhető el."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Hívásindításhoz adjon meg egy érvényes számot."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"A hívás sikertelen."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI-sorozat indítása..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"A szolgáltatás nem támogatott."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"A hívások közötti váltás sikertelen."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"A híváselkülönítés sikertelen."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Az átirányítás sikertelen."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"A konferenciahívás sikertelen."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"A híváselutasítás sikertelen."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"A tartásban lévő hívás(ok) folytatása sikertelen."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-hívás"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Segélyhívás"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Rádió bekapcsolása..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nincs szolgáltatás. Újrapróbálkozás folyamatban…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"A hívás sikertelen. A(z) <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> szám nem segélyhívószám."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"A hívás sikertelen. Tárcsázzon segélyhívószámot."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"A tárcsázáshoz használja a billentyűzetet"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Hívás tartása"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Hívás folytatása"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Hívás befejezése"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Tárcsázó"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Lezárás"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Hívás hozzáadása"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Hívások egyesítése"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Csere"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Hívások kezelése"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Konferenciahívás kezelése"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Hang"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videohívás"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Váltás hanghívásra"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Kamera váltása"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Videó szüneteltetése"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"További lehetőségek"</string>
+ <string name="player_started" msgid="6046262510243983589">"A lejátszó elindult"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"A lejátszó leállt"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"A kamera nem áll készen"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"A kamera készen áll"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Ismeretlen hívási esemény"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Szolgáltatás"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Beállítás"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nincs megadva>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Egyéb hívásbeállítások"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Hívás (<xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Bejövő hívás a következőn keresztül: <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"ismerős fotója"</string>
+ <string name="goPrivate" msgid="865837794424530980">"magánbeszélgetés"</string>
+ <string name="selectContact" msgid="781975788478987237">"névjegy kijelölése"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Saját válasz írása..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Mégse"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Küldés"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Fogadás"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS küldése"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Elutasítás"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Fogadás videohívásként"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Fogadás hanghívásként"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Videó kérésének elfogadása"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Videó kérésének elutasítása"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Videoküldési kérés elfogadása"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Videoküldési kérés elutasítása"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Videofogadási kérés elfogadása"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Videofogadási kérés elutasítása"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa felfelé."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa jobbra."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa lefelé."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Rezgés"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Rezgés"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Hang"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Alapértelmezett hang (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefon csengőhangja"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Csengetéskor rezegjen"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Csengőhang és rezgés"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Konferenciahívás kezelése"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Segélyhívó szám"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> másodperc</item>
+ <item quantity="one">1 másodperc</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> perc</item>
+ <item quantity="one">1 perc</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> óra</item>
+ <item quantity="one">1 óra</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilfotó"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera ki"</string>
+ <string name="child_number" msgid="7437330400723805538">"a következő számon keresztül: <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Üzenet elküldve"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Legutóbbi üzenetek"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Cég adatai"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mérföldre"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> kilométerre"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Holnap ekkor nyit: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Ma ekkor nyit: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Ekkor zár: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Zárva ma ekkor: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Jelenleg nyitva van"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Jelenleg zárva van"</string>
+</resources>
diff --git a/InCallUI/res/values-hy-rAM/strings.xml b/InCallUI/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..130ff4c
--- /dev/null
+++ b/InCallUI/res/values-hy-rAM/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Հեռախոս"</string>
+ <string name="onHold" msgid="9035493194749959955">"Սպասում"</string>
+ <string name="unknown" msgid="6878797917991465859">"Անհայտ"</string>
+ <string name="private_num" msgid="6713286113000232309">"Գաղտնի համար"</string>
+ <string name="payphone" msgid="4793877574636445118">"Բջջային տերմինալ"</string>
+ <string name="confCall" msgid="1904840547188336828">"Կոնֆերանս զանգ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Զանգը դադարեցվեց"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Բարձրախոս"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Հեռախոսի ականջակալ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Լարային ականջակալ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Ուղարկե՞լ հետևյալ ձայներանգները:\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Ձայներանգների առաքում\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Ուղարկել"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Այո"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ոչ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Փոխարինել կոպիտ գրանշանը"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Կոնֆերանս զանգ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Ձայնային փոստի համարը"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Համարարկվում է"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Վերահամարարկում"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Կոնֆերանս զանգ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Մուտքային զանգ"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Մուտքային աշխատանքային զանգ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Զանգն ավարտվեց"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Սպասում է"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Կապվում է"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Զանգը միացված է"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Իմ համարը՝ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Տեսակապը միանում է"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Տեսազանգել"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Տեսակապի հայցում"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Հնարավոր չէ կապակցել տեսազանգը"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Տեսազանգի հարցումը մերժվել է"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Ձեր հետադարձ զանգի համարը՝\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Արտակարգ իրավիճակների հետադարձ զանգի համարը՝\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Համարարկում է"</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_ongoing_call" msgid="7068688957273482989">"Ընթացիկ զանգը"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Ընթացիկ աշխատանքային զանգ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ընթացիկ զանգ Wi-Fi-ի միջոցով"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Ընթացիկ աշխատանքային Wi-Fi զանգ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Սպասում"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Մուտքային զանգ"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Մուտքային աշխատանքային զանգ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Մուտքային զանգ Wi-Fi-ի միջոցով"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Մուտքային աշխատանքային Wi-Fi զանգ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Մուտքային տեսազանգ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Մուտքային տեսազանգի հայցում"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Նոր ձայնային հաղորդագրություն"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Նոր ձայնային նամակ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Զանգել <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Ձայնային փոստի համարն անհայտ է"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ծառայություններ չկան"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Ընտրված ցանցը (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) անհասանելի է"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Պատասխանել"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Վայր դնել"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Տեսազանգ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Ձայնային"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Ընդունել"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Անտեսել"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Հետ զանգել"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Ուղարկել հաղորդագրություն"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Զանգի կատարման համար նախ անջատեք թռիչքային ռեժիմը:"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ցանցում գրանցված չէ:"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Բջջային ցանցն անհասանելի է:"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Զանգ կատարելու համար մուտքագրեք ճիշտ համար:"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Հնարավոր չէ զանգել:"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Մեկնարկում է MMI հաջորդականությունը..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Ծառայությունը չի աջակցվում:"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Հնարավոր չէ փոխանջատել զանգը:"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Հնարավոր չէ առանձնացնել զանգը:"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Հնարավոր չէ փոխանցել:"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Հնարավոր չէ խմբային զանգ կատարել:"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Հնարավոր չէ մերժել զանգը:"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Հնարավոր չէ անջատել զանգ(եր)ը:"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP զանգ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Արտակարգ իրավիճակների զանգ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ռադիոն միացվում է..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ծառայությունը մատչելի չէ: Նորից փորձեք…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Հնարավոր չէ զանգել: <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> համարը արտակարգ իրավիճակի համար չէ:"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Հնարավոր չէ զանգել: Հավաքեք արտակարգ իրավիճակի որևէ համար:"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Օգտագործեք ստեղնաշարը՝ համարհավաքման համար"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Հետաձգել զանգը"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Վերսկսել զանգը"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Ավարտել զանգը"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Թվաշար"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Խլացնել"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Ավելացնել զանգ"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Միավորել զանգերը"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Փոխանակել"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Կառավարել զանգերը"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Կառավարել կոնֆերանս զանգը"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Ձայնանյութ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Տեսազանգել"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Փոխարկել ձայնային կանչի"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Փոխարկել խցիկը"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Դադարեցնել տեսանյութի դիտումը"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Այլ ընտրանքներ"</string>
+ <string name="player_started" msgid="6046262510243983589">"Նվագարկիչը մեկնարկել է"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Նվագարկիչը դադարեցվել է"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Տեսախցիկը պատրաստ չէ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Տեսախցիկը պատրաստ է"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Զանգի աշխատաշրջանի անհայտ իրադարձություն"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Ծառայություն"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Կարգավորում"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Նշված չէ>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Այլ զանգերի կարգավորումներ"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Զանգ <xliff:g id="PROVIDER_NAME">%s</xliff:g>-ի միջոցով"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Մուտքային զանգ <xliff:g id="PROVIDER_NAME">%s</xliff:g>-ի ցանցից"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"կոնտակտի լուսանկարը"</string>
+ <string name="goPrivate" msgid="865837794424530980">"Անցնել անձնականի"</string>
+ <string name="selectContact" msgid="781975788478987237">"ընտրել կոնտակտ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Գրեք ձեր սեփականը..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Չեղարկել"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Ուղարկել"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Պատասխանել"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Ուղարկել SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Մերժել"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Պատասխանել տեսազանգով"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Պատասխանել ձայնային զանգով"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Ընդունել տեսանյութի հարցումը"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Մերժել տեսանյութի հարցումը"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Ընդունել տեսափոխանցման հարցումը"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Մերժել տեսափոխանցման հարցումը"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Ընդունել տեսազանգ ստանալու հարցումը"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Մերժել տեսազանգ ստանալու հարցումը"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Սահեցրեք վերև` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Սահեցրեք աջ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Սահեցրեք ցած <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ի համար:"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Թրթռալ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Թրթռալ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Ձայն"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Լռելյայն ձայներանգը (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Հեռախոսի զանգերանգ"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Թրթռալ զանգի ժամանակ"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ձայներանգ & Թրթռոց"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Կառավարեք կոնֆերանս զանգը"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Արտակարգ իրավիճակների հեռախոսահամար"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> վայրկյան</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> վայրկյան</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> րոպե</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> րոպե</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ժամ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ժամ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Պրոֆիլի լուսանկար"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Խցիկն անջատված է"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>-ի միջոցով"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Գրառումը ուղարկված է"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Վերջին հաղորդագրությունները"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Բիզնես տեղեկատվություն"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> մղոն հեռու"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> կմ հեռու"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Բացվում է վաղը ժամը <xliff:g id="OPEN_TIME">%s</xliff:g>-ին"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Բացվում է այսօր ժամը <xliff:g id="OPEN_TIME">%s</xliff:g>-ին"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Փակվում է ժամը <xliff:g id="CLOSE_TIME">%s</xliff:g>-ին"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Փակվել է այսօր ժամը <xliff:g id="CLOSE_TIME">%s</xliff:g>-ին"</string>
+ <string name="open_now" msgid="6439301193613349163">"Հիմա բաց է"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Հիմա փակ է"</string>
+</resources>
diff --git a/InCallUI/res/values-in/strings.xml b/InCallUI/res/values-in/strings.xml
new file mode 100644
index 0000000..444e952
--- /dev/null
+++ b/InCallUI/res/values-in/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Ponsel"</string>
+ <string name="onHold" msgid="9035493194749959955">"Ditangguhkan"</string>
+ <string name="unknown" msgid="6878797917991465859">"Tidak diketahui"</string>
+ <string name="private_num" msgid="6713286113000232309">"Nomor pribadi"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telepon Umum"</string>
+ <string name="confCall" msgid="1904840547188336828">"Telewicara"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Panggilan terputus"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Earpiece handset"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Headset berkabel"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Kirimkan nada berikut?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Mengirimkan nada\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Kirimkan"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ya"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Tidak"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Ganti karakter acak dengan"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Telewicara <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nomor kotak pesan"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Memanggil"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Memanggil ulang"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Telewicara"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Panggilan masuk"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Panggilan telepon kerja yang masuk"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Panggilan diakhiri"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Ditangguhkan"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Menutup panggilan"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Sedang dalam panggilan"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Nomor saya <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Menyambungkan video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Meminta video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Tidak dapat menyambungkan video call"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Permintaan video ditolak"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Nomor panggilan balik Anda\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Nomor panggilan balik darurat Anda\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Memanggil"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Panggilan tak terjawab"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Panggilan tak terjawab"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> panggilan tak terjawab"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Panggilan tak terjawab dari <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Panggilan yang sedang berlangsung"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Panggilan telepon kerja yang sedang berlangsung"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Panggilan Wi-Fi keluar"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Panggilan Wi-Fi kerja yang sedang berlangsung"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Ditangguhkan"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Panggilan masuk"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Panggilan telepon kerja yang masuk"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Panggilan Wi-Fi masuk"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Panggilan telepon Wi-Fi kerja yang masuk"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Video call masuk"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Permintaan video masuk"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Kotak pesan baru"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Kotak pesan baru (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Telepon <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nomor kotak pesan tidak dikenal"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Tidak ada layanan"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Jaringan yang dipilih (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) tidak tersedia"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Jawab"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Akhiri"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Suara"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Terima"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Tutup"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Telepon"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Pesan"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Untuk melakukan panggilan, pertama-tama matikan mode Pesawat."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Tidak terdaftar pada jaringan."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Jaringan seluler tidak tersedia."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Untuk melakukan panggilan telepon, masukkan nomor yang valid."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Tidak dapat menelepon."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Memulai urutan MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Layanan tidak didukung."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Tidak dapat berganti panggilan telepon."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Tidak dapat memisahkan panggilan telepon."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Tidak dapat mentransfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Tidak dapat melakukan konferensi."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Tidak dapat menolak panggilan telepon."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Tidak dapat melepas panggilan telepon."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Panggilan SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Panggilan darurat"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Menghidupkan radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Tidak ada layanan. Mencoba lagi…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Tidak dapat menelepon. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bukan nomor darurat."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Tidak dapat menelepon. Panggil nomor darurat."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Gunakan keyboard untuk memanggil"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Tahan Panggilan"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Lanjutkan Panggilan"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Akhiri Panggilan"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Dialpad"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Bisukan"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Tambahkan panggilan"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Gabungkan panggilan"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Tukar"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Kelola panggilan"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Kelola panggilan konferensi"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Ubah ke panggilan suara"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Beralih kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Jeda video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Opsi lainnya"</string>
+ <string name="player_started" msgid="6046262510243983589">"Pemutar Dimulai"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Pemutar Dihentikan"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera tidak siap"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera siap"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Sesi panggilan tidak dikenal"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Layanan"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Penyiapan"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Tidak disetel>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Setelan panggilan lainnya"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Memanggil via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Masuk via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto kontak"</string>
+ <string name="goPrivate" msgid="865837794424530980">"aktifkan pribadi"</string>
+ <string name="selectContact" msgid="781975788478987237">"pilih kontak"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Tulis respons Anda sendiri…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Batal"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Kirim"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Jawab"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Mengirim SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Menolak"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Jawab sebagai video call"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Jawab sebagai panggilan audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Terima permintaan video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Tolak permintaan video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Terima permintaan transmisi video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Tolak permintaan transmisi video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Terima permintaan menerima video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Tolak permintaan menerima video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Geser ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Geser ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Getar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Getar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Suara"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Suara default (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Nada dering ponsel"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Bergetar saat berdering"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Nada dering & Getar"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Kelola penggilan telewicara"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Nomor darurat"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> detik</item>
+ <item quantity="one">1 detik</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> menit</item>
+ <item quantity="one">1 menit</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> jam</item>
+ <item quantity="one">1 jam</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto profil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera tidak aktif"</string>
+ <string name="child_number" msgid="7437330400723805538">"melalui <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Catatan telah dikirim"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Pesan terbaru"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Info bisnis"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Buka pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Hari ini buka pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Tutup pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Hari ini tutup pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Buka sekarang"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Sekarang tutup"</string>
+</resources>
diff --git a/InCallUI/res/values-is-rIS/strings.xml b/InCallUI/res/values-is-rIS/strings.xml
new file mode 100644
index 0000000..5b80f08
--- /dev/null
+++ b/InCallUI/res/values-is-rIS/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Sími"</string>
+ <string name="onHold" msgid="9035493194749959955">"Í bið"</string>
+ <string name="unknown" msgid="6878797917991465859">"Óþekkt"</string>
+ <string name="private_num" msgid="6713286113000232309">"Leyninúmer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Símasjálfsali"</string>
+ <string name="confCall" msgid="1904840547188336828">"Símafundur"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Símtali slitið"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Hátalari"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Símahátalari"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Höfuðtól með snúru"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Senda eftirfarandi tóna?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sendir tóna\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Senda"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Já"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nei"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Skipta algildisstaf út fyrir"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Símafundur <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Talhólfsnúmer"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Hringir"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Hringir aftur"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Símafundur"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Símtal berst"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Vinnusímtal berst"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Lagt á"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Í bið"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Leggur á"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Í símtali"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Númerið mitt er <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Tengir myndskeið"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Myndsímtal"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Biður um myndskeið"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Ekki tókst að tengja myndsímtal"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Myndsímtalsbeiðni hafnað"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Svarhringinúmerið þitt\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Svarhringinúmerið þitt í neyð\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Hringir"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ósvarað símtal"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Ósvöruð símtöl"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ósvöruð símtöl"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Ósvarað símtal frá <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Samtal í gangi"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Vinnusímtal í gangi"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi símtal stendur yfir"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Vinnusímtal í gangi um Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Í bið"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Símtal berst"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Vinnusímtal berst"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Wi-Fi símtal berst"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Vinnusímtal berst um Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Myndsímtal berst"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Myndbeiðni berst"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Ný skilaboð í talhólfinu"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Ný skilaboð í talhólfinu (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Hringja í <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Talhólfsnúmer ekki þekkt"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ekkert símasamband"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Valið símkerfi (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ekki tiltækt"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Svara"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Leggja á"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Myndskeið"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Tal"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Samþykkja"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Hunsa"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Hringja til baka"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Skilaboð"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Til að hringja símtal þarftu fyrst að slökkva á flugstillingu."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ekki skráð á símkerfi."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Farsímakerfi ekki til staðar."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Sláðu inn gilt númer til að hringja símtal."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Ekki hægt að hringja."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Ræsir MMI-runu…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Þjónustan er ekki studd."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Ekki hægt að skipta milli símtala."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ekki hægt að aðskilja símtal."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Ekki hægt að flytja."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Ekki hægt að halda símafund."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Ekki hægt að hafna símtali."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Ekki hægt að leggja á."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-símtal"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Neyðarsímtal"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Kveikir á loftneti…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ekkert samband. Reynir aftur…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Ekki hægt að hringja. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ekki neyðarnúmer."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Ekki hægt að hringja. Hringdu í neyðarnúmer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Notaðu lyklaborðið til að hringja"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Setja símtal í bið"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Halda símtali áfram"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Leggja á"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Takkaborð"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Þagga"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Bæta við símtali"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Sameina símtöl"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Skipta milli"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Stjórna símtölum"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Stjórna símafundi"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Hljóð"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Myndsímtal"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Breyta í símtal"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Skipta um myndavél"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Gera hlé á myndskeiði"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Fleiri valkostir"</string>
+ <string name="player_started" msgid="6046262510243983589">"Spilari ræstur"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Spilari stöðvaður"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Myndavél ekki tilbúin"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Myndavél tilbúin"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Óþekkt atvik símtalslotu"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Þjónusta"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Uppsetning"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ekki valið>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Aðrar símtalsstillingar"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Hringt í gegnum <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Berst í gegnum <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"mynd tengiliðar"</string>
+ <string name="goPrivate" msgid="865837794424530980">"tala í einrúmi"</string>
+ <string name="selectContact" msgid="781975788478987237">"velja tengilið"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skrifaðu eigið svar…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Hætta við"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Senda"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Svara"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Senda SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Hafna"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Svara sem myndsímtali"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Svara sem símtali"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Samþykkja beiðni um myndsímtal"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Hafna beiðni um myndsímtal"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Samþykkja beiðni um sendingu myndsímtals"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Hafna beiðni um sendingu myndsímtals"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Samþykkja beiðni um móttöku myndsímtals"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Hafna beiðni um móttöku myndsímtals"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Strjúktu upp til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Strjúktu til hægri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Strjúktu niður til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Titringur"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Titringur"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Hljóð"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sjálfgefið hljóð (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Hringitónn síma"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Titra við hringingu"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Hringitónn og titringur"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Stjórna símafundi"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Neyðarnúmer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekúnda</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekúndur</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> mínúta</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> mínútur</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> klukkustund</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> klukkustundir</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Prófílmynd"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Slökkt á myndavél"</string>
+ <string name="child_number" msgid="7437330400723805538">"úr <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Glósa send"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nýleg skilaboð"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Fyrirtækjaupplýsingar"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"í <xliff:g id="DISTANCE">%.1f</xliff:g> míl. fjarlægð"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"í <xliff:g id="DISTANCE">%.1f</xliff:g> km fjarlægð"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Opið á morgun frá kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Opið í dag frá kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Lokunartími kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Var lokað í dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Opið núna"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Lokað núna"</string>
+</resources>
diff --git a/InCallUI/res/values-it/strings.xml b/InCallUI/res/values-it/strings.xml
new file mode 100644
index 0000000..30e2642
--- /dev/null
+++ b/InCallUI/res/values-it/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefono"</string>
+ <string name="onHold" msgid="9035493194749959955">"In attesa"</string>
+ <string name="unknown" msgid="6878797917991465859">"Sconosciuto"</string>
+ <string name="private_num" msgid="6713286113000232309">"Numero privato"</string>
+ <string name="payphone" msgid="4793877574636445118">"Cabina telefonica"</string>
+ <string name="confCall" msgid="1904840547188336828">"Audioconferenza"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Chiamata persa"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altoparlante"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Auricolare telefono"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Auricolare con cavo"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Inviare i numeri successivi?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Invio toni\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Invia"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Sì"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"No"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Sostituisci carattere jolly con"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Audioconferenza <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Numero segreteria"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Chiamata in corso"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Ricomposizione"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Audioconferenza"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Chiamata in arrivo"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Chiamata lavoro in arrivo"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Chiamata terminata"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"In attesa"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"In fase di chiusura"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Chiamata"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Il mio numero è <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Collegamento video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videochiamata"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Richiesta video..."</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Impossibile effettuare una videochiamata"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Richiesta video rifiutata"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Il numero da richiamare\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Numero da richiamare in caso di emergenza\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Chiamata in corso"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chiamata senza risposta"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chiamate senza risposta"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chiamate senza risposta"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Chiamata senza risposta da <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Chiamata in corso"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Chiamata di lavoro in corso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Chiamata Wi-Fi in corso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Chiamata di lavoro tramite Wi-Fi in corso"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"In attesa"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Chiamata in arrivo"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Chiamata di lavoro in arrivo"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Chiamata Wi-Fi in arrivo"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Chiamata di lavoro in arrivo tramite Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Videochiamata in arrivo"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Richiesta video in arrivo"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nuovo msg vocale"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nuovo msg vocale (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Componi <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Numero segreteria sconosciuto"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nessun servizio"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Rete selezionata (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponibile"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Rispondi"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Riaggancia"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voce"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accetta"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ignora"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Richiama"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Messaggio"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Per fare una telefonata, disattiva la modalità aereo."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Non registrato sulla rete."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rete cellulare non disponibile."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Per effettuare una chiamata, inserisci un numero valido."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Impossibile chiamare."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Inizio sequenza MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Servizio non supportato."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Impossibile cambiare chiamata."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Impossibile separare la chiamata."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Impossibile trasferire."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Impossibile fare una chiamata in conferenza."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Impossibile rifiutare la chiamata."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Impossibile riagganciare."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Chiamata SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chiamata di emergenza"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Attivazione segnale cellulare..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nessun servizio. Nuovo tentativo…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Impossibile chiamare. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> non è un numero di emergenza."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Impossibile chiamare. Componi un numero di emergenza."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Usa tastiera"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Metti in attesa la chiamata"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Riprendi chiamata"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Termina chiamata"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Tastierino"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"No audio"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Aggiungi chiamata"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Unisci"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Scambia"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gestisci chiamate"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gestisci audioconferenza"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videochiam."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Imposta chiamata vocale"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Cambia fotocamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Metti in pausa video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Altre opzioni"</string>
+ <string name="player_started" msgid="6046262510243983589">"Player avviato"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Player interrotto"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"La fotocamera non è pronta"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Fotocamera pronta"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Evento sessione chiamata sconosciuto"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Servizio"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configurazione"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Non impostato>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Altre impostazioni chiamate"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Chiamata tramite <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"In arrivo tramite <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto contatto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"Privato"</string>
+ <string name="selectContact" msgid="781975788478987237">"seleziona contatto"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Scrivi risposta personale..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Annulla"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Invia"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Rispondi"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Invia SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rifiuta"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Rispondi con videochiamata"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Rispondi con chiamata audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accetta richiesta video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Rifiuta richiesta video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Accetta richiesta di trasmissione video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Rifiuta richiesta di trasmissione video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Accetta richiesta di ricevimento video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Rifiuta richiesta di ricevimento video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Scorri verso l\'alto per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Scorri verso sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Scorri verso destra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Scorri verso il basso per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrazione"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrazione"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Suono"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Suono predefinito (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Suoneria telefono"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrazione quando squilla"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Suoneria e vibrazione"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gestisci audioconferenza"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Numero di emergenza"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> secondi</item>
+ <item quantity="one">1 secondo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuti</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ore</item>
+ <item quantity="one">1 ora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto del profilo"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Videocamera disattivata"</string>
+ <string name="child_number" msgid="7437330400723805538">"tramite <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota inviata"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Messaggi recenti"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informazioni sull\'attività commerciale"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Distante <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Distante <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Apre domani alle ore <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Apre oggi alle ore <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Chiude alle ore <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Ha chiuso oggi alle ore <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Aperto ora"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Ora chiuso"</string>
+</resources>
diff --git a/InCallUI/res/values-iw/strings.xml b/InCallUI/res/values-iw/strings.xml
new file mode 100644
index 0000000..553a588
--- /dev/null
+++ b/InCallUI/res/values-iw/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"טלפון"</string>
+ <string name="onHold" msgid="9035493194749959955">"בהמתנה"</string>
+ <string name="unknown" msgid="6878797917991465859">"לא ידוע"</string>
+ <string name="private_num" msgid="6713286113000232309">"מספר פרטי"</string>
+ <string name="payphone" msgid="4793877574636445118">"טלפון ציבורי"</string>
+ <string name="confCall" msgid="1904840547188336828">"שיחת ועידה"</string>
+ <string name="call_lost" msgid="6183862117003999578">"השיחה נותקה"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"רמקול"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"אוזניה"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"אוזניות קוויות"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"לשלוח את הצלילים הבאים?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"שולח צלילים\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"שלח"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"כן"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"לא"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"החלף את התו הכללי ב"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"שיחת ועידה <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"המספר של הדואר הקולי"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"מחייג"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"מחייג שוב"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"שיחת ועידה"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"שיחה נכנסת"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"שיחת עבודה נכנסת"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"השיחה הסתיימה"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"בהמתנה"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"מנתק"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"בשיחה"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"המספר שלי הוא <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"מחבר וידאו"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"שיחת וידאו"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"מבקש וידאו"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"לא ניתן לחבר שיחת וידאו"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"בקשת וידאו נדחתה"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"המספר שלך להתקשרות חזרה\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"המספר שלך להתקשרות חזרה במצב חירום\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"מחייג"</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_ongoing_call" msgid="7068688957273482989">"שיחה פעילה"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"שיחת עבודה פעילה"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"שיחת Wi-Fi מתבצעת"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"שיחת עבודה פעילה ברשת WiFi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"בהמתנה"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"שיחה נכנסת"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"שיחת עבודה נכנסת"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"שיחת Wi-Fi נכנסת"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"שיחת עבודה נכנסת ברשת WiFi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"שיחת וידאו נכנסת"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"בקשת וידאו נכנסת"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"דואר קולי חדש"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"דואר קולי חדש (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"חייג <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"המספר של הדואר הקולי אינו ידוע"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"אין שירות"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"הרשת שנבחרה (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) לא זמינה"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"ענה"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"נתק"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"סרטון"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"קול"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"קבל"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"דחה"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"התקשר חזרה"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"שלח הודעה"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"כדי להתקשר, כבה תחילה את מצב טיסה."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"לא רשום ברשת."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"רשת סלולרית אינה זמינה."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"כדי להתקשר, הזן מספר טלפון חוקי."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"לא ניתן להתקשר."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"מתחיל רצף MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"שירות לא נתמך."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"לא ניתן לעבור בין שיחות."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"לא ניתן להפריד שיחה."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"לא ניתן להעביר."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"לא ניתן לבצע שיחת ועידה."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"לא ניתן לדחות שיחה."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"לא ניתן לשחרר שיחות."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"שיחת SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"שיחת חירום"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"מפעיל את הרדיו…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"אין שירות. מנסה שוב..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"לא ניתן להתקשר. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> אינו מספר חירום."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"לא ניתן להתקשר. חייג למספר חירום."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"השתמש במקלדת כדי לחייג"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"החזק שיחה"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"המשך בשיחה"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"סיים שיחה"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"לוח חיוג"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"השתק"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"הוסף שיחה"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"מזג שיחות"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"החלף"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"נהל שיחות"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"נהל שיחת ועידה"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"אודיו"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"שיחת וידאו"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"שנה לשיחה קולית"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"החלף מצלמה"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"השהה סרטון"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"אפשרויות נוספות"</string>
+ <string name="player_started" msgid="6046262510243983589">"הנגן הופעל"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"הנגן הפסיק"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"המצלמה לא מוכנה"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"המצלמה מוכנה"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"אירוע הפעלת שיחה לא ידוע"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"שירות"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"הגדרות"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<לא הוגדר>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"הגדרות שיחה אחרות"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"שיחה באמצעות <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"שיחה נכנסת באמצעות <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"תמונה של איש קשר"</string>
+ <string name="goPrivate" msgid="865837794424530980">"עבור לשיחה פרטית"</string>
+ <string name="selectContact" msgid="781975788478987237">"בחר איש קשר"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"כתוב אחת משלך..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"בטל"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"שלח"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"ענה"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"שלח SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"דחה"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ענה כשיחת וידאו"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ענה כשיחת אודיו"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"קבל בקשת וידאו"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"דחה בקשת וידאו"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"אשר את הבקשה לשידור סרטון"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"דחה את הבקשה לשידור סרטון"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"אשר את הבקשה לקבלת סרטון"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"דחה את הבקשה לקבלת סרטון"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"הסט למעלה ל<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"הסט שמאלה ל<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"הסט ימינה ל<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"הסט למטה ל<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"רטט"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"רטט"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"צליל"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"צליל ברירת מחדל (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"רינגטון של טלפון"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"רטט בעת צלצול"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"רינגטון ורטט"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"נהל שיחת ועידה"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"מספר חירום"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> שניות</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> שניות</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> שניות</item>
+ <item quantity="one">שנייה אחת</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> דקות</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> דקות</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> דקות</item>
+ <item quantity="one">דקה אחת</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> שעות</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> שעות</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> שעות</item>
+ <item quantity="one">שעה אחת</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"תמונת פרופיל"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"מצלמה כבויה"</string>
+ <string name="child_number" msgid="7437330400723805538">"דרך <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ההערה נשלחה"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"הודעות אחרונות"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"פרטי עסק"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"במרחק <xliff:g id="DISTANCE">%.1f</xliff:g> מייל"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"במרחק <xliff:g id="DISTANCE">%.1f</xliff:g> ק\"מ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"ייפתח מחר ב-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"נפתח היום ב-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"נסגר ב-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"נסגר היום ב-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"פתוח עכשיו"</string>
+ <string name="closed_now" msgid="9175774453982778909">"סגור עכשיו"</string>
+</resources>
diff --git a/InCallUI/res/values-ja/strings.xml b/InCallUI/res/values-ja/strings.xml
new file mode 100644
index 0000000..849c662
--- /dev/null
+++ b/InCallUI/res/values-ja/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"電話"</string>
+ <string name="onHold" msgid="9035493194749959955">"保留中"</string>
+ <string name="unknown" msgid="6878797917991465859">"通知不可能"</string>
+ <string name="private_num" msgid="6713286113000232309">"非通知設定"</string>
+ <string name="payphone" msgid="4793877574636445118">"公衆電話"</string>
+ <string name="confCall" msgid="1904840547188336828">"グループ通話"</string>
+ <string name="call_lost" msgid="6183862117003999578">"通話が遮断されました"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"スピーカー"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"携帯端末のイヤホン"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"有線ヘッドセット"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"次の番号を送信しますか?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"番号送信\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"送信"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"はい"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"いいえ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ワイルド文字を置換:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"グループ通話 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ボイスメールの番号"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"発信中"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"リダイヤル中"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"グループ通話"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"着信"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"仕事の通話が着信中"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"通話終了"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"保留中"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"通話終了"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"着信"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"この電話の番号: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ビデオハングアウトに接続しています"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ビデオハングアウト"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ビデオハングアウトをリクエストしています"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ビデオハングアウトを接続できません"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ビデオハングアウトのリクエスト不承認"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"コールバック先\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"緊急通報コールバック先\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"発信中"</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_ongoing_call" msgid="7068688957273482989">"通話中"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"仕事の通話中"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi通話を発信中"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"仕事の Wi-Fi 通話中"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"保留中"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"通話着信"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"仕事の通話が着信中"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Wi-Fi通話が着信中"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"仕事の Wi-Fi 通話が着信中"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ビデオハングアウト着信"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ビデオハングアウトリクエスト着信"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"新しいボイスメール"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新しいボイスメール(<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>にダイヤル"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ボイスメールの番号が不明です"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"通信サービスなし"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"選択したネットワーク(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)が利用できません"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"電話に出る"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"通話終了"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ビデオ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"音声"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"同意する"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"拒否"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"コールバック"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"メッセージ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"機内モードをOFFにしてから発信してください。"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ご加入の通信サービスがありません"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"モバイルネットワークが利用できません。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"発信するには、有効な番号を入力してください。"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"発信できません。"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMIシーケンスを開始中..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"サービスはサポートされていません。"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"通話を切り替えられません。"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"通話を分割できません。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"転送できません。"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"グループ通話できません。"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"着信を拒否できません。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"通話を解放できません。"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP通話"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"緊急通報"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"無線通信をONにしています..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"通信サービスはありません。もう一度お試しください…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"発信できません。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>は緊急通報番号ではありません。"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"発信できません。緊急通報番号におかけください。"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"キーボードで番号を入力してください"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"通話を保留"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"通話を再開"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"通話を終了"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ダイヤルキー"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ミュート"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"通話を追加"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"グループ通話"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"切り替え"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"通話の管理"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"グループ通話オプション"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"音声"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ビデオハングアウト"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"音声通話に変更"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"カメラを切り替え"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"動画を一時停止"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"その他のオプション"</string>
+ <string name="player_started" msgid="6046262510243983589">"プレーヤーを開始しました"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"プレーヤーを停止しました"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"カメラが準備できていません"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"カメラが準備できました"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"不明な通話セッションイベントです"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"サービス"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"セットアップ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<未設定>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"その他の通話設定"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>で発信中"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>で着信中"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"連絡先の写真"</string>
+ <string name="goPrivate" msgid="865837794424530980">"個別通話に切り替え"</string>
+ <string name="selectContact" msgid="781975788478987237">"連絡先を選択"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"カスタム返信を作成..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"キャンセル"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"送信"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"電話に出る"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMSを送信"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"着信拒否"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ビデオハングアウトで電話に出る"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"音声通話で電話に出る"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ビデオ通話のリクエストを承諾する"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ビデオ通話のリクエストを拒否する"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ビデオ送信リクエストを承認する"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ビデオ送信リクエストを拒否する"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ビデオ受信リクエストを承認する"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ビデオ受信リクエストを拒否する"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"上にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"右にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"下にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"バイブレーション"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"バイブレーション"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"通知音"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"デフォルトの通知音(<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"着信音"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"着信時のバイブレーション"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"着信音とバイブレーション"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"グループ通話オプション"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"緊急通報番号"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>秒</item>
+ <item quantity="one">1秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>分</item>
+ <item quantity="one">1分</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>時間</item>
+ <item quantity="one">1時間</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"プロフィール写真"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"カメラをオフ"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>に着信"</string>
+ <string name="note_sent" msgid="3548700178238244595">"メモを送信しました"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"最近のメッセージ"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ビジネス情報"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g>マイル圏内"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g>km圏内"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>、<xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>~<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>、<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"明日 <xliff:g id="OPEN_TIME">%s</xliff:g> に営業開始"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"本日 <xliff:g id="OPEN_TIME">%s</xliff:g> に営業開始"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> に営業終了"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"本日 <xliff:g id="CLOSE_TIME">%s</xliff:g> に営業終了"</string>
+ <string name="open_now" msgid="6439301193613349163">"現在営業中"</string>
+ <string name="closed_now" msgid="9175774453982778909">"営業終了"</string>
+</resources>
diff --git a/InCallUI/res/values-ka-rGE/strings.xml b/InCallUI/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..b322eb8
--- /dev/null
+++ b/InCallUI/res/values-ka-rGE/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ტელეფონი"</string>
+ <string name="onHold" msgid="9035493194749959955">"შეყოვნების რეჟიმში"</string>
+ <string name="unknown" msgid="6878797917991465859">"უცნობი"</string>
+ <string name="private_num" msgid="6713286113000232309">"დაფარული ნომერი"</string>
+ <string name="payphone" msgid="4793877574636445118">"გადახდის ტელეფონი"</string>
+ <string name="confCall" msgid="1904840547188336828">"საკონფერენციო ზარი"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ზარი შეწყვეტილია"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"სპიკერი"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"მოწყობილობის ყურმილი"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"შნურიანი ყურსაცვამი"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"გსურთ შემდეგი ტონების გაგზავნა?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ტონების გაგზავნა\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"გაგზავნა"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"დიახ"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"არა"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ჩანაცვლების სიმბოლო ჩანაცვლდეს შემდეგით:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"საკონფერენციო ზარი: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ხმოვანი ფოსტის ნომერი"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"აკრეფვა"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"განმეორება"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"საკონფერენციო ზარი"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"შემომავალი ზარი"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"შემომავალი ზარი (სამსახური)"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ზარი გაწყდა"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"შეყოვნების რეჟიმში"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"გათშვა"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"მიმდინარეობს საუბარი"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"ჩემი ნომერია <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"მიმდინარეობს ვიდეოს დაკავშირება"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ვიდეოზარი"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"მიმდინარეობს ვიდეოს მოთხოვნა"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ვერ ხორციელდება ვიდეო ზარით დაკავშირება"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ვიდეო მოთხოვნა არ დაკმაყოფილდა"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"თქვენი გადმორეკვის ნომერი \n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"თქვენი საგანგებო გადმორეკვის ნომერი \n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"აკრეფვა"</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_ongoing_call" msgid="7068688957273482989">"მიმდინარე ზარი"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"მიმდინარე ზარი (სამსახური)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"მიმდინარე Wi-Fi ზარი"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"მიმდინარე Wi-Fi ზარი (სამსახური)"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"შეყოვნების რეჟიმში"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"შემომავალი ზარი"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"შემომავალი ზარი (სამსახური)"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"შემომავალი Wi-Fi ზარი"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"შემომავალი Wi-Fi ზარი (სამსახური)"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"შემომავალი ვიდეოზარი"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"შემომავალი ვიდეოს მოთხოვნა"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"ახალი ხმოვანი ფოსტა"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"ახალი ხმოვანი ფოსტა (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>-ზე დარეკვა"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ხმოვანი ფოსტის ნომერი უცნობია"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"სერვისი არ არის"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"ხელმისაწვდომია არჩეული ქსელი (<xliff:g id="OPERATOR_NAME">%s</xliff:g>)"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"პასუხი"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"გათიშვა"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ვიდეო"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ხმა"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"მიღება"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"დახურვა"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"გადარეკვა"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"შეტყობინების გაგზავნა"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ზარის განსახორციელებლად, ჯერ თვითმფრინავის რეჟიმი უნდა გამორთოთ."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ქსელში რეგისტრირებული არ არის."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"ფიჭური ქსელი მიუწვდომელია"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ზარის განხორციელებისათვის, შეიყვანეთ მოქმედი ნომერი."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"არ ირეკება."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI თანმიმდევრობის დაწყება…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"მომსახურება არ არის მხარდაჭერილი."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ვერ ხორციელდება ზარების გადართვა."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ვერ ხორციელდება ზარის გამოყოფა."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"გადაცემა ვერ ხორციელდება."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"კონფერენცია ვერ სრულდება."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ზარის უარყოფა ვერ ხორციელდება."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ვერ ხერხდება ზარ(ებ)ის გაშვება."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP ზარი"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"გადაუდებელი ზარი"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"გადამცემის ჩართვა…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"მომხსახურება არ არის. სცადეთ ხელხლა..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"არ ირეკება. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> არ არის საგანგებო ნომერი."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"დარეკვა ვერ ხორციელდება. აკრიფეთ საგანგებო ნომერი."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"კლავიატურის გამოყენება დასარეკად"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ზარის დაკავება"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ზარის განახლება"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ზარის დასრულება"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ციფერბლატი"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"დადუმება"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ზარის დამატება"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ზარების გაერთიანება"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"შენაცვლება"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ზარების მართვა"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"საკონფერენციო ზარის მართვა"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"აუდიო"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ვიდეოზარი"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"აუდიო ზარზე გადართვა"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"კამერის გადართვა"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ვიდეოს შეჩერება"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"მეტი ვარიანტები"</string>
+ <string name="player_started" msgid="6046262510243983589">"დამკვრელი ჩაირთო"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"დამკვრელი გამოირთო"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"კამერა არ არის მზად"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"კამერა მზადაა"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"უცნობი ზარის სეანსი"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"სერვისი"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"დაყენება"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<არ არის დაყენებული>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"ზარის სხვა პარამეტრები"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"ზარი <xliff:g id="PROVIDER_NAME">%s</xliff:g>-ის მეშვეობით"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"შემომავალი <xliff:g id="PROVIDER_NAME">%s</xliff:g>-დან"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"კონტაქტის ფოტო"</string>
+ <string name="goPrivate" msgid="865837794424530980">"პირადი რეჟიმი"</string>
+ <string name="selectContact" msgid="781975788478987237">"კონტაქტის არჩევა"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ჩაწერეთ საკუთარი..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"გაუქმება"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"გაგზავნა"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"პასუხი"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS-ის გაგზავნა"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"უარყოფა"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"პასუხი ვიდეოზარის სახით"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"პასუხი აუდიო ზარის სახით"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ვიდეოს მოთხოვნის მიღება"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ვიდეოს მოთხოვნის უარყოფა"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ვიდეოს გადაცემის თხოვნაზე დათანხმება"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ვიდეოს გადაცემის თხოვნის უარყოფა"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ვიდეოს მიღების თხოვნაზე დათანხმება"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ვიდეოს მიღების თხოვნის უარყოფა"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"გაასრიალეთ ზემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ისთვის."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ისათვის გაასრიალეთ მარცხნივ."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ისათვის გაასრიალეთ მარჯვნივ."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"გაასრიალეთ ქვემოთ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-ისთვის."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"ვიბრაცია"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"ვიბრაცია"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ხმა"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ნაგულისხმები ხმა (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ტელეფონის ზარი"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"დარეკვის დროს ვიბრაცია"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"ზარის მელოდია & ვიბრაცია"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"საკონფერენციო ზარის მართვა"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"გადაუდებელი დახმარების ნომერი"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> წამი</item>
+ <item quantity="one">1 წამი</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> წუთი</item>
+ <item quantity="one">1 წუთი</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> საათი</item>
+ <item quantity="one">1 საათი</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"პროფილის ფოტო"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"კამერა გამორთულია"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>-დან"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ჩანიშვნა გაიგზავნა"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ბოლო შეტყობინებები"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ბიზნეს-ინფორმაცია"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> მილში"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> კმ-ში"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"იხსნება ხვალ <xliff:g id="OPEN_TIME">%s</xliff:g>-ზე"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"იხსნება დღეს <xliff:g id="OPEN_TIME">%s</xliff:g>-ზე"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"იკეტება <xliff:g id="CLOSE_TIME">%s</xliff:g>-ზე"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"დაიკეტა დღეს <xliff:g id="CLOSE_TIME">%s</xliff:g>-ზე"</string>
+ <string name="open_now" msgid="6439301193613349163">"ახლა ღიაა"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ახლა დაკეტილია"</string>
+</resources>
diff --git a/InCallUI/res/values-kk-rKZ/strings.xml b/InCallUI/res/values-kk-rKZ/strings.xml
new file mode 100644
index 0000000..cc8b935
--- /dev/null
+++ b/InCallUI/res/values-kk-rKZ/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"Күтуде"</string>
+ <string name="unknown" msgid="6878797917991465859">"Белгісіз"</string>
+ <string name="private_num" msgid="6713286113000232309">"Жеке нөмір"</string>
+ <string name="payphone" msgid="4793877574636445118">"Автомат-телефон"</string>
+ <string name="confCall" msgid="1904840547188336828">"Мәжіліс қоңырауы"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Қоңырау үзілді"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Үндеткіш"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Телефон құлағы"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Сымды телефон"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Келесі әуендер жіберілсін бе?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Жіберу әуендері\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Жіберу"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Иә"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Жоқ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Ерекше таңбаны келесі таңбамен алмастыру"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"<xliff:g id="CONF_CALL_TIME">%s</xliff:g> мәжіліс қоңырауы"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Дауыстық пошта нөмірі"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Теруде"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Қайта терілуде"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Мәжіліс қоңырауы"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Келген қоңырау"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Кіріс жұмыс қоңырауы"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Қоңырау аяқталды"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Күтуде"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Телефон құлағын ілуде"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Қоңырау"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mенің нөмірім <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Бейне қосылуда"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Бейне қоңырау"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Бейне сұралуда"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Бейне қоңырауға қосылу мүмкін емес"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Бейне сұрауы қабылданбады"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Кері қоңырау шалу нөміріңіз\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Жедел кері қоңырау шалу нөміріңіз\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Теру"</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_ongoing_call" msgid="7068688957273482989">"Ағымдағы қоңырау"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Ағымдағы жұмыс қоңырауы"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ағымдық Wi-Fi қоңырауы"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Ағымдағы Wi-Fi жұмыс қоңырауы"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Күтуде"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Келген қоңырау"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Кіріс жұмыс қоңырауы"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Кіріс Wi-Fi қоңырауы"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Кіріс Wi-Fi жұмыс қоңырауы"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Кіріс бейне қоңырау"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Кіріс бейне сұрау"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Жаңа дауыс хабары"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"(<xliff:g id="COUNT">%d</xliff:g>) дауыс хабары"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> нөмірін теру"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Дауыс хабарының нөмірі белгісіз"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Қызмет көрсетілмейді"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Таңдалған (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) желісі қол жетімсіз"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Жауап"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Қоңырауды аяқтау"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Бейне"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Дауыс"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Қабылдау"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Бас тарту"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Қоңырау шалу"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Хабар"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Қоңырау шалу үшін алдымен Ұшақ режимін өшіріңіз."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Желіде тіркелмеген."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Ұялы желі қол жетімді емес."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Қоңырау шалу үшін жарамды нөмірді енгізіңіз."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Қоңырау шалу мүмкін емес."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI қатарын бастау…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Қызметке қолдау көрсетілмейді."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Қоңырауларды ауыстыру мүмкін емес."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Қоңырауды бөлу мүмкін емес."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Тасымалдау мүмкін емес."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Конференция мүмкін емес."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Қоңырауды қабылдамау мүмкін емес."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Қоңырау(лар)ды босату мүмкін емес."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP қоңырауы"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Төтенше қоңырау"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Радионы қосуда…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Қызмет жоқ. Әрекет қайталануда…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Қоңырау шалу мүмкін емес. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> жедел нөмір емес."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Қоңырау шалу мүмкін емес. Жедел нөмірді теріңіз."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Теру үшін пернетақтаны қолдану"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Қоңырауды ұстап тұру"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Қоңырауды жалғастыру"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Қоңырауды аяқтау"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Теру тақтасы"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Үнсіз"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Қоңырау қосу"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Қоңырауларды біріктіру"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Алмастыру"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Қоңырауларды басқару"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Конф-қ қоң. басқару"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Aудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видео қоңырау"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Дауыстық қоңырауға өзгерту"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Камераны ауыстыру"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Бейнені кідірту"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Басқа опциялар"</string>
+ <string name="player_started" msgid="6046262510243983589">"Ойнатқыш іске қосылды"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Ойнатқыш тоқтатылды"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камера дайын емес"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камера дайын"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Белгісіз қоңырау сеансы оқиғасы"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Қызмет"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Орнату"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Реттелген жоқt>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Басқа қоңырау параметрлері"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> арқылы шалу"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> арқылы кіріс"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"контакт фотосуреті"</string>
+ <string name="goPrivate" msgid="865837794424530980">"жеке қоңырауға ауысу"</string>
+ <string name="selectContact" msgid="781975788478987237">"контакт таңдау"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Өзіңіздікін жазыңыз..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Тоқтату"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Жіберу"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Жауап"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS жіберу"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Қабылдамау"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Бейне қоңырауға жауап беру"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Аудио қоңырауға жауап беру"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Бейне сұрауды қабылдау"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Бейне сұрауды қабылдамау"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Бейне тасымалдау сұрауын қабылдау"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Бейне тасымалдау сұрауын қабылдамау"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Бейне алу сұрауын қабылдау"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Бейне алу сұрауын қабылдамау"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғыту."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін сол жаққа сырғыту."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін оң жаққа сырғыту."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін төмен сырғыту."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Діріл"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Діріл"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Дыбыс"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Бастапқы бойынша дыбыс (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Телефон рингтоны"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Шырылдағанда тербеу"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Рингтон& Діріл"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Мәжіліс қоңырауын басқару"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Төтенше жағдай нөмірі"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="one">1 секунд</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="one">1 минут</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> сағат</item>
+ <item quantity="one">1 сағат</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Профиль фотосуреті"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камераны өшіру"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> арқылы"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Ескертпе жіберілді"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Жақындағы хабарлар"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Іскери ақпарат"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> миля қашықтықта"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> км қашықтықта"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Ертең <xliff:g id="OPEN_TIME">%s</xliff:g> уақытында ашылады"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Бүгін <xliff:g id="OPEN_TIME">%s</xliff:g> уақытында ашылады"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> уақытында жабылады"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Бүгін <xliff:g id="CLOSE_TIME">%s</xliff:g> уақытында жабық"</string>
+ <string name="open_now" msgid="6439301193613349163">"Қазір ашық"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Қазір жабық"</string>
+</resources>
diff --git a/InCallUI/res/values-km-rKH/strings.xml b/InCallUI/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..b8c836a
--- /dev/null
+++ b/InCallUI/res/values-km-rKH/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ទូរស័ព្ទ"</string>
+ <string name="onHold" msgid="9035493194749959955">"រង់ចាំ"</string>
+ <string name="unknown" msgid="6878797917991465859">"មិនស្គាល់"</string>
+ <string name="private_num" msgid="6713286113000232309">"លេខឯកជន"</string>
+ <string name="payphone" msgid="4793877574636445118">"ទូរស័ព្ទសាធារណៈ"</string>
+ <string name="confCall" msgid="1904840547188336828">"ការហៅជាសន្និសីទ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ការហៅទូរស័ព្ទបានដាក់ចុះ"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"អូប៉ាល័រ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"កាស"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"កាសមានខ្សែ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ប៊្លូធូស"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"ផ្ញើសំឡេងដូចខាងក្រោម?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ផ្ញើសំឡេង \n"</string>
+ <string name="send_button" msgid="4106860097497818751">"ផ្ញើ"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"បាទ/ចាស"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"គ្មាន"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ជំនួសតួអក្សរជំនួសដោយ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"ការហៅជាសន្និសីទ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"លេខសារជាសំឡេង"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"កំពុងហៅ"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ការចុចហៅឡើងវិញ"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"ការហៅជាសន្និសីទ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ការហៅចូល"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"កំពុងហៅចូលពីកន្លែងការងារ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"បានបញ្ចប់ការហៅ"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"រង់ចាំ"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"បញ្ចប់ការសន្ទនា"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ការហៅចូល"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"លេខរបស់ខ្ញុំគឺ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ភ្ជាប់វីដេអូ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ហៅជាវីដេអូ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ស្នើវីដេអូ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"មិនអាចភ្ជាប់ការហៅជាវីដេអូបានទេ"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"បានបដិសេធសំណើហៅជាវីដេអូ"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"លេខទូរស័ព្ទអាសន្នហៅទៅវិញរបស់អ្នក\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"លេខទូរស័ព្ទអាសន្នហៅទៅវិញរបស់អ្នក\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ហៅ"</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_ongoing_call" msgid="7068688957273482989">"កំពុងបន្តការហៅ"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ការហៅពីកន្លែងការងារកំពុងដំណើរការ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ការហៅតាម Wi-Fi កំពុងបន្ត"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ការហៅតាម Wi-Fi ពីកន្លែងការងារកំពុងដំណើរការ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"រង់ចាំ"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ការហៅចូល"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"កំពុងហៅចូលពីកន្លែងការងារ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"មានការហៅចូលមកតាម Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"កំពុងហៅចូលពីកន្លែងការងារតាម Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ការហៅចូលជាវីដេអូ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"សំណើការហៅជាវីដេអូចូល"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"សារជាសំឡេងថ្មី"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"សារជាសំឡេងថ្មី (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"ចុច <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"មិនស្គាល់ចំនួនសារជាសំឡេង"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"គ្មានសេវា"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"បណ្ដាញដែលបានជ្រើស ( <xliff:g id="OPERATOR_NAME">%s</xliff:g> ) មិនអាចប្រើបានទេ"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"ឆ្លើយតប"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"បញ្ចប់ការសន្ទនា"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"វីដេអូ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"សំឡេង"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ព្រមទទួល"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"បដិសេធ"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"ហៅទៅវិញ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"សារ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ដើម្បីកំណត់ការហៅ ដំបូងត្រូវបិទរបៀបនៅពេលជិះយន្តហោះ។"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"មិនបានចុះឈ្មោះនៅលើបណ្ដាញ។"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"បណ្ដាញចល័តមិនអាចប្រើបាន។"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ដើម្បីធ្វើការហៅ បញ្ចូលលេខដែលមានសុពលភាព។"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"មិនអាចហៅបានទេ។"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"កំពុងចាប់ផ្ដើមលំដាប់ MMI ..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"សេវាកម្មមិនត្រូវបានគាំទ្រទេ។"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"មិនអាចឆ្លាស់ការហៅបានទេ។"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"មិនអាចបំបែកការហៅបានទេ។"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"មិនអាចផ្ទេរបានទេ។"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"មិនអាចទំនាក់ទំនងបានទេ។"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"មិនអាចបដិសេធការហៅបានទេ។"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"មិនអាចបញ្ចេញការហៅបានទេ។"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"ការហៅ SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"ការហៅនៅពេលមានអាសន្ន"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"កំពុងបើកវិទ្យុ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"គ្មានសេវាទេ។ ព្យាយាមម្តង…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"មិនអាចហៅបានទេ។ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> មិនមានជាលេខអាសន្នទេ។"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"មិនអាចហៅបានទេ។ ចុចហៅលេខអាសន្ន។"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ប្រើក្ដារចុចដើម្បីចុចលេខ"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"រង់ចាំការហៅ"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"បន្តការហៅ"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"បញ្ចប់ការហៅ"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"បន្ទះលេខ"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ស្ងាត់"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"បន្ថែមការហៅ"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"បញ្ចូលការហៅរួមគ្នា"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"ប្ដូរ"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"គ្រប់គ្រងការហៅ"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"គ្រប់គ្រងការហៅជាសន្និសីទ"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"សំឡេង"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ហៅជាវីដេអូ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ប្ដូរទៅការហៅជាសំឡេង"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ប្ដូរម៉ាស៊ីនថត"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ផ្អាកវីដេអូ"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"ជម្រើសច្រើនទៀត"</string>
+ <string name="player_started" msgid="6046262510243983589">"អ្នកលេងបានចាប់ផ្តើម"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"អ្នកលេងបានឈប់"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"កាមេរ៉ាមិនទាន់ត្រៀមទេ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"កាមេរ៉ាត្រៀមស្រេចហើយ"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"ព្រឹត្តិការណ៍សម័យនៃការហៅមិនស្គាល់"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"សេវា"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"រៀបចំ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"< មិនកំណត់ >"</string>
+ <string name="other_settings" msgid="3672912580359716394">"កំណត់ការហៅផ្សេងទៀត"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"ការហៅតាមរយៈ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"ចូលតាមរយៈ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"រូបថតទំនាក់ទំនង"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ទៅកាន់ឯកជន"</string>
+ <string name="selectContact" msgid="781975788478987237">"ជ្រើសទំនាក់ទំនង"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"សរសេរផ្ទាល់ខ្លួនរបស់អ្នក"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"បោះបង់"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ផ្ញើ"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"ឆ្លើយតប"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"ផ្ញើសារ SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"បដិសេធ"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ឆ្លើយតបជាការហៅជាវីដេអូ"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ឆ្លើយតបជាការហៅជាសំឡេង"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ទទួលយកសំណើវីដេអូ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ទទួលយកសំណើវីដេអូ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ទទួលយកសំណើបញ្ជូនជាវីដេអូ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"បដិសេធសំណើបញ្ជូនជាវីដេអូ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ទទួលយកសំណើទទួលជាវីដេអូ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"បដិសេធសំណើទទួលជាវីដេអូ"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"រុញទៅស្ដាំដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"រុញចុះក្រោមសម្រាប់ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ។"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"ញ័រ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"ញ័រ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"សំឡេង"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"សំឡេងលំនាំដើម (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"សំឡេងទូរស័ព្ទរោទ៍"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ញ័រនៅពេលរោទ៍"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"សំឡេងរោទ៍ & ញ័រ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"គ្រប់គ្រងការហៅជាសន្និសីទ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"លេខពេលអាសន្ន"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> វិនាទី</item>
+ <item quantity="one">1 វិនាទី</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> នាទី</item>
+ <item quantity="one">1 នាទី</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ម៉ោង</item>
+ <item quantity="one">1 ម៉ោង</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"រូបថតប្រវត្តិរូប"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"បិទកាមេរ៉ា"</string>
+ <string name="child_number" msgid="7437330400723805538">"តាមរយៈ <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"បានផ្ញើចំណាំ"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"សារថ្មីៗ"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ព័ត៌មានធុរកិច្ច"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"ចម្ងាយ <xliff:g id="DISTANCE">%.1f</xliff:g> ម៉ាយល៍"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"ចម្ងាយ <xliff:g id="DISTANCE">%.1f</xliff:g> គម"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"បើកថ្ងៃស្អែកនៅម៉ោង <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"បើកថ្ងៃនេះនៅម៉ោង <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"បិទនៅម៉ោង <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"បានបិទថ្ងៃនេះនៅម៉ោង <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"បើកឥឡូវនេះ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"បិទឥឡូវនេះ"</string>
+</resources>
diff --git a/InCallUI/res/values-kn-rIN/strings.xml b/InCallUI/res/values-kn-rIN/strings.xml
new file mode 100644
index 0000000..3c6a8f9
--- /dev/null
+++ b/InCallUI/res/values-kn-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ಫೋನ್"</string>
+ <string name="onHold" msgid="9035493194749959955">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+ <string name="unknown" msgid="6878797917991465859">"ಅಜ್ಞಾತ"</string>
+ <string name="private_num" msgid="6713286113000232309">"ಖಾಸಗಿ ಸಂಖ್ಯೆ"</string>
+ <string name="payphone" msgid="4793877574636445118">"ಪೇಫೋನ್"</string>
+ <string name="confCall" msgid="1904840547188336828">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ಕರೆಯನ್ನು ಬಿಡಲಾಗಿದೆ"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"ಸ್ಪೀಕರ್"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ಹ್ಯಾಂಡ್ಸೆಟ್ ಇಯರ್ಪೀಸ್"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"ವೈರ್ಡ್ ಹೆಡ್ಸೆಟ್"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ಬ್ಲೂಟೂತ್"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"ಕೆಳಗಿನ ಟೋನ್ಗಳನ್ನು ಕಳುಹಿಸುವುದೇ?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ಟೋನ್ಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"ಕಳುಹಿಸು"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ಹೌದು"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"ಇಲ್ಲ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ಇದರೊಂದಿಗೆ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸು"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ಧ್ವನಿಮೇಲ್ ಸಂಖ್ಯೆ"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ಡಯಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ಮರು ಡಯಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ಒಳಬರುವ ಕರೆ"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ಒಳಬರುವ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ಕರೆ ಅಂತ್ಯಗೊಂಡಿದೆ"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"ಹ್ಯಾಂಗ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ಕರೆಯಲ್ಲಿ"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"ನನ್ನ ಸಂಖ್ಯೆ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ವೀಡಿಯೊ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ವೀಡಿಯೊ ಕರೆ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ವೀಡಿಯೊ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ವೀಡಿಯೊ ಕರೆಯನ್ನು ಸಂಪರ್ಕಪಡಿಸಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ವೀಡಿಯೊ ವಿನಂತಿಯನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"ನಿಮ್ಮ ಕರೆಯ ಸಂಖ್ಯೆ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"ನಿಮ್ಮ ತುರ್ತು ಕರೆಯ ಸಂಖ್ಯೆ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ಡಯಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</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_ongoing_call" msgid="7068688957273482989">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ Wi-Fi ಕರೆ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ವೈ-ಫೈ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ಒಳಬರುವ ಕರೆ"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ಒಳಬರುವ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"ಒಳಬರುವ Wi-Fi ಕರೆ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ಒಳಬರುವ ವೈ-ಫೈ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ಒಳಬರುವ ವೀಡಿಯೊ ಕರೆ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ಒಳಬರುವ ವೀಡಿಯೊ ವಿನಂತಿ"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"ಹೊಸ ಧ್ವನಿಮೇಲ್"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"ಹೊಸ ಧ್ವನಿಮೇಲ್ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ಗೆ ಡಯಲ್ ಮಾಡು"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ಅಪರಿಚಿತ ಧ್ವನಿಮೇಲ್ ಸಂಖ್ಯೆ"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"ಯಾವುದೇ ಸೇವೆಯಿಲ್ಲ"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"ಆಯ್ಕೆಮಾಡಿದ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"ಉತ್ತರ"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"ಹ್ಯಾಂಗ್ ಅಪ್ ಮಾಡಿ"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ವೀಡಿಯೊ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ಧ್ವನಿ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ಸಮ್ಮತಿಸು"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ವಜಾಗೊಳಿಸು"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"ಮರಳಿ ಕರೆ ಮಾಡಿ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"ಸಂದೇಶ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ಕರೆ ಮಾಡಲು, ಮೊದಲು ಏರ್ಪ್ಲೇನ್ ಮೋಡ್ ಆಫ್ ಮಾಡಿ."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ನೆಟ್ವರ್ಕ್ನಲ್ಲಿ ಇನ್ನೂ ನೋಂದಣಿಯಾಗಿಲ್ಲ."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ಕರೆಯನ್ನು ಮಾಡಲು, ಮಾನ್ಯವಾದ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI ಅನುಕ್ರಮ ಪ್ರಾರಂಭವಾಗುತ್ತಿದೆ…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"ಸೇವೆ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ಕರೆಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ಕರೆಯನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"ವರ್ಗಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"ಕಾನ್ಫರೆನ್ಸ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ಕರೆಯನ್ನು ತಿರಸ್ಕರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ಕರೆ(ಗಳು) ಬಿಡುಗಡೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP ಕರೆ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"ತುರ್ತು ಕರೆಗಳು"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ರೇಡಿಯೋ ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"ಯಾವುದೇ ಸೇವೆ ಇಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ಇದು ತುರ್ತು ಸಂಖ್ಯೆಯಲ್ಲ."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ತುರ್ತು ಸಂಖ್ಯೆಯನ್ನು ಡಯಲ್ ಮಾಡಿ."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ಡಯಲ್ ಮಾಡಲು ಕೀಬೋರ್ಡ್ ಬಳಸಿ"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ಕರೆಯನ್ನು ಹೋಲ್ಡ್ ಮಾಡು"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ಕರೆ ಅಂತ್ಯಗೊಳಿಸಿ"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ಡಯಲ್ಪ್ಯಾಡ್"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ಮ್ಯೂಟ್ ಮಾಡು"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ಕರೆಯನ್ನು ಸೇರಿಸು"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ಕರೆಗಳನ್ನು ವಿಲೀನಗೊಳಿಸು"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"ಸ್ವ್ಯಾಪ್ ಮಾಡು"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ಕರೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ಆಡಿಯೊ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ವೀಡಿಯೊ ಕರೆ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ಧ್ವನಿ ಕರೆಗೆ ಬದಲಾಯಿಸಿ"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ಕ್ಯಾಮರಾ ಬದಲಿಸಿ"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ವೀಡಿಯೊ ವಿರಾಮಗೊಳಿಸು"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string>
+ <string name="player_started" msgid="6046262510243983589">"ಪ್ಲೇಯರ್ ಪ್ರಾರಂಭವಾಗಿದೆ"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"ಪ್ಲೇಯರ್ ನಿಲ್ಲಿಸಲಾಗಿದೆ"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ಕ್ಯಾಮರಾ ಸಿದ್ಧವಾಗಿಲ್ಲ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ಕ್ಯಾಮರಾ ಸಿದ್ಧವಾಗಿದೆ"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"ಅಜ್ಞಾತ ಕರೆಯ ಸೆಶನ್ ಈವೆಂಟ್"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"ಸೇವೆ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"ಸೆಟಪ್"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<ಹೊಂದಿಸಿಲ್ಲ>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"ಇತರ ಕರೆ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>ನಿಂದ ಕರೆ ಆಗುತ್ತಿದೆ"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ಅವರ ಒಳಬರುತ್ತಿರುವ ಕರೆ"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"ಸಂಪರ್ಕ ಫೋಟೋ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ಖಾಸಗಿಯಾಗಿ ಹೋಗಿ"</string>
+ <string name="selectContact" msgid="781975788478987237">"ಸಂಪರ್ಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ನಿಮ್ಮ ಸ್ವಂತದ್ದನ್ನು ಬರೆಯಿರಿ..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ರದ್ದುಮಾಡು"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ಕಳುಹಿಸು"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"ಉತ್ತರ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS ಕಳುಹಿಸಿ"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"ನಿರಾಕರಿಸು"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ವೀಡಿಯೊ ಕರೆ ರೂಪದಲ್ಲಿ ಉತ್ತರಿಸಿ"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ಆಡಿಯೊ ಕರೆಯಂತೆ ಉತ್ತರಿಸಿ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ವೀಡಿಯೊ ವಿನಂತಿ ಒಪ್ಪಿಕೊಳ್ಳು"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ವೀಡಿಯೊ ವಿನಂತಿ ತಿರಸ್ಕರಿಸು"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ವೀಡಿಯೊ ಪ್ರಸಾರ ವಿನಂತಿ ಸಮ್ಮತಿಸಿ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ವೀಡಿಯೊ ಪ್ರಸಾರ ವಿನಂತಿ ತಿರಸ್ಕರಿಸಿ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ವೀಡಿಯೊ ಸ್ವೀಕರಿಸುವಿಕೆ ವಿನಂತಿ ಸಮ್ಮತಿಸಿ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ವೀಡಿಯೊ ಸ್ವೀಕರಿಸುವಿಕೆ ವಿನಂತಿ ತಿರಸ್ಕರಿಸಿ"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಬಲಗಡೆಗೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಕೆಳಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"ವೈಬ್ರೇಟ್"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"ವೈಬ್ರೇಟ್"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ಧ್ವನಿ"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ಡೀಫಾಲ್ಟ್ ಧ್ವನಿ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ಫೋನ್ ರಿಂಗ್ಟೋನ್"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ರಿಂಗ್ ಆಗುವಾಗ ಕಂಪಿಸು"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"ರಿಂಗ್ಟೋನ್ & ವೈಬ್ರೇಟ್"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"ತುರ್ತು ಸಂಖ್ಯೆ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳು</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ನಿಮಿಷಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ನಿಮಿಷಗಳು</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ಗಂಟೆಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ಗಂಟೆಗಳು</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"ಪ್ರೊಫೈಲ್ ಫೋಟೋ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ಕ್ಯಾಮರಾ ಆಫ್"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ಮೂಲಕ"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ಟಿಪ್ಪಣಿ ಕಳುಹಿಸಲಾಗಿದೆ"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ವ್ಯಾಪಾರ ಮಾಹಿತಿ"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> ಮೈಲು ದೂರ"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> ಕಿಮೀ ದೂರ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"ನಾಳೆ <xliff:g id="OPEN_TIME">%s</xliff:g> ಗಂಟೆಗೆ ತೆರೆಯುತ್ತದೆ"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ಇಂದು <xliff:g id="OPEN_TIME">%s</xliff:g> ಗಂಟೆಗೆ ತೆರೆಯುತ್ತದೆ"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ಗಂಟೆಗೆ ಮುಚ್ಚಲಾಗಿದೆ"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ಇಂದು <xliff:g id="CLOSE_TIME">%s</xliff:g> ಗಂಟೆಗೆ ಮುಚ್ಚಲಾಗಿದೆ"</string>
+ <string name="open_now" msgid="6439301193613349163">"ಇದೀಗ ತೆರೆಯಲಾಗಿದೆ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ಇದೀಗ ಮುಚ್ಚಲಾಗಿದೆ"</string>
+</resources>
diff --git a/InCallUI/res/values-ko/strings.xml b/InCallUI/res/values-ko/strings.xml
new file mode 100644
index 0000000..6d07e98
--- /dev/null
+++ b/InCallUI/res/values-ko/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"휴대전화"</string>
+ <string name="onHold" msgid="9035493194749959955">"대기 중"</string>
+ <string name="unknown" msgid="6878797917991465859">"알 수 없음"</string>
+ <string name="private_num" msgid="6713286113000232309">"비공개 번호"</string>
+ <string name="payphone" msgid="4793877574636445118">"공중전화"</string>
+ <string name="confCall" msgid="1904840547188336828">"다자간 통화"</string>
+ <string name="call_lost" msgid="6183862117003999578">"연락되지 않음"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"스피커"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"휴대전화"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"유선 헤드셋"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"블루투스"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"다음 톤을 보내시겠습니까?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"신호음 보내기\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"전송"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"예"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"아니요"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"와일드 문자를 다음으로 바꿈:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"다자간 통화 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"음성사서함 번호"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"전화 거는 중"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"재다이얼 중"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"다자간 통화"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"수신전화"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"수신 업무 전화"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"통화 종료됨"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"대기 중"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"전화 끊는 중"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"통화 상태"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"내 전화번호는 <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>입니다."</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"동영상 연결 중"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"화상 통화"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"동영상 요청 중"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"화상 통화를 연결할 수 없습니다."</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"동영상 요청 거부됨"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"콜백 번호\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"긴급 콜백 번호\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"전화 거는 중"</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_ongoing_call" msgid="7068688957273482989">"현재 통화"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"발신 업무 전화"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi 발신 전화"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"발신 Wi-Fi 업무 전화"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"대기 중"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"수신 전화"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"수신 업무 전화"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Wi-Fi 수신 전화"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"수신 Wi-Fi 업무 전화"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"수신 화상 통화"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"수신 동영상 요청"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"새 음성사서함"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"새 음성사서함(<xliff:g id="COUNT">%d</xliff:g>개)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>(으)로 전화걸기"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"알 수 없는 음성사서함 번호"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"서비스 불가"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"선택한 네트워크(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)를 사용할 수 없음"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"전화 받기"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"전화 끊기"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"동영상"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"음성"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"수락"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"거부"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"통화하기"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"문자 메시지"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"전화를 걸려면 먼저 비행기 모드를 해제하세요."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"네트워크에서 등록되지 않았습니다."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"사용 가능한 이동통신망이 없습니다."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"전화를 걸려면 올바른 번호를 입력하세요."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"전화를 걸 수 없습니다."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI 시퀀스 시작 중..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"서비스가 지원되지 않습니다."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"통화를 전환할 수 없습니다."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"통화를 분리할 수 없습니다."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"통화를 전환할 수 없습니다."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"컨퍼런스 콜을 이용할 수 없습니다."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"통화를 거절할 수 없습니다."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"통화를 끊을 수 없습니다."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP 통화"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"긴급 전화"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"무선을 켜는 중..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"서비스를 사용할 수 없습니다. 다시 시도 중..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"전화를 걸 수 없습니다. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>은(는) 긴급 번호가 아닙니다."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"전화를 걸 수 없습니다. 긴급 번호를 사용하세요."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"키보드를 사용하여 전화걸기"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"통화 대기"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"통화 재개"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"통화 종료"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"다이얼패드"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"음소거"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"통화 추가"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"통화 병합"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"전환"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"통화 관리"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"다자간 통화 관리"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"오디오"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"화상 통화"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"음성 통화로 변경"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"카메라 전환"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"동영상 일지중지"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"옵션 더보기"</string>
+ <string name="player_started" msgid="6046262510243983589">"플레이어가 시작되었습니다."</string>
+ <string name="player_stopped" msgid="8856926759436364963">"플레이어가 중지되었습니다."</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"카메라가 준비되지 않았습니다."</string>
+ <string name="camera_ready" msgid="1903335385405807324">"카메라가 준비되었습니다."</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"알 수 없는 통화 세션 이벤트"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"서비스"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"설정"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<설정 안됨>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"기타 통화 설정"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>을(를) 통해 걸려온 전화"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>을(를) 통해 전화가 왔습니다"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"연락처 사진"</string>
+ <string name="goPrivate" msgid="865837794424530980">"비공개로 실행"</string>
+ <string name="selectContact" msgid="781975788478987237">"연락처 선택"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"나만의 응답 작성…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"취소"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"보내기"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"통화"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS 보내기"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"거부"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"화상 통화로 받기"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"음성 전화로 받기"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"동영상 요청 수락"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"동영상 요청 거절"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"화상 통화 전송 요청 허용"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"화상 통화 전송 요청 거부"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"화상 통화 수신 요청 허용"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"화상 통화 수신 요청 거부"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 위로 슬라이드합니다."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드합니다."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 오른쪽으로 슬라이드합니다."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 아래로 슬라이드합니다."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"진동"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"진동"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"알림음"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"기본 알림음(<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"전화 벨소리"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"전화 수신 시 진동"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"벨소리 및 진동"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"다자간 통화 관리"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"비상 전화번호"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>초</item>
+ <item quantity="one">1초</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>분</item>
+ <item quantity="one">1분</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>시간</item>
+ <item quantity="one">1시간</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"프로필 사진"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"카메라 꺼짐"</string>
+ <string name="child_number" msgid="7437330400723805538">"수신 번호: <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"메모가 전송되었습니다."</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"최근 메시지"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"비즈니스 정보"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g>mi 거리"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g>km 거리"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>~<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"내일 <xliff:g id="OPEN_TIME">%s</xliff:g>에 영업 시작"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"오늘 <xliff:g id="OPEN_TIME">%s</xliff:g>에 영업 시작"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g>에 영업 종료"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"오늘 <xliff:g id="CLOSE_TIME">%s</xliff:g>에 영업 종료됨"</string>
+ <string name="open_now" msgid="6439301193613349163">"영업 중"</string>
+ <string name="closed_now" msgid="9175774453982778909">"영업 종료"</string>
+</resources>
diff --git a/InCallUI/res/values-ky-rKG/strings.xml b/InCallUI/res/values-ky-rKG/strings.xml
new file mode 100644
index 0000000..96095aa
--- /dev/null
+++ b/InCallUI/res/values-ky-rKG/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"Күтүлүүдө"</string>
+ <string name="unknown" msgid="6878797917991465859">"Белгисиз"</string>
+ <string name="private_num" msgid="6713286113000232309">"Купуя номер"</string>
+ <string name="payphone" msgid="4793877574636445118">"Таксофон"</string>
+ <string name="confCall" msgid="1904840547188336828">"Конференц-чалуу"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Чалуу үзүлдү"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Катуу сүйлөткүч"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Гарнитура"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Зымдуу кулакчын"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Төмөнкү номер жөнөтүлсүнбү?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Тоналдык жөнөтүү болууда \n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Жөнөтүү"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ооба"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Жок"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Атайын белгини муну менен алмаштыр"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Конференц-чалуу <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Үн почтасынын номери"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Терилүүдө"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Кайра терүү"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Конференц-чалуу"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Кирүүчү чалуу"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Жумуш боюнча чалуу"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Чалуу аяктады"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Күтүлүүдө"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Телефон коюлууда"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Чалууда"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Менин номерим <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Видео туташтырылууда"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Видео чалуу"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Видео"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Видео чалууга туташуу мүмкүн болбой жатат"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Видео сурам четке кагылды"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Төмөнкү номерге кайра чалуу\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Төмөнкү номерге шашылыш кайра чалуу\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Терилүүдө"</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_ongoing_call" msgid="7068688957273482989">"Учурдагы чалуу"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Учурда болуп жаткан чалуу (жумуш боюнча)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Аткаруудагы Wi-Fi чалуу"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Учурда болуп жаткан Wi-Fi чалуу (жумуш боюнча)"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Күтүлүүдө"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Кирүүчү чалуу"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Жумуш боюнча келип жаткан чалуу"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Кирүүчү Wi-Fi чалуу"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Жумуш боюнча келип жаткан Wi-Fi чалуу"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Келип жаткан видео чалуу"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Келип жаткан видео сурамы"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Жаңы үн почтасы"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Жаңы үн почтасы (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> номерин терүү"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Үн почтасынын номери белгисиз"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Байланыш жок"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Тандалган тармак (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) жеткиликсиз"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Жооп берүү"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Телефонду коюу"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Үн"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Кабыл алуу"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Этибарга албоо"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Кайра чалуу"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Билдирүү"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Чалуу үчүн, адегенде учак режимин өчүрүңүз."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Тармакта катталган эмес."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Уюктук тармак жеткиликтүү эмес."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Чалуу үчүн, жарактуу номер киргизиңиз."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Чалынбай жатат."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI кезеги башталууда…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Кызмат колдоого алынбайт."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Чалуулар которуштурулбай жатат."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Чалуу бөлүнбөй жатат."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Өткөрүлбөй жатат."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Конференц-байланышы түзүлбөй жатат."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Чалуу четке кагылбай жатат."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Чалуу(лар) бошотулбай жатат."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP чалуу"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Шашылыш чалуу"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Радио күйгүзүлүүдө…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Кызмат жок. Кайра аракет кылууда…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Чалынбай жатат. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> өзгөчө кырдаал номери эмес."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Чалынбай жатат. Өзгөчө кырдаал номерин териңиз."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Баскычтоп менен териңиз"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Чалууну Кармоо"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Чалууну Улантуу"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Чалууну бүтүрүү"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Тергич"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Үнсүз"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Чалуу кошуу"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Чалууларды бириктирүү"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Алмаштыруу"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Чалууларды башкаруу"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Конференц-чалууну башкаруу"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видео чалуу"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Үн чалууга өзгөртүү"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Камерага которулуу"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Видеону бир азга токтото туруу"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Көбүрөөк параметрлер"</string>
+ <string name="player_started" msgid="6046262510243983589">"Ойноткуч башталды"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Ойноткуч токтотулду"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камера даяр эмес"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камера даяр"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Чалуу сеансынын окуясы белгисиз"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Кызмат"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Орнотуу"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Орнотулган эмес>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Башка чалуу жөндөөлөрү"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> аркылуу чалуу"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> аркылуу келүүдө"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"байланыштын сүрөтү"</string>
+ <string name="goPrivate" msgid="865837794424530980">"купуя режимине өтүү"</string>
+ <string name="selectContact" msgid="781975788478987237">"байланыш тандоо"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Каалганыңызды жазыңыз..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Жокко чыгаруу"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Жөнөтүү"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Жооп берүү"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS жөнөтүү"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Четке кагуу"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Видео чалуу түрүндө жооп берүү"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Аудио чалуу жооп берүү"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Видео сурамын кабыл алуу"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Видео сурамын четке кагуу"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Видео өткөрүү өтүнүчүн кабыл алуу"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Видео өткөрүү өтүнүчүн четке кагуу"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Видео алуу өтүнүчүн кабыл алуу"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Видео алуу өтүнүчүн четке кагуу"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн жогору жылмыштырыңыз."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн оңго жылмыштырыңыз."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн төмөн сылап коюңуз."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Титиретүү"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Титиретүү"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Үнү"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Абалкы үнү (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Телефондун рингтону"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Шыңгырап жатканда титиретүү"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Рингтон жана Титирөө"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Конференц-чалууну башкаруу"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Куткаруучулардын номуру"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="one">1 секунд</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> мүнөт</item>
+ <item quantity="one">1 мүнөт</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> саат</item>
+ <item quantity="one">1 саат</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Профиль сүрөтү"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камера өчүк"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> аркылуу"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Билдирүү жөнөтүлдү"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Акыркы билдирүүлөр"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Ишкердик маалыматы"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> миля алыста"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> км алыста"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Эртең саат <xliff:g id="OPEN_TIME">%s</xliff:g> ачылат"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Бүгүн саат <xliff:g id="OPEN_TIME">%s</xliff:g> ачылат"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Саат <xliff:g id="CLOSE_TIME">%s</xliff:g> жабылат"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Бүгүн саат <xliff:g id="CLOSE_TIME">%s</xliff:g> жабылды"</string>
+ <string name="open_now" msgid="6439301193613349163">"Эми ачылды"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Эми жабылды"</string>
+</resources>
diff --git a/InCallUI/res/values-land/colors.xml b/InCallUI/res/values-land/colors.xml
new file mode 100644
index 0000000..77eea2e
--- /dev/null
+++ b/InCallUI/res/values-land/colors.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+
+<resources>
+ <!-- Background color for status bar. For portrait this will be ignored. -->
+ <color name="statusbar_background_color">#000000</color>
+</resources>
diff --git a/InCallUI/res/values-land/dimens.xml b/InCallUI/res/values-land/dimens.xml
new file mode 100644
index 0000000..59a5a9a
--- /dev/null
+++ b/InCallUI/res/values-land/dimens.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Whether or not the landscape mode layout is currently being used -->
+ <bool name="is_layout_landscape">true</bool>
+ <!-- Height and width of the in-call buttons. -->
+ <dimen name="in_call_button_dimension">40dp</dimen>
+ <!-- Margin underneath the call buttons. This is used only in landscape mode and is sized
+ so that the call buttons are center aligned with the end call button. -->
+ <dimen name="call_buttons_bottom_margin">30dp</dimen>
+</resources>
diff --git a/InCallUI/res/values-lo-rLA/strings.xml b/InCallUI/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..fc31f1b
--- /dev/null
+++ b/InCallUI/res/values-lo-rLA/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ໂທລະສັບ"</string>
+ <string name="onHold" msgid="9035493194749959955">"ພັກສາຍຊົ່ວຄາວ"</string>
+ <string name="unknown" msgid="6878797917991465859">"ບໍ່ຮູ້ຈັກ"</string>
+ <string name="private_num" msgid="6713286113000232309">"ເບີສ່ວນໂຕ"</string>
+ <string name="payphone" msgid="4793877574636445118">"ຕູ້ໂທລະສັບສາທາລະນະ"</string>
+ <string name="confCall" msgid="1904840547188336828">"ປະຊຸມສາຍ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ສາຍຫຼຸດແລ້ວ"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"ລຳໂພງ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ຊຸດຫູຟັງ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"ຊຸດຫູຟັງແບບມີສາຍ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"ສົ່ງໂທນສຽງຕໍ່ໄປນີ້ບໍ່?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ກຳລັງສົ່ງໂທນສຽງ\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"ສົ່ງ"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ຕົກລົງ"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"ບໍ່"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ແທນທີ່ \"ໂຕອັກສອນທົດແທນ\" ດ້ວຍ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"ປະຊຸມສາຍ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ເບີຂໍ້ຄວາມສຽງ"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ກຳລັງໂທ"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ກຳລັງໂທຄືນ"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"ປະຊຸມສາຍ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ສາຍໂທເຂົ້າ"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ສາຍໂທເຂົ້າຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ວາງສາຍແລ້ວ"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ພັກສາຍຊົ່ວຄາວ"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"ກຳລັງວາງສາຍ"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ກຳລັງໃຊ້ສາຍ"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"ເບີໂທຂອງຂ້ອຍແມ່ນ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ກຳລັງເຊື່ອມຕໍ່ວິດີໂອ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ໂທແບບເຫັນໜ້າ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ກຳລັງຮ້ອງຂໍວິດີໂອ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ບໍ່ສາມາດເຊື່ອມຕໍ່ການໂທເຫັນພາບໄດ້"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ປະຕິເສດການຂໍວິດີໂອແລ້ວ"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"ເບີໂທກັບຂອງທ່ານ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"ເບີໂທກັບສຸກເສີນຂອງທ່ານ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ກຳລັງໂທ"</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_ongoing_call" msgid="7068688957273482989">"ສາຍທີ່ກຳລັງໂທອອກ"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ສາຍໂທອອກຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ການໂທ Wi-Fi ທີ່ດໍາເນີນຢູ່"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ສາຍໂທອອກ Wi-Fi ຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ພັກສາຍຊົ່ວຄາວ"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ສາຍໂທເຂົ້າ"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ສາຍໂທເຂົ້າຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"ສາຍໂທເຂົ້າ Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ສາຍໂທເຂົ້າ Wi-Fi ຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ສາຍວິດີໂອເຂົ້າ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ຄຳຮ້ອງຂໍວິດີໂອເຂົ້າມາ"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"ຂໍ້ຄວາມສຽງໃໝ່"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"ຂໍ້ຄວາມສຽງໃໝ່ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"ໂທຫາ <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ບໍ່ຮູ້ຈັກເບີຂໍ້ຄວາມສຽງ"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"ບໍ່ມີບໍລິການ"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"ບໍ່ສາມາດໃຊ້ເຄືອຂ່າຍທີ່ເລືອກ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ໄດ້"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"ຮັບສາຍ"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"ວາງສາຍ"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ວິດີໂອ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ສຽງ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ຍອມຮັບ"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ປິດໄວ້"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"ໂທກັບ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"ຂໍ້ຄວາມ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ເພື່ອໂທລະສັບ, ໃຫ້ປິດໂໝດຢູ່ເທິງຍົນກ່ອນ."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ບໍ່ໄດ້ລົງທະບຽນໃນເຄືອຂ່າຍ."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"ບໍ່ມີເຄືອຂ່າຍມືຖືທີ່ສາມາດໃຊ້ໄດ້."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ເພື່ອທີ່ຈະໂທ, ປ້ອນເບີໂທທີ່ໃຊ້ໄດ້ເຂົ້າໄປ."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"ບໍ່ສາມາດໂທໄດ້."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"ກຳລັງເລີ່ມຕົ້ນລຳດັບ MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"ການບໍລິການບໍ່ຮອງຮັບ."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ບໍ່ສາມາດສະຫຼັບສາຍໂທໄດ້."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ບໍ່ສາມາດແຍກສາຍໂທໄດ້."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"ບໍ່ສາມາດໂອນໄດ້."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"ບໍ່ສາມາດປະຊຸມໄດ້."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ບໍ່ສາມາດປະຕິເສດສາຍໂທໄດ້."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ບໍ່ສາມາດປ່ອຍສາຍໂທໄດ້."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"ການໂທ SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"ໂທສຸກເສີນ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ກຳລັງເປີດໃຊ້ວິທະຍຸ..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"ບໍ່ມີການບໍລິການ. ກຳລັງລອງໃໝ່ອີກ…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"ບໍ່ສາມາດໂທໄດ້. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ບໍ່ແມ່ນເບີໂທສຸກເສີນ."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"ບໍ່ສາມາດໂທໄດ້. ກົດເບີໂທສຸກເສີນ."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ໃຊ້ແປ້ນພິມເພື່ອກົດໂທ"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ພັກສາຍ"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ສືບຕໍ່ສາຍ"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ວາງສາຍ"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ແປ້ນໂທ"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ປິດສຽງ"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ເພີ່ມການໂທ"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ຮວມສາຍ"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"ສະລັບ"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ຈັດການການໂທ"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"ຈັດການການປະຊຸມສາຍ"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ສຽງ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ໂທແບບເຫັນໜ້າ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ປ່ຽນເປັນການໂທດ້ວຍສຽງ"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ສະລັບກ້ອງ"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ຢຸດວິດີໂອຊົ່ວຄາວ"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"ໂຕເລືອກເພີ່ມເຕີມ"</string>
+ <string name="player_started" msgid="6046262510243983589">"ຜູ້ຫຼິ້ນເລີ່ມຕົ້ນແລ້ວ"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"ຜູ້ຫຼິ້ນຢຸດແລ້ວ"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ກ້ອງຖ່າຍຮູບບໍ່ພ້ອມ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ກ້ອງຖ່າຍຮູບພ້ອມແລ້ວ"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"ເຫດການເຊສຊັນການໂທບໍ່ຮູ້ຈັກ"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"ບໍລິການ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"ຕັ້ງຄ່າ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<ຍັງບໍ່ໄດ້ຕັ້ງ>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"ການຕັ້ງຄ່າການໂທອື່ນໆ"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"ກຳລັງໂທຜ່ານ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"ເຂົ້າມາຈາກ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"ຮູບພາບລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ໃຊ້ແບບສ່ວນໂຕ"</string>
+ <string name="selectContact" msgid="781975788478987237">"ເລືອກລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ຂຽນຂໍ້ຄວາມຂອງທ່ານເອງ..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ຍົກເລີກ"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ສົ່ງ"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"ຄໍາຕອບ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"ສົ່ງ SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"ປະຕິເສດ"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ຕອບເປັນສາຍວິດີໂອ"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ຕອບເປັນສາຍສຽງ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ຍອມຮັບການຂໍສົ່ງວິດີໂອ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ປະຕິເສດການຂໍສົ່ງວິດີໂອ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ຍອມຮັບການຂໍຮັບວິດີໂອ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ປະຕິເສດການຂໍຮັບວິດີໂອ"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"ເລື່ອນໄປທາງຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"ເລື່ອນໄປທາງຂວາເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"ເລື່ອນລົງເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"ສັ່ນເຕືອນ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"ສັ່ນເຕືອນ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ສຽງ"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ສຽງເລີ່ມຕົ້ນ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ຣິງໂທນໂທລະສັບ"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ສັ່ນເຕືອນເມື່ອມີສາຍໂທເຂົ້າ"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"ຣິງໂທນ & ການສັ່ນເຕືອນ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"ຈັດການການປະຊຸມສາຍ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"ເບີໂທສຸກເສີນ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ວິນາທີ</item>
+ <item quantity="one">1 ວິນາທີ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ນາທີ</item>
+ <item quantity="one">1 ນາທີ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ</item>
+ <item quantity="one">1 ຊົ່ວໂມງ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"ຮູບໂປຣໄຟລ໌"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ກ້ອງຖ່າຍຮູບປິດ"</string>
+ <string name="child_number" msgid="7437330400723805538">"ຜ່ານ <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ສົ່ງບັນທຶກແລ້ວ"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ຂໍ້ຄວາມບໍ່ດົນມານີ້"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ຂໍ້ມູນທຸລະກິດ"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> ໄມລ໌ ຫ່າງອອກໄປ"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> ກມ ຫ່າງອອກໄປ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"ເປີດມື້ອື່ນເວລາ <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ເປີດມື້ນີ້ເວລາ <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"ປິດເວລາ <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ປິດແລ້ວມື້ນີ້ເວລາ <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"ດຽວນີ້ເປີດ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ດຽວນີ້ປິດແລ້ວ"</string>
+</resources>
diff --git a/InCallUI/res/values-lt/strings.xml b/InCallUI/res/values-lt/strings.xml
new file mode 100644
index 0000000..62ea2e4
--- /dev/null
+++ b/InCallUI/res/values-lt/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefonas"</string>
+ <string name="onHold" msgid="9035493194749959955">"Sulaikyta"</string>
+ <string name="unknown" msgid="6878797917991465859">"Nežinomas"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privatus numeris"</string>
+ <string name="payphone" msgid="4793877574636445118">"Taksofonas"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferencinis skambutis"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Skambutis atmestas"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Garsiakalbis"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Telefono ausinė"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Laidinės ausinės"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Siųsti šiuo tonus?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Siunčiami tonai\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Siųsti"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Taip"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ne"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Pakaitos simbolį pakeisti"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferencinis skambutis <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Balso pašto numeris"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Renkamas numeris"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Numeris renkamas pakartotinai"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferencinis skambutis"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Gaunamasis skambutis"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Gaunamasis darbo skambut."</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Skambutis baigtas"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Sulaikyta"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Baigiamas pokalbis"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Skambinant"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mano numeris: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Prisijungiama prie vaizdo skambučio"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Vaizdo skambutis"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Pateikiama vaizdo skambučio užklausa"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Nepavyko prijungti vaizdo įrašo skambučio"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Vaizdo įrašo užklausa atmesta"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Atskambinimo numeris\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Atskambinimo numeris, kuriuos skambina pagalbos tarnyba\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Renkamas numeris"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Praleistas skambutis"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Praleisti skambučiai"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> praleisti (-ų) skambučiai (-ų)"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"praleistas skambutis nuo <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Vykstantis pokalbis"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Vykstantis darbo skambutis"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Vykstantis „Wi-Fi“ skambutis"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Vykstantis „Wi-Fi“ darbo skambutis"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Sulaikyta"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Skambina"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Gaunamasis darbo skambutis"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Gaunamasis „Wi-Fi“ skambutis"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Gaunamasis „Wi-Fi“ darbo skambutis"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Gaunamas vaizdo skambutis"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Gaunama vaizdo skambučio užklausa"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Naujas balso pašto pranešimas"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Naujas balso pašto pranešimas (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Rinkti <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nežinomas balso pašto numeris"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nėra paslaugos"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Pasirinktas tinklas (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) negalimas"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Atsiliepti"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Padėti ragelį"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vaizdo skambutis"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Balsas"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Atsiliepti"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Atsisakyti"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Perskambinti"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Pranešimas"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Jei norite skambinti, išjunkite lėktuvo režimą."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Neregistruota tinkle."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Korinis tinklas nepasiekiamas"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Kad galėtumėte paskambinti, įveskite tinkamą numerį."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Nepavyko paskambinti."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Paleidžiama MMI seka..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Paslauga nepalaikoma."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nepavyko perjungti skambučių."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nepavyko atskirti skambučio."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Nepavyko peradresuoti."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Nepavyko sukurti konferencijos."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Nepavyko atmesti skambučio."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Nepavyko atjungti skamb."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP skambutis"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Skambutis pagalbos numeriu"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Įjungiamas radijas…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nėra ryšio. Bandoma dar kartą…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Nepavyko paskambinti. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nėra pagalbos numeris."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Nepavyko paskambinti. Surinkite pagalbos numerį."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Naudokite klaviatūrą ir rinkite numerius"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Sulaikyti skambutį"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Tęsti skambutį"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Baigti skambutį"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Numerio rinkimo klaviatūra"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Nutildyti"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Pridėti skambutį"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Sujungti skambučius"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Apkeisti"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Valdyti skambučius"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Tvark. konf. skamb."</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Garso įr."</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Vaizdo sk."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Pakeisti į balso skambutį"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Perjungti fotoaparatą"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pristabdyti vaizdo įrašą"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Daugiau parinkčių"</string>
+ <string name="player_started" msgid="6046262510243983589">"Leistuvė paleista"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Leistuvė sustabdyta"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Fotoaparatas neparuoštas"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Fotoaparatas paruoštas"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Nežinomas skambučio sesijos įvykis"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Paslauga"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Sąranka"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nenustatyta>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Kiti skambučio nustatymai"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Skam. naudojant „<xliff:g id="PROVIDER_NAME">%s</xliff:g>“"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Gaunama per „<xliff:g id="PROVIDER_NAME">%s</xliff:g>“"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontakto nuotrauka"</string>
+ <string name="goPrivate" msgid="865837794424530980">"naudoti privatų režimą"</string>
+ <string name="selectContact" msgid="781975788478987237">"pasirinkti kontaktą"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Sukurkite patys..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Atšaukti"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Siųsti"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Atsakyti"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Siųsti SMS pranešimą"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Atmesti"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Atsiliepti kaip į vaizdo skambutį"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Atsiliepti kaip į garso skambutį"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Priimti vaizdo įrašo užklausą"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Atmesti vaizdo įrašo užklausą"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Priimti vaizdo įrašo perdavimo užklausą"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Atmesti vaizdo įrašo perdavimo užklausą"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Priimti vaizdo įrašo gavimo užklausą"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Atmesti vaizdo įrašo gavimo užklausą"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Slyskite aukštyn link parinkties „<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>“."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Slyskite į kairę link parinkties „<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>“."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Slyskite į dešinę link parinkties „<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>“."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Slyskite žemyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibruoti"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibruoti"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Garsas"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Numatytasis garsas (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefono skambėjimo tonas"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibruoti, kai skambina"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Skambėjimo tonas ir vibracija"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Valdyti konferencinį skambutį"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Pagalbos numeris"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekundė</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundės</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekundės</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundžių</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minutė</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minutės</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minutės</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minučių</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> valanda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> valandos</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> valandos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> valandų</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilio nuotrauka"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Fotoaparatas išjungtas"</string>
+ <string name="child_number" msgid="7437330400723805538">"naudojant <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Užrašas išsiųstas"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Naujausi pranešimai"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Verslo informacija"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Už <xliff:g id="DISTANCE">%.1f</xliff:g> myl."</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Už <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Rytoj atidaroma <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Šiandien atidaroma <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Uždaroma <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Šiandien uždaryta <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Dabar atidaryta"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Dabar uždaryta"</string>
+</resources>
diff --git a/InCallUI/res/values-lv/strings.xml b/InCallUI/res/values-lv/strings.xml
new file mode 100644
index 0000000..73e852c
--- /dev/null
+++ b/InCallUI/res/values-lv/strings.xml
@@ -0,0 +1,195 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Tālrunis"</string>
+ <string name="onHold" msgid="9035493194749959955">"Aizturēts"</string>
+ <string name="unknown" msgid="6878797917991465859">"Nezināms"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privāts numurs"</string>
+ <string name="payphone" msgid="4793877574636445118">"Maksas tālrunis"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferences zvans"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Zvans tika pārtraukts."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Skaļrunis"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Austiņas"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Austiņas ar vadu"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Vai sūtīt tālāk norādītos signālus?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sūtīšanas signāli\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Sūtīt"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Jā"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nē"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Aizstāt aizstājējzīmi ar:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferences zvans <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Balss pasta numurs"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Notiek numura sastādīšana"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Notiek atkārtota zvanīšana"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferences zvans"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Ienākošais zvans"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Ienākošs darba zvans"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Zvans ir pabeigts"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Aizturēts"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Notiek klausules nolikšana"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Notiek saruna"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mans tālruņa numurs: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Notiek video savienojuma izveide"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videozvans"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Notiek video pieprasīšana"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Nevar veikt videozvanu"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video pieprasījums noraidīts"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Jūsu atzvana numurs\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Jūsu ārkārtas atzvana numurs\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Notiek numura sastādīšana"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Neatbildēts zvans"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Neatbildētie zvani"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> neatbildēts(-i) zvans(-i)"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Neatbildēts zvans no: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Pašreizējā saruna"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Notiekošs darba zvans"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Notiekošs Wi-Fi zvans"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Notiekošs darba Wi-Fi zvans"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Aizturēts"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Ienākošs zvans"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Ienākošs darba zvans"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Ienākošs Wi-Fi zvans"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Ienākošs darba Wi-Fi zvans"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Ienākošs videozvans"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Ienākošs video pieprasījums"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Jauns balss pasts"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Jauns balss pasts (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Sastādiet šādu numuru: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Balss pasta numurs nav zināms."</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nav pakalpojuma"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Atlasītais tīkls (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nav pieejams"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Atbildēt"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Pārtraukt"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Balss"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Pieņemt"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Nerādīt"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Atzvanīt"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Ziņojums"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Lai veiktu zvanu, vispirms izslēdziet lidojuma režīmu."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Tīklā nav reģistrēts."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilais tīkls nav pieejams."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Lai veiktu zvanu, ievadiet derīgu numuru."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Nevar veikt zvanu."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Notiek MMI secības startēšana…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Pakalpojums netiek atbalstīts."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nevar pārslēgt zvanus."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nevar nošķirt zvanu."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Nevar pāradresēt."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Nevar veikt konferences zvanu."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Nevar noraidīt zvanu."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Nevar pārtraukt zvanu(-us)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP zvans"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Ārkārtas zvans"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Notiek radio ieslēgšana..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nav pakalpojuma. Notiek atkārtots mēģinājums…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Nevar veikt zvanu. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nav ārkārtas numurs."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Nevar veikt zvanu. Zvaniet ārkārtas numuram."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Izmantojiet tastatūru, lai sastādītu numuru."</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Aizturēt zvanu"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Atsākt zvanu"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Beigt zvanu"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Numuru sastādīšanas tastatūra"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Izslēgt skaņu"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Pievienot zvanu"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Sapludināt zvanus"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Mainīt"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Pārvaldīt zvanus"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Pārvaldīt zvanu"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videozvans"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Mainīt uz balss zvanu"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Pārslēgt kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pārtraukt videoklipa atskaņošanu"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Citas opcijas"</string>
+ <string name="player_started" msgid="6046262510243983589">"Sākta atskaņošana"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Atskaņošana apturēta"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera nav gatava"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera gatava"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Nezināms zvana sesijas notikums"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Pakalpojums"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Iestatīšana"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nav iestatīts>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Citi zvanu iestatījumi"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Zvanu nodrošina <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Ienākošie zvani, ko nodrošina <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontaktpersonas fotoattēls"</string>
+ <string name="goPrivate" msgid="865837794424530980">"pārslēgt uz privāto režīmu"</string>
+ <string name="selectContact" msgid="781975788478987237">"atlasīt kontaktpersonu"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Rakstīt savu…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Atcelt"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Sūtīt"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Atbildēt"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Sūtīt īsziņu"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Noraidīt"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Atbildēt videozvanā"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Atbildēt audiozvanā"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Pieņemt video pieprasījumu"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Noraidīt video pieprasījumu"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Apstiprināt video pārsūtīšanas pieprasījumu"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Noraidīt video pārsūtīšanas pieprasījumu"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Apstiprināt video saņemšanas pieprasījumu"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Noraidīt video saņemšanas pieprasījumu"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Velciet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Velciet pa labi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Velciet uz leju, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrozvans"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrozvans"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Signāls"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Noklusējuma signāls (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Tālruņa zvana signāls"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrēt zvanot"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Zvana signāls un vibrācija"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Pārvaldīt konferences zvanu"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Ārkārtas numurs"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> sekundes</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundes</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> minūtes</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minūte</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minūtes</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> stundas</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> stunda</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> stundas</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profila fotoattēls"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Izslēgt kameru"</string>
+ <string name="child_number" msgid="7437330400723805538">"no numura <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Piezīme nosūtīta"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Pēdējie ziņojumi"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informācija par uzņēmumu"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> jūdzes(-džu) attālumā"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km attālumā"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Tiks atvērts rīt plkst. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Tiks atvērts šodien plkst. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Tiks slēgts plkst. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Tika slēgts šodien plkst. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Atvērts"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Slēgts"</string>
+</resources>
diff --git a/InCallUI/res/values-mk-rMK/strings.xml b/InCallUI/res/values-mk-rMK/strings.xml
new file mode 100644
index 0000000..8d23b7d
--- /dev/null
+++ b/InCallUI/res/values-mk-rMK/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"На чекање"</string>
+ <string name="unknown" msgid="6878797917991465859">"Непознато"</string>
+ <string name="private_num" msgid="6713286113000232309">"Приватен број"</string>
+ <string name="payphone" msgid="4793877574636445118">"Говорница"</string>
+ <string name="confCall" msgid="1904840547188336828">"Конференциски повик"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Повикот е испуштен"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Звучник"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Слушалка"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Жични слушалки"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Испрати ги следниве тонови?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Испраќање тонови\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Испрати"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Да"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Не"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Замени резервен знак со"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Конференциски повик <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Број на говорна пошта"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Бирање"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Повторно бирање"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Конференциски повик"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Дојдовен повик"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Дојдовен работен повик"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Повикот заврши"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"На чекање"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Прекинување повик"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Повик во тек"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Мојот број е <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Се поврзува видео"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Видеоповик"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Се побарува видео"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Не може да поврзе видеоповик"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Барањето за видео е одбиено"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Вашиот број за повратен повик\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Вашиот број за итен повик\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Бирање"</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_ongoing_call" msgid="7068688957273482989">"Тековен повик"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Тековен работен повик"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Појдовен повик преку Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Тековен работен повик преку Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"На чекање"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Дојдовен повик"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Дојдовен работен повик"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Дојдовен повик преку Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Дојдовен работен повик преку Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Дојдовен видеоповик"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Дојдовно побарување за видео"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Нова говорна пошта"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Нова говорна пошта (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Бирај <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Бројот на говорна пошта е непознат"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Нема услуга"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Одбраната мрежа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) е недостапна"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Одговори"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Спушти"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Гласовен"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Прифати"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Отфрли"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Повикува назад"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Порака"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"За да воспоставите повик, прво исклучете режим на работа во авион."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Не е регистриран на мрежа."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Не е достапна мобилна мрежа."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"За да повикате, внесете важечки број."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Не може да повика."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Започнува MMI низа..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Услугата не е поддржана."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Не може да префрли повици."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Не може да оддели повик."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Не може да пренесе."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Не може да влезе во конференција."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Не може да отфрли повик."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Не може да реализира повик(ци)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Повик преку СИП"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Повик за итни случаи"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Вклучување радио..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Нема услуга. Се обидува повторно…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Не може да повика. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не е број за итни повици."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Не може да повика. Бирајте го бројот за итни повици."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Користи тастатурата за бирање"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Ставете повик на чекање"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Продолжете повик"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Завршете повик"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Тастатура за бирање"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Исклучи звук"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Додај повик"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Спој повици"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Замени"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Управувај со повици"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Управувај со повикот"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видео повик"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Промени во гласовен повик"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Префрли фотоапарат"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Паузирај видео"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Повеќе опции"</string>
+ <string name="player_started" msgid="6046262510243983589">"Плеерот започна"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Плеерот запре"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камерата не е подготвена"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камерата е подготвена"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Непознат настан на сесија на повик"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Услуга"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Подесување"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Не е подесен>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Други подесувања на повик"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Повикување преку <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Дојдовни повици преку <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"фотографија за контакт"</string>
+ <string name="goPrivate" msgid="865837794424530980">"префли на приватно"</string>
+ <string name="selectContact" msgid="781975788478987237">"избери контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напиши сопствена..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Откажи"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Испрати"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Одговори"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Испрати СМС"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Одбиј"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Одговори со видеоповик"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Одговори со аудиоповик"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Прифати барање за видео"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Одбиј барање за видео"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Прифати барање за пренос на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Одбиј барање за пренос на видео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Прифати барање за прием на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Одбиј барање за прием на видео"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Лизгај нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Лизгај надесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Лизгај надолу за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Вибрирање"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Вибрирање"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Звук"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Стандарден звук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Мелодија на телефон"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Вибрирај кога ѕвони"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Мелодија и вибрации"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Управувај со конференциски повик"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Број за итни случаи"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минути</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> час</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Фотографија на профил"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камерата е исклучена"</string>
+ <string name="child_number" msgid="7437330400723805538">"преку <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Испратена е белешка"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Скорешни пораки"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Бизнис информации"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Оддалечено <xliff:g id="DISTANCE">%.1f</xliff:g> ми"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Оддалчено <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Отвора утре во <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Отвора денес во <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Затвора во <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Затвори денес во <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Сега е отворено"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Сега е затворено"</string>
+</resources>
diff --git a/InCallUI/res/values-ml-rIN/strings.xml b/InCallUI/res/values-ml-rIN/strings.xml
new file mode 100644
index 0000000..bac3144
--- /dev/null
+++ b/InCallUI/res/values-ml-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ഫോണ്"</string>
+ <string name="onHold" msgid="9035493194749959955">"ഹോള്ഡിലാണ്"</string>
+ <string name="unknown" msgid="6878797917991465859">"അജ്ഞാതം"</string>
+ <string name="private_num" msgid="6713286113000232309">"സ്വകാര്യ നമ്പർ"</string>
+ <string name="payphone" msgid="4793877574636445118">"പണം നൽകി ഉപയോഗിക്കുന്ന ഫോൺ"</string>
+ <string name="confCall" msgid="1904840547188336828">"കോൺഫറൻസ് കോൾ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"കോൾ വിട്ടു"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"സ്പീക്കർ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ഹാൻഡ്സെറ്റ് ഇയർപീസ്"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"വയർ മുഖേന ബന്ധിപ്പിച്ച ഹെഡ്സെറ്റ്"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ബ്ലൂടൂത്ത്"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"ഇനിപ്പറയുന്ന ടോണുകൾ അയയ്ക്കണോ?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ടോണുകൾ അയയ്ക്കുന്നു\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"അയയ്ക്കുക"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"വേണം"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"വേണ്ട"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"വൈൽഡ് പ്രതീകം ഇതുപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുക"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"കോൺഫറൻസ് കോൾ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"വോയ്സ്മെയിൽ നമ്പർ"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ഡയൽ ചെയ്യുന്നു"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"വീണ്ടും ഡയൽചെയ്യുന്നു"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"കോൺഫറൻസ് കോൾ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ഇന്കമിംഗ് കോള്"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ഇൻകമിംഗ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"കോൾ അവസാനിച്ചു"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ഹോള്ഡിലാണ്"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"ഹാംഗിംഗ് അപ്പ്"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"കോളിലാണ്"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"എന്റെ നമ്പർ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ആണ്"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"വീഡിയോ കണക്റ്റുചെയ്യുന്നു"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"വീഡിയോ കോള്"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"വീഡിയോ അഭ്യർത്ഥിക്കുന്നു"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"വീഡിയോ കോളുമായി കണക്റ്റുചെയ്യാനാവില്ല"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"വീഡിയോ അഭ്യർത്ഥന നിരസിച്ചു"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"നിങ്ങൾ തിരിച്ചുവിളിക്കേണ്ട നമ്പർ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"അടിയന്തിരമായി നിങ്ങൾ തിരിച്ചുവിളിക്കേണ്ട നമ്പർ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ഡയൽ ചെയ്യുന്നു"</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_ongoing_call" msgid="7068688957273482989">"കോൾ സജീവമാണ്"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ഓൺഗോയിംഗ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ഓൺഗോയിംഗ് വൈഫൈ കോൾ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ഓൺഗോയിംഗ് വൈഫൈ ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ഹോള്ഡിലാണ്"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ഇന്കമിംഗ് കോള്"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ഇൻകമിംഗ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"ഇൻകമിംഗ് വൈഫൈ കോൾ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ഇൻകമിംഗ് വൈഫൈ ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ഇൻകമിംഗ് വീഡിയോ കോൾ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ഇൻകമിംഗ് വീഡിയോ അഭ്യർത്ഥന"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"പുതിയ വോയ്സ്മെയിൽ"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"പുതിയ വോയ്സ്മെയിൽ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ഡയൽ ചെയ്യുക"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"വോയ്സ്മെയിൽ നമ്പർ അജ്ഞാതമാണ്"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"സേവനമില്ല"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ലഭ്യമല്ല"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"മറുപടി"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"ഹാംഗ് അപ്പ് ചെയ്യുക"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"വീഡിയോ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"വോയ്സ്"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"അംഗീകരിക്കുക"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"നിരസിക്കുക"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"കോൾബാക്ക്"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"സന്ദേശം"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ഒരു കോൾ വിളിക്കാൻ, ആദ്യം ഫ്ലൈറ്റ് മോഡ് ഓഫുചെയ്യുക."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"നെറ്റ്വർക്കിൽ രജിസ്റ്റർ ചെയ്തിട്ടില്ല."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"സെല്ലുലാർ നെറ്റ്വർക്ക് ലഭ്യമല്ല."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ഒരു കോൾ ചെയ്യുന്നതിന്, സാധുതയുള്ള നമ്പർ നൽകുക."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"കോൾ ചെയ്യാനായില്ല."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI സീക്വൻസ് ആരംഭിക്കുന്നു…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"സേവനം പിന്തുണയ്ക്കുന്നില്ല."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"കോളുകൾ മാറാനാവില്ല."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"കോൾ വേർതിരിക്കാനാവില്ല."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"കൈമാറ്റം ചെയ്യാനാവില്ല."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"കോൺഫറൻസ് കോൾ ചെയ്യാനാവില്ല."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"കോൾ നിരസിക്കാനാവില്ല."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"കോൾ (കോളുകൾ) വിളിക്കാനാവില്ല."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP കോൾ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"അടിയന്തര കോൾ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"റേഡിയോ ഓൺ ചെയ്യുന്നു…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"സേവനമൊന്നുമില്ല. വീണ്ടും ശ്രമിക്കുന്നു…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"കോൾ ചെയ്യാനാവില്ല. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> എന്നത് ഒരു അടിയന്തിര നമ്പരല്ല."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"കോൾ ചെയ്യാനാവില്ല. ഒരു അടിയന്തിര കോൾ നമ്പർ ഡയൽചെയ്യുക."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ഡയൽ ചെയ്യാൻ കീബോർഡ് ഉപയോഗിക്കുക"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"കോൾ ഹോൾഡുചെയ്യുക"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"കോൾ പുനരാരംഭിക്കുക"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"കോള് അവസാനിപ്പിക്കുക"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ഡയല്പാഡ്"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"മ്യൂട്ടുചെയ്യുക"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"കോൾ ചേർക്കുക"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"കോളുകൾ ലയിപ്പിക്കുക"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"സ്വാപ്പുചെയ്യുക"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"കോളുകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"കോൺഫറൻസ് കോൾ നിയന്ത്രിക്കുക"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ഓഡിയോ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"വീഡിയോ കോൾ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"വോയ്സ് കോളിലേക്ക് മാറ്റുക"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ക്യാമറയിലേക്ക് മാറുക"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"വീഡിയോ താൽക്കലികമായി നിർത്തുക"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"കൂടുതൽ ഓപ്ഷനുകൾ"</string>
+ <string name="player_started" msgid="6046262510243983589">"പ്ലെയർ ആരംഭിച്ചു"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"പ്ലേയർ നിർത്തി"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ക്യാമറ തയ്യാറായില്ല"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ക്യാമറ തയ്യാറായി"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"അജ്ഞാത കോൾ സെഷൻ ഇവന്റ്"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"സേവനം"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"സജ്ജമാക്കുക"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<സജ്ജീകരിച്ചിട്ടില്ല>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"മറ്റ് കോൾ ക്രമീകരണങ്ങൾ"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> വഴി വിളിക്കുന്നു"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> മുഖേനയുള്ള ഇൻകമിംഗ്"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"കോൺടാക്റ്റ് ഫോട്ടോ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"സ്വകാര്യം എന്നതിലേക്ക് പോകുക"</string>
+ <string name="selectContact" msgid="781975788478987237">"കോൺടാക്റ്റ് തിരഞ്ഞെടുക്കുക"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"നിങ്ങളുടെ സ്വന്തം സന്ദേശമെഴുതുക..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"റദ്ദാക്കുക"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"അയയ്ക്കുക"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"മറുപടി"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS അയയ്ക്കുക"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"നിരസിക്കുക"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"വീഡിയോ കോളായി മറുപടി നൽകുക"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ഓഡിയോ കോളായി മറുപടി നൽകുക"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"വീഡിയോ അഭ്യർത്ഥന അംഗീകരിക്കുക"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"വീഡിയോ അഭ്യർത്ഥന നിരസിക്കുക"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"വീഡിയോ പ്രക്ഷേപണ അഭ്യർത്ഥന അംഗീകരിക്കുക"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"വീഡിയോ പ്രക്ഷേപണ അഭ്യർത്ഥന നിരസിക്കുക"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"വീഡിയോ ലഭിക്കൽ അഭ്യർത്ഥന അംഗീകരിക്കുക"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"വീഡിയോ ലഭിക്കൽ അഭ്യർത്ഥന നിരസിക്കുക"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി വലത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി താഴേക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"വൈബ്രേറ്റുചെയ്യുക"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"വൈബ്രേറ്റുചെയ്യുക"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ശബ്ദം"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"സ്ഥിര ശബ്ദം (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ഫോൺ റിംഗ്ടോൺ"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"റിംഗുചെയ്യുമ്പോൾ വൈബ്രേറ്റുചെയ്യുക"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"റിംഗ്ടോണും വൈബ്രേറ്റുചെയ്യലും"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"കോൺഫറൻസ് കോൾ നിയന്ത്രിക്കുക"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"അടിയന്തര നമ്പർ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> സെക്കൻഡ്</item>
+ <item quantity="one">1 സെക്കൻഡ്</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> മിനിറ്റ്</item>
+ <item quantity="one">1 മിനിറ്റ്</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> മണിക്കൂർ</item>
+ <item quantity="one">1 മണിക്കൂർ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"പ്രൊഫൈൽ ഫോട്ടോ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ക്യാമറ ഓഫാക്കുക"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> വഴി"</string>
+ <string name="note_sent" msgid="3548700178238244595">"കുറിപ്പ് അയച്ചു"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ഏറ്റവും പുതിയ സന്ദേശങ്ങൾ"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ബിസിനസ്സ് വിവരം"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> മൈൽ അകലെ"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> കിലോമീറ്റർ അകലെ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"നാളെ <xliff:g id="OPEN_TIME">%s</xliff:g>-ന് തുറക്കുന്നു"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ഇന്ന് <xliff:g id="OPEN_TIME">%s</xliff:g>-ന് തുറക്കുന്നു"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g>-ന് അടയ്ക്കുന്നു"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ഇന്ന് <xliff:g id="CLOSE_TIME">%s</xliff:g>-ന് അടച്ചു"</string>
+ <string name="open_now" msgid="6439301193613349163">"ഇപ്പോൾ തുറന്നിരിക്കുന്നു"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ഇപ്പോൾ അടച്ചിരിക്കുന്നു"</string>
+</resources>
diff --git a/InCallUI/res/values-mn-rMN/strings.xml b/InCallUI/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..d18598b
--- /dev/null
+++ b/InCallUI/res/values-mn-rMN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Утас"</string>
+ <string name="onHold" msgid="9035493194749959955">"Хүлээлгэнд"</string>
+ <string name="unknown" msgid="6878797917991465859">"Тодорхойгүй"</string>
+ <string name="private_num" msgid="6713286113000232309">"Нууцлагдсан дугаар"</string>
+ <string name="payphone" msgid="4793877574636445118">"Payphone"</string>
+ <string name="confCall" msgid="1904840547188336828">"Утсан хурал"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Дуудлага таслагдсан"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Чанга яригч"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Утасны чихэвч"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Утастай чихэвч"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Дараах аяуудыг илгээх үү?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Аяуудыг илгээж байна\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Илгээх"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Тийм"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Үгүй"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Үсгийг дараахаар солих"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Утсан хурал <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Дуут шуудангийн дугаар"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Залгаж байна"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Дахин залгаж байна"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Утсан хурал"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Ирж буй дуудлага"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Ирж буй ажлын дуудлага"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Дуудлага дууссан"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Хүлээлгэнд"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Тасалж байна"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Дуудлагатай"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Миний дугаар <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Видеог холбож байна"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Видео хурал"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Видео хүсэлт гаргасан"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Видео дуудлага амжилтгүй боллоо"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Бичлэг хийх хүсэлтийг татгалзсан"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Таны залгасан дугаар\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Таны залгасан түргэн тусламжийн дугаар \n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Залгаж байна"</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_ongoing_call" msgid="7068688957273482989">"Хийгдэж буй дуудлага"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Залгаж буй албаны дуудлага"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ярьж буй Wi-Fi дуудлага"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Залгаж буй Wi-Fi албаны дуудлага"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Хүлээлгэнд"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Ирж буй дуудлага"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Ирж буй албаны дуудлага"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Орж ирсэн Wi-Fi дуудлага"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Ирж буй Wi-Fi албаны дуудлага"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Ирж буй видео дуудлага"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Ирж буй видео хүсэлт"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Шинэ дуут шуудан"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Шинэ дуут шуудан (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> руу залгах"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Дуут шуудангийн дугаар тодорхойгүй"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Үйлчилгээ байхгүй"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Сонгосон сүлжээ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ашиглах боломжгүй"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Хариулт"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Таслах"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Хоолой"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Зөвшөөрөх"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Алгасах"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Буцааж залгах"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Зурвас"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Дуудлага хийхийн тулд юуны өмнө Нислэгийн төлвийг идэвхгүйжүүлнэ үү."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Сүлжээнд бүртгэгдээгүй."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Үүрэн сүлжээ байхгүй."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Дуудлага хийхийн тулд хүчин төгөлдөр дугаар оруулна уу."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Дуудлага хийх боломжгүй байна."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI дарааллыг эхлүүлж байна…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Дэмжигдээгүй үйлчилгээ байна."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Дуудлагыг солих боломжгүй байна."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Дуудлагыг салгаж чадахгүй байна."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Шилжүүлэх боломжгүй байна."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Конференц дуудлага хийх боломжгүй байна."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Дуудлага татгалзах боломжгүй байна."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Дуудлага чөлөөлөх боломжгүй байна."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP дуудлага"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Ослын дуудлага"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Радиог асааж байна…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ажиллагаагүй байна. Дахин оролдоно уу..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Дуудлага хийх боломжгүй. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> нь түргэн тусламжийн дугаар биш байна."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Дуудлага хийх боломжгүй. Түргэн тусламжийн дугаар луу залга."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Залгахдаа гар ашиглах"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Дуудлагыг хүлээлгэх"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Дуудлагыг үргэлжлүүлэх"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Дуудлагыг дуусгах"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Диалпад"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Дууг хаах"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Дуудлага нэмэх"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Дуудлагуудыг нэгтгэх"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Солих"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Дуудлагуудыг удирдах"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Утсан хурлыг удирдах"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видео хурал"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Дуут дуудлага руу өөрчлөх"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Камер солих"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Видеог түр зогсоох"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Нэмэлт сонголтууд"</string>
+ <string name="player_started" msgid="6046262510243983589">"Тоглуулагч эхэлсэн"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Тоглуулагч зогссон"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камер бэлэн бус байна"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камер бэлэн"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Үл мэдэгдэх дуудлагын үе"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Үйлчилгээ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Суулгах"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Тохируулаагүй>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Бусад дуудлагын тохиргоо"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>-р залгаж байна"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>-р ирсэн"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"харилцагчийн зураг"</string>
+ <string name="goPrivate" msgid="865837794424530980">"хувийн яриа"</string>
+ <string name="selectContact" msgid="781975788478987237">"харилцагч сонгох"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Өөрийн гэснийг бичээрэй..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Цуцлах"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Илгээх"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Хариулах"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS илгээх"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Татгалзах"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Видео дуудлагаар хариулах"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Аудио дуудлагаар хариулах"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Видео хүсэлтийг зөвшөөрөх"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Видео хүсэлтээс татгалзах"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Видео дамжуулах хүсэлтийг хүлээн зөвшөөрөх"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Видео дамжуулах хүсэлтээс татгалзах"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Видео хүлээж авах хүсэлтийг хүлээн зөвшөөрөх"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Видео хүлээн авах хүсэлтээс татгалзах"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол дээш гулсуулна уу."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол зүүн талруу гулсуулна уу."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол баруун талруу гулсуулна уу."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол доош гулсуулах."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Чичиргээ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Чичиргээ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Дуу"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Үндсэн дуу (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Утасны хонхны ая"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Хонх дуугарах үед чичрэх"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Хонхны ая & Чичиргээ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Утсан хурлыг удирдах"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Яаралтай дугаар"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="one">1 секунд</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="one">1 минут</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> цаг</item>
+ <item quantity="one">1 цаг</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Профайл зураг"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камер унтраалттай байна"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>-аар"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Тэмдэглэлийг илгээсэн"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Саяхны зурвас"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Бизнес мэдээлэл"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> милийн зайтай"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> км-н зайтай"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Маргааш <xliff:g id="OPEN_TIME">%s</xliff:g>-с нээнэ"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Өнөөдөр <xliff:g id="OPEN_TIME">%s</xliff:g>-с нээнэ"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g>-с хаадаг"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Өнөөдөр <xliff:g id="CLOSE_TIME">%s</xliff:g>-с хаасан"</string>
+ <string name="open_now" msgid="6439301193613349163">"Одоо нээлттэй"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Одоо хаалттай"</string>
+</resources>
diff --git a/InCallUI/res/values-mr-rIN/strings.xml b/InCallUI/res/values-mr-rIN/strings.xml
new file mode 100644
index 0000000..a1e8989
--- /dev/null
+++ b/InCallUI/res/values-mr-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"फोन"</string>
+ <string name="onHold" msgid="9035493194749959955">"होल्ड वर"</string>
+ <string name="unknown" msgid="6878797917991465859">"अज्ञात"</string>
+ <string name="private_num" msgid="6713286113000232309">"खाजगी नंबर"</string>
+ <string name="payphone" msgid="4793877574636445118">"सार्वजनिक फोन"</string>
+ <string name="confCall" msgid="1904840547188336828">"परिषद कॉल"</string>
+ <string name="call_lost" msgid="6183862117003999578">"कॉल सोडला"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"स्पीकर"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"हँडसेट इअरपीस"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"वायर्ड हेडसेट"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ब्लूटुथ"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"खालील टोन पाठवायचे?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"टोन पाठवित आहे\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"पाठवा"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"होय"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"नाही"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"खराब वर्णास यासह पुनर्स्थित करा"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"परिषद कॉल <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"व्हॉइसमेल नंबर"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"डायल करीत आहे"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"रीडायल करत आहे"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"परिषद कॉल"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"येणारे कॉल"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"येणारा कार्य कॉल"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"कॉल संपला"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"होल्ड वर"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"हँग अप करणेे"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"कॉल मधील"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"माझा नंबर <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> आहे"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"व्हिडिओ कनेक्ट करत आहे"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"व्हिडिओ कॉल"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"व्हिडिओ विनंती करत आहे"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"व्हिडिओ कॉल कनेक्ट करू शकत नाही"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"व्हिडिओ विनंती नाकारली"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"आपला कॉलबॅक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"आपला आणीबाणी कॉलबॅक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"डायल करीत आहे"</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_ongoing_call" msgid="7068688957273482989">"सुरू असलेला कॉल"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"सुरु असलेला कार्य कॉल"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"सुरु असलेला वाय-फाय कॉल"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"सुरु असलेला वाय-फाय कार्य कॉल"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"होल्ड वर"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"येणारा कॉल"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"येणारा कार्य कॉल"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"येणारा वाय-फाय कॉल"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"येणारा वाय-फाय कार्य कॉल"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"येणारा व्हिडिओ कॉल"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"येणारी व्हिडिओ विनंती"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"नवीन व्हॉइसमेल"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"नवीन व्हॉइसमेल (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> डायल करा"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"व्हॉइसमेल नंबर अज्ञात"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"सेवा नाही"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"निवडलेले नेटवर्क (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) अनुपलब्ध"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"उत्तर"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"हँग अप"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"व्हिडिओ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"व्हॉइस"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"स्वीकारा"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"डिसमिस करा"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"पुन्हा कॉल करा"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"संदेश"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"कॉल करण्यासाठी, प्रथम विमान मोड बंद करा."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"नेटवर्कवर नोंदणीकृत नाही."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"सेल्युलर नेटवर्क उपलब्ध नाही."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"कॉल करण्यासाठी, एक वैध नंबर प्रविष्ट करा."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"कॉल करू शकत नाही."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI क्रम प्रारंभ करीत आहे..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"सेवा समर्थित नाही."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"कॉल स्विच करू शकत नाही."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"कॉल विभक्त करू शकत नाही."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"हस्तांतर करू शकत नाही."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"कॉन्फरन्स घेऊ शकत नाही."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"कॉल नाकारू शकत नाही."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"कॉल रिलीझ करू शकत नाही."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP कॉल"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"आणीबाणीचा कॉल"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"रेडिओ चालू करीत आहे..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"सेवा नाही. पुन्हा प्रयत्न करत आहे…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"कॉल करू शकत नाही. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> हा आणीबाणी नंबर नाहीये."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"कॉल करू शकत नाही. आणीबाणी नंबर डायल करा."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"डायल करण्यासाठी कीबोर्डचा वापर करा"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"कॉल होल्ड करा"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"कॉल पुनः सुरु करा"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"कॉल समाप्त करा"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"डायलपॅड"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"नि:शब्द करा"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"कॉल जोडा"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"कॉल विलीन करा"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"अदलाबदल करा"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"कॉल व्यवस्थापित करा"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"परिषद कॉल व्यवस्थापित करा"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ऑडिओ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"व्हिडिओ कॉल"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"व्हॉइस कॉल वर बदला"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"कॅमेरा स्विच करा"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"व्हिडिओला विराम द्या"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"अधिक पर्याय"</string>
+ <string name="player_started" msgid="6046262510243983589">"प्लेअर प्रारंभ झाले"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"प्लेअर थांबले"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"कॅमेरा सज्ज नाही"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"कॅमेरा सज्ज"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"अज्ञात कॉल सत्र इव्हेंट"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"सेवा"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"सेटअप"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<सेट नाही>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"इतर कॉल सेटिंग्ज"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> द्वारे कॉल करत आहे"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> द्वारे येणारे"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"संपर्क फोटो"</string>
+ <string name="goPrivate" msgid="865837794424530980">"खाजगी जा"</string>
+ <string name="selectContact" msgid="781975788478987237">"संपर्क निवडा"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"आपण स्वतः लिहा…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"रद्द करा"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"पाठवा"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"उत्तर"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS पाठवा"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"नकार द्या"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"व्हिडिओ कॉल म्हणून उत्तर द्या"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ऑडिओ कॉल म्हणून उत्तर द्या"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"व्हिडिओ विनंती स्वीकारा"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"व्हिडिओ विनंतीस नकार द्या"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"व्हिडिओ प्रसारण विनंती स्वीकार करा"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"व्हिडिओ प्रसारण विनंतीस नकार द्या"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"व्हिडिओ प्राप्त करा विनंती स्वीकार करा"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"व्हिडिओ प्राप्त करा विनंतीस नकार द्या"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी उजवीकडे स्लाइड करा."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी खाली स्लाइड करा."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"कंपन होणे"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"कंपन होणे"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ध्वनी"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"डीफॉल्ट आवाज (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"फोन रिंगटोन"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"रिंग करताना कंपन करा"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"रिंगटोन आणि कंपन"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"परिषद कॉल व्यवस्थापित करा"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"आणीबाणीचा नंबर"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> सेकंद</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंद</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> मिनिटे</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> मिनिटे</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> तास</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> तास</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"प्रोफाईल फोटो"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"कॅमेरा बंद"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> द्वारा"</string>
+ <string name="note_sent" msgid="3548700178238244595">"टीप पाठविली"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"अलीकडील संदेश"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"व्यवसाय माहिती"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> मैल दूर"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> किमी दूर"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"उद्या <xliff:g id="OPEN_TIME">%s</xliff:g> वाजता उघडेल"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"आज <xliff:g id="OPEN_TIME">%s</xliff:g> उघडेल"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> वाजता बंद होईल"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> वाजता बंद केले"</string>
+ <string name="open_now" msgid="6439301193613349163">"आता उघडा"</string>
+ <string name="closed_now" msgid="9175774453982778909">"आता बंद केले आहे"</string>
+</resources>
diff --git a/InCallUI/res/values-ms-rMY/strings.xml b/InCallUI/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..0026b74
--- /dev/null
+++ b/InCallUI/res/values-ms-rMY/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Ditunda"</string>
+ <string name="unknown" msgid="6878797917991465859">"Tidak diketahui"</string>
+ <string name="private_num" msgid="6713286113000232309">"Nombor peribadi"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefon Awam"</string>
+ <string name="confCall" msgid="1904840547188336828">"Panggilan sidang"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Panggilan diputuskan"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Pembesar suara"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Alat dengar telefon mudah alih"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Set kepala berwayar"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Hantar nada berikut?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Menghantar nada\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Hantar"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ya"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Tidak"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Gantikan aksara bebas dengan"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Panggilan sidang <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nombor mel suara"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Mendail"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Mendail semula"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Panggilan sidang"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Panggilan masuk"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Pgln masuk tempat kerja"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Panggilan tamat"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Ditunda"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Menamatkan panggilan"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Dalam panggilan"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Nombor saya ialah <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Menyambungkan video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Pgln video"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Meminta video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Tidak dapat menyambungkan panggilan video"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Permintaan video ditolak"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Nombor panggil balik anda\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Nombor panggil balik kecemasan anda\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Mendail"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Panggilan tidak dijawab"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Panggilan tidak dijawab"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> panggilan tidak dijawab"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Panggilan tidak dijawab daripada <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Panggilan sedang berjalan"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Panggilan sedang berlangsung daripada tempat kerja"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Panggilan Wi-Fi sedang berlangsung"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Panggian Wi-Fi sedang berlangsung daripada tempat kerja"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Ditunda"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Panggilan masuk"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Panggilan masuk daripada tempat kerja"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Panggilan Wi-Fi masuk"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Panggilan masuk melalui Wi-Fi daripada tempat kerja"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Panggilan video masuk"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Permintaan video masuk"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Mel suara baharu"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Mel suara baharu (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Dail <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nombor mel suara tidak dikenali"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Tiada perkhidmatan"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Rangkaian pilihan (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) tidak tersedia"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Jawab"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Letakkan gagang"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video dalam strim"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Suara"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Terima"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ketepikan"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Panggil balik"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mesej"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Untuk membuat panggilan, matikan mod Pesawat terlebih dahulu."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Tidak didaftarkan pada rangkaian."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rangkaian selular tidak tersedia."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Untuk membuat panggilan, masukkan nombor yang sah."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Tidak dapat memanggil."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Memulakan jujukan MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Perkhidmatan tidak disokong."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Tidak dapat menukar panggilan."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Tidak dapat mengasingkan panggilan."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Tidak dapat memindahkan panggilan."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Tidak dapat membuat panggilan persidangan."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Tidak dapat menolak panggilan."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Tidak dapat melepaskan panggilan."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Panggilan SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Panggilan kecemasan"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Menghidupkan radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Tiada perkhidmatan. Mencuba lagi..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Tidak dapat memanggil. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bukan nombor kecemasan."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Tidak dapat memanggil. Dail nombor kecemasan."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Gunakan papan kekunci untuk mendail"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Tahan Panggilan"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Sambung Semula Panggilan"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Tamatkan Panggilan"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Pad dail"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Redam"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Tambah panggilan"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Gabung panggilan"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Silih"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Urus panggilan"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Urus panggilan sidang"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Pgln video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Tukar ke panggilan suara"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Tukar kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Jeda video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Lagi pilihan"</string>
+ <string name="player_started" msgid="6046262510243983589">"Pemain Dimulakan"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Pemain Dihentikan"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera tidak bersedia"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera bersedia"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Acara sesi panggilan tidak diketahui"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Perkhidmatan"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Persediaan"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Tidak ditetapkan>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Tetapan panggilan lain"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Memanggil melalui <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Panggilan masuk melalui <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto kenalan"</string>
+ <string name="goPrivate" msgid="865837794424530980">"jadi tertutup"</string>
+ <string name="selectContact" msgid="781975788478987237">"pilih kenalan"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Tulis sendiri…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Batal"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Hantar"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Jawapan"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Hantar SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Tolak"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Jawab sebagai panggilan video"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Jawab sebagai panggilan audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Terima permintaan video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Tolak permintaan video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Terima permintaan hantar video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Tolak permintaan hantar video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Terima permintaan terima video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Tolak permintaan terima video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Luncurkan ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Luncurkan ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Getar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Getar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Bunyi"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Bunyi lalai (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Nada dering telefon"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Bergetar apabila berdering"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Nada dering & Bergetar"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Urus panggilan sidang"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Nombor kecemasan"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saat</item>
+ <item quantity="one">1 saat</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minit</item>
+ <item quantity="one">1 minit</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> jam</item>
+ <item quantity="one">1 jam</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto profil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera dimatikan"</string>
+ <string name="child_number" msgid="7437330400723805538">"melalui <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota dihantar"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mesej terbaru"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Maklumat perniagaan"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> batu dari sini"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km dari sini"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Dibuka esok pada pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Dibuka hari ini pada pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Tutup pada pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Ditutup hari ini pada pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Dibuka sekarang"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Ditutup sekarang"</string>
+</resources>
diff --git a/InCallUI/res/values-my-rMM/strings.xml b/InCallUI/res/values-my-rMM/strings.xml
new file mode 100644
index 0000000..72fbd6d
--- /dev/null
+++ b/InCallUI/res/values-my-rMM/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ဖုန်း"</string>
+ <string name="onHold" msgid="9035493194749959955">"ခဏ ကိုင်ထားစဉ်"</string>
+ <string name="unknown" msgid="6878797917991465859">"အကြောင်းအရာ မသိရှိ"</string>
+ <string name="private_num" msgid="6713286113000232309">"လျို့ဝှက် နံပါတ်"</string>
+ <string name="payphone" msgid="4793877574636445118">"ငွေပေးရသည့်ဖုန်း"</string>
+ <string name="confCall" msgid="1904840547188336828">"ကွန်းဖရင့်ခေါ်ဆိုမှု"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ဖုန်းလိုင်းကျသွား၏"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"စပီကာ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"လက်ကိုင်တယ်လီဖုန်းနားခွက်"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"ကြိုးတပ် မိုက်ခွက်ပါနားကြပ်"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ဘလူးတုသ်"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"အောက်ပါ တီးလုံးများကို ပို့မလား?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"အသံ ပို့နေစဉ်\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"ပို့ခြင်း"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ဟုတ်ကဲ့"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"မဟုတ်ပါ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"wildစာလုံးကို အစားထိုးရန်မှာ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"ကွန်းဖရင့် ခေါ်ဆိုမှု <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"အသံစာပို့စနစ်နံပါတ်"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ဖုန်းခေါ်နေစဉ်"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ပြန်ခေါ်ရန်"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"ကွန်းဖရင့်ခေါ်ဆိုမှု"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"အဝင်ခေါ်ဆိုမှု"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"အလုပ်ဆိုင်ရာ အဝင် ခေါ်ဆိုမှု"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ဖုန်းခေါ်ဆိုမှု ပြီးဆုံးပါပြီ"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ခဏ ကိုင်ထားစဉ်"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"ဖုန်းချနေပါသည်"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ဖုန်းပြောနေစဉ်"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"ကျွန်ုပ်၏ နံပါတ်မှာ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ဖြစ်ပါသည်"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ဗီဒီယို ချိတ်ဆက်နေ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ဗီဒီယို ခေါ်ဆိုမှု"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ဗွီဒီယိုကို တောင်းဆိုနေ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ဗွီဒီယို ခေါ်ဆိုမှု မပြုနိုင်။"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ဗီဒီယို တောင်းဆိုချက် ပယ်ချ၏"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"သင့်အား ပြန်ခေါ်ရန် နံပါတ်\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"သင့် အရေးပေါ် ပြန်ခေါ်ရန် နံပါတ်\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ဖုန်းခေါ်နေစဉ်"</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_ongoing_call" msgid="7068688957273482989">"ဆက်သွားနေသော ဖုန်းခေါ်မှု"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ခေါ်နေဆဲ အလုပ်မှ ခေါ်ဆိုမှု"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ခေါ်နေဆဲ ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ခေါ်နေဆဲ Wi-Fi အလုပ်မှ ခေါ်ဆိုမှု"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ခဏ ကိုင်ထားစဉ်"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"အဝင်ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"အဝင် ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"ဝင်လာသော ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Wi-Fi အလုပ်မှ အဝင် ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ဝင်လာသည့် ဗီဒီယို ခေါ်ဆိုမှု"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"အသံ ခေါ်ဆိုမှုအဖြစ် တောင်းဆိုမှု"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"အသံမေးလ်အသစ်"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"အသံစာ အသစ် (<xliff:g id="COUNT">%d</xliff:g>) စောင်"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ကိုခေါ်ပါ"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"အသံဖုန်းခေါ်မှုနံပါတ် မသိပါ"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"ဝန်ဆောင်မှု မရှိပါ"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"ရွေးချယ်ထားသော ကွန်ရက် (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) မရရှိနိုင်ပါ"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"ဖြေကြားရန်"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"ဖုန်းချလိုက်ပါပြီ"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ဗီဒီယို"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"အသံ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"လက်ခံရန်"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ပယ်ရန်"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"ပြန်ခေါ်ပါ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"စာတို"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ဖုန်းခေါ်ဆိုမှုပြုရန်, လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်ကို ပိတ်ပါ"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ကွန်ယက်ပေါ်မှာ မှတ်ပုံတင်မှု မပြုလုပ်ထားပါ"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"ဆယ်လူလာ ကွန်ရက် မရှိပါ။"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ဖုန်းခေါ်ရန်အတွက်၊ သင့်လျော်သည့်နံပါတ် ရိုက်ထည့်ပါ။"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"မခေါ်ဆိုနိုင်ပါ။"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI အမှတ်စဉ်ကို စတင်နေပါသည်…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"ဤဝန်ဆောင်မှုအား မပံ့ပိုးပါ။"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ဖုန်းခေါ်ခြင်းများကြား မကူးပြောင်းနိုင်ပါ။"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ဖုန်းခေါ်ခြင်းအား မခွဲထုတ်နိုင်ပါ။"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"မလွှဲပြောင်းနိုင်ပါ။"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"ကွန်းဖရန့်စ် မလုပ်နိုင်ပါ။"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ဖုန်းခေါ်ခြင်းအား မငြင်းဆိုနိုင်ပါ။"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ဖုန်းခေါ်ခြင်း(များ)အား လွှတ်မပေးနိုင်ပါ။"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP ခေါ်ဆိုမှုများ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"အရေးပေါ်ခေါ်ဆိုမှု"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ရေဒီယို ဖွင့်နေစဉ်…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"ဝန်ဆောင်မှု မရှိပါ။ ထပ်မံကြိုးစားပါ…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"မခေါ်ဆိုနိုင်ပါ။ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> က အရေးပေါ်နံပါတ် မဟုတ်ပါ။"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"မခေါ်ဆိုနိုင်ပါ။ အရေးပေါ်နံပါတ်အား ခေါ်ဆိုပါ။"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ကီးဘုတ်သုံး၍ခလုတ်နှိပ်ပါ"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ခေါ်ဆိုမှု ဆိုင်းငံ့ရန်"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ဆက်လက် ခေါ်ဆိုရန်"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ခေါ်ဆိုမှု ပြီးစီးရန်"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"နံပါတ်ကွက်"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"အသံတိတ်"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ဖုန်းခေါ်မှု ထပ်ထည့်ပါ"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ဖုန်းခေါ်မှုများကို ပူးပေါင်းသည်"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"လဲပြောင်းသည်"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ဖုန်းခေါ်မှုကို ကြီးကြပ်သည်"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"ညီလာခံ ခေါ်ဆိုရန်"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"အသံ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ဗီဒီယိုခေါ်ဆိုမှု"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"အသံဖြင့် ခေါ်ဆိုမှုသို့ ပြောင်းရန်"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ကင်မရာကို ဖွင့်ရန်"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ဗီဒီယို ဆိုင်းငံ့ရန်"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"နောက်ထပ် ရွေးစရာများ"</string>
+ <string name="player_started" msgid="6046262510243983589">"Player စတင်ခဲ့သည်"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Player ရပ်တန့်ခဲ့သည်"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ကင်မရာအဆင်သင့် မဖြစ်သေးပါ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ကင်မရာအဆင်သင့်"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"အမည်မသိခေါ်ဆိုမှု ဆက်ရှင်ဖြစ်ရပ်"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"ဝန်ဆောင်မှု"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"ပြင်ဆင်သည်"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"မသတ်မှတ်ထားပါ"</string>
+ <string name="other_settings" msgid="3672912580359716394">"တခြားခေါ်ဆိုမှုဆိုင်ရာ ဆက်တင်"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> မှ ခေါ်ဆိုခြင်း"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>မှ တစ်ဆင့် ခေါ်ဆိုမှု"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"အဆက်အသွယ်များ၏ ဓာတ်ပုံ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ပရိုက်ဗိတ်သို့ သွားပါ"</string>
+ <string name="selectContact" msgid="781975788478987237">"လိပ်စာရွေးပါ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"သင့်ကိုယ်ပိုင် စာသား ရေးပါ..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ထားတော့"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ပို့ခြင်း"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"အဖြေ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"စာတို ပေးပို့သည်"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"လက်မခံပါ"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ဗွီဒီယို ခေါ်ဆိုမှုအဖြစ် ဖြေကြားရန်"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"အသံ ခေါ်ဆိုမှုအဖြစ် ဖြေကြားရန်"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ဗီဒီယို တောင်းဆိုမှုကို လက်ခံရန်"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ဗီဒီယို တောင်းဆိုမှုကို ငြင်းပယ်ရန်"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ဗီဒီယိုထုတ်လွှင့်ခြင်းတောင်းဆိုမှုကို လက်ခံရန်"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ဗီဒီယိုထုတ်လွှင့်ခြင်းတောင်းဆိုမှုကို ငြင်းပယ်ရန်"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ဗီဒီယိုရရှိသည့်တောင်းဆိုမှုကို လက်ခံရန်"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ဗီဒီယိုရရှိသည့်တောင်းဆိုမှုကို ငြင်းပယ်ရန်"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဖယ်ဘက်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ညာဖက်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အောက်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"တုန်ခါခြင်း"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"တုန်ခါခြင်း"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"အသံ"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ပုံသေ အသံ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ဖုန်းမြည်သံ"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ဖုန်းမြည်စဉ်တုန်ခါရန်"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"ဖုန်းမြည်သံ & တုန်ခါသံ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"ကွန်းဖရင့် ခေါ်ဆိုမှုကို ထိန်းချုပ်သည်"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"အရေးပေါ်နံပါတ်"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> စက္ကန့်များ</item>
+ <item quantity="one">၁ စက္ကန့်</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> မိနစ်များ</item>
+ <item quantity="one">၁ မိနစ်</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> နာရီများ</item>
+ <item quantity="one">၁ နာရီ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"ပရိုဖိုင် ဓာတ်ပုံ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ကင်မရာ ပိတ်ရန်"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>မှတစ်ဆင့်"</string>
+ <string name="note_sent" msgid="3548700178238244595">"မပို့ခဲ့"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"မကြာမီက စာတိုများ"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"စီးပွားရေး အချက်အလက်"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi အကွာ"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km အကွာ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>၊ <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>၊ <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"မနက်ဖြန် <xliff:g id="OPEN_TIME">%s</xliff:g> ၌ဖွင့်မည်"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ယနေ့ <xliff:g id="OPEN_TIME">%s</xliff:g> ၌ဖွင့်မည်"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ၌ပိတ်မည်"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ယနေ့ <xliff:g id="CLOSE_TIME">%s</xliff:g> ၌ပိတ်ခဲ့သည်"</string>
+ <string name="open_now" msgid="6439301193613349163">"ယခုဖွင့်ရန်"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ယခုပိတ်ရန်"</string>
+</resources>
diff --git a/InCallUI/res/values-nb/strings.xml b/InCallUI/res/values-nb/strings.xml
new file mode 100644
index 0000000..249a608
--- /dev/null
+++ b/InCallUI/res/values-nb/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Parkert"</string>
+ <string name="unknown" msgid="6878797917991465859">"Ukjent"</string>
+ <string name="private_num" msgid="6713286113000232309">"Hemmelig nummer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefonkiosk"</string>
+ <string name="confCall" msgid="1904840547188336828">"Telefonmøte"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Samtale droppet"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Høyttaler"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Telefonens øreplugg"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Hodetelefon med kabel"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Send disse tonene?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sendetoner\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Send"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nei"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Erstatt jokertegn med"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Telefonmøte <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nummer til talepostkasse"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Ringer"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Slår nummer på nytt"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonmøte"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Innkommende anrop"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Innkommende jobbanrop"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Samtalen er avsluttet"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Parkert"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Legger på"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Samtale pågår"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Nummeret mitt er <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Kobler til videoanrop"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videoanrop"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Ber om video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Kan ikke koble til videosamtale"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videoforespørselen er avvist"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Ditt tilbakeringingsnummer\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Ditt tilbakeringingsnummer for nødsamtaler\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Slår nummeret"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Tapt anrop"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Tapte anrop"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> tapte anrop"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Tapt anrop fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Pågående samtale"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Pågående jobbanrop"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Pågående Wi-Fi-anrop"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Pågående jobbanrop via Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Parkert"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Innkommende samtale"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Innkommende jobbanrop"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Innkommende anrop via Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Innkommende jobbanrop via Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Innkommende videoanrop"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Innkommende videoforespørsel"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny talemelding"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nye talemeldinger (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Mangler nummer til talepostkasse"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen tjeneste"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Valgt nettverk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ikke tilgjengelig"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Svar"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Legg på"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Google Voice"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Godta"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Avvis"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Ring tilbake"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Melding"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"For å ringe, slå av flymodus først."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ikke registrert på nettverket."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilnettverket er ikke tilgjengelig."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Skriv inn et gyldig nummer for å plassere en samtale."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Kan ikke ringe."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Begynner MMI-sekvens…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Tjenesten håndteres ikke."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan ikke bytte samtaler."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan ikke splitte opp samtale."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Kan ikke overføre."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Kan ikke opprette konferanse."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Kan ikke avvise anropet."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Kan ikke frigjøre samtale(r)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-anrop"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Nødanrop"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Slår på radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ingen tjeneste. Prøver på nytt …"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Kan ikke ringe. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et nødnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Kan ikke ringe. Ring et nødnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Bruk tastaturet for å ringe"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Sett samtalen på vent"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Gjenoppta samtale"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Avslutt samtale"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Talltastatur"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Lyd av"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Tilføy anrop"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Slå sammen samtaler"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Bytt"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Administrer samtaler"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Administrer konferansesamtale"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Lyd"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videosamtale"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Bytt til taleanrop"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Bytt kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Sett videoen på pause"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Flere alternativer"</string>
+ <string name="player_started" msgid="6046262510243983589">"Avspilleren har startet"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Avspilleren har stoppet"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kameraet er ikke klart"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kameraet er klart"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Ukjent anrop"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Tjeneste"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfigurering"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ikke angitt>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Andre ringeinnstillinger"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Ringer via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Innkommende via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontaktbilde"</string>
+ <string name="goPrivate" msgid="865837794424530980">"aktiver privat samtale"</string>
+ <string name="selectContact" msgid="781975788478987237">"velg kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv ditt eget"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Avbryt"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Send"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Svar"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Send tekstmelding"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Avslå"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Svar med video"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Svar uten video"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Godta videoforespørselen"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Avslå videoforespørselen"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Godta forespørsel om å sende video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Avvis forespørsel om å sende video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Godta forespørsel om å motta video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Avvis forespørsel om å motta video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Dra opp for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Dra til høyre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Dra ned for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrering"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrering"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Lyd"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Standardlyd (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefonringelyd"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrering når det ringer"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringetone og vibrering"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Administrer konferansesamtale"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Nødnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ <item quantity="one">1 sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutter</item>
+ <item quantity="one">1 minutt</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> timer</item>
+ <item quantity="one">1 time</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilbilde"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kameraet er slått av"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Notatet er sendt"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nylige meldinger"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informasjon om bedriften"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> engelske mil unna"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km unna"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Åpner i morgen kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Åpner i dag kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Stenger kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Stengte i dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Åpent nå"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Stengt nå"</string>
+</resources>
diff --git a/InCallUI/res/values-ne-rNP/strings.xml b/InCallUI/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..3178c7a
--- /dev/null
+++ b/InCallUI/res/values-ne-rNP/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"फोन"</string>
+ <string name="onHold" msgid="9035493194749959955">"होल्डमा"</string>
+ <string name="unknown" msgid="6878797917991465859">"अज्ञात"</string>
+ <string name="private_num" msgid="6713286113000232309">"निजी नम्बर"</string>
+ <string name="payphone" msgid="4793877574636445118">"पेफोन"</string>
+ <string name="confCall" msgid="1904840547188336828">"सम्मेलन कल"</string>
+ <string name="call_lost" msgid="6183862117003999578">"कल ड्रप गरियो"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"स्पिकर"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ह्यान्डसेट इयरपिस"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"तारसहितको हेडसेट"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"ब्लुटूथ"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"निम्न टोनहरू पठाउने? \n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"टोनहरू \n पठाउँदै"</string>
+ <string name="send_button" msgid="4106860097497818751">"पठाउनुहोस्"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"हो"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"होइन"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"यससँग वाइल्ड अक्षर बदल्नुहोस्"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"सम्मेलन कल <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"भ्वाइसमेल नम्बर"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"डायल गर्दै"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"पुन: डायल गर्दै"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"सम्मेलन कल"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"आगमन कल"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"आगमन कार्यको कल"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"कल अन्त्य भयो"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"होल्डमा"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"फोन काट्दै"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"कलमा"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"मेरो नम्बर <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> हो"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"भिडियो जडान गरिँदै"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"भिडियो कल"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"भिडियो अनुरोध"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"भिडियो कल जडान गर्न सक्दैन"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"भिडियो अनुरोध अस्वीकार गरियो"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"तपाईंको कलब्याक नम्बर \n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"तपाईंको आपतकालिन कलब्याक नम्बर \n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"डायल गर्ने"</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_ongoing_call" msgid="7068688957273482989">"चलिरहेको कल"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"चालू रहेको कार्यको कल"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"चालु रहेको WI-Fi कल"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"चालू रहेको Wi-Fi कार्यको कल"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"होल्डमा"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"आगमन कल"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"आगमन कार्यको कल"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"आगमन Wi-Fi कल"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"आगमन Wi-Fi कार्यको कल"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"आगमन भिडियो कल"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"आगमन भिडियो अनुरोध"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"नयाँ भ्वाइस मेल"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"नयाँ भ्वाइसमेल ( <xliff:g id="COUNT">%d</xliff:g> )"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>मा डायल गर्नुहोस्"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"अज्ञात भवाइसमेल नम्बर"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"सेवा छैन"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"चयन गरिएको नेटवर्क ( <xliff:g id="OPERATOR_NAME">%s</xliff:g> ) अनुपलब्ध"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"उत्तर दिनुहोस्"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"छुटाउनुहोस्"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"भिडियो"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"आवाज"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"स्वीकार्नुहोस्"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"खारेज गर्नुहोस्"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"फेरि कल गर्नुहोस्"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"सन्देश"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"कल राख्नका लागि, पहिले हवाइजहाज मोड बन्द गर्नुहोस्।"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"नेटवर्कमा दर्ता भएको छैन।"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"सेलुलर सञ्जाल उपलब्ध छैन।"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"एक कल गर्नको लागि, एक वैध नम्बर प्रविष्ट गर्नुहोस्।"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"कल गर्न सक्दैन।"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI अनुक्रम सुरु गर्दै..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"सेवा समर्थित छैन।"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"कल स्विच गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"कल अलग गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"हस्तान्तरण गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"सम्मेलन गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"कल अस्वीकार गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"कल (हरू) जारी गर्न सकिँदैन ।"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP कल"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"आपतकालीन कल"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"रेडियो खोल्दै..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"कुनै सेवा छैन। फेरि प्रयास गर्दै ..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"कल गर्न सकिँदैन। <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> आपतकालीन नम्बर होइन।"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"कल गर्न सकिँदैन। आपतकालीन नम्बर डायल गर्नुहोस्।"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"डायल गर्न किबोर्ड प्रयोग गर्नुहोस्"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"कल होल्ड गर्नुहोस्"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"कललाई पुन: निरन्तरता दिनुहोस्"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"कल अन्त्य गर्नुहोस्"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"डायलप्याड"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"म्युट"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"कल थप्नुहोस्"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"कलहरू समायोजन गर्नुहोस्"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"स्वाप"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"कलहरू प्रबन्ध गर्नुहोस्"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"सम्मेलन कल प्रबन्ध गर्नुहोस्"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"अडियो"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"भिडियो कल"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"आवाज कल गर्न परिवर्तन"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"क्यामेरा फेर्नुहोस्"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"भिडियो स्थगित गर्नुहोस्"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"थप विकल्पहरू"</string>
+ <string name="player_started" msgid="6046262510243983589">"प्लेयर सुरु भयो"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"प्लेयर रोकियो"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"क्यामेरा तयार छैन"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"क्यामेरा तयार"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"अज्ञात कल सत्र घटना"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"सेवा"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"सेटअप"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"सेट गरेको छैन"</string>
+ <string name="other_settings" msgid="3672912580359716394">"अन्य कल सेटिङहरू"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> को मार्फत कल गर्दै"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> मार्फत आगमन"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"सम्पर्क फोटो"</string>
+ <string name="goPrivate" msgid="865837794424530980">"निजी जानुहोस्"</string>
+ <string name="selectContact" msgid="781975788478987237">"सम्पर्क चयन गर्नुहोस्"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"आफ्नै लेख्नुहोस्..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"रद्द गर्नुहोस्"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"पठाउनुहोस्"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"उत्तर"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS पठाउनुहोस्"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"अस्वीकार गर्नुहोस्"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"भिडियो कल रूपमा जवाफ दिनुहोस्"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"अडियो कलको रूपमा जवाफ दिनुहोस्"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"भिडियो अनुरोध स्वीकार गर्नुहोस्"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"भिडियो अनुरोध अस्वीकार गर्नुहोस्"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"भिडियो प्रसारण गर्न अनुरोध स्वीकार गर्नुहोस्"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"भिडियो प्रसारण गर्न अनुरोध अस्वीकार गर्नुहोस्"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"भिडियो प्राप्त गर्न अनुरोध स्वीकार गर्नुहोस्"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"भिडियो प्राप्त गर्न अनुरोध अस्वीकार गर्नुहोस्"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि माथि सार्नुहोस्।"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि बायाँ सार्नुहोस्।"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>को लागि दायाँ सार्नुहोस्।"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल सार्नुहोस्।"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"भाइब्रेट"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"भाइब्रेट"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"आवाज:"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"पूर्वनिर्धारित ध्वनि ( <xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g> )"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"फोन रिङटोन"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"घन्टी बज्दा भाइब्रेट"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"रिङ्गटोन र भाइब्रेट"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"सम्मेलन कल प्रबन्ध गर्नुहोस्"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"आपतकालीन नम्बर"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकेन्ड</item>
+ <item quantity="one">१ सेकेन्ड</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> मिनेट</item>
+ <item quantity="one">१ मिनेट</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> घन्टा</item>
+ <item quantity="one">१ घन्टा</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"प्रोफाइल तस्बिर"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"क्यामेरा बन्द"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> बाट"</string>
+ <string name="note_sent" msgid="3548700178238244595">"नोट पठाइयो"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"भर्खरैका सन्देशहरू"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"व्यवसाय जानकारी"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> माइल टाढा"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> किलोमिटर टाढा"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"भोलि <xliff:g id="OPEN_TIME">%s</xliff:g> खुल्छ"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"आज <xliff:g id="OPEN_TIME">%s</xliff:g> खुल्छ"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> बन्द हुन्छ"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> बन्द भयो"</string>
+ <string name="open_now" msgid="6439301193613349163">"अहिले खुला छ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"अब बन्द भयो"</string>
+</resources>
diff --git a/InCallUI/res/values-nl/strings.xml b/InCallUI/res/values-nl/strings.xml
new file mode 100644
index 0000000..9616719
--- /dev/null
+++ b/InCallUI/res/values-nl/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefoon"</string>
+ <string name="onHold" msgid="9035493194749959955">"In de wacht"</string>
+ <string name="unknown" msgid="6878797917991465859">"Onbekend"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privénummer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefooncel"</string>
+ <string name="confCall" msgid="1904840547188336828">"Telefonische vergadering"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Oproep beëindigd"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Luidspreker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Oortelefoon van handset"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Bedrade headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"De volgende tonen verzenden?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Nummers verzenden\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Verzenden"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nee"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Jokerteken vervangen door"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Telefonische vergadering <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Voicemailnummer"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Kiezen"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Opnieuw bellen"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonische vergadering"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Inkomende oproep"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Inkomende zakelijke oproep"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Oproep beëindigd"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"In de wacht"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Ophangen"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Actieve oproep"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mijn nummer is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Verbinding maken met video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videogesprek"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Video aanvragen"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Kan geen videogesprek starten"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videoverzoek geweigerd"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Je terugbelnummer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Je terugbelnummer bij alarm\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Kiezen"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Gemiste oproep"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Gemiste oproepen"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepen"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Gemiste oproep van <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Actieve oproep"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Actieve zakelijke oproep"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Actieve wifi-oproep"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Actieve zakelijke oproep via wifi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"In de wacht"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Inkomende oproep"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Inkomende zakelijke oproep"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Inkomende wifi-oproep"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Inkomende zakelijke oproep via wifi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Binnenkomend videogesprek"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Binnenkomend videoverzoek"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nieuwe voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nieuwe voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> bellen"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemailnummer onbekend"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Geen service"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Geselecteerd netwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) niet beschikbaar"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Beantwoorden"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Ophangen"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"InStream-video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Spraak"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Accepteren"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Sluiten"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Terugbellen"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Bericht"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Als je wilt bellen, moet je eerst de Vliegtuigmodus uitschakelen."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Niet geregistreerd op netwerk."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobiel netwerk niet beschikbaar."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Als je wilt bellen, moet je een geldig nummer invoeren."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Kan niet bellen."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI-reeks starten..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Service wordt niet ondersteund."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Kan niet overschakelen tussen oproepen."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Kan oproep niet scheiden."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Kan niet doorschakelen."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Telefonische vergadering niet mogelijk."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Kan oproep niet weigeren."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Kan oproep(en) niet vrijgeven."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-oproep"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Noodoproep"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Radio aanzetten..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Geen bereik. Opnieuw proberen…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Kan niet bellen. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is geen alarmnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Kan niet bellen. Bel een alarmnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Toetsen gebruiken om te bellen"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Gesprek in de wacht zetten"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Gesprek hervatten"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Gesprek beëindigen"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Toetsenblok"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Dempen"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Oproep toevoegen"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Oproepen samenvoegen"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Wisselen"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gesprekken beheren"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Telefonische vergadering beheren"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videogesp."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Wijzigen in spraakoproep"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Camera wijzigen"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Video onderbreken"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Meer opties"</string>
+ <string name="player_started" msgid="6046262510243983589">"Speler gestart"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Speler gestopt"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Camera niet gereed"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Camera gereed"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Onbekende oproepsessiegebeurtenis"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Service"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Instelling"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Niet ingesteld>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Andere instellingen voor bellen"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Bellen via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Inkomend via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"contactfoto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"privé"</string>
+ <string name="selectContact" msgid="781975788478987237">"contact selecteren"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Eigen reactie opstellen..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Annuleren"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Verzenden"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Antwoord"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Sms verzenden"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Weigeren"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Beantwoorden als videogesprek"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Beantwoorden als audiogesprek"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Videoverzoek accepteren"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Videoverzoek weigeren"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Verzoek voor video-overdracht accepteren"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Verzoek voor video-overdracht afwijzen"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Verzoek voor video-ontvangst accepteren"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Verzoek voor video-ontvangst afwijzen"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Veeg omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Veeg naar rechts voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Veeg omlaag voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Trillen"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Trillen"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Geluid"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Standaardgeluid (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Beltoon telefoon"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Trillen bij bellen"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Beltoon en trillen"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Telefonische vergadering beheren"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Alarmnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconden</item>
+ <item quantity="one">1 seconde</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuten</item>
+ <item quantity="one">1 minuut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> uur</item>
+ <item quantity="one">1 uur</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profielfoto"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Camera uit"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Notitie verzonden"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Recente berichten"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Bedrijfsinformatie"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mijl hiervandaan"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km hiervandaan"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Gaat morgen open om <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Gaat vandaag open om <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Sluit om <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Vandaag gesloten vanaf <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Nu geopend"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Nu gesloten"</string>
+</resources>
diff --git a/InCallUI/res/values-pa-rIN/strings.xml b/InCallUI/res/values-pa-rIN/strings.xml
new file mode 100644
index 0000000..4bfa2df
--- /dev/null
+++ b/InCallUI/res/values-pa-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ਫੋਨ"</string>
+ <string name="onHold" msgid="9035493194749959955">"ਹੋਲਡ ਤੇ"</string>
+ <string name="unknown" msgid="6878797917991465859">"ਅਗਿਆਤ"</string>
+ <string name="private_num" msgid="6713286113000232309">"ਨਿੱਜੀ ਨੰਬਰ"</string>
+ <string name="payphone" msgid="4793877574636445118">"ਪੇਫੋਨ"</string>
+ <string name="confCall" msgid="1904840547188336828">"ਕਾਨਫਰੰਸ ਕਾਲ"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ਕਾਲ ਡ੍ਰੌਪ ਕੀਤੀ"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"ਸਪੀਕਰ"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ਹੈਂਡਸੈਟ ਈਅਰਪੀਸ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"ਵਾਇਰ ਵਾਲਾ ਹੈਡਸੈਟ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"ਕੀ ਇਹ ਟੋਨਾਂ ਭੇਜਣੀਆਂ ਹਨ?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ਟੋਨਾਂ\n ਭੇਜ ਰਿਹਾ ਹੈ"</string>
+ <string name="send_button" msgid="4106860097497818751">"ਭੇਜੋ"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ਹਾਂ"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"ਨਹੀਂ"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"ਇਸ ਨਾਲ ਵਾਈਲਡ ਅੱਖਰ ਬਦਲੋ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"ਕਾਨਫਰੰਸ ਕਾਲ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"ਵੌਇਸਮੇਲ ਨੰਬਰ"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ਡਾਇਲ ਕਰ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"ਮੁੜ ਡਾਇਲ ਕਰ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"ਕਾਨਫਰੰਸ ਕਾਲ"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ਇਨਕਮਿੰਗ ਕਾਲ"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ਕੰਮ ਸਬੰਧਿਤ ਆ ਰਹੀ ਕਾਲ"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ਕਾਲ ਖ਼ਤਮ ਹੋਈ"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ਹੋਲਡ ਤੇ"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"ਹੈਂਗ ਅਪ ਕਰ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ਇਨ ਕਾਲ"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"ਮੇਰਾ ਨੰਬਰ ਹੈ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ਵੀਡੀਓ ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ਵੀਡੀਓ ਕਾਲ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ਵੀਡੀਓ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ਵੀਡੀਓ ਕਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਦਾ"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ਵੀਡੀਓ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕੀਤੀ ਗਈ"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"ਤੁਹਾਡਾ ਕਾਲਬੈਕ ਨੰਬਰ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"ਤੁਹਾਡਾ ਐਮਰਜੈਂਸੀ ਕਾਲਬੈਕ ਨੰਬਰ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ਡਾਇਲ ਕਰ ਰਿਹਾ ਹੈ"</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_ongoing_call" msgid="7068688957273482989">"ਜਾਰੀ ਕਾਲ"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"ਕੰਮ ਸਬੰਧਿਤ ਜਾਰੀ ਕਾਲ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"ਜਾਰੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"ਕੰਮ ਸਬੰਧਿਤ ਜਾਰੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ਹੋਲਡ ਤੇ"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ਇਨਕਮਿੰਗ ਕਾਲ"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ਕੰਮ ਸਬੰਧਿਤ ਆ ਰਹੀ ਕਾਲ"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"ਇਨਕਮਿੰਗ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ਕੰਮ ਸਬੰਧਿਤ ਆ ਰਹੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ਇਨਕਮਿੰਗ ਵੀਡੀਓ ਕਾਲ"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ਇਨਕਮਿੰਗ ਵੀਡੀਓ ਬੇਨਤੀ"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"ਨਵੀਂ ਵੌਇਸਮੇਲ"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"ਨਵੀਂ ਵੌਇਸਮੇਲ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ਡਾਇਲ ਕਰੋ"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ਵੌਇਸਮੇਲ ਨੰਬਰ ਅਗਿਆਤ"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"ਚੁਣੇ ਗਏ ਨੈਟਵਰਕ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ਅਣਉਪਲਬਧ"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"ਜਵਾਬ ਦਿਓ"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"ਹੈਂਗ ਅਪ ਕਰੋ"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ਵੀਡੀਓ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"ਵੌਇਸ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ਬਰਖਾਸਤ ਕਰੋ"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"ਕਾਲ ਬੈਕ ਕਰੋ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"ਸੁਨੇਹਾ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਕਰੋ।"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ਨੈਟਵਰਕ ਤੇ ਰਜਿਸਟਰ ਨਹੀਂ ਕੀਤਾ।"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"ਸੈਲਿਊਲਰ ਨੈਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ, ਇੱਕ ਪ੍ਰਮਾਣਿਕ ਨੰਬਰ ਦਰਜ ਕਰੋ।"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI ਕੜੀ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"ਸੇਵਾ ਸਮਰਥਿਤ ਨਹੀਂ।"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ਕਾਲਾਂ ਸਵਿਚ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ਕਾਲ ਵੱਖ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"ਟ੍ਰਾਂਸਫਰ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"ਕਾਨਫਰੰਸ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ਕਾਲ ਅਸਵੀਕਾਰ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ਕਾਲ(ਕਾਲਾਂ) ਰਿਲੀਜ ਨਹੀਂ ਕਰ ਸਕਦਾ।"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP ਕਾਲ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"ਐਮਰਜੈਂਸੀ ਕਾਲ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ਰੇਡੀਓ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ। <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ਇੱਕ ਐਮਰਜੈਂਸੀ ਨੰਬਰ ਨਹੀਂ ਹੈ।"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ। ਇੱਕ ਐਮਰਜੈਂਸੀ ਨੰਬਰ ਡਾਇਲ ਕਰੋ।"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ਡਾਇਲ ਕਰਨ ਲਈ ਕੀਬੋਰਡ ਵਰਤੋ"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ਕਾਲ ਹੋਲਡ ਕਰੋ"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ਕਾਲ ਦੁਬਾਰਾ ਸ਼ੁਰੂ ਕਰੋ"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ਕਾਲ ਸਮਾਪਤ ਕਰੋ"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ਡਾਇਲਪੈਡ"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ਮਿਊਟ ਕਰੋ"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ਕਾਲ ਜੋੜੋ"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ਕਾਲਾਂ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"ਸਵੈਪ ਕਰੋ"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ਕਾਲਾਂ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"ਕਾਨਫਰੰਸ ਕਾਲ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ਔਡੀਓ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ਵੀਡੀਓ ਕਾਲ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"ਵੌਇਸ ਕਾਲ ਵਿੱਚ ਬਦਲੋ"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"ਕੈਮਰਾ ਸਵਿਚ ਕਰੋ"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ਵੀਡੀਓ ਰੋਕੋ"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"ਹੋਰ ਚੋਣਾਂ"</string>
+ <string name="player_started" msgid="6046262510243983589">"ਪਲੇਅਰ ਅਰੰਭ ਹੋ ਗਿਆ"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"ਪਲੇਅਰ ਰੁੱਕ ਗਿਆ"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"ਕੈਮਰਾ ਤਿਆਰ ਨਹੀਂ ਹੈ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"ਕੈਮਰਾ ਤਿਆਰ ਹੈ"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"ਅਗਿਆਤ ਕਾਲ ਸੈਸ਼ਨ ਇਵੈਂਟ"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"ਸੇਵਾ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"ਸੈਟਅਪ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<ਸੈਟ ਨਹੀਂ ਕੀਤਾ>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"ਹੋਰ ਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ਰਾਹੀਂ ਕਾਲ ਕਰ ਰਿਹਾ ਹੈ"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ਰਾਹੀਂ ਇਨਕਮਿੰਗ"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"ਸੰਪਰਕ ਫੋਟੋ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ਨਿੱਜੀ ਜਾਓ"</string>
+ <string name="selectContact" msgid="781975788478987237">"ਸੰਪਰਕ ਚੁਣੋ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ਆਪਣਾ ਖੁਦ ਦਾ ਲਿਖੋ..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ਰੱਦ ਕਰੋ"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ਭੇਜੋ"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"ਜਵਾਬ ਦਿਓ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS ਭੇਜੋ"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ਵੀਡੀਓ ਕਾਲ ਦੇ ਤੌਰ ਤੇ ਜਵਾਬ ਦਿਓ"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ਔਡੀਓ ਕਾਲ ਦੇ ਤੌਰ ਤੇ ਜਵਾਬ ਦਿਓ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ਵੀਡੀਓ ਬੇਨਤੀ ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ਵੀਡੀਓ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ਵੀਡੀਓ ਪ੍ਰਸਾਰਣ ਬੇਨਤੀ ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ਵੀਡੀਓ ਪ੍ਰਸਾਰਣ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਉੱਪਰ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਸੱਜੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਤੱਕ ਹੇਠਾਂ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"ਵਾਈਬ੍ਰੇਟ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"ਵਾਈਬ੍ਰੇਟ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ਅਵਾਜ਼"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ਡਿਫੌਲਟ ਅਵਾਜ਼ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ਫੋਨ ਰਿੰਗਟੋਨ"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ਰਿੰਗ ਕਰਨ ਵੇਲੇ ਵਾਈਬ੍ਰੇਟ"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"ਰਿੰਗਟੋਨ & ਵਾਈਬ੍ਰੇਟ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"ਕਾਨਫਰੰਸ ਕਾਲ ਵਿਵਸਥਿਤ ਕਰੋ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"ਐਮਰਜੈਂਸੀ ਨੰਬਰ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"ਪ੍ਰੋਫ਼ਾਈਲ ਫੋਟੋ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ਕੈਮਰਾ ਬੰਦ"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ਰਾਹੀਂ"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ਸੂਚਨਾ ਭੇਜੀ ਗਈ"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ਹਾਲੀਆ ਸੁਨੇਹੇ"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ਵਪਾਰ ਜਾਣਕਾਰੀ"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> ਮੀਲ ਦੂਰ"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> ਕਿ.ਮੀ. ਦੂਰ"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"ਕੱਲ੍ਹ <xliff:g id="OPEN_TIME">%s</xliff:g> ਵਜੇ ਖੁੱਲ੍ਹੇਗਾ"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ਅੱਜ <xliff:g id="OPEN_TIME">%s</xliff:g> ਵਜੇ ਖੁੱਲ੍ਹੇਗਾ"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ਵਜੇ ਬੰਦ ਹੋਵੇਗਾ"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ਅੱਜ <xliff:g id="CLOSE_TIME">%s</xliff:g> ਵਜੇ ਬੰਦ ਹੋਇਆ"</string>
+ <string name="open_now" msgid="6439301193613349163">"ਹੁਣ ਖੁੱਲ੍ਹਾ ਹੈ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ਹੁਣ ਬੰਦ ਹੈ"</string>
+</resources>
diff --git a/InCallUI/res/values-pl/strings.xml b/InCallUI/res/values-pl/strings.xml
new file mode 100644
index 0000000..b70cac7
--- /dev/null
+++ b/InCallUI/res/values-pl/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Oczekujące"</string>
+ <string name="unknown" msgid="6878797917991465859">"Nieznany"</string>
+ <string name="private_num" msgid="6713286113000232309">"Numer prywatny"</string>
+ <string name="payphone" msgid="4793877574636445118">"Automat telefoniczny"</string>
+ <string name="confCall" msgid="1904840547188336828">"Poł. konferencyjne"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Połączenie przerwane"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Głośnik"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Słuchawka telefonu"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Przewodowy zestaw słuch."</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Wysłać następujące dzwonki?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Wysyłanie sygnałów\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Wyślij"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Tak"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nie"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Zastąp symbol wieloznaczny"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Poł. konferencyjne <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Numer poczty głosowej"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Wybieranie"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Ponowne wybieranie numeru"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Poł. konferencyjne"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Połączenie"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Przychodz. poł. służbowe"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Połączenie zakończone"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Oczekujące"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Trwa rozłączanie"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Trwa połączenie"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mój numer to <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Rozpoczynanie rozmowy wideo"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Rozmowa wideo"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Wysyłanie żądania wideo"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Nie można nawiązać połączenia wideo"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Prośba o film została odrzucona"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Twój numer oddzwaniania\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Twój numer oddzwaniania dla połączeń alarmowych\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Trwa wybieranie numeru"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Nieodebrane połączenie"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Połączenia nieodebrane"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> nieodebranych połączeń"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Nieodebrane połączenie z <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Trwa połączenie"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Trwa połączenie służbowe"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Trwające połączenie przez Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Trwa połączenie służbowe przez Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Oczekujące"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Połączenie przychodzące"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Przychodzące połączenie służbowe"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Przychodzące połączenie przez Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Przychodzące połączenie służbowe przez Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Przychodząca rozmowa wideo"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Przychodzące żądanie wideo"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nowa poczta głosowa"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nowa poczta głosowa (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Zadzwoń do <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nieznany numer poczty głosowej"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Brak usługi"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Wybrana sieć (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) jest niedostępna"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Odbierz"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Rozłącz"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Rozmowa wideo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Głos"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Zaakceptuj"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Odrzuć"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Oddzwoń"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Wiadomość"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Aby rozpocząć połączenie, wyłącz najpierw tryb samolotowy"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Nie zarejestrowano w sieci"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Sieć komórkowa jest niedostępna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Aby zadzwonić, wybierz prawidłowy numer."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Nie można dzwonić."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Rozpoczynanie sekwencji MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Usługa nie jest obsługiwana."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nie można przełączyć połączeń."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nie można rozdzielić połączenia."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Nie można przekazać."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Nie można nawiązać połączenia konferencyjnego."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Nie można odrzucić połączenia."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Nie można zwolnić połączeń."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Połączenie SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Połączenie alarmowe"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Trwa włączanie sieci bezprzewodowych..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Brak sieci. Próbuję ponownie…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Nie można dzwonić. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nie jest numerem alarmowym."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Nie można dzwonić. Wybierz numer alarmowy."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Aby zadzwonić, użyj klawiatury."</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Wstrzymaj połączenie"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Wznów połączenie"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Zakończ połączenie"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Klawiatura"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Wycisz"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Dodaj połączenie"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Scal połączenia"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Przełącz"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Zarządzaj połączeniami"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Zarządzaj poł. konf."</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Dźwięk"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Rozmowa wideo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Zmień na połączenie głosowe"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Przełącz aparat"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Wstrzymaj film"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Więcej opcji"</string>
+ <string name="player_started" msgid="6046262510243983589">"Odtwarzacz włączony"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Odtwarzacz zatrzymany"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Aparat niegotowy"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Aparat gotowy"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Nieznane zdarzenie sesji połączenia"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Usługa"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfiguracja"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nie ustawiono>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Inne ustawienia połączeń"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Połączenie przez <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Przychodzące przez <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"zdjęcie kontaktu"</string>
+ <string name="goPrivate" msgid="865837794424530980">"przejdź do rozmowy prywatnej"</string>
+ <string name="selectContact" msgid="781975788478987237">"wybierz kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napisz własną..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Anuluj"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Wyślij"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Odbierz"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Wyślij SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Odrzuć"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Odbierz jako rozmowę wideo"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Odbierz jako rozmowę audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Przyjmij połączenie wideo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Odrzuć połączenie wideo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Zaakceptuj wysyłanie obrazu wideo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Odrzuć wysyłanie obrazu wideo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Zaakceptuj odbieranie obrazu wideo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Odrzuć odbieranie obrazu wideo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Przesuń w górę: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Przesuń w prawo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Przesuń w dół: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Wibracje"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Wibracje"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Dźwięk"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Domyślny dźwięk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Dzwonek telefonu"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Wibracje i dzwonek"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Dzwonek i wibracje"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Zarządzaj połączeniem konferencyjnym"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Numer alarmowy"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="one">1 sekunda</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="one">1 minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> godziny</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> godzin</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> godziny</item>
+ <item quantity="one">1 godzina</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Zdjęcie profilowe"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera wyłączona"</string>
+ <string name="child_number" msgid="7437330400723805538">"z <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Notatka wysłana"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Ostatnie wiadomości"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informacje o firmie"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil(e) stąd"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km stąd"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Otwarte jutro od <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Otwarte dzisiaj od <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Zamknięte od <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Zamknięte dzisiaj od <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Teraz otwarte"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Teraz zamknięte"</string>
+</resources>
diff --git a/InCallUI/res/values-pt-rPT/strings.xml b/InCallUI/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..83bdac1
--- /dev/null
+++ b/InCallUI/res/values-pt-rPT/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telemóvel"</string>
+ <string name="onHold" msgid="9035493194749959955">"Em espera"</string>
+ <string name="unknown" msgid="6878797917991465859">"Desconhecido"</string>
+ <string name="private_num" msgid="6713286113000232309">"Número particular"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefone público"</string>
+ <string name="confCall" msgid="1904840547188336828">"Chamada de conferência"</string>
+ <string name="call_lost" msgid="6183862117003999578">"A chamada caiu"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altifalante"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Auricular do aparelho"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Auscultadores com fios"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Enviar os seguintes tons?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"A enviar tons\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Sim"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Não"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Substituir o carácter universal por"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Chamada de conferência <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número do correio de voz"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"A marcar"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"A marcar novamente"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Chamada de conferência"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Chamada recebida"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Chamada de trab. recebida"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Chamada terminada"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Em espera"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"A desligar"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"A chamar"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"O meu número é <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"A ligar vídeo"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"A solicitar vídeo"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Não é possível ligar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Pedido de vídeo rejeitado"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"O seu número de retorno de chamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"O seu número de retorno de chamadas de emergência\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"A marcar"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada não atendida"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chamadas não atendidas"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas não atendidas"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Chamada não atendida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Chamada em curso"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Chamada de trabalho em curso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Chamada Wi-Fi em curso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Chamada de trabalho por Wi-Fi em curso"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Em espera"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Chamada recebida"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Chamada de trabalho recebida"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Chamada Wi-Fi recebida"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Chamada de trabalho recebida por Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"A receber videochamada"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Pedido de vídeo recebido"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Novo correio de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Novo correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número do correio de voz desconhecido"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nenhum serviço"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Rede selecionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) indisponível"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Atender"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Desligar"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voz"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Aceitar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ignorar"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Ligar de volta"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mensagem"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Para efectuar uma chamada, desactive primeiro o modo para Avião."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Sem registo na rede."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rede móvel não disponível."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para telefonar, introduza um número válido."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Não é possível telefonar."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"A iniciar sequência de MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Serviço não suportado."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Não é possível alternar chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Não é possível separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Não é possível transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Não é possível efetuar uma conferência."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Não é possível rejeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Não é possível libertar a(s) chamada(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chamada de emergência"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"A ligar o rádio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Sem serviço. A tentar novamente…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Não é possível telefonar. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> não é um número de emergência."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Não é possível telefonar. Marque um número de emergência."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizar o teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Colocar a chamada em espera"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Retomar a chamada"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Terminar a chamada"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado de marcação"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Desativar som"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Adicionar chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Intercalar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Trocar"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gerir chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gerir chamada de conferência"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Áudio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videochamada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Mudar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Mudar de câmara"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Interromper vídeo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Mais opções"</string>
+ <string name="player_started" msgid="6046262510243983589">"Leitor iniciado"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Leitor interrompido"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"A câmara não está pronta"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Câmara pronta"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Evento de sessão de chamada desconhecido"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Serviço"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuração"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Não definido>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Outras definições de chamada"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"A chamar via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Recebida através de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografia do contacto"</string>
+ <string name="goPrivate" msgid="865837794424530980">"tornar privado"</string>
+ <string name="selectContact" msgid="781975788478987237">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escrever a sua própria..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancelar"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Enviar"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Atender"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Recusar"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Responder como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Responder como chamada de áudio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Aceitar o pedido de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Recusar o pedido de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Aceitar pedido para transmitir vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Recusar pedido para transmitir vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Aceitar pedido para receber vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Recusar pedido para receber vídeo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Deslize lentamente para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Deslize lentamente para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Deslize lentamente para a direita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Deslize lentamente para baixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Som"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Som predefinido (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Toque do telemóvel"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar ao tocar"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Tocar e Vibrar"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gerir chamada de conferência"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Número de emergência"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto do perfil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Câmara desligada"</string>
+ <string name="child_number" msgid="7437330400723805538">"através de <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mensagens recentes"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informações da empresa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"A <xliff:g id="DISTANCE">%.1f</xliff:g> milhas de distância"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km de distância"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Abre amanhã às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Abre hoje às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Fecha às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Fechou hoje às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Aberto agora"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Fechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-pt/strings.xml b/InCallUI/res/values-pt/strings.xml
new file mode 100644
index 0000000..4411206
--- /dev/null
+++ b/InCallUI/res/values-pt/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefone"</string>
+ <string name="onHold" msgid="9035493194749959955">"Em espera"</string>
+ <string name="unknown" msgid="6878797917991465859">"Desconhecido"</string>
+ <string name="private_num" msgid="6713286113000232309">"Número privado"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefone público"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conferência telefônica"</string>
+ <string name="call_lost" msgid="6183862117003999578">"A chamada caiu."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Alto-falante"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Minifone do aparelho"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Fone de ouvido com fio"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Enviar os toques a seguir?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Enviando tons\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Sim"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Não"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Substituir caractere curinga por"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conferência telefônica <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Número correio de voz"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Discando"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Rediscando"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conferência telefônica"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Recebendo chamada"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Chamada de trabalho recebida"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Chamada encerrada"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Em espera"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Desligando"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Em chamada"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Meu número é <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Conectando vídeo"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Solicitando vídeo"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Não é possível conectar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Solicitação de vídeo rejeitada"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Seu número de retorno de chamada\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Seu número de retorno de chamada de emergência\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Discando"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Chamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Chamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Chamada em andamento"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Chamada de trabalho em andamento"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Chamada Wi-Fi em andamento"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Chamada trabalho por Wi-Fi em andamento"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Em espera"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Recebendo chamada"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Chamada de trabalho recebida"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Chamada Wi-Fi recebida"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Chamada de trabalho recebida por Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Recebendo videochamada"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Recebendo solicitação de vídeo"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Novo correio de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Novo correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Discar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Número correio de voz desconhecido"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Sem serviço"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"A rede selecionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) não está disponível"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Responder"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Desligar"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voz"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Aceitar"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Dispensar"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Retornar chamada"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mensagem"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Para fazer uma chamada, primeiro desative o modo avião."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Não registrado na rede."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rede celular não disponível."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Para realizar uma chamada, digite um número válido."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Não é possível realizar chamadas."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iniciando sequência MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Serviço não suportado."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Não é possível alternar as chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Não é possível separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Não é possível transferir a chamada."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Não é possível fazer uma conferência."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Não é possível rejeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Não é possível liberar chamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Chamada de emergência"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ativando o rádio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Sem serviço. Tentando novamente..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Não é possível realizar chamadas. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> não é um número de emergência."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Não é possível realizar chamadas. Disque um número de emergência."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Use o teclado para discar"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Colocar chamada em espera"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Retomar chamada"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Finalizar chamada"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Teclado"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Desativar som"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Adicionar chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Mesclar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Trocar"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gerenciar chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gerenciar teleconferência"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Áudio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videocham."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Alterar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Alternar câmera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Mais opções"</string>
+ <string name="player_started" msgid="6046262510243983589">"Player iniciado"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Player interrompido"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"A câmera não está pronta"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Câmera pronta"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Evento de sessão de chamada desconhecido"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Serviço"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configuração"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Não definido>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Outras configurações de chamada"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Chamando via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Chamada de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"foto do contato"</string>
+ <string name="goPrivate" msgid="865837794424530980">"conversar em particular"</string>
+ <string name="selectContact" msgid="781975788478987237">"selecionar contato"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escreva sua resposta..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Cancelar"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Enviar"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Responder"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Recusar"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Atender como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Atender como chamada de áudio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Aceitar solicitação de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Recusar solicitação de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Aceitar solicitação de transmissão de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Recusar solicitação de transmissão de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Aceitar solicitação de recebimento de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Recusar solicitação de recebimento de vídeo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a direita."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para baixo."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Som"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Som padrão (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Toque do telefone"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrar quando estiver tocando"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Toque e vibração"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gerenciar conferência telefônica"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Número de emergência"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Foto do perfil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Câmera desligada"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mensagens recentes"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informações sobre a empresa"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> milhas de distância"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km de distância"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Abre amanhã às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Abre hoje às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Fecha às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Fechou hoje às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Aberto agora"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Fechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-ro/strings.xml b/InCallUI/res/values-ro/strings.xml
new file mode 100644
index 0000000..145104f
--- /dev/null
+++ b/InCallUI/res/values-ro/strings.xml
@@ -0,0 +1,195 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"În așteptare"</string>
+ <string name="unknown" msgid="6878797917991465859">"Necunoscut"</string>
+ <string name="private_num" msgid="6713286113000232309">"Număr privat"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefon public"</string>
+ <string name="confCall" msgid="1904840547188336828">"Teleconferință"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Apelul s-a încheiat"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Difuzor"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Casca dispozitivului"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Cască cu fir"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Trimiteți următoarele tonuri?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Se trimit tonuri\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Trimiteți"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Da"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nu"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Înlocuiţi metacaracterul cu"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Teleconferință <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Număr mesagerie vocală"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Apelează"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Se reapelează"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Teleconferință"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Apel primit"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Apel de serviciu primit"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Apel încheiat"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"În așteptare"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Se închide telefonul"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"În timpul apelului"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Numărul meu este <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Se conectează video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Apel video"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Se solicită video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Nu se poate conecta apelul video"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Solicitarea pentru apel video a fost respinsă"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Numărul de apelare inversă\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Numărul de apelare inversă de urgență\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Apelează"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Apel nepreluat"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Apeluri nepreluate"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> (de) apeluri nepreluate"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Apel nepreluat de la <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Apel în desfăşurare"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Apel de serviciu în desfășurare"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Apel Wi-Fi în desfășurare"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Apel de serviciu prin Wi-Fi în desfășurare"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"În așteptare"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Apel de intrare"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Apel de serviciu primit"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Apel prin Wi-Fi primit"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Apel de serviciu prin Wi-Fi primit"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Apel video primit"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Solicitare de trecere la apel video"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Mesaj vocal nou"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Mesaj vocal nou (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Apelați <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Număr mesagerie vocală necunoscut"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Fără serviciu"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Rețeaua selectată (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nu este disponibilă"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Răspundeți"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Încheiaţi apelul"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Videoclip"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Voce"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Acceptați"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Refuzați"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Sunați"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mesaj"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Pentru a efectua un apel, mai întâi dezactivați modul Avion."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Neînregistrat în rețea."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rețeaua mobilă nu este disponibilă"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Pentru a apela, introduceți un număr valid."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Nu se poate apela."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Se porneşte secvenţa MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Serviciul nu este acceptat."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Apelurile nu pot fi comutate."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Apelul nu poate fi separat."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Nu se poate transfera."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Conferința telefonică nu poate fi inițiată."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Apelul nu poate fi respins."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Apelurile nu pot fi eliberate."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"apel SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Apel de urgenţă"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Se activează semnalul radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Fără semnal. Se încearcă din nou..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Nu se poate apela. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nu este un număr de urgență."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Nu se poate apela. Formați un număr de urgență."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Utilizaţi tastatura pentru a forma"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Puneți apelul în așteptare"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Reluați apelul"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Încheiați apelul"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Tastatură numerică"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Dezactivați sunetul"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Adăugați un apel"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Îmbinați apelurile"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Schimbaţi"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Gestionați apelurile"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Gestionați teleconferința"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Apel video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Treceți la apel vocal"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Comutați camera foto"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Întrerupeți videoclipul"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Mai multe opțiuni"</string>
+ <string name="player_started" msgid="6046262510243983589">"Playerul a pornit"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Playerul s-a oprit"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Camera foto nu este pregătită"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Camera foto este pregătită"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Eveniment necunoscut privind o sesiune de apeluri"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Servicii"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Configurare"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nesetat>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Alte setări de apel"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Se apelează prin <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Primite prin <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografie persoană din agendă"</string>
+ <string name="goPrivate" msgid="865837794424530980">"trecerea la modul privat"</string>
+ <string name="selectContact" msgid="781975788478987237">"selectarea unei persoane din agendă"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Scrieți propriul răspuns…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Anulați"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Trimiteți"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Răspundeți"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Trimiteți SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Refuzaţi"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Răspundeți ca apel video"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Răspundeți ca apel audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Acceptați solicitarea de a trece la apel video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Refuzați solicitarea de a trece la apel video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Acceptați solicitarea de a transmite conținut video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Refuzați solicitarea de a transmite conținut video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Acceptați solicitarea de a primi conținut video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Refuzați solicitarea de a primi conținut video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Glisați în sus pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Glisați spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Glisați spre dreapta pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Glisați în jos pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrații"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrații"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sunet"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sunet prestabilit (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ton de apel telefon"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrează când sună"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ton de apel și vibrare"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Gestionați teleconferința"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Număr de urgență"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> secunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> de secunde</item>
+ <item quantity="one">O secundă</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> de minute</item>
+ <item quantity="one">Un minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ore</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> de ore</item>
+ <item quantity="one">O oră</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Fotografie de profil"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Camera este oprită"</string>
+ <string name="child_number" msgid="7437330400723805538">"pe <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Nota a fost trimisă"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mesaje recente"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informații despre companie"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi distanță"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km distanță"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Deschide mâine la <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Deschide astăzi la <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Închide la <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"A închis astăzi la <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Acum este deschis"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Acum este închis"</string>
+</resources>
diff --git a/InCallUI/res/values-ru/strings.xml b/InCallUI/res/values-ru/strings.xml
new file mode 100644
index 0000000..b7227b0
--- /dev/null
+++ b/InCallUI/res/values-ru/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"Ждет ответа"</string>
+ <string name="unknown" msgid="6878797917991465859">"Неизвестный абонент"</string>
+ <string name="private_num" msgid="6713286113000232309">"Скрытый номер"</string>
+ <string name="payphone" msgid="4793877574636445118">"Телефон-автомат"</string>
+ <string name="confCall" msgid="1904840547188336828">"Конференц-вызов"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Звонок сброшен"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Динамик"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Динамик гарнитуры"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Проводная гарнитура"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Отправить следующие тоны?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Отправка тональных сигналов\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Позвонить"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Да"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Нет"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Заменить универсальный символ на"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Конференц-вызов: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Номер голосовой почты"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Набор номера"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Повторный набор"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Конференц-вызов"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Входящий вызов"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Входящий звонок (работа)"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Вызов завершен"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Ждет ответа"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Завершение разговора"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Поступающий вызов"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Мой номер: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Подключение видео"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Видеовстреча"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Запрос видео"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Не удалось совершить видеовызов"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Видеовызов отклонен"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Номер обратного вызова:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Номер обратного вызова для экстренных служб:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Набор номера"</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_ongoing_call" msgid="7068688957273482989">"Текущий вызов"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Текущий звонок (работа)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Текущий Wi-Fi-звонок"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Текущий Wi-Fi-звонок (работа)"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"На удержании"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Входящий вызов"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Входящий звонок (работа)"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Входящий Wi-Fi-звонок"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Входящий Wi-Fi-звонок (работа)"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Входящий видеовызов"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Входящий видеовызов"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Новое сообщение голосовой почты"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Новое сообщение голосовой почты (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Позвонить <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Номер голосовой почты неизвестен"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Сеть не найдена"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Выбранная сеть (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) недоступна."</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Ответить"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Завершить разговор"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Голосовой вызов"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Принять"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Отклонить"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Позвонить"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Написать"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Перед тем как звонить, отключите режим полета."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Нет регистрации в сети."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Мобильная сеть недоступна."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Недействительный номер."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Не удалось позвонить."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Запуск последовательности MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Сервис не поддерживается."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Не удалось переключить вызов."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Не удалось разделить вызов."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Не удалось перенести."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Не удалось выполнить конференц-вызов."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Не удалось отклонить вызов."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Не удалось разъединить."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Вызов SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Экстренный вызов"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Включение радио…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Нет сигнала. Повторная попытка…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Не удалось позвонить. Номер <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не принадлежит экстренным службам."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Не удалось позвонить. Наберите номер экстренных служб."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Используйте клавиатуру для набора номера"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Удерживать вызов"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Возобновить вызов"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Завершить вызов"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Кнопки"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Откл. звук"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Добавить вызов"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Соединить"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Перевод звонка"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Управление вызовами"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Управление конференц-связью"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видео"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Телефонный звонок"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Переключение камеры"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Приостановить видео"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Ещё"</string>
+ <string name="player_started" msgid="6046262510243983589">"Видеоплеер включен"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Видеоплеер отключен"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камера недоступна"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камера доступна"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Неизвестное событие сеанса связи"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Служба"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Настройка"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Не задано>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Другие настройки вызовов"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Звонок через <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Входящий вызов (оператор: <xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"фотография контакта"</string>
+ <string name="goPrivate" msgid="865837794424530980">"приватная конференция"</string>
+ <string name="selectContact" msgid="781975788478987237">"выбрать контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Ваш ответ…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Отмена"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Отправить"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Ответить"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Отправить SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Отклонить"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Ответить с видео"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Ответить на голосовой вызов"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Ответить на видеовызов"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Отклонить видеовызов"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Разрешить передачу видео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Отклонить передачу видео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Принять видео"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Отклонить видео"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Проведите вправо, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Проведите вниз, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Вибросигнал"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Вибросигнал"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Звук"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"По умолчанию (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Рингтон"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Вибросигнал и рингтон"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Рингтон и вибросигнал"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Управление конференц-связью"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Экстренная служба"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунды</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунды</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> минуты</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минуты</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> час</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> часов</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Фото профиля"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камера отключена"</string>
+ <string name="child_number" msgid="7437330400723805538">"через <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Сообщение отправлено"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Недавние сообщения"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Информация о компании"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> мил."</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Откроется завтра в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Откроется сегодня в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Работает до <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Сегодня не работает с <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Сейчас открыто"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Сейчас закрыто"</string>
+</resources>
diff --git a/InCallUI/res/values-si-rLK/strings.xml b/InCallUI/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..4c653f3
--- /dev/null
+++ b/InCallUI/res/values-si-rLK/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"දුරකථනය"</string>
+ <string name="onHold" msgid="9035493194749959955">"රඳවා ගනිමින්"</string>
+ <string name="unknown" msgid="6878797917991465859">"නොදනී"</string>
+ <string name="private_num" msgid="6713286113000232309">"පුද්ගලික අංකය"</string>
+ <string name="payphone" msgid="4793877574636445118">"පේෆෝනය"</string>
+ <string name="confCall" msgid="1904840547188336828">"සම්මන්ත්රණ ඇමතුම"</string>
+ <string name="call_lost" msgid="6183862117003999578">"ඇමතුම නැවතුණි"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"නාදකය"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"හෑන්ඩ්සෙටයේ සවන් කඬ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"රැහැන් සහිත හෙඩ්සෙටය"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"බ්ලූටූත්"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"පහත නාද යවන්නද?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"නාද යවමින්\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"යවන්න"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ඔව්"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"නැත"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"අක්ෂරය ප්රතිස්ථාපනය කරන්නේ"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"සම්මන්ත්රණ ඇමතුම <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"හඬ තැපැල් අංකය"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"අමතමින්"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"නැවත අංකනය කරමින්"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"සම්මන්ත්රණ ඇමතුම"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"එන ඇමතුම"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"පැමිණෙන කාර්යාල ඇමතුම"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"ඇමතුම අවසන් විය"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"රඳවා ගනිමින්"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"විසන්ධි කරමින්"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"ඇමතුමක"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"මගේ අංකය <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"වීඩියෝවකට සම්බන්ධ කරමින්"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"වීඩියෝ ඇමතුම"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"වීඩියෝවක් ඉල්ලමින්"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"වීඩියෝ ඇමතුම සම්බන්ධ කළ නොහැක"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"වීඩියෝ ඉල්ලීම ප්රතික්ෂේප කරන ලදී"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"ඔබට ආපසු කථා කිරීමේ අංකය\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"ඔබගේ හදිසි ඇමතුම් අංකය\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"අමතමින්"</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_ongoing_call" msgid="7068688957273482989">"කරගෙනය යන ඇමතුම"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"කරගෙන යන කාර්යාල ඇමතුම"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"දැනට ක්රියාත්මක Wi-Fi ඇමතුම"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"කරගෙන යන Wi-Fi කාර්යාල ඇමතුම"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"රඳවා ගනිමින්"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"එන ඇමතුම"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"පැමිණෙන කාර්යාල ඇමතුම"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"පැමිණෙන Wi-Fi ඇමතුම"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"පැමිණෙන Wi-Fi කාර්යාල ඇමතුම"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"පැමිණෙන වීඩියෝ ඇමතුම"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"පැමිණෙන වීඩියෝ ඉල්ලීම"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"නව හඬතැපෑල"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"නව හඬ තැපැල් (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> අමතන්න"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"හඬතැපැල් අංකය නොදනී"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"සේවාව නැත"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"තෝරා ඇති ජාලය (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) නොමැත"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"පිළිතුරු දෙන්න"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"විසන්ධි කරන්න"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"වීඩියෝව"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"හඬ"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"පිළිගන්න"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ඉවත ලන්න"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"නැවත අමතන්න"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"පණිවිඩය"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"ඇමතුමක් ගැනීමට, මුලින්ම ගුවන්යානා ආකාරය අක්රිය කරන්න."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ජාලය මත ලියාපදිංචි වී නැත."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"සෙලියුලර් ජාලය නොමැත"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"ඇමතුමක් ලබාගැනීමට, වලංගු අංකයක් ලබාගන්න."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"ඇමතුම් ගැනීමට නොහැක."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI අනුපිළිවෙල ආරම්භ කරමින්…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"සේවාව සහාය ලබාදෙන්නේ නැත."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ඇමතුම් මාරු කිරීම කළ නොහැක."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ඇමතුම වෙන් කිරීම කළ නොහැක."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"මාරු කිරීමට නොහැක."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"සාකච්ඡාව කළ නොහැක."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ඇමතුම ප්රතික්ෂේප කළ නොහැක."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ඇමතුම(ම්) මුදාහැරීම කළ නොහැක."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP ඇමතුම"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"හදිසි ඇමතුම"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"රේඩියෝව ආරම්භ කරමින්…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"සේවා නැත. නැවත උත්සාහ කරන්න…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"ඇමතුම් ලබාගැනීම කළ නොහැක. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> මෙය හදිස්සි ඇමතුම් අංකයක් නොවේ."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"ඇමතිය නොහැක. හදිසි අංකයක් අමතන්න."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ඇමතීමට කිරීමට යතුරු පුවරුව භාවිතා කරන්න"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"ඇමතුම රඳවා ගන්න"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"ඇමතුම නැවත පටන්ගන්න"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"ඇමතුම අවසන් කරන්න"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ඇමතුම් පෑඩය"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"නිශ්ශබ්ද කරන්න"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"ඇමතුමක් එක් කරන්න"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"ඇමතුම් එකට මුසු කරන්න"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"මාරු කරන්න"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"ඇමතුම් කළමනාකරණය කරන්න"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"සම්මන්ත්රණ ඇමතුම කළමනාකරණය කරන්න"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ශ්රව්ය"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"වීඩියෝ ඇමතුම"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"හඬ ඇමතුමක් වෙත මාරු කරන ලදි"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"කැමරාව මාරු කරන්න"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"විඩියෝව විරාම කරන්න"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"තවත් විකල්ප"</string>
+ <string name="player_started" msgid="6046262510243983589">"ධාවකය ආරම්භ කරන ලදි"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"ධාවකය නැවතුණි"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"කැමරාව සූදානම් නැහැ"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"කැමරාව සූදානම්"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"නොදන්නා ඇමතුම් සැසි සිදුවීම"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"සේවාව"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"ස්ථාපනය කරන්න"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<පිහිටුවා නැත>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"වෙනත් ඇමතුම් සැකසුම්"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> හරහා අමතමින්"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> මගින් ඇතුළට එන"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"සම්බන්ධතා ඡායාරූපය"</string>
+ <string name="goPrivate" msgid="865837794424530980">"පොද්ගලික බවට යන්න"</string>
+ <string name="selectContact" msgid="781975788478987237">"සම්බන්ධතාවය තෝරාගන්න"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ඔබෙම එකක් ලියන්න..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"අවලංගු කරන්න"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"යවන්න"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"පිළිතුරු දෙන්න"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS යවන්න"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"ප්රතික්ෂේප කරන්න"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"වීඩියෝ ඇමතුමට පිළිතුරු දෙන්න"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ශ්රව්ය ඇමතුමට පිළිතුරු දෙන්න"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"වීඩියෝ ඉල්ලීම පිළිගනියි"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"වීඩියෝ ඉල්ලීම ප්රතික්ෂේප කරයි"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"වීඩියෝ සම්ප්ර්ෂණ ඉල්ලීම පිළිගන්නා ලදි"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"වීඩියෝ සම්ප්ර්ෂණ ඉල්ලීම ප්රතික්ෂේප කරන ලදි"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"වීඩියෝ ලැබීමේ ඉල්ලීම පිළිගන්නා ලදි"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"වීඩියෝ ලැබීමේ ඉල්ලීම ප්රතික්ෂේප කරන ලදි"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා උඩට සර්පණය කරන්න."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා දකුණට සර්පණය කරන්න."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා පහළට සර්පණය කරන්න."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"කම්පනය වීම"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"කම්පනය වීම"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ශබ්දය"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"සුපුරුදු ශබ්දය (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"දුරකථන රිංටෝනය"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"රිංග් වන විට කම්පනයවේ"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"රිගින් ටෝන් සහ කම්පනය කරන්න"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"සම්මන්ත්රණ ඇමතුම කළමනාකරණය කරන්න"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"හදිසි ඇමතුම් අංකය"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one">තත්පර <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="other">තත්පර <xliff:g id="COUNT">%d</xliff:g></item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one">මිනිත්තු <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="other">මිනිත්තු <xliff:g id="COUNT">%d</xliff:g></item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one">පැය <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="other">පැය <xliff:g id="COUNT">%d</xliff:g></item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"පැතිකඩ ඡායාරූපය"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"කැමරාව ක්රියාවිරහිතයි"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> හරහා"</string>
+ <string name="note_sent" msgid="3548700178238244595">"සටහන යවන ලදී"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"මෑත පණිවිඩ"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ව්යාපාර තොරතුරු"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"සැතපුම් <xliff:g id="DISTANCE">%.1f</xliff:g>ක් ඈතින්"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"කි.මි. <xliff:g id="DISTANCE">%.1f</xliff:g>ක් ඈතින්"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"හෙට <xliff:g id="OPEN_TIME">%s</xliff:g>ට විවෘත කෙරේ"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"අද <xliff:g id="OPEN_TIME">%s</xliff:g>ට විවෘත කෙරේ"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g>ට වසයි"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"අද <xliff:g id="CLOSE_TIME">%s</xliff:g>ට වසනු ලැබේ"</string>
+ <string name="open_now" msgid="6439301193613349163">"දැන් විවෘතයි"</string>
+ <string name="closed_now" msgid="9175774453982778909">"දැන් වසා ඇත"</string>
+</resources>
diff --git a/InCallUI/res/values-sk/strings.xml b/InCallUI/res/values-sk/strings.xml
new file mode 100644
index 0000000..9c04392
--- /dev/null
+++ b/InCallUI/res/values-sk/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefón"</string>
+ <string name="onHold" msgid="9035493194749959955">"Podržaný hovor"</string>
+ <string name="unknown" msgid="6878797917991465859">"Neznáme"</string>
+ <string name="private_num" msgid="6713286113000232309">"Súkromné číslo"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefónny automat"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferenčný hovor"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Hovor bol prerušený."</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Reproduktor"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Slúchadlo"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Náhlavná súprava s káblom"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Odoslať nasledujúce tóny?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Odosielanie tónov\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Odoslať"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Áno"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nie"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Nahradiť zástupný znak znakom"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferenčný hovor <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Číslo hlasovej schránky"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Vytáča sa"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Znova sa vytáča"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenčný hovor"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Prichádzajúci hovor"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Prichádzajúci prac. hovor"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Hovor bol ukončený"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Podržaný hovor"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Ukončovanie hovoru"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Prebieha hovor"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Moje číslo je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Pripája sa video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videohovor"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Žiada sa video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videohovor nie je možné pripojiť"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Žiadosť o video bola odmietnutá"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Vaše číslo na spätné volanie\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Vaše číslo na spätné tiesňové volanie\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Vytáča sa"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Zmeškaný hovor"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Zmeškané hovory"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>."</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Zmeškaný hovor od volajúceho <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Prebiehajúci hovor"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Prebiehajúci pracovný hovor"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Odchádzajúci hovor prostredníctvom siete Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Prebiehajúci pracovný hovor cez Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Podržaný hovor"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Prichádzajúci hovor"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Prichádzajúci pracovný hovor"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Prichádzajúci hovor prostredníctvom siete Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Prichádzajúci pracovný hovor cez Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Prichádzajúci videohovor"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Prichádzajúca žiadosť o video"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nová hlasová správa"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nová hlasová správa (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Zavolať hlasovú schránku <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Číslo hlasovej schránky je neznáme"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Žiadny signál"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Vybratá sieť (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nie je k dispozícii"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Prijať"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Položiť"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Hlas"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Prijať"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Zatvoriť"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Zavolať"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Napísať"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Ak chcete telefonovať, vypnite najprv režim v lietadle."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Prihlásenie do siete nebolo úspešné."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilná sieť nie je k dispozícii."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ak chcete volať, zadajte platné číslo"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Hovor nie je možné uskutočniť"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Prebieha spúšťanie sekvencie MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Služba nie je podporovaná"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nedajú sa prepínať hovory"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nedá sa rozdeliť hovor"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Nedá sa preniesť"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Nedá sa uskutočniť konferenčný hovor"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Nedá sa odmietnuť hovor"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Nedajú sa ukončiť hovory"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Hovory SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Tiesňové volanie"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Prebieha zapínanie rádia..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Žiadna služba. Prebieha opätovný pokus…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Hovor nie je možné uskutočniť. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nie je číslo tiesňového volania."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Hovor nie je možné uskutočniť. Vytočte číslo tiesňového volania."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Číslo vytočíte pomocou klávesnice."</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Podržať hovor"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Obnoviť hovor"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Ukončiť hovor"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Číselná klávesnica"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Ignorovať"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Pridať hovor"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Zlúčiť hovory"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Zameniť"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Spravovať hovory"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Spravovať kon. hovor"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Zvuk"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videohovor"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Zmeniť na hlasový hovor"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Prepnúť kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pozastaviť video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Ďalšie možnosti"</string>
+ <string name="player_started" msgid="6046262510243983589">"Prehrávač bol spustený"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Prehrávač bol zastavený"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera nie je pripravená"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera je pripravená"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Neznáma udalosť relácie volania"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Služba"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Nastavenie"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Nenastavené>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Ďalšie nastavenia hovorov"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Volanie cez <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Prichádz. hovor prostred. poskytovateľa <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografia kontaktu"</string>
+ <string name="goPrivate" msgid="865837794424530980">"prepnúť na súkromné"</string>
+ <string name="selectContact" msgid="781975788478987237">"vybrať kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napísať vlastnú..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Zrušiť"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Odoslať"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Prijať"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Odoslať SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Odmietnuť"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Prijať ako videohovor"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Prijať ako zvukový hovor"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Prijať žiadosť o videohovor"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Odmietnuť žiadosť o videohovor"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Prijať žiadosť o prenos videa"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Odmietnuť žiadosť o prenos videa"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Povoliť žiadosť o prijatie videa"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Odmietnuť žiadosť o prijatie videa"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Prejdite prstom doprava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Prejdite prstom nadol: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrovať"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrovať"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Zvuk"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Predvolený zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Tón zvonenia telefónu"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibrovať pri zvonení"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Tón zvonenia a vibrovanie"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Spravovať konferenčný hovor"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Číslo tiesňového volania"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekúnd</item>
+ <item quantity="one">1 sekunda</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minúty</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minúty</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minút</item>
+ <item quantity="one">1 minúta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hodín</item>
+ <item quantity="one">1 hodina</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilová fotka"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera je vypnutá"</string>
+ <string name="child_number" msgid="7437330400723805538">"na čísle <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Poznámka bola odoslaná"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nedávne správy"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informácie o firme"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Vzdialené <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Vzdialené <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Otvára sa zajtra o <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Dnes sa otvára o <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Zatvára sa o <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Dnes bolo zatvorené o <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Otvorené"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Zatvorené"</string>
+</resources>
diff --git a/InCallUI/res/values-sl/strings.xml b/InCallUI/res/values-sl/strings.xml
new file mode 100644
index 0000000..3c8cfc6
--- /dev/null
+++ b/InCallUI/res/values-sl/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Zadržano"</string>
+ <string name="unknown" msgid="6878797917991465859">"Neznano"</string>
+ <string name="private_num" msgid="6713286113000232309">"Zasebna številka"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefonska govorilnica"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferenčni klic"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Klic je bil prekinjen"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Zvočnik"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Slušalka"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Žične slušalke"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Ali želite poslati naslednje tone?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Pošiljanje tonov\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Pošlji"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Da"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ne"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Zamenjaj nadomestni znak z"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferenčni klic <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Številka glasovne pošte"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Klicanje"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Vnovično klicanje"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenčni klic"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Dohodni klic"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Dohodni delovni klic"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Klic je bil končan"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Zadržano"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Prekinitev"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Dohodni klic"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Moja številka je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Povezovanje videa"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videoklic"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Zahtevanje videa"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Videoklica ni mogoče vzpostaviti"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Zavrnjena zahteva za videoklic"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Vaša številka za povratni klic:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Vaša številka za povratni klic v sili:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Klicanje"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Neodgovorjeni klic"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Neodgovorjeni klici"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> neodgovorjenih klicev"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Neodgovorjeni klic od <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Aktivni klic"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Aktivni delovni klic"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Odhodni klic prek Wi-Fi-ja"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Aktivni delovni klic prek omrežja Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Zadržano"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Dohodni klic"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Dohodni delovni klic"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Dohodni klic prek Wi-Fi-ja"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Dohodni delovni klic prek omrežja Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Dohodni videoklic"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Dohodna zahteva za video"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nova glasovna pošta"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nova glasovna pošta (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Kliči <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Neznana številka glasovne pošte"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ni storitve"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Izbrano omrežje (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ni na voljo"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Sprejmi"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Prekinite klic"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Videoklic"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Govor"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Sprejmi"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Opusti"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Povratni klic"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Sporočilo"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Če želite poklicati, najprej izklopite način za letalo."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ni registrirano v omrežju."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobilno omrežje ni na voljo."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Če želite opraviti klic, vnesite veljavno številko."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Klicanje ni mogoče."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Začetek zaporedja MMI ..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Storitev ni podprta."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Preklop med klici ni mogoč."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ločitev klica ni mogoča."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Prenos ni mogoč."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferenčni klic ni mogoč."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Zavrnitev klica ni mogoča."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Prevzem klicev ni mogoč."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Klic SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Klic v sili"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Vklop radia …"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ni signala. Vnovičen poskus …"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Klicanje ni mogoče. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ni številka za klic v sili."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Klicanje ni mogoče. Opravite klic v sili."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Za klicanje uporabite tipkovnico"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Zadrži klic"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Nadaljuj klic"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Končaj klic"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Številčnica"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Nemo"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Dodaj klic"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Združi klice"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Zamenjaj"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Upravljanje klicev"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Upravljanje konferenčnih klicev"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Zvok"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videoklic"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Preklopi na glasovni klic"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Preklop fotoaparata"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Začasno ustavi video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Več možnosti"</string>
+ <string name="player_started" msgid="6046262510243983589">"Predvajanje začeto"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Predvajanje ustavljeno"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Fotoaparat ni pripravljen"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Fotoaparat je pripravljen"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Neznan dogodek seje klica"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Storitev"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Nastavitev"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ni nastavljeno>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Druge nastavitve klicev"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Klicanje prek <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Dohodni prek <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografija stika"</string>
+ <string name="goPrivate" msgid="865837794424530980">"zasebno"</string>
+ <string name="selectContact" msgid="781975788478987237">"izbira stika"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite svoje besedilo …"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Prekliči"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Pošlji"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Odgovori"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Pošlji SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Zavrni"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Odgovori z videoklicem"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Odgovori z zvočnim klicem"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Sprejmi zahtevo za video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Zavrni zahtevo za video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Sprejemanje zahteve za pošiljanje videoklica"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Zavrnitev zahteve za pošiljanje videoklica"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Sprejemanje zahteve za prejem videoklica"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Zavrnitev zahteve za prejem videoklica"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Povlecite navzgor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Povlecite v desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Povlecite navzdol za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibriraj"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibriraj"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Zvok"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Privzeti zvok (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ton zvonjenja telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Vibriranje ob zvonjenju"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Zvonjenje in vibriranje"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Upravljanje konferenčnih klicev"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Številka za klic v sili"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> minuti</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ura</item>
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> uri</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ure</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ur</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Slika profila"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera je izklopljena"</string>
+ <string name="child_number" msgid="7437330400723805538">"prek <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Opomba poslana"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Nedavna sporočila"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Podatki o podjetju"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi stran"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km stran"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Odpre se jutri ob <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Odpre se danes ob <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Zapre se ob <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Zaprto danes ob <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Trenutno odprto"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Trenutno zaprto"</string>
+</resources>
diff --git a/InCallUI/res/values-sq-rAL/strings.xml b/InCallUI/res/values-sq-rAL/strings.xml
new file mode 100644
index 0000000..4478fa2
--- /dev/null
+++ b/InCallUI/res/values-sq-rAL/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefoni"</string>
+ <string name="onHold" msgid="9035493194749959955">"Në pritje"</string>
+ <string name="unknown" msgid="6878797917991465859">"I panjohur"</string>
+ <string name="private_num" msgid="6713286113000232309">"Numër privat"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefon me pagesë"</string>
+ <string name="confCall" msgid="1904840547188336828">"Telefonatë konference"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Telefonata ra"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Altoparlant"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Kufje për vesh"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kufje me tel"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Dëshiron t\'i dërgosh tonet e mëposhtme?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Po dërgon tone\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Dërgo"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Po"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Jo"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Zëvendëso karakterin variabël me"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Telefonatë konference <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Numri i postës zanore"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Po telefonon"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Po riformon numrin"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Telefonatë konference"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Telefonatë hyrëse"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Telefonatë pune hyrëse"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Telefonata përfundoi"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Në pritje"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Mbyllja"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Në telefonatë"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Numri është <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Po rilidh videon"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Telefonatë me video"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Po kërkon video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Nuk mund të lidhë telefonatën me video"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Kërkesa me video u refuzua"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Numri i kthimit të telefonatës\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Numri i kthimit të telefonatës së urgjencës\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Po telefonon"</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_ongoing_call" msgid="7068688957273482989">"Telefonatë në vazhdim"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Telefonatë pune dalëse"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Telefonatë në vazhdim me Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Telefonatë pune dalëse përmes Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Në pritje"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Telefonatë hyrëse"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Telefonatë pune hyrëse"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Telefonatë hyrëse Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Telefonatë pune hyrëse përmes Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Telefonatë me video hyrëse"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Kërkesë për video hyrëse"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Postë e re zanore"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Postë e re zanore (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Formo numrin <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Numri i postës zanore është i panjohur"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Nuk ka shërbim"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Rrjeti i përzgjedhur (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nuk mundësohet"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Përgjigju"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Mbyll"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Zanore"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Prano"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Injoro"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Telefono"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mesazh"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Për të kryer telefonatë, së pari çaktivizo modalitetin e aeroplanit."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"I paregjistruar në rrjet."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Rrjeti celular nuk mundësohet."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Për të kryer një telefonatë, fut një numër të vlefshëm."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Nuk mund të telefonojë."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Po fillon sekuencën MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Shërbimi nuk mbështetet."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Nuk mund të ndryshojë telefonatat."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Nuk mund të ndajë telefonatën."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Nuk mund të transferojë."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Nuk mund të kryejë telefonatë konference."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Nuk mund të refuzojë telefonatën."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Nuk mund të lëshojë telefonatën(at)."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Telefonatë SAP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Telefonata e urgjencës"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Po aktivizon radion…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Nuk ka shërbim. Po provon sërish…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Nuk mund të telefonohet. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nuk është numër urgjence."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Nuk mund të telefonohet. Formo një numër urgjence."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Përdor tastierën për të formuar numrin"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Vendose në pritje telefonatën"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Rifillo telefonatën"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Mbylle telefonatën"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Blloku i formimit të numrit"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Kalo në heshtje"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Shto telefonatë"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Shkri telefonatat"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Shkëmbe"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Menaxho telefonatat"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Menaxho telefonatën-konferencë"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Telefonatë me video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Ndërro në telefonatë me video"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Ndërro kamerën"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Vendose në pauzë videon"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Më shumë opsione"</string>
+ <string name="player_started" msgid="6046262510243983589">"Luajtësi filloi"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Luajtësi ndaloi"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera nuk është gati"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera është gati"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Ngjarje e panjohur në sesionin e telefonatës"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Shërbimi"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfigurimi"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<I pavendosur>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Cilësime të tjera të telefonatës"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Telefonatë përmes <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Hyrëse nga <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"fotografia e kontaktit"</string>
+ <string name="goPrivate" msgid="865837794424530980">"bëje private"</string>
+ <string name="selectContact" msgid="781975788478987237">"përzgjidh kontaktin"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Shkruaj përgjigjen tënde..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Anulo"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Dërgo"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Përgjigju"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Dërgo SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Refuzo"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Përgjigju si telefonatë me video"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Përgjigju si telefonatë me video"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Prano kërkesën për video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Refuzo kërkesën për video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Prano kërkesën për transmetimin e videos"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Refuzo kërkesën për transmetimin e videos"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Prano kërkesën për marrjen e videos"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Refuzo kërkesën për marrjen e videos"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Rrëshqit lart për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Rrëshqit majtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Rrëshqit djathtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Rrëshqit poshtë për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Dridhja"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Dridhja"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Tingulli"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Tingulli me parazgjedhje (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Zilja e telefonit"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Lësho edhe dridhje kur bie zilja"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Me zile dhe me dridhje"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Menaxho telefonatën-konferencë"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Numri i urgjencës"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekonda</item>
+ <item quantity="one">1 sekondë</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="one">1 minutë</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> orë</item>
+ <item quantity="one">1 orë</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Fotografia e profilit"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera joaktive"</string>
+ <string name="child_number" msgid="7437330400723805538">"përmes <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Shënimi u dërgua"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mesazhet e fundit"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Informacioni i biznesit"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> milje larg"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km larg"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Hapet nesër në <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Hapet sot në <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Mbyllet në <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Mbyllur sot në <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Tani është hapur"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Tani është mbyllur"</string>
+</resources>
diff --git a/InCallUI/res/values-sr/strings.xml b/InCallUI/res/values-sr/strings.xml
new file mode 100644
index 0000000..a881bf0
--- /dev/null
+++ b/InCallUI/res/values-sr/strings.xml
@@ -0,0 +1,195 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"На чекању"</string>
+ <string name="unknown" msgid="6878797917991465859">"Непознато"</string>
+ <string name="private_num" msgid="6713286113000232309">"Приватан број"</string>
+ <string name="payphone" msgid="4793877574636445118">"Телефонска говорница"</string>
+ <string name="confCall" msgid="1904840547188336828">"Конференцијски позив"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Позив је прекинут"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Звучник"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Слушалица телефона"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Жичане слушалице"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Желите ли да пошаљете следеће тонове?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Тонови слања\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Пошаљи"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Да"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Не"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Замените џокер знак са"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Конференцијски позив <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Број говорне поште"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Позива се"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Поновно бирање"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Конференцијски позив"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Долазни позив"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Долазни позив за Work"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Позив је завршен"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"На чекању"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Прекид везе"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"У позиву"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Мој број је <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Повезивање са видео позивом"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Видео позив"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Захтевање видео позива"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Повезивање видео позива није успело"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Захтев за видео позив је одбијен"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Број за повратни позив\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Број за хитан повратни позив\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Бирање"</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_ongoing_call" msgid="7068688957273482989">"Актуелни позив"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Текући позив за Work"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Текући Wi-Fi позив"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Текући позив за Work преко Wi-Fi-ја"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"На чекању"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Долазни позив"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Долазни позив за Work"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Долазни Wi-Fi позив"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Долазни позив за Work преко Wi-Fi-ја"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Долазни видео позив"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Захтев за долазни видео позив"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Нова говорна пошта"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Нова говорна пошта (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Позови <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Непознат број говорне поште"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Нема услуге"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Изабрана мрежа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) није доступна"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Одговори"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Прекини везу"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Гласовни"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Прихвати"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Одбиј"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Узврати позив"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Порука"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Да бисте упутили позив, прво искључите режим рада у авиону."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Није регистровано на мрежи."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Мобилна мрежа није доступна."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Да бисте упутили позив, унесите важећи број."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Позив није успео."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Покретање MMI секвенце"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Услуга није подржана."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Замена позива није успела."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Раздвајање позива није успело."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Пребацивање није успело."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Конференцијски позив није успео."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Одбијање позива није успело."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Успостављање позива није успело."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP позив"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Хитан позив"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Укључивање радија…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Нема мреже. Поновни покушај…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Позив није успео. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> није број за хитне случајеве."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Позив није успео. Позовите број за хитне случајеве."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Користите тастатуру за позивање"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Стави позив на чекање"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Настави позив"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Заврши позив"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Нумеричка тастатура"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Искључи звук"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Додај позив"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Обједини позиве"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Замени"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Управљајте позивима"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Управљај конф. позивом"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Видео поз."</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Промени у гласовни позив"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Промени камеру"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Паузирај видео"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Још опција"</string>
+ <string name="player_started" msgid="6046262510243983589">"Плејер је покренут"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Плејер је заустављен"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камера није спремна"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камера је спремна"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Непознат догађај сесије позива"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Услуга"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Подешавање"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Није подешено>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Друга подешавања позива"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Позивање преко <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Долазна преко <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"фотографија контакта"</string>
+ <string name="goPrivate" msgid="865837794424530980">"иди на приватно"</string>
+ <string name="selectContact" msgid="781975788478987237">"изаберите контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишите сами…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Откажи"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Пошаљи"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Одговори"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Пошаљи SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Одбиј"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Одговорите видео позивом"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Одговорите аудио-позивом"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Прихвати захтев за видео"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Одбиј захтев за видео"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Прихвати захтев за одлазни видео позив"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Одбиј захтев за одлазни видео позив"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Прихвати захтев за долазни видео позив"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Одбиј захтев за долазни видео позив"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Превуците нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Превуците удесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Превуците надоле за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Вибрација"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Вибрација"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Звук"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Подразумевани звук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Мелодија звона телефона"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Вибрирај када звони"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Мелодија звона и вибрација"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Управљање конференцијским позивом"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Број за хитне случајеве"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунде</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> сат</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> сата</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> сати</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Слика профила"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камера је искључена"</string>
+ <string name="child_number" msgid="7437330400723805538">"на <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Белешка је послата"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Недавне поруке"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Информације о предузећу"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Удаљеност је <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Удаљеност је <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Отвара се сутра у <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Отвара се данас у <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Затвара се у <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Затворило се данас у <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Тренутно отворено"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Тренутно затворено"</string>
+</resources>
diff --git a/InCallUI/res/values-sv/strings.xml b/InCallUI/res/values-sv/strings.xml
new file mode 100644
index 0000000..f2f0125
--- /dev/null
+++ b/InCallUI/res/values-sv/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Parkerat"</string>
+ <string name="unknown" msgid="6878797917991465859">"Okänd"</string>
+ <string name="private_num" msgid="6713286113000232309">"Privat nummer"</string>
+ <string name="payphone" msgid="4793877574636445118">"Telefonautomat"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferenssamtal"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Samtalet avbröts"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Högtalare"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Telefonlur"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Trådanslutet headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Skicka följande toner?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Skickar signaler\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Skicka"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ja"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Nej"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Ersätt jokertecknet med"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferenssamtal <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nummer till röstbrevlåda"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Ringer"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Ringer upp igen"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferenssamtal"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Inkommande samtal"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Inkommande jobbsamtal"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Samtal avslutat"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Parkerat"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Lägger på"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"I samtal"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mitt nummer är <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Ansluter video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Videosamtal"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Begär video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Det gick inte att ansluta till videosamtalet"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Videobegäran avslogs"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Ditt nummer för återuppringning\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Ditt nödnummer för återuppringning\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Ringer"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Missat samtal"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Missade samtal"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missade samtal"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Missat samtal från <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Pågående samtal"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Pågående jobbsamtal"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Pågående Wi-Fi-samtal"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Pågående jobbsamtal via Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Parkerat"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Inkommande samtal"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Inkommande jobbsamtal"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Inkommande Wi-Fi-samtal"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Inkommande jobbsamtal via Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Inkommande videosamtal"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Inkommande begäran om videosamtal"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Nytt röstmeddelande"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nytt röstmeddelande (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nummer till röstbrevlåda okänt"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen tjänst"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Det valda nätverket (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) är inte tillgängligt"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Svara"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Lägg på"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Röst"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Godkänn"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Avvisa"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Ring upp"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Sms:a"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Om du vill ringa ett samtal måste du först inaktivera flygplansläge."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Inte registrerat på nätverk."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Det finns inget mobilnät tillgängligt."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ange ett giltigt nummer om du vill ringa ett samtal."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Det gick inte att ringa."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Startar sekvens för MMI-kod…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Tjänsten stöds inte."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Det gick inte att växla mellan samtal."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Det gick inte att koppla isär samtalen."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Det gick inte att överföra."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Det gick inte att starta en konferens."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Det gick inte att avvisa samtalet."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Det gick inte att släppa samtal."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP-anrop"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Nödsamtal"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Sätter på radion…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ingen tjänst. Försök igen …"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Det gick inte att ringa. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> är inget nödnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Det gick inte att ringa. Slå ett nödnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Använd tangentbordet om du vill ringa"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Parkera samtal"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Återuppta samtal"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Avsluta samtal"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Knappsats"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Ljud av"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Lägg till samtal"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Koppla ihop samtal"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Växla"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Hantera samtal"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Hantera konf.samtal"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Ljud"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Videosamtal"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Byt till röstsamtal"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Byt kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Pausa video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Fler alternativ"</string>
+ <string name="player_started" msgid="6046262510243983589">"Spelaren har startats"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Spelaren har stoppats"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kameran är inte klar"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kameran är klar"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Okänd händelse vid samtalssession"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Tjänst"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Konfiguration"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Har inte angetts>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Övriga samtalsinställningar"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Ringer via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Inkommande via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontaktbild"</string>
+ <string name="goPrivate" msgid="865837794424530980">"gör privat"</string>
+ <string name="selectContact" msgid="781975788478987237">"välj kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv ett eget svar ..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Avbryt"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Skicka"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Svara"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Skicka SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Avvisa"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Svara som videosamtal"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Svara som röstsamtal"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Acceptera videobegäran"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Neka videobegäran"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Acceptera begäran om att skicka video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Avvisa begäran om att skicka video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Acceptera begäran om att ta emot video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Avvisa begäran om att ta emot video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Dra uppåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Dra åt vänster för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Dra åt höger för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Dra nedåt för <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Vibrera"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Vibrera"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Ljud"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Standardsignal (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ringsignal"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Mobilen vibrerar när det ringer"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringsignal och vibrera"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Hantera konferenssamtal"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Nödsamtalsnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ <item quantity="one">1 sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuter</item>
+ <item quantity="one">1 minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> timmar</item>
+ <item quantity="one">1 timme</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profilfoto"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera av"</string>
+ <string name="child_number" msgid="7437330400723805538">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Anteckningen har skickats"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Senaste meddelandena"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Företagsuppgifter"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> miles bort"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km bort"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Öppnar i morgon kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Öppnar i dag kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Stänger kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Stängde i dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Öppet"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Stängt"</string>
+</resources>
diff --git a/InCallUI/res/values-sw/strings.xml b/InCallUI/res/values-sw/strings.xml
new file mode 100644
index 0000000..2909cdb
--- /dev/null
+++ b/InCallUI/res/values-sw/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Simu"</string>
+ <string name="onHold" msgid="9035493194749959955">"Inangoja"</string>
+ <string name="unknown" msgid="6878797917991465859">"Haijulikani"</string>
+ <string name="private_num" msgid="6713286113000232309">" Number isiyojulikana"</string>
+ <string name="payphone" msgid="4793877574636445118">"Simu ya kulipia"</string>
+ <string name="confCall" msgid="1904840547188336828">"Simu ya kongamano"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Simu imekatwa"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Spika"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Kipaza sauti cha kichwani"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Viskizi vya maskio pasiwaya"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Ungependa kutuma toni zifuatazo? \n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Inatuma toni\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Tuma"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ndiyo"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Hapana"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Badilisha kibambo egemezi na"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Simu ya kongamano <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Nambari ya ujumbe wa sauti"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Inapiga"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Inapiga simu tena"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Simu ya kongamano"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Simu inayoingia"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Simu ya kazi inayoingia"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Simu imekamilika"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Inangoja"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Kukata simu"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Katika simu"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Nambari yangu ni <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Inaunganisha video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Hangout ya Video"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Inaomba video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Haiwezi kuunganisha Hangout ya video"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Ombi la video limekataliwa"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Nambari yako ya kupigiwa simu\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Nambari yako ya dharura ya kupigiwa simu\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Inapiga"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Simu isiyojibiwa"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Simu zisizojibiwa"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> simu ambazo hazijajibiwa"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Simu isiyojibiwa kutoka <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Simu inayoendelea"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Simu ya kazi inayoendelea"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Simu ya Wi-Fi inayoendelea"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Simu ya Wi-Fi ya kazi inayoendelea"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Inangoja"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Simu inayoingia"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Simu ya kazi inayoingia"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Simu ya Wi-Fi inayoingia"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Simu ya Wi-Fi ya kazi inayoingia"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Hangout ya Video inayoingia"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Ombi linaloingia la video"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Ujumbe mpya wa sauti"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Barua mpya ya sauti <xliff:g id="COUNT">%d</xliff:g>"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Piga <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Nambari ya ujumbe wa sauti haijulikani."</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Hakuna huduma"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Mtandao uliochaguliwa <xliff:g id="OPERATOR_NAME">%s</xliff:g> haupatikani"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Jibu"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Kata simu"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Sauti"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Kubali"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Ondoa"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Mpigie"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Ujumbe"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Kupiga simu, kwanza zima hali ya ndege."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Haijasajiliwa kwa mitandao"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mitandao ya simu za mkononi haipatikani"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ili upige simu, weka nambari sahihi."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Haiwezi kupiga simu."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Inaanzisha msururu wa MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Huduma haitumiki."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Haiwezi kubadili simu."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Haiwezi kutenganisha simu."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Haiwezi kuhamisha."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Haiwezi kushiriki katika simu ya mkutano."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Haiwezi kukataa simu."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Haiwezi kutoa simu."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Simu ya SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Simu ya dharura"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Inawasha redio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Hakuna huduma. Inajaribu tena..."</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Haiwezi kupiga simu. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> si nambari ya dharura."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Haiwezi kupiga simu. Piga simu nambari ya dharura."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Tumia kibodi kubonyeza"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Shikilia Simu"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Endelea na Simu"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Kata Simu"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Kibao cha kupiga"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Nyamazisha"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Ongeza simu"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Changanyisha simu"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Badili"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Dhibiti simu"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Dhibiti simu ya kongamano"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Kusikika"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Hangout ya Video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Badilisha iwe simu ya sauti"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Badilisha kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Sitisha video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Chaguo zaidi"</string>
+ <string name="player_started" msgid="6046262510243983589">"Kichezaji Kimeanzishwa"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Kichezaji Kimekomeshwa"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera haiko tayari"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera iko tayari"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Tukio lisilojulikana la kipindi cha simu"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Huduma"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Sanidi"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Haijawekwa>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Mipangilio mingine ya simu"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Inapiga kupitia <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Simu zinazoingia kupitia <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"picha ya anwani"</string>
+ <string name="goPrivate" msgid="865837794424530980">"nenda kwa faragha"</string>
+ <string name="selectContact" msgid="781975788478987237">"chagua anwani"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Andika yako binafsi..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Ghairi"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Tuma"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Jibu"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Tuma SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Kataa"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Pokea kama Hangout ya Video"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Pokea kama simu ya sauti"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Kubali ombi la video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Kataa ombi la video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Kubali ombi la kutuma kupitia hangout ya video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Kataa ombi la kutuma kupitia hangout ya video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Kubali ombi la kupokea kupitia hangout ya video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Kataa ombi la kupokea kupitia hangout ya video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Sogeza juu ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Sogeza kushoto ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Sogeza kulia ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Telezesha kidole chini kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Mtetemo"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Mtetemo"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Sauti"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Sauti chaguo-msingi (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Mlio wa simu"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Tetema wakati wa kulia"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Mlio wa simu na Mtetemo"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Dhibiti simu ya kongamano"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Nambari ya dharura"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other">Sekunde <xliff:g id="COUNT">%d</xliff:g> </item>
+ <item quantity="one">Sekunde 1</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other">Dakika <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="one">Dakika 1 </item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other">Saa <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="one">Saa 1</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Picha kwenye wasifu"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera imezimwa"</string>
+ <string name="child_number" msgid="7437330400723805538">"kupitia <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Dokezo limetumwa"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Ujumbe wa hivi majuzi"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Maelezo ya biashara"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Umbali wa maili <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Umbali wa kilomita <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Itafunguliwa kesho saa <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Itafunguliwa leo saa <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Hufungwa saa <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Imefungwa leo saa <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Sasa imefunguliwa"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Sasa imefungwa"</string>
+</resources>
diff --git a/InCallUI/res/values-sw360dp/dimens.xml b/InCallUI/res/values-sw360dp/dimens.xml
new file mode 100644
index 0000000..9fbcd60
--- /dev/null
+++ b/InCallUI/res/values-sw360dp/dimens.xml
@@ -0,0 +1,35 @@
+<?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>
+ <!-- Dimensions for CallCard elements (the normal in-call UI) -->
+
+ <!-- Text size for the name in the call info. -->
+ <dimen name="call_status_text_size">22sp</dimen>
+ <dimen name="call_status_text_min_size">18sp</dimen>
+ <dimen name="call_name_text_size">45dp</dimen>
+ <dimen name="call_name_text_min_size">34sp</dimen>
+ <dimen name="call_label_text_size">18sp</dimen>
+
+ <!-- The InCallUI dialpad will sometimes want digits sizes that are different from dialer. -->
+ <dimen name="dialpad_key_number_margin_bottom">@dimen/dialpad_key_number_default_margin_bottom</dimen>
+ <!-- Zero key should have less space between self and text because "+" is smaller -->
+ <dimen name="dialpad_zero_key_number_margin_bottom">@dimen/dialpad_zero_key_number_default_margin_bottom</dimen>
+ <dimen name="dialpad_digits_adjustable_text_size">@dimen/dialpad_digits_text_size</dimen>
+ <dimen name="dialpad_digits_adjustable_height">@dimen/dialpad_digits_height</dimen>
+ <dimen name="dialpad_key_numbers_size">@dimen/dialpad_key_numbers_default_size</dimen>
+</resources>
diff --git a/InCallUI/res/values-sw410dp/config.xml b/InCallUI/res/values-sw410dp/config.xml
new file mode 100644
index 0000000..a57f867
--- /dev/null
+++ b/InCallUI/res/values-sw410dp/config.xml
@@ -0,0 +1,21 @@
+<!--
+ ~ 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
+ -->
+
+<resources>
+ <!-- Determines the maximum number of buttons visible on the call card. Any buttons over this
+ count are put into the overflow menu. -->
+ <integer name="call_card_max_buttons">6</integer>
+</resources>
\ No newline at end of file
diff --git a/InCallUI/res/values-ta-rIN/strings.xml b/InCallUI/res/values-ta-rIN/strings.xml
new file mode 100644
index 0000000..9cfa41b
--- /dev/null
+++ b/InCallUI/res/values-ta-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ஃபோன்"</string>
+ <string name="onHold" msgid="9035493194749959955">"காத்திருப்பில்"</string>
+ <string name="unknown" msgid="6878797917991465859">"தெரியாதவர்"</string>
+ <string name="private_num" msgid="6713286113000232309">"தனிப்பட்ட எண்"</string>
+ <string name="payphone" msgid="4793877574636445118">"கட்டணத் தொலைபேசி"</string>
+ <string name="confCall" msgid="1904840547188336828">"குழு அழைப்பு"</string>
+ <string name="call_lost" msgid="6183862117003999578">"அழைப்பு நிறுத்தப்பட்டது"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"ஸ்பீக்கர்"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ஹேண்ட்செட் இயர்ஃபீஸ்"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"வயருடன்கூடிய ஹெட்செட்"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"புளூடூத்"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"பின்வரும் டோன்களை அனுப்பவா?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"டோன்களை அனுப்புகிறது\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"அனுப்பு"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ஆம்"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"வேண்டாம்"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"இதனுடன் சிறப்புக்குறியை மாற்றியமை"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"குழு அழைப்பு <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"குரலஞ்சல் எண்"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"டயல் செய்கிறது"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"மீண்டும் டயல் செய்கிறது"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"குழு அழைப்பு"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"உள்வரும் அழைப்பு"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"உள்வரும் அழைப்பு (பணி)"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"அழைப்பு முடிந்தது"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"காத்திருப்பில்"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"துண்டிக்கிறது"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"அழைப்பில்"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"எனது எண் <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"வீடியோவை இணைக்கிறது"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"வீடியோ அழைப்பு"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"வீடியோவைக் கோருகிறது"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"வீடியோ அழைப்பை இணைக்க முடியாது"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"வீடியோ கோரிக்கை புறக்கணிக்கப்பட்டது"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"உங்களைத் திரும்ப அழைப்பதற்கான எண்\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"அவசர அழைப்பு எண்\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"அழைக்கிறது"</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_ongoing_call" msgid="7068688957273482989">"செயலில் இருக்கும் அழைப்பு"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"வெளிச்செல்லும் அழைப்பு (பணி)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"வெளிச்செல்லும் வைஃபை அழைப்பு"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"வெளிச்செல்லும் வைஃபை அழைப்பு (பணி)"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"காத்திருப்பில்"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"உள்வரும் அழைப்பு"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"உள்வரும் அழைப்பு (பணி)"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"உள்வரும் வைஃபை அழைப்பு"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"உள்வரும் வைஃபை அழைப்பு (பணி)"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"உள்வரும் வீடியோ அழைப்பு"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"உள்வரும் வீடியோ கோரிக்கை"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"புதிய குரலஞ்சல்"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"புதிய குரலஞ்சல் (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ஐ அழை"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"குரலஞ்சல் எண் அறியப்படவில்லை"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"சேவை இல்லை"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"தேர்ந்தெடுத்த நெட்வொர்க் (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) கிடைக்கவில்லை"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"எடு"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"துண்டி"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"வீடியோ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"குரல்"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ஏற்கிறேன்"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"நிராகரி"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"அழை"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"செய்தி"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"அழைப்பதற்கு, முதலில் விமானப் பயன்முறையை முடக்கவும்."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"நெட்வொர்க்கில் பதிவுசெய்யப்படவில்லை."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"செல்லுலார் நெட்வொர்க் கிடைக்கவில்லை."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"அழைக்க, சரியான எண்ணை உள்ளிடவும்."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"அழைக்க முடியாது."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI வரிசையைத் தொடங்குகிறது..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"சேவை ஆதரிக்கப்படவில்லை."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"அழைப்புகளில் மாற முடியாது."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"அழைப்பைப் பிரிக்க முடியாது."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"மாற்ற முடியாது."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"குழு அழைப்பு செய்ய முடியாது."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"அழைப்பை நிராகரிக்க முடியாது."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"அழைப்பை(அழைப்புகளை) விடுவிக்க முடியாது."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP அழைப்பு"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"அவசரகால அழைப்பு"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ரேடியோவை இயக்குகிறது…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"சேவை இல்லை. மீண்டும் முயற்சிக்கிறது…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> அவசர அழைப்பு எண் இல்லை என்பதால் அழைக்க முடியாது."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"அழைக்க முடியாது. அவசர அழைப்பு எண்ணை அழைக்கவும்."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"டயல் செய்வதற்கு விசைப்பலகையைப் பயன்படுத்துக"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"அழைப்பை இடைநிறுத்து"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"அழைப்பைத் தொடர்"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"அழைப்பை முடி"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"டயல்பேடு"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"முடக்கு"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"அழைப்பைச் சேர்"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"அழைப்புகளை இணை"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"மாற்று"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"அழைப்புகளை நிர்வகி"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"குழு அழைப்பை நிர்வகி"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ஆடியோ"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"வீடியோ அழைப்பு"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"குரல் அழைப்பிற்கு மாறு"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"கேமராவை மாற்று"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"வீடியோவை இடைநிறுத்து"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"மேலும் விருப்பங்கள்"</string>
+ <string name="player_started" msgid="6046262510243983589">"வீடியோ துவங்கியது"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"வீடியோ நிறுத்தப்பட்டது."</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"கேமரா தயாராக இல்லை"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"கேமரா தயார்"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"தெரியாத அழைப்பு நேர நிகழ்வு"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"சேவை"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"அமைவு"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<அமைக்கப்படவில்லை>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"பிற அழைப்பு அமைப்பு"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> வழியாக அழைக்கிறது"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> மூலம் உள்வருவது"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"தொடர்பு படம்"</string>
+ <string name="goPrivate" msgid="865837794424530980">"தனிப்பட்டதிற்குச் செல்"</string>
+ <string name="selectContact" msgid="781975788478987237">"தொடர்பைத் தேர்ந்தெடுக்கவும்"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"சொந்தமாக எழுதவும்..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ரத்துசெய்"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"அனுப்பு"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"பதிலளி"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS அனுப்பு"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"நிராகரி"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"வீடியோ அழைப்பில் பதிலளி"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ஆடியோ அழைப்பில் பதிலளி"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"வீடியோ கோரிக்கையை அனுமதி"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"வீடியோ கோரிக்கையை நிராகரி"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"வீடியோவைப் பரிமாற்றும் கோரிக்கையை அனுமதிக்கும்"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"வீடியோவைப் பரிமாற்றும் கோரிக்கையை நிராகரிக்கும்"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"வீடியோவைப் பெறும் கோரிக்கையை அனுமதிக்கும்"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"வீடியோவைப் பெறும் கோரிக்கையை நிராகரிக்கும்"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு மேலாக நகர்த்தவும்."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்கு இடதுபக்கமாக நகர்த்தவும்."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> வலதுபக்கமாக நகர்த்தவும்."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> க்குக் கீழே ஸ்லைடு செய்க."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"அதிர்வு"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"அதிர்வு"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ஒலி"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"இயல்பு ஒலி (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"தொலைபேசி ரிங்டோன்"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"ரிங் ஆகும்போது அதிர்வை ஏற்படுத்து"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"ரிங்டோன் & அதிர்வு"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"குழு அழைப்பை நிர்வகிக்கவும்"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"அவசரகால எண்"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> வினாடிகள்</item>
+ <item quantity="one">1 வினாடி</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> நிமிடங்கள்</item>
+ <item quantity="one">1 நிமிடம்</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> மணிநேரம்</item>
+ <item quantity="one">1 மணிநேரம்</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"சுயவிவரப் படம்"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"கேமராவை முடக்கும்"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> வழியாக"</string>
+ <string name="note_sent" msgid="3548700178238244595">"குறிப்பு அனுப்பப்பட்டது"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"சமீபத்திய செய்திகள்"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"வணிகத் தகவல்"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> மைல் தொலைவில்"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> கிமீ தொலைவில்"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"நாளை <xliff:g id="OPEN_TIME">%s</xliff:g> மணிக்குத் திறக்கப்படும்"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"இன்று <xliff:g id="OPEN_TIME">%s</xliff:g> மணிக்குத் திறக்கப்படும்"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> மணிக்கு மூடப்படும்"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"இன்று <xliff:g id="CLOSE_TIME">%s</xliff:g> மணிக்கு மூடப்பட்டது"</string>
+ <string name="open_now" msgid="6439301193613349163">"இப்போது திறக்கப்பட்டுள்ளது"</string>
+ <string name="closed_now" msgid="9175774453982778909">"இப்போது மூடப்பட்டுள்ளது"</string>
+</resources>
diff --git a/InCallUI/res/values-te-rIN/strings.xml b/InCallUI/res/values-te-rIN/strings.xml
new file mode 100644
index 0000000..fd510df
--- /dev/null
+++ b/InCallUI/res/values-te-rIN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"ఫోన్"</string>
+ <string name="onHold" msgid="9035493194749959955">"హోల్డ్లో ఉంది"</string>
+ <string name="unknown" msgid="6878797917991465859">"తెలియదు"</string>
+ <string name="private_num" msgid="6713286113000232309">"ప్రైవేట్ నంబర్"</string>
+ <string name="payphone" msgid="4793877574636445118">"పే ఫోన్"</string>
+ <string name="confCall" msgid="1904840547188336828">"కాన్ఫరెన్స్ కాల్"</string>
+ <string name="call_lost" msgid="6183862117003999578">"కాల్ కట్ అయింది"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"స్పీకర్"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"హ్యాండ్సెట్ ఇయర్పీస్"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"వైర్ గల హెడ్సెట్"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"బ్లూటూత్"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"క్రింది టోన్లు పంపాలా?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"టోన్లు పంపుతోంది\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"పంపు"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"అవును"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"లేదు"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"దీనితో వైల్డ్ అక్షరాన్ని భర్తీ చేయండి"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"కాన్ఫరెన్స్ కాల్ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"వాయిస్ మెయిల్ నంబర్"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"డయల్ చేస్తోంది"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"మళ్లీ డయల్ చేస్తోంది"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"కాన్ఫరెన్స్ కాల్"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"ఇన్కమింగ్ కాల్"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"ఇన్కమింగ్ కార్యాలయ కాల్"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"కాల్ ముగిసింది"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"హోల్డ్లో ఉంది"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"ముగిస్తోంది"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"కాల్లో ఉంది"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"నా నంబర్ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"వీడియోను కనెక్ట్ చేస్తోంది"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"వీడియో కాల్"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"వీడియో కోసం అభ్యర్థిస్తోంది"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"వీడియో కాల్ను కనెక్ట్ చేయలేరు"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"వీడియో అభ్యర్థన నిరాకరించబడింది"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"మీ కాల్బ్యాక్ నంబర్\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"మీ అత్యవసర కాల్బ్యాక్ నంబర్\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"డయల్ చేస్తోంది"</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_ongoing_call" msgid="7068688957273482989">"కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"కార్యాలయ కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Wi-Fi కార్యాలయ కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"హోల్డ్లో ఉంది"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"ఇన్కమింగ్ కాల్"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"ఇన్కమింగ్ కార్యాలయ కాల్"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Wi-Fi కాల్ వస్తోంది"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"ఇన్కమింగ్ Wi-Fi కార్యాలయ కాల్"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"ఇన్కమింగ్ వీడియో కాల్"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"ఇన్కమింగ్ వీడియో అభ్యర్థన"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"కొత్త వాయిస్ మెయిల్"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"కొత్త వాయిస్ మెయిల్ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>కు డయల్ చేయండి"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"వాయిస్ మెయిల్ నంబర్ తెలియదు"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"సేవ లేదు"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"ఎంచుకున్న నెట్వర్క్ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) అందుబాటులో లేదు"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"సమాధానం"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"కాల్ను ముగించు"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"వీడియో"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"వాయిస్"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ఆమోదిస్తున్నాను"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"తీసివేయి"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"కాల్ చేయి"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"సందేశం"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"కాల్ చేయడానికి, మొదట ఎయిర్ప్లైన్ మోడ్ను ఆపివేయండి."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"నెట్వర్క్లో నమోదు కాలేదు."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"సెల్యులార్ నెట్వర్క్ అందుబాటులో లేదు."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"కాల్ చేయడానికి, చెల్లుబాటు అయ్యే నంబర్ను నమోదు చేయండి."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"కాల్ చేయలేరు."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI శ్రేణిని ప్రారంభిస్తోంది…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"సేవకు మద్దతు లేదు."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"కాల్లను మార్చలేరు."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"కాల్ను వేరు చేయలేరు."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"బదిలీ చేయలేరు."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"సమావేశం కుదరదు."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"కాల్ను తిరస్కరించలేరు."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"కాల్(ల)ను విడిచిపెట్టలేరు."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP కాల్"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"అత్యవసర కాల్"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"రేడియోను ప్రారంభిస్తోంది…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"సేవ లేదు. మళ్లీ ప్రయత్నిస్తోంది…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"కాల్ చేయలేరు. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> అత్యవసర నంబర్ కాదు."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"కాల్ చేయలేరు. అత్యవసర నంబర్ను డయల్ చేయండి."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"డయల్ చేయడానికి కీబోర్డ్ను ఉపయోగించండి"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"కాల్ను హోల్డ్లో ఉంచు"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"కాల్ను పునఃప్రారంభించు"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"కాల్ని ముగించు"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"డయల్ప్యాడ్"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"మ్యూట్ చేయి"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"కాల్ను జోడించు"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"కాల్లను విలీనం చేయి"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"స్వాప్ చేయి"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"కాల్లను నిర్వహించు"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"సమావేశ కాల్ను నిర్వహించు"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"ఆడియో"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"వీడియో కాల్"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"వాయిస్ కాల్కి మార్చు"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"కెమెరాను మార్చు"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"వీడియోను పాజ్ చేయి"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"మరిన్ని ఎంపికలు"</string>
+ <string name="player_started" msgid="6046262510243983589">"ప్లేయర్ ప్రారంభమైంది"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"ప్లేయర్ ఆపివేయబడింది"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"కెమెరా సిద్ధంగా లేదు"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"కెమెరా సిద్ధంగా ఉంది"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"తెలియని కాల్ సెషన్ ఉదంతం"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"సేవ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"సెటప్"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<సెట్ చేయలేదు>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"ఇతర కాల్ సెట్టింగ్లు"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>తో కాల్ వెళుతోంది"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ద్వారా ఇన్కమింగ్"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"పరిచయ ఫోటో"</string>
+ <string name="goPrivate" msgid="865837794424530980">"ప్రైవేట్గా వెళ్లు"</string>
+ <string name="selectContact" msgid="781975788478987237">"పరిచయాన్ని ఎంచుకోండి"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"మీ స్వంతంగా వ్రాయండి…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"రద్దు చేయి"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"పంపు"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"సమాధానం ఇవ్వండి"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS పంపండి"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"తిరస్కరిస్తున్నాను"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"వీడియో కాల్ రూపంలో సమాధానమివ్వండి"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"ఆడియో కాల్ రూపంలో సమాధానమివ్వండి"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"వీడియో అభ్యర్థనను అంగీకరించండి"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"వీడియో అభ్యర్థనను తిరస్కరించండి"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"వీడియో ప్రసరణ అభ్యర్థనను ఆమోదిస్తుంది"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"వీడియో ప్రసరణ అభ్యర్థనను నిరాకరిస్తుంది"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"వీడియో స్వీకరణ అభ్యర్థనను ఆమోదిస్తుంది"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"వీడియో స్వీకరణ అభ్యర్థనను నిరాకరిస్తుంది"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం కుడివైపుకు స్లైడ్ చేయండి."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం క్రిందికి స్లైడ్ చేయండి."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"వైబ్రేట్"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"వైబ్రేట్"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"ధ్వని"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"డిఫాల్ట్ ధ్వని (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"ఫోన్ రింగ్టోన్"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"రింగ్ అవుతున్నప్పుడు వైబ్రేట్ చేయి"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"రింగ్టోన్ & వైబ్రేట్"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"కాన్ఫరెన్స్ కాల్ను నిర్వహించండి"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"అత్యవసర నంబర్"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> సెకన్లు</item>
+ <item quantity="one">1 సెకను</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> నిమిషాలు</item>
+ <item quantity="one">1 నిమిషం</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> గంటలు</item>
+ <item quantity="one">1 గంట</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"ప్రొఫైల్ ఫోటో"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"కెమెరా ఆఫ్లో ఉంది"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ద్వారా"</string>
+ <string name="note_sent" msgid="3548700178238244595">"గమనిక పంపబడింది"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ఇటీవలి సందేశాలు"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"వ్యాపార సంస్థ సమాచారం"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> మై. దూరంలో ఉంది"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> కి.మీ దూరంలో ఉంది"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"రేపు <xliff:g id="OPEN_TIME">%s</xliff:g>కి తెరవబడుతుంది"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"ఈరోజు <xliff:g id="OPEN_TIME">%s</xliff:g>కి తెరవబడుతుంది"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g>కి మూసివేయబడుతుంది"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ఈరోజు <xliff:g id="CLOSE_TIME">%s</xliff:g>కి మూసివేయబడింది"</string>
+ <string name="open_now" msgid="6439301193613349163">"ఇప్పుడు తెరిచి ఉంది"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ఇప్పుడు మూసివేయబడింది"</string>
+</resources>
diff --git a/InCallUI/res/values-th/strings.xml b/InCallUI/res/values-th/strings.xml
new file mode 100644
index 0000000..13739b2
--- /dev/null
+++ b/InCallUI/res/values-th/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"โทรศัพท์"</string>
+ <string name="onHold" msgid="9035493194749959955">"พักสาย"</string>
+ <string name="unknown" msgid="6878797917991465859">"ไม่ทราบ"</string>
+ <string name="private_num" msgid="6713286113000232309">"หมายเลขส่วนตัว"</string>
+ <string name="payphone" msgid="4793877574636445118">"โทรศัพท์สาธารณะ"</string>
+ <string name="confCall" msgid="1904840547188336828">"การประชุมสาย"</string>
+ <string name="call_lost" msgid="6183862117003999578">"สายหลุด"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"ลำโพง"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ชุดหูฟังโทรศัพท์"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"ชุดหูฟังแบบมีสาย"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"บลูทูธ"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"ส่งโทนเสียงต่อไปนี้หรือไม่ \n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"กำลังส่งโทนเสียง\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"ส่ง"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ใช่"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"ไม่"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"แทนที่อักขระแทนด้วย"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"การประชุมสาย <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"หมายเลขข้อความเสียง"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"กำลังโทรออก"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"โทรใหม่"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"การประชุมสาย"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"สายเข้า"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"มีสายเรียกเข้าจากที่ทำงาน"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"วางสายแล้ว"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"พักสาย"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"กำลังวางสาย"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"กำลังใช้สาย"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"หมายเลขของฉันคือ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"กำลังเชื่อมต่อวิดีโอ"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"แฮงเอาท์วิดีโอ"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"กำลังขอวิดีโอ"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ไม่สามารถเชื่อมต่อแฮงเอาท์วิดีโอได้"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"คำขอวิดีโอถูกปฏิเสธ"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"หมายเลขโทรกลับของคุณ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"หมายเลขโทรกลับฉุกเฉินของคุณ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"กำลังโทรออก"</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_ongoing_call" msgid="7068688957273482989">"โทรต่อเนื่อง"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"กำลังอยู่ในสายจากที่ทำงาน"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"กำลังโทรผ่าน Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"กำลังอยู่ในสายจากที่ทำงานผ่าน Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"พักสาย"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"สายเรียกเข้า"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"มีสายเรียกเข้าจากที่ทำงาน"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"สายโทรเข้าผ่าน Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"มีสายเรียกเข้าจากที่ทำงานผ่าน Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"แฮงเอาท์วิดีโอเรียกเข้า"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"คำขอโทรเข้าเป็นวิดีโอ"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"ข้อความเสียงใหม่"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"ข้อความเสียงใหม่ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"หมุนหมายเลข <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"ไม่ทราบหมายเลขข้อความเสียง"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"ไม่มีบริการ"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"เครือข่ายที่เลือกไว้ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ไม่พร้อมใช้งาน"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"รับสาย"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"วางสาย"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"วิดีโอ"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"เสียง"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"ยอมรับ"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"ไม่รับ"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"โทรกลับ"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"ข้อความ"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"หากต้องการโทรออก ให้ปิดโหมดใช้งานบนเครื่องบินก่อน"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"ยังไม่ได้ลงทะเบียนบนเครือข่าย"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"เครือข่ายมือถือใช้งานไม่ได้"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"หากต้องการโทรออก โปรดป้อนหมายเลขที่ถูกต้อง"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"ไม่สามารถโทรได้"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"กำลังเริ่มต้นลำดับ MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"ไม่สนับสนุนบริการนี้"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"ไม่สามารถสลับสายได้"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"ไม่สามารถแยกสายได้"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"ไม่สามารถโอนได้"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"ไม่สามารถประชุมได้"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"ไม่สามารถปฏิเสธสายได้"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"ไม่สามารถเริ่มการโทรได้"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"โทรแบบ SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"หมายเลขฉุกเฉิน"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"กำลังเปิดวิทยุ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"ไม่มีบริการ โปรดลองอีกครั้ง…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"ไม่สามารถโทรได้ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ไม่ใช่หมายเลขฉุกเฉิน"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"ไม่สามารถโทรออก โทรหมายเลขฉุกเฉิน"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ใช้แป้นพิมพ์กดหมายเลขโทรศัพท์"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"พักสาย"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"โทรต่อ"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"วางสาย"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"แป้นหมายเลข"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"ปิดเสียง"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"เพิ่มการโทร"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"รวมสาย"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"สลับ"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"จัดการการโทร"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"จัดการการประชุมสาย"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"เสียง"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"แฮงเอาท์วิดีโอ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"เปลี่ยนเป็นการโทรด้วยเสียง"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"สลับกล้องถ่ายรูป"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"หยุดวิดีโอชั่วคราว"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"ตัวเลือกอื่น"</string>
+ <string name="player_started" msgid="6046262510243983589">"โปรแกรมเล่นเริ่มทำงานแล้ว"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"โปรแกรมเล่นหยุดแล้ว"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"กล้องไม่พร้อมทำงาน"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"กล้องพร้อมทำงาน"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"เหตุการณ์เซสชันการโทรที่ไม่รู้จัก"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"บริการ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"การตั้งค่า"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<ไม่ได้ตั้งค่า>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"การตั้งค่าการโทรอื่นๆ"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"โทรผ่าน <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"สายเรียกเข้าผ่าน <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"ภาพของรายชื่อติดต่อ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"เข้าสู่โหมดส่วนตัว"</string>
+ <string name="selectContact" msgid="781975788478987237">"เลือกรายชื่อติดต่อ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"เขียนคำตอบของคุณเอง..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"ยกเลิก"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"ส่ง"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"คำตอบ"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"ส่ง SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"ปฏิเสธ"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"รับสายเป็นแฮงเอาท์วิดีโอ"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"รับสายเป็นการโทรด้วยเสียง"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ยอมรับคำขอวิดีโอ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ปฏิเสธคำขอวิดีโอ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ยอมรับคำขอให้ส่งวิดีโอ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ปฏิเสธคำขอให้ส่งวิดีโอ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ยอมรับคำขอให้รับวิดีโอ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ปฏิเสธคำขอให้รับวิดีโอ"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"เลื่อนขึ้นเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"เลื่อนไปทางขวาเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"เลื่อนลงเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"สั่น"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"สั่น"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"เสียง"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"เสียงเริ่มต้น (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"เสียงเรียกเข้าโทรศัพท์"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"สั่นเมื่อมีสายเข้า"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"เสียงเรียกเข้าและสั่น"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"จัดการการประชุมสาย"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"หมายเลขฉุกเฉิน"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> วินาที</item>
+ <item quantity="one">1 วินาที</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> นาที</item>
+ <item quantity="one">1 นาที</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ชั่วโมง</item>
+ <item quantity="one">1 ชั่วโมง</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"รูปโปรไฟล์"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"ปิดกล้อง"</string>
+ <string name="child_number" msgid="7437330400723805538">"ผ่านหมายเลข <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"ส่งโน้ตแล้ว"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"ข้อความล่าสุด"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"ข้อมูลธุรกิจ"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"อยู่ห่างออกไป <xliff:g id="DISTANCE">%.1f</xliff:g> ไมล์"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"อยู่ห่างออกไป <xliff:g id="DISTANCE">%.1f</xliff:g> กม."</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"เปิดให้บริการพรุ่งนี้เวลา <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"เปิดให้บริการวันนี้เวลา <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"ปิดให้บริการเวลา <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"ปิดให้บริการแล้ววันนี้เวลา <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"ขณะนี้เปิดทำการ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"ขณะนี้ปิดทำการ"</string>
+</resources>
diff --git a/InCallUI/res/values-tl/strings.xml b/InCallUI/res/values-tl/strings.xml
new file mode 100644
index 0000000..9f67a3d
--- /dev/null
+++ b/InCallUI/res/values-tl/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telepono"</string>
+ <string name="onHold" msgid="9035493194749959955">"Naka-hold"</string>
+ <string name="unknown" msgid="6878797917991465859">"Di-kilala"</string>
+ <string name="private_num" msgid="6713286113000232309">"Pribadong numero"</string>
+ <string name="payphone" msgid="4793877574636445118">"Payphone"</string>
+ <string name="confCall" msgid="1904840547188336828">"Conference na tawag"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Na-drop ang tawag"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Wired na headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Ipadala ang mga sumusunod na tone?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Nagpapadala ng mga tono\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Ipadala"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Oo"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Hindi"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Palitan ang wild character ng"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Conference na tawag <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Numero ng voicemail"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Dina-dial"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Muling dina-dial"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Conference na tawag"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Papasok na tawag"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Papasok, tawag sa trabaho"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Winakasan ang Tawag"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Naka-hold"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Binababa"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Nasa tawag"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Ang aking numero ay <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Ikinokonekta ang video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Humihiling ng video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Hindi makakonekta sa video call"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Tinanggihan ang kahilingan sa video"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Ang iyong numero ng callback\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Ang iyong emergency na numero ng callback\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Dina-dial"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Hindi nasagot na tawag"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Mga hindi nasagot na tawag"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> (na) hindi nasagot na tawag"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Hindi nasagot na tawag mula kay <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Kasalukuyang tawag"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Kasalukuyang tawag sa trabaho"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Isinasagawang tawag sa Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Kasalukuyang tawag sa trabaho sa pamamagitan ng Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Naka-hold"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Papasok na tawag"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Papasok na tawag sa trabaho"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Papasok na tawag sa Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Papasok na tawag sa trabaho sa pamamagitan ng Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Papasok na video call"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Papasok na kahilingan ng video"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Bagong voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Bagong voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"I-dial ang <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Hindi kilala ang numero ng voicemail"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Walang serbisyo"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Hindi available ang mga piniling network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>)"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Sagutin"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Ibaba"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Boses"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Tanggapin"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"I-dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Tawagan"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Padalhan ng mensahe"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Upang tumawag, paki-off ang Airplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Hindi nakarehistro sa network."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Hindi available ang cellular network"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Upang tumawag, maglagay ng wastong numero."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Hindi makatawag."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Sinisimulan ang pagkakasunud-sunod ng MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Hindi sinusuportahan ang serbisyo."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Hindi mailipat ang mga tawag."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Hindi mapaghiwalay ang tawag"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Hindi mailipat."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Hindi makapag-conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Hindi matanggihan ang tawag."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Hindi mailabas ang (mga) tawag."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Tawag sa SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Emergency na tawag"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ino-on ang radyo…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Walang serbisyo. Sinusubukang muli…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Hindi makatawag. Ang <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ay hindi isang emergency na numero."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Hindi makatawag. Mag-dial ng emergency na numero."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Gamitin ang keyboard upang mag-dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"I-hold ang Tawag"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Ituloy ang Tawag"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Ibaba ang Tawag"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Dialpad"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"I-mute"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Magdagdag ng tawag"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Pagsamahin ang mga tawag"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Pagpalitin"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Pamahalaan ang mga tawag"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Manage conference call"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Gawing voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Magpalit ng camera"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"I-pause ang video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Higit pang mga opsyon"</string>
+ <string name="player_started" msgid="6046262510243983589">"Nagsimula na ang Player"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Huminto ang Player"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Hindi pa handa ang camera"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Handa na ang camera"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Hindi alam na kaganapan ng session ng tawag"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Serbisyo"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Setup"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Hindi nakatakda>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Iba pang mga setting ng tawag"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Tumatawag via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Papasok sa pamamagitan ng <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"larawan ng contact"</string>
+ <string name="goPrivate" msgid="865837794424530980">"maging pribado"</string>
+ <string name="selectContact" msgid="781975788478987237">"pumili ng contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Sumulat ng sarili mong tugon…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Kanselahin"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Ipadala"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Sagutin"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Magpadala ng SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Tanggihan"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Sagutin bilang video call"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Sagutin bilang audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Tanggapin ang kahilingan sa video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Tanggihan ang kahilingan sa video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Tanggapin ang kahilingan sa pagpapadala ng video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Tanggihan ang kahilingan sa pagpapadala ng video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Tanggapin ang kahilingan sa pagtanggap ng video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Tanggihan ang kahilingan sa pagtanggap ng video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Mag-slide pakanan para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Mag-slide pababa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Mag-vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Mag-vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Tunog"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Default na tunog (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ringtone ng telepono"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"I-vibrate kapag nagri-ring"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ringtone at Pag-vibrate"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Pamahalaan ang conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Pang-emergency na numero"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> segundo</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> na segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuto</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> na minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> oras</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> na oras</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Larawan sa profile"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Naka-off ang camera"</string>
+ <string name="child_number" msgid="7437330400723805538">"sa pamamagitan ng <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Naipadala ang tala"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Mga kamakailang mensahe"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Impormasyon ng negosyo"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> (na) milya ang layo"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> (na) kilometro ang layo"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Magbubukas bukas nang <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Magbubukas ngayon nang <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Magsasara nang <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Sarado ngayon nang <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Bukas ngayon"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Sarado ngayon"</string>
+</resources>
diff --git a/InCallUI/res/values-tr/strings.xml b/InCallUI/res/values-tr/strings.xml
new file mode 100644
index 0000000..ce2ea0c
--- /dev/null
+++ b/InCallUI/res/values-tr/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Beklemede"</string>
+ <string name="unknown" msgid="6878797917991465859">"Bilinmiyor"</string>
+ <string name="private_num" msgid="6713286113000232309">"Özel numara"</string>
+ <string name="payphone" msgid="4793877574636445118">"Ankesörlü telefon"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferans görüşmesi"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Çağrı kesildi"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Hoparlör"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Mobil cihaz kulaklığı"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Kablolu kulaklık"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Şu zil sesleri gönderilsin mi?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Sayı tonları gönderiliyor\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Gönder"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Evet"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Hayır"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Joker karakteri şununla değiştir:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferans görüşmesi <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Sesli mesaj numarası"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Çevriliyor"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Yeniden aranıyor"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferans görüşmesi"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Gelen çağrı"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"İşle ilgili gelen çağrı"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Çağrı sonlandırıldı"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Beklemede"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Sonlandırılıyor"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Çağrı halinde"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Numaram: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Video bağlanıyor"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video görüşmesi"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Video isteniyor"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Video görüşmesi bağlantısı yapılamıyor"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video isteği reddedildi"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Geri arama numaranız\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Acil durum geri arama numaranız\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Çevriliyor"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Cevapsız çağrı"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Cevapsız çağrılar"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cevapsız çağrı"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Cevapsız çağrı: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Devam eden çağrılar"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Süren iş çağrısı"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Giden kablosuz çağrı"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Süren kablosuz iş çağrısı"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Beklemede"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Gelen çağrı"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Gelen iş çağrısı"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Gelen kablosuz çağrı"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Gelen kablosuz iş çağrısı"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Gelen video görüşmesi isteği"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Gelen video isteği"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Yeni sesli mesaj"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Yeni sesli mesaj (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Çevir: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Sesli mesaj numarası bilinmiyor"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Hizmet yok"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Seçili ağ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) kullanılamıyor"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Yanıtla"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Kapat"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Ses"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Kabul et"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Kapat"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Geri ara"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Mesaj gönder"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Bir çağrı yapmak için öncelikle Uçak modunu kapatın."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ağda kayıtlı değil."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Hücresel ağ kullanılamıyor."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Arama yapmak için geçerli bir numara girin."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Arama yapılamıyor."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI dizisi başlatılıyor..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Servis desteklenmiyor."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Çağrı geçişi yapılamıyor."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Çağrı ayrılamıyor."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Aktarılamıyor."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferans yapılamıyor."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Çağrı reddedilemiyor."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Çağrılar bırakılamıyor."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP çağrısı"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Acil durum çağrısı"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Radyo açılıyor..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Servis yok. Tekrar deneniyor…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Aranamıyor. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bir acil durum numarası değil."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Aranamıyor. Bir acil durum numarasını arayın."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Çevirmek için klavyeyi kullan"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Çağrıyı Beklet"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Çağrıyı Devam Ettir"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Çağrıyı Sonlandır"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Tuş takımı"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Sesi Kapat"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Çağrı ekle"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Çağrıları birleştir"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Değiştir"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Aramaları yönet"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Konferans çağrısını yönet"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Ses"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video görüşmesi"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Sesli çağrıya geç"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Kamerayı değiştir"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Videoyu duraklat"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Diğer seçenekler"</string>
+ <string name="player_started" msgid="6046262510243983589">"Oynatıcı Başlatıldı"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Oynatıcı Durduruldu"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera hazır değil"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera hazır"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Bilinmeyen çağrı oturumu etkinliği"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Hizmet"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Kurulum"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ayarlanmadı>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Diğer çağrı ayarları"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> üzerinden"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> adlı sağlayıcı üzerinden gelen çağrı"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kişi fotoğrafı"</string>
+ <string name="goPrivate" msgid="865837794424530980">"özele git"</string>
+ <string name="selectContact" msgid="781975788478987237">"kişi seçin"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kendi yanıtınızı oluşturun…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"İptal"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Gönder"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Yanıtla"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS gönder"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Reddet"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Video görüşmesi olarak yanıtla"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Sesli görüşme olarak yanıtla"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Video isteğini kabul et"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Video isteğini reddet"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Video aktarma isteğini kabul et"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Video aktarma isteğini reddet"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Video alma isteğini kabul et"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Video alma isteğini reddet"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için yukarı kaydırın."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sağa kaydırın."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için aşağı kaydırın."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Titreşim"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Titreşim"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Ses"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Varsayılan ses (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefon zil sesi"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Çalarken titret"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Zil Sesi ve Titreşim"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Konferans görüşmesini yönet"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Acil durum numarası"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saniye</item>
+ <item quantity="one">1 saniye</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> dakika</item>
+ <item quantity="one">1 dakika</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saat</item>
+ <item quantity="one">1 saat</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profil fotoğrafı"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera kapalı"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ile"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Not gönderildi"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Son iletiler"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"İş bilgileri"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil uzakta"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km uzakta"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Yarın açılış saati: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Bugün açılış saati: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Kapanış saati: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Bugün kapanış saati: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Şu an açık"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Şu an kapalı"</string>
+</resources>
diff --git a/InCallUI/res/values-uk/strings.xml b/InCallUI/res/values-uk/strings.xml
new file mode 100644
index 0000000..57f9664
--- /dev/null
+++ b/InCallUI/res/values-uk/strings.xml
@@ -0,0 +1,198 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Телефон"</string>
+ <string name="onHold" msgid="9035493194749959955">"Очікує"</string>
+ <string name="unknown" msgid="6878797917991465859">"Невідомий"</string>
+ <string name="private_num" msgid="6713286113000232309">"Приватний номер"</string>
+ <string name="payphone" msgid="4793877574636445118">"Таксофон"</string>
+ <string name="confCall" msgid="1904840547188336828">"Конференц-виклик"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Виклик перервано"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Динамік"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Гарнітура Bluetooth"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Дротова гарнітура"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Надісл. наступні сигнали?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Надсилання сигналів\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Надісл."</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Так"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Ні"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Замінити довільний символ на"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Конференц-виклик <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Номер голосової пошти"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Набір номера"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Повторний набір"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Конференц-виклик"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Вхідний дзвінок"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Вхідний робочий дзвінок"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Виклик заверш."</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Очікує"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Класти слухавку"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Вхід. викл."</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Мій номер: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Відеодзвінок: з’єднання"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Відеодзвінок"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Надсилання запиту на відеодзвінок"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Неможливо здійснити відеодзвінок"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Запрошення на відеодзвінок відхилено"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Номер для зв’язку:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Екстрений номер:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Набір номера"</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_ongoing_call" msgid="7068688957273482989">"Поточний виклик"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Поточний дзвінок на робочий телефон"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Активний дзвінок через Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Поточний дзвінок на робочий телефон через Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Очікує"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Вхідний дзвінок"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Вхідний дзвінок на робочий телефон"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Вхідний дзвінок через Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Вхідний дзвінок на робочий телефон через Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Вхідний відеодзвінок"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Запит на вхідний відеодзвінок"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Нове голосове повідомлення"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Нове голосове повідомлення (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Набрати <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Невідомий номер голосової пошти"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Нема служби"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Вибрана мережа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) недоступна"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Відповісти"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Завершити виклик"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Відео"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Голосовий дзвінок"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Приймаю"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Закрити"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Передзвонити"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Повідомлення"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Щоб установ. з\'єднання, споч. вимк. режим польоту."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Не зареєстровано в мережі."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Мобільна мережа недоступна."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Щоб зателефонувати, введіть дійсний номер."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Неможливо зателефонувати."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Запуск ряду MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Служба не підтримується."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Неможливо переключитися між викликами."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Неможливо розділити виклик."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Неможливо перенести."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Неможливо здійснити конференц-виклик."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Неможливо відхилити виклик."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Неможливо телефонувати."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Дзвінок через протокол SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Аварійний виклик"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Увімкнення радіо…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Зв’язку немає. Повторна спроба…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Неможливо зателефонувати. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> – не є екстреним номером."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Неможливо зателефонувати. Наберіть екстрений номер."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Викор. клав. для набору"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Призупинити виклик"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Відновити виклик"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Завершити виклик"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Цифр. клав."</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Вимк. зв."</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Додати виклик"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Об’єдн. дзвінки"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Поміняти"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Керув. викликами"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Керувати дзвінком"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Звук"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Відеодзвінок"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Перейти в режим голосового дзвінка"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Змінити камеру"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Призупинити відео"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Більше опцій"</string>
+ <string name="player_started" msgid="6046262510243983589">"Програвач запущено"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Програвач зупинено"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Камера неготова"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Камера готова"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Невідомий сеанс дзвінка"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Служба"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Налаштування"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Не встановлено>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Інші налаштування виклику"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Виклик через <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Вхідні дзвінки через оператора <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"фото контакта"</string>
+ <string name="goPrivate" msgid="865837794424530980">"конфіденц."</string>
+ <string name="selectContact" msgid="781975788478987237">"вибрати контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишіть власну відповідь..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Скасувати"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Надіслати"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Відповісти"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Надіслати SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Відхилити"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Відповісти в режимі відеодзвінка"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Відповісти в режимі аудіодзвінка"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Прийняти запит на відеодзвінок"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Відхилити запит на відеодзвінок"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Прийняти запит на передавання відеодзвінка"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Відхилити запит на передавання відеодзвінка"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Прийняти запит на отримання відеодзвінка"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Відхилити запит на отримання відеодзвінка"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – проведіть пальцем угору."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – проведіть пальцем ліворуч."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – проведіть пальцем праворуч."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Проведіть пальцем донизу, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Вібросигнал"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Вібросигнал"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Звук"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Звук за умовчанням (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Сигнал дзвінка телефону"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Вібрувати під час дзвінка"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Сигнал дзвінка та вібросигнал"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Керувати конференц-викликом"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Екстрений номер"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> хвилина</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> хвилини</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> хвилин</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> хвилини</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> година</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> години</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> годин</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> години</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Фотографія профілю"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Камеру вимкнено"</string>
+ <string name="child_number" msgid="7437330400723805538">"на номер <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Нотатку надіслано"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Останні повідомлення"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Інформація про компанію"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"За <xliff:g id="DISTANCE">%.1f</xliff:g> мил."</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"За <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Відчиняється завтра о <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Відчиняється сьогодні о <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Зачиняється о <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Зачинено сьогодні о <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Відчинено"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Зачинено"</string>
+</resources>
diff --git a/InCallUI/res/values-ur-rPK/strings.xml b/InCallUI/res/values-ur-rPK/strings.xml
new file mode 100644
index 0000000..77f7562
--- /dev/null
+++ b/InCallUI/res/values-ur-rPK/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"فون"</string>
+ <string name="onHold" msgid="9035493194749959955">"ہولڈ پر"</string>
+ <string name="unknown" msgid="6878797917991465859">"نامعلوم"</string>
+ <string name="private_num" msgid="6713286113000232309">"نجی نمبر"</string>
+ <string name="payphone" msgid="4793877574636445118">"پے فون"</string>
+ <string name="confCall" msgid="1904840547188336828">"کانفرنس کال"</string>
+ <string name="call_lost" msgid="6183862117003999578">"کال چھوڑ دی گئی"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"اسپیکر"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"ہینڈسیٹ ایئرپیس"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"تار والا ہیڈسیٹ"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"بلوٹوتھ"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"درج ذیل ٹونز بھیجیں؟\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"ٹونز بھیج رہا ہے\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"بھیجیں"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"ہاں"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"نہیں"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"وائلڈ حرف کو اس کے ساتھ بدلیں"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"کانفرنس کال <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"صوتی میل نمبر"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"ڈائل ہو رہا ہے"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"دوبارہ ڈائل ہو رہا ہے"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"کانفرنس کال"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"آنے والی کال"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"دفتر سے آنے والی کال"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"کال ختم ہوگئی"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"ہولڈ پر"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"کال منقطع ہو رہی ہے"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"کال میں"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"میرا نمبر ہے <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"ویڈیو کال مربوط ہو رہی ہے"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"ویڈیو کال"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"ویڈیو کی درخواست کی جا رہی ہے"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"ویڈیو کال منسلک نہیں کر سکتا"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"ویڈیو کی درخواست مسترد کر دی گئی"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"آپ کا کال بیک نمبر\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"آپ کا ہنگامی کال بیک نمبر\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"ڈائل ہو رہا ہے"</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_ongoing_call" msgid="7068688957273482989">"جاری کال"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"کام سے متعلق جاری کال"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Wi-Fi کال جاری ہے"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"کام سے متعلق جاری Wi-Fi کال"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"ہولڈ پر"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"آنے والی کال"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"کام سے متعلق آنے والی کال"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Wi-Fi کال آ رہی ہے"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"کام سے متعلق آنے والی Wi-Fi کال"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"اِن کمنگ ویڈیو کال"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"اِن کمنگ ویڈیو درخواست"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"نیا صوتی میل"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"نیا صوتی میل (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ڈائل کریں"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"صوتی میل نمبر نامعلوم ہے"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"کوئی سروس نہیں ہے"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"منتخب کردہ نیٹ ورک (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) دستیاب نہیں ہے"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"جواب دیں"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"کال منقطع کریں"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"ویڈیو"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"آواز"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"قبول کریں"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"برخاست کریں"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"واپس کال کریں"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"پیغام"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"کال کرنے کیلئے، پہلے ہوائی جہاز طرز کو آف کریں۔"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"نیٹ ورک پر رجسٹرڈ نہیں ہے۔"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"سیلولر نیٹ ورک دستیاب نہیں ہے۔"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"کال کرنے کیلئے، ایک درست نمبر درج کریں۔"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"کال نہیں کر سکتے۔"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI ترتیب شروع ہو رہی ہے…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"سروس تعاون یافتہ نہیں ہے۔"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"کالز سوئچ نہیں کر سکتے۔"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"کال کو الگ نہیں کر سکتے۔"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"منتقل نہیں کر سکتے۔"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"کانفرنس نہیں کر سکتے۔"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"کال مسترد نہیں کی جا سکتی۔"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"کال(ز) ریلیز نہیں کر سکتے۔"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP کال"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"ہنگامی کال"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"ریڈیو آن کر رہا ہے…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"کوئی سروس نہیں ہے۔ دوبارہ کوشش کی جا رہی ہے…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"کال نہیں کی جا سکتی۔ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ایک ہنگامی نمبر نہیں ہے۔"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"کال نہیں کی جا سکتی۔ ایک ہنگامی نمبر ڈائل کریں۔"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"ڈائل کرنے کیلئے کی بورڈ استعمال کریں"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"کال کو ہولڈ کریں"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"کال کو دوبارہ شروع کریں"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"کال ختم کریں"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"ڈائل پیڈ"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"خاموش کریں"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"کال شامل کریں"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"کالیں ضم کریں"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"تبادلہ کریں"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"کالوں کا نظم کریں"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"کانفرنس کال کا نظم کریں"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"آڈیو"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"ویڈیو کال"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"صوتی کال میں تبدیل کریں"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"کیمرہ سوئچ کریں"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"ویڈیو موقوف کریں"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"مزید اختیارات"</string>
+ <string name="player_started" msgid="6046262510243983589">"پلیئر شروع ہوگیا"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"پلیئر بند ہوگیا"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"کیمرہ تیار نہیں ہے"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"کیمرہ تیار ہے"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"نامعلوم کال سیشن ایونٹ"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"سروس"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"سیٹ اپ"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<سیٹ نہیں ہے>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"دیگر کال کی ترتیبات"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"کالنگ بذریعہ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> کے ذریعے موصول ہونے والی"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"رابطہ کی تصویر"</string>
+ <string name="goPrivate" msgid="865837794424530980">"نجی ہوجائیں"</string>
+ <string name="selectContact" msgid="781975788478987237">"رابطہ منتخب کریں"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"اپنا خود کا تحریر کریں…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"منسوخ کریں"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"بھیجیں"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"جواب دیں"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS بھیجیں"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"مسترد کریں"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"ویڈیو کال کے بطور جواب دیں"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"آڈیو کال کے بطور جواب دیں"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"ویڈیو کی درخواست قبول کریں"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"ویڈیو کی درخواست مسترد کریں"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"ویڈیو منتقل کرنے کی درخواست قبول کریں"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"ویڈیو منتقل کرنے کی درخواست مسترد کریں"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"ویڈیو موصول کرنے کی درخواست قبول کریں"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"ویڈیو موصول کرنے کی درخواست مسترد کریں"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے اوپر سلائیڈ کریں۔"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے دائیں سلائیڈ کریں۔"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے نیچے سلائیڈ کریں۔"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"وائبریٹ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"وائبریٹ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"آواز"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"ڈیفالٹ آواز (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"فون رنگ ٹون"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"بجنے کے وقت مرتعش کریں"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"رنگ ٹون اور وائبریٹ"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"کانفرنس کال کا نظم کریں"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"ہنگامی نمبر"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> سیکنڈ</item>
+ <item quantity="one">1 سیکنڈ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> منٹ</item>
+ <item quantity="one">1 منٹ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> گھنٹے</item>
+ <item quantity="one">1 گھنٹہ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"پروفائل کی تصویر"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"کیمرہ آف ہے"</string>
+ <string name="child_number" msgid="7437330400723805538">"بذریعہ <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"نوٹ بھیج دیا گیا"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"حالیہ پیغامات"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"کاروباری معلومات"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> میل دور"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> کلومیٹر دور"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>، <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>، <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"کل <xliff:g id="OPEN_TIME">%s</xliff:g> بجے کھلے گا"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"آج <xliff:g id="OPEN_TIME">%s</xliff:g> بجے کھلے گا"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> بجے بند ہوگا"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"آج <xliff:g id="CLOSE_TIME">%s</xliff:g> بجے بند ہوا"</string>
+ <string name="open_now" msgid="6439301193613349163">"ابھی کھلا ہے"</string>
+ <string name="closed_now" msgid="9175774453982778909">"اب بند ہے"</string>
+</resources>
diff --git a/InCallUI/res/values-uz-rUZ/strings.xml b/InCallUI/res/values-uz-rUZ/strings.xml
new file mode 100644
index 0000000..23c86da
--- /dev/null
+++ b/InCallUI/res/values-uz-rUZ/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Telefon"</string>
+ <string name="onHold" msgid="9035493194749959955">"Kutmoqda"</string>
+ <string name="unknown" msgid="6878797917991465859">"Noma’lum"</string>
+ <string name="private_num" msgid="6713286113000232309">"Shaxsiy raqam"</string>
+ <string name="payphone" msgid="4793877574636445118">"Taksofon"</string>
+ <string name="confCall" msgid="1904840547188336828">"Konferensiya qo‘ng‘irog‘i"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Qo‘ng‘iroq tugatildi"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Karnay"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Telefon quloq eshitgichlari"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Simli garnitura"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Ushbu tovushlar jo‘natilsinmi?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Tovushlar jo‘natilmoqda\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Jo‘natish"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Ha"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Yo‘q"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Belgilarni quyidagilar bilan almashtiring:"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Konferensiya qo‘ng‘irog‘i <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Ovozli pochta raqami"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Raqam terilmoqda"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Qayta terilmoqda"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Konferensiya qo‘ng‘irog‘i"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Kiruvchi qo‘ng‘iroq"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Kiruvchi ishchi qo‘ng‘irog‘i"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Qo‘ng‘iroq tugadi"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Kutish holatida"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Suhbat tugatilmoqda"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Qo‘ng‘iroqda"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Mening raqamim - <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Videoga ulanmoqda"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Video qo‘ng‘iroq"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Video so\'ralmoqda"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Video qo‘ng‘iroqqa ulanib bo‘lmadi"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Video qo‘ng‘iroq so‘rovi rad etildi"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Teskari qo‘ng‘iroq raqamingiz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Favqulodda holatlar uchun teskari qo‘ng‘iroq raqamingiz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Raqam terilmoqda"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Javobsiz qo‘ng‘iroq"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Javobsiz qo‘ng‘iroqlar"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ta javobsiz qo‘ng‘iroq"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> qo‘ng‘irog‘i javobsiz qoldirildi"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Joriy qo‘ng‘iroq"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Chiquvchi ishchi qo‘ng‘irog‘i"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Chiquvchi Wi-Fi qo‘ng‘irog‘i"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Chiquvchi Wi-Fi ishchi qo‘ng‘irog‘i"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Kutmoqda"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Kiruvchi qo‘ng‘iroq"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Kiruvchi ishchi qo‘ng‘irog‘i"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Kiruvchi Wi-Fi qo‘ng‘irog‘i"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Kiruvchi Wi-Fi ishchi qo‘ng‘irog‘i"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Kiruvchi videoqo‘ng‘iroq"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Kiruvchi video so\'rovi"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Yangi ovozli xabar"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Yangi ovozli xabar (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>ni terish"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Ovozli pochta raqami noma’lum"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Xizmat mavjud emas"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Tanlangan tarmoq (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) mavjud emas"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Javob"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Go‘shakni qo‘yish"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Ovoz"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Roziman"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Yopish"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Telefon"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"SMS"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Qo‘ng‘iroq qilish uchun, avval \"Parvoz rejimi\" o‘chirilishi kerak."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Tarmoqda ro‘yxatdan o‘tmagan."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Mobil tarmoq mavjud emas."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Qo‘ng‘iroq qilish uchun raqamni to‘g‘ri kiriting."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Qo‘ng‘iroq qilib bo‘lmadi."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"MMI tartibi ishga tushmoqda..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Xizmat qo‘llab-quvvatlanmaydi."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Qo‘ng‘iroqlarni almashtirib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Qo‘ng‘iroqni ajratib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"O‘tkazib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Konferens-aloqa o‘rnatib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Qo‘ng‘iroqni rad qilib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Qo‘ng‘iroq(lar)ni chiqarib bo‘lmadi."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP qo‘ng‘iroq"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Favqulodda qo‘ng‘iroq"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Radio yoqilmoqda…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Aloqa yo‘q. Qayta urinilmoqda…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Qo‘ng‘iroq qilib bo‘lmadi. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> favqulodda raqam emas."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Qo‘ng‘iroq qilib bo‘lmadi. Favqulodda raqamga tering."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Terish uchun tugmatagdan foydalaning"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Qo‘ng‘iroqni ushlab turish"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Qo‘ng‘iroqni davom ettirish"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Qo‘ng‘iroqni tugatish"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Terish paneli"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Ovozni o‘chirish"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Qo‘ng‘iroq qo‘shish"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Qo‘ng‘iroqlarni birlashtirish"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Almashish"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Qo‘ng‘iroqlarni boshqarish"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Konf. aloqani boshqarish"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Video qo‘ng‘iroq"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Ovozli qo‘ng‘iroqqa o‘zgartirish"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Kamerani almashtirish"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Videoni vaqtincha to‘xtatish"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Ko‘proq"</string>
+ <string name="player_started" msgid="6046262510243983589">"Pleyer ishga tushirildi"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Pleyer to‘xtatildi"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Kamera tayyor emas"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Kamera tayyor"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Noma’lum qo‘ng‘iroq sessiyasi hodisasi"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Xizmat"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Sozlash"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ko‘rsatilmagan>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Boshqa qo‘ng‘iroq sozlamalari"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> orqali qo‘ng‘iroq"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Kiruvchi qo‘ng‘iroqlar <xliff:g id="PROVIDER_NAME">%s</xliff:g> orqali"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"kontakt surati"</string>
+ <string name="goPrivate" msgid="865837794424530980">"alohidaga o‘tish"</string>
+ <string name="selectContact" msgid="781975788478987237">"kontaktni tanlash"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"O‘z javobingizni yozing..."</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Bekor qilish"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Jo‘natish"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Javob"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"SMS yuborish"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Rad qilish"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Video qo\'ng\'iroq sifatida javob berish"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Audio qo\'ng\'iroq sifatida javob berish"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Video qo‘ng‘iroq so‘rovini qabul qilish"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Video qo‘ng‘iroq so‘rovini rad qilish"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Video jo‘natmani qabul qilish"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Video jo‘natmani rad qilish"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Kiruvchi video qo‘ng‘iroqni qabul qilish"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Kiruvchi video qo‘ng‘iroqni rad etish"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun tepaga suring."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun o‘ngga suring."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun pastga suring."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Tebranish"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Tebratish"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Ovoz"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Standart ovoz (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Telefon ringtoni"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Jiringlash vaqtida tebranish"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Qo‘ng‘iroq ohangi & tebranish"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Konferensiya qo‘ng‘irog‘ini boshqarish"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Favqulodda qo‘ng‘iroq raqamlari"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soniya</item>
+ <item quantity="one">1 soniya</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> daqiqa</item>
+ <item quantity="one">1 daqiqa</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soat</item>
+ <item quantity="one">1 soat</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Profil rasmi"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Kamera o‘chiq"</string>
+ <string name="child_number" msgid="7437330400723805538">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> orqali"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Qayd yuborildi"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"So‘nggi xabarlar"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Korporativ ma’lumotlar"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil uzoqda"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km uzoqda"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Ertaga <xliff:g id="OPEN_TIME">%s</xliff:g> da ochiladi"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Bugun <xliff:g id="OPEN_TIME">%s</xliff:g> da ochiladi"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"<xliff:g id="CLOSE_TIME">%s</xliff:g> da yopiladi"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Bugun <xliff:g id="CLOSE_TIME">%s</xliff:g> da yopiladi"</string>
+ <string name="open_now" msgid="6439301193613349163">"Ochiq"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Yopiq"</string>
+</resources>
diff --git a/InCallUI/res/values-vi/strings.xml b/InCallUI/res/values-vi/strings.xml
new file mode 100644
index 0000000..f028936
--- /dev/null
+++ b/InCallUI/res/values-vi/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Điện thoại"</string>
+ <string name="onHold" msgid="9035493194749959955">"Đang chờ"</string>
+ <string name="unknown" msgid="6878797917991465859">"Không xác định"</string>
+ <string name="private_num" msgid="6713286113000232309">"Số cá nhân"</string>
+ <string name="payphone" msgid="4793877574636445118">"Điện thoại công cộng"</string>
+ <string name="confCall" msgid="1904840547188336828">"Cuộc gọi hội nghị"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Cuộc gọi bị gián đoạn"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Loa"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Tai nghe ĐTDĐ"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Tai nghe có dây"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Gửi các âm sau?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Đang gửi âm\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Gửi"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Có"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Không"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Thay thế ký tự tự do bằng"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Cuộc gọi hội nghị <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Số thư thoại"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Đang gọi"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Đang quay số lại"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Cuộc gọi hội nghị"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Cuộc gọi đến"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Cuộc gọi đến về công việc"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Cuộc gọi đã kết thúc"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Đang chờ"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Kết thúc cuộc gọi"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Đang trong cuộc gọi"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Số điện thoại của tôi là <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Đang kết nối video"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Cuộc gọi điện video"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Đang yêu cầu video"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Không kết nối được cuộc gọi điện video"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Đã từ chối yêu cầu video"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Số gọi lại của bạn\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Số gọi lại khẩn cấp của bạn\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Đang gọi"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Cuộc gọi nhỡ từ <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Cuộc gọi đang thực hiện"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Cuộc gọi đang diễn ra về công việc"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Cuộc gọi đang diễn ra qua Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Cuộc gọi đang diễn ra qua Wi-Fi về công việc"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Đang chờ"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Cuộc gọi đến"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Cuộc gọi đến về công việc"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Cuộc gọi đến qua Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Cuộc gọi đến qua Wi-Fi về công việc"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Cuộc gọi điện video đến"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Yêu cầu video đến"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Thư thoại mới"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Thư thoại mới (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Quay số <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Số thư thoại không xác định"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Không có dịch vụ nào"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Mạng được chọn (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) không khả dụng"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Trả lời"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Kết thúc"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Thoại"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Chấp nhận"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Loại bỏ"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Gọi lại"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Tin nhắn"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Để thực hiện cuộc gọi, trước tiên, hãy tắt chế độ trên Máy bay."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Chưa được đăng ký trên mạng."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Không có mạng di động."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Để thực hiện cuộc gọi, hãy nhập một số hợp lệ."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Không thực hiện được cuộc gọi."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Khởi động chuỗi MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Dịch vụ không được hỗ trợ."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Không chuyển đổi được cuộc gọi."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Không tách được cuộc gọi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Không chuyển được cuộc gọi."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Không thực hiện được cuộc gọi hội nghị."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Không từ chối được cuộc gọi."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Không thực hiện được cuộc gọi."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Cuộc gọi qua SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Cuộc gọi khẩn cấp"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Đang bật radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Không có dịch vụ nào. Đang thử lại…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Không thực hiện được cuộc gọi. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> không phải là số khẩn cấp."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Không thực hiện được cuộc gọi. Hãy quay số khẩn cấp."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Sử dụng bàn phím để quay số"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Giữ cuộc gọi"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Tiếp tục cuộc gọi"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Kết thúc cuộc gọi"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Bàn phím số"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Tắt tiếng"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Thêm cuộc gọi"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Hợp nhất cuộc gọi"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Hoán đổi"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Quản lý cuộc gọi"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Quản lý cuộc gọi nhiều bên"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Âm thanh"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"C.gọi video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Thay đổi thành cuộc gọi thoại"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Chuyển đổi máy ảnh"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Tạm dừng video"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Thêm tùy chọn"</string>
+ <string name="player_started" msgid="6046262510243983589">"Đã khởi động trình phát"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Đã dừng trình phát"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Máy ảnh chưa sẵn sàng"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Máy ảnh đã sẵn sàng"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Sự kiện phiên cuộc gọi không xác định"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Dịch vụ"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Thiết lập"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Chưa đặt>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Cài đặt cuộc gọi khác"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Gọi điện qua <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Cuộc gọi đến qua <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"ảnh liên hệ"</string>
+ <string name="goPrivate" msgid="865837794424530980">"chuyển thành riêng tư"</string>
+ <string name="selectContact" msgid="781975788478987237">"chọn địa chỉ liên hệ"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Viết trả lời của riêng bạn…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Hủy"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Gửi"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Trả lời"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Gửi SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Từ chối"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Trả lời là cuộc gọi điện video"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Trả lời là cuộc gọi âm thanh"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Chấp nhận yêu cầu cuộc gọi video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Từ chối yêu cầu cuộc gọi video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Chấp nhận yêu cầu truyền video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Từ chối yêu cầu truyền video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Chấp nhận yêu cầu nhận video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Từ chối yêu cầu nhận video"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Trượt lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Trượt sang phải để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Trượt xuống để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Rung"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Rung"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Âm thanh"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Âm thanh mặc định (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Nhạc chuông điện thoại"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Rung khi đổ chuông"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Nhạc chuông và rung"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Quản lý cuộc gọi hội nghị"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Số khẩn cấp"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> giây</item>
+ <item quantity="one">1 giây</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> phút</item>
+ <item quantity="one">1 phút</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> giờ</item>
+ <item quantity="one">1 giờ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Ảnh hồ sơ"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Tắt máy ảnh"</string>
+ <string name="child_number" msgid="7437330400723805538">"qua <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Đã gửi ghi chú"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Tin nhắn gần đây"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Thông tin doanh nghiệp"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"Cách <xliff:g id="DISTANCE">%.1f</xliff:g> dặm"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"Cách <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Mở cửa lúc <xliff:g id="OPEN_TIME">%s</xliff:g> ngày mai"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Mở cửa lúc <xliff:g id="OPEN_TIME">%s</xliff:g> hôm nay"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Đóng cửa lúc <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Đã đóng cửa lúc <xliff:g id="CLOSE_TIME">%s</xliff:g> hôm nay"</string>
+ <string name="open_now" msgid="6439301193613349163">"Mở ngay bây giờ"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Hiện đã đóng cửa"</string>
+</resources>
diff --git a/InCallUI/res/values-zh-rCN/strings.xml b/InCallUI/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..ab4999485
--- /dev/null
+++ b/InCallUI/res/values-zh-rCN/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"电话"</string>
+ <string name="onHold" msgid="9035493194749959955">"保持"</string>
+ <string name="unknown" msgid="6878797917991465859">"未知"</string>
+ <string name="private_num" msgid="6713286113000232309">"私密号码"</string>
+ <string name="payphone" msgid="4793877574636445118">"公用电话"</string>
+ <string name="confCall" msgid="1904840547188336828">"电话会议"</string>
+ <string name="call_lost" msgid="6183862117003999578">"通话中断"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"扬声器"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"手机听筒"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"有线耳机"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"蓝牙"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"发送以下音频?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"正在发送双音频\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"发送"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"是"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"否"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"将通配符替换为"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"电话会议<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"语音信箱号码"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"正在拨号"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"正在重拨"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"电话会议"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"来电"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"工作来电"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"通话结束"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"保持"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"正在挂断"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"正在通话"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"我的手机号码:<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"正在连接视频"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"视频通话"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"正在发出视频请求"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"无法连接视频通话"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"视频请求被拒绝"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"您的回拨号码\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"您的紧急回拨号码\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"正在拨号"</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_ongoing_call" msgid="7068688957273482989">"当前通话"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"工作通话进行中"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"正在进行 WLAN 通话"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"WLAN 工作通话进行中"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"保持"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"来电"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"工作来电"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"WLAN 来电"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"WLAN 工作来电"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"有视频通话来电"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"收到视频通话邀请"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"新语音邮件"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新语音邮件 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"拨打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"语音信箱号码未知"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"无服务"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"所选网络(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)不可用"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"接听"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"挂断"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"视频"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"语音"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"接受"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"忽略"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"回拨"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"短信"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"要进行呼叫,请先关闭飞行模式。"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"尚未注册网络。"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"无法连接到移动网络。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"要拨打电话,请输入有效的电话号码。"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"无法拨打该电话。"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"正在启动 MMI 序列..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"服务不受支持。"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"无法切换通话。"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"无法单独通话。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"无法转移呼叫。"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"无法进行电话会议。"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"无法拒接来电。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"无法挂断电话。"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP电话"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"紧急呼救"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"正在打开天线..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"无服务,正在重试…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"无法拨打该电话。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是紧急呼救号码。"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"无法拨打该电话。请拨打紧急呼救电话。"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"使用键盘拨号"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"保持通话"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"恢复通话"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"结束通话"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"拨号键盘"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"静音"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"添加通话"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"合并通话"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"交换"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"管理通话"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"管理电话会议"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"音频"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"视频通话"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"改为语音通话"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"切换摄像头"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"暂停视频"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"更多选项"</string>
+ <string name="player_started" msgid="6046262510243983589">"播放器已启动"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"播放器已停止"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"相机尚未准备就绪"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"相机已准确就绪"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"未知通话事件"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"服务"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"设置"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<未设置>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"其他通话设置"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"通过<xliff:g id="PROVIDER_NAME">%s</xliff:g>进行通话"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"来电(<xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"联系人照片"</string>
+ <string name="goPrivate" msgid="865837794424530980">"私聊"</string>
+ <string name="selectContact" msgid="781975788478987237">"选择联系人"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰写回复…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"取消"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"发送"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"接听"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"发送短信"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"拒绝"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"以视频通话的形式接听"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"以音频通话的形式接听"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"接受视频请求"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"拒绝视频请求"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"接受视频传输请求"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"拒绝视频传输请求"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"接受视频接收请求"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"拒绝视频接收请求"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"向上滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"向左滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"向右滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"向下滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"振动"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"振动"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"提示音"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"默认提示音 (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"手机铃声"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"响铃时振动"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"铃声和振动"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"管理电话会议"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"紧急电话号码"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒</item>
+ <item quantity="one">1 秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 分钟</item>
+ <item quantity="one">1 分钟</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 小时</item>
+ <item quantity="one">1 小时</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"个人资料照片"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"关闭摄像头"</string>
+ <string name="child_number" msgid="7437330400723805538">"通过 <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"已发送记事"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"最近的信息"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"商家信息"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> 英里远"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> 公里远"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="LOCALITY">%2$s</xliff:g><xliff:g id="STREET_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>,<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"将于明天<xliff:g id="OPEN_TIME">%s</xliff:g>开始营业"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"将于今天<xliff:g id="OPEN_TIME">%s</xliff:g>开始营业"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"将于<xliff:g id="CLOSE_TIME">%s</xliff:g>结束营业"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"已于今天<xliff:g id="CLOSE_TIME">%s</xliff:g>结束营业"</string>
+ <string name="open_now" msgid="6439301193613349163">"营业中"</string>
+ <string name="closed_now" msgid="9175774453982778909">"现已打烊"</string>
+</resources>
diff --git a/InCallUI/res/values-zh-rHK/strings.xml b/InCallUI/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..f3fd0e4
--- /dev/null
+++ b/InCallUI/res/values-zh-rHK/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"手機"</string>
+ <string name="onHold" msgid="9035493194749959955">"保留通話"</string>
+ <string name="unknown" msgid="6878797917991465859">"未知"</string>
+ <string name="private_num" msgid="6713286113000232309">"私人號碼"</string>
+ <string name="payphone" msgid="4793877574636445118">"公共電話"</string>
+ <string name="confCall" msgid="1904840547188336828">"視訊會議"</string>
+ <string name="call_lost" msgid="6183862117003999578">"已中斷通話"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"揚聲器"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"免提聽筒"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"有線頭戴式耳機"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"藍牙"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"傳送下列鈴聲? \n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"正在傳送訊號音\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"發送"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"是"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"否"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"將萬用字元改成"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"電話會議 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"留言信箱號碼"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"撥號中"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"重撥"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"視訊會議"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"來電"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"工作來電"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"通話已結束"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"保留通話"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"結束通話"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"通話中"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"我的電話號碼:<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"連結視像"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"視像通話"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"提出視像要求"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"無法連接視像通話"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"視像通話要求被拒"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"您的回撥號碼:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"您的緊急回撥號碼:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"撥號中"</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_ongoing_call" msgid="7068688957273482989">"通話中"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"正在進行工作通話"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"正在進行 Wi-Fi 通話"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"正在進行 Wi-Fi 工作通話"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"保留通話"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"來電"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"工作來電"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Wi-Fi 來電"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Wi-Fi 工作來電"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"視像通話來電"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"收到視像要求"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"新留言"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新留言 (<xliff:g id="COUNT">%d</xliff:g> 個)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"撥號 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"沒有可用的留言信箱號碼"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"沒有服務"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"您所選取的網絡 (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) 無法使用"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"接聽"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"掛斷"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"影片"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"語音"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"接受"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"關閉"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"回撥"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"短訊"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"請先關閉飛行模式後再撥打電話。"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"未在網絡上完成註冊。"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"無法連線至流動網絡。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"要撥打電話,請輸入有效的號碼。"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"無法通話。"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"開始 MMI 序列..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"不支援的服務。"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"無法切換通話。"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"無法分開通話。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"無法轉移。"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"無法進行會議。"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"無法拒絕來電。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"無法釋放通話。"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP 通話"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"緊急電話"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"正在開啟無線電..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"沒有服務。請再試一次…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"無法通話。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是緊急號碼。"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"無法通話。撥打緊急號碼。"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"使用鍵盤撥號"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"保留通話"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"恢復通話"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"結束通話"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"撥號鍵盤"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"靜音"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"新增通話"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"合併通話"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"切換"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"管理通話"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"管理會議通話"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"音頻裝置"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"視像通話"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"變更為語音通話"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"切換相機"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"暫停視像"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"更多選項"</string>
+ <string name="player_started" msgid="6046262510243983589">"開始播放"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"停止播放"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"相機未準備好"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"已可使用相機"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"未知的視像通訊"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"服務"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"設定"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<未設定>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"其他通話設定"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"正在透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 撥號"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"有人透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 來電"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"聯絡人相片"</string>
+ <string name="goPrivate" msgid="865837794424530980">"私人通話"</string>
+ <string name="selectContact" msgid="781975788478987237">"選取聯絡人"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰寫回覆…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"取消"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"傳送"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"接聽"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"發送短訊"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"拒絕"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"接聽視像通話"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"接聽語音通話"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"接受視像通話要求"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"拒絕視像通話要求"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"接受視像對話轉駁要求"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"拒絕視像對話轉駁要求"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"接受視像通話要求"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"拒絕視像通話要求"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"震動"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"震動"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"音效"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"預設音效 (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"手機鈴聲"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"鈴響時震動"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"鈴聲與震動"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"管理會議通話"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"緊急電話號碼"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒</item>
+ <item quantity="one">1 秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 分鐘</item>
+ <item quantity="one">1 分鐘</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 小時</item>
+ <item quantity="one">1 小時</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"個人檔案相片"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"攝影機已關閉"</string>
+ <string name="child_number" msgid="7437330400723805538">"透過 <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"已傳送筆記"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"最新訊息"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"公司資料"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> 英里外"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> 公里外"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g> (<xliff:g id="LATER_TIME">%2$s</xliff:g>)"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"將於明天<xliff:g id="OPEN_TIME">%s</xliff:g> 開放"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"將於今天<xliff:g id="OPEN_TIME">%s</xliff:g> 開放"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"將於<xliff:g id="CLOSE_TIME">%s</xliff:g> 關門"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"已於今天<xliff:g id="CLOSE_TIME">%s</xliff:g> 關門"</string>
+ <string name="open_now" msgid="6439301193613349163">"營業中"</string>
+ <string name="closed_now" msgid="9175774453982778909">"休息"</string>
+</resources>
diff --git a/InCallUI/res/values-zh-rTW/strings.xml b/InCallUI/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..2633956
--- /dev/null
+++ b/InCallUI/res/values-zh-rTW/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"電話"</string>
+ <string name="onHold" msgid="9035493194749959955">"通話保留"</string>
+ <string name="unknown" msgid="6878797917991465859">"不明"</string>
+ <string name="private_num" msgid="6713286113000232309">"私人號碼"</string>
+ <string name="payphone" msgid="4793877574636445118">"公用電話"</string>
+ <string name="confCall" msgid="1904840547188336828">"多方通話"</string>
+ <string name="call_lost" msgid="6183862117003999578">"通話已中斷"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"喇叭"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"手機聽筒"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"有線頭戴式耳機"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"藍牙"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"傳送此鈴聲?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"正在傳送信號音\n"</string>
+ <string name="send_button" msgid="4106860097497818751">"傳送"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"是"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"否"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"將萬用字元改成"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"多方通話<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"語音信箱號碼"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"撥號中"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"重撥中"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"多方通話"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"來電"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"公司來電"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"通話結束"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"通話保留"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"掛斷電話"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"通話中"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"我的電話號碼:<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"連接視訊"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"視訊通話"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"提出視訊要求"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"無法建立視訊通話連線"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"視訊通話請求遭拒"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"您的回撥號碼如下\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"您的緊急回撥號碼如下\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"撥號中"</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_ongoing_call" msgid="7068688957273482989">"通話中"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"進行中的公司通話"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"撥出的 Wi-Fi 電話"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"進行中的公司通話 (透過 Wi-Fi)"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"通話保留"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"來電"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"公司來電"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"撥入的 Wi-Fi 電話"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"公司來電 (透過 Wi-Fi)"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"視訊通話來電"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"收到視訊要求"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"新留言"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"新留言 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"撥打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"無語音信箱號碼"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"沒有服務"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"您所選取的網路 (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) 無法使用"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"接聽"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"掛斷"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"視訊"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"語音"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"接受"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"拒絶"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"回撥"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"簡訊"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"撥號前,請先關閉飛航模式。"</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"尚未註冊網路。"</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"無法連線到行動網路。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"如要撥打電話,請輸入有效的號碼。"</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"無法通話。"</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"開始 MMI 序列…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"不支援的服務。"</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"無法切換通話。"</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"無法分割通話。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"無法轉接。"</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"無法進行電話會議。"</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"無法拒接來電。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"無法掛斷電話。"</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"SIP 通話"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"緊急電話"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"開啟無線通訊中…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"找不到服務訊號,正在重試…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"無法通話。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是緊急號碼。"</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"無法通話。只能撥打緊急號碼。"</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"使用鍵盤撥號"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"保留通話"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"恢復通話"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"結束通話"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"撥號鍵盤"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"靜音"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"新增通話"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"合併通話"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"切換"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"管理通話"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"管理會議通話"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"音訊"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"視訊通話"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"變更為語音通話"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"切換相機"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"暫停影片"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"更多選項"</string>
+ <string name="player_started" msgid="6046262510243983589">"已啟動播放器"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"已停止播放器"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"相機尚未就緒"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"相機準備就緒"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"不明的通話工作階段事件"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"服務"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"設定"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<未設定>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"其他通話設定"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"正在透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 撥號"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"有人透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 來電"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"聯絡人相片"</string>
+ <string name="goPrivate" msgid="865837794424530980">"私人通話"</string>
+ <string name="selectContact" msgid="781975788478987237">"選取聯絡人"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰寫回應…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"取消"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"傳送"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"接聽"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"傳送簡訊"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"拒絕"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"接聽視訊通話"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"接聽語音通話"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"接受視訊要求"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"拒絕視訊要求"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"接受視訊傳送要求"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"拒絕視訊傳送要求"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"接受視訊接收要求"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"拒絕視訊接收要求"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"震動"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"震動"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"音效"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"預設音效 (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"手機鈴聲"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"鈴響時震動"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"鈴聲與震動"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"管理會議通話"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"緊急電話號碼"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒</item>
+ <item quantity="one">1 秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 分鐘</item>
+ <item quantity="one">1 分鐘</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 小時</item>
+ <item quantity="one">1 小時</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"個人資料相片"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"關閉相機"</string>
+ <string name="child_number" msgid="7437330400723805538">"透過 <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"備註已送出"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"最近的訊息"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"商家資訊"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> 英里遠"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> 公里遠"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>,<xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>,<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"將於明日<xliff:g id="OPEN_TIME">%s</xliff:g>開始營業"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"將於本日<xliff:g id="OPEN_TIME">%s</xliff:g>開始營業"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"將於<xliff:g id="CLOSE_TIME">%s</xliff:g>結束營業"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"已於本日<xliff:g id="CLOSE_TIME">%s</xliff:g>結束營業"</string>
+ <string name="open_now" msgid="6439301193613349163">"營業中"</string>
+ <string name="closed_now" msgid="9175774453982778909">"今日已結束營業"</string>
+</resources>
diff --git a/InCallUI/res/values-zu/strings.xml b/InCallUI/res/values-zu/strings.xml
new file mode 100644
index 0000000..55ba0eb
--- /dev/null
+++ b/InCallUI/res/values-zu/strings.xml
@@ -0,0 +1,192 @@
+<?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="phoneAppLabel" product="default" msgid="906161039445636857">"Ifoni"</string>
+ <string name="onHold" msgid="9035493194749959955">"Ibambile"</string>
+ <string name="unknown" msgid="6878797917991465859">"Akwaziwa"</string>
+ <string name="private_num" msgid="6713286113000232309">"Inombolo eyimfihlo"</string>
+ <string name="payphone" msgid="4793877574636445118">"Ucingo olufakwa imali"</string>
+ <string name="confCall" msgid="1904840547188336828">"Ikholi yengqungquthela"</string>
+ <string name="call_lost" msgid="6183862117003999578">"Ikholi ivaliwe"</string>
+ <string name="audio_mode_speaker" msgid="27649582100085266">"Isipikha"</string>
+ <string name="audio_mode_earpiece" msgid="4156527186373869107">"Ucezulwendlebe lwe-Handset"</string>
+ <string name="audio_mode_wired_headset" msgid="1465350758489175975">"I-headset enezincingo"</string>
+ <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="7601815427707856238">"Thumela amathoni alandelayo?\n"</string>
+ <string name="pause_prompt_str" msgid="1789964702154314806">"Ithumela Amathoni \n"</string>
+ <string name="send_button" msgid="4106860097497818751">"Thumela"</string>
+ <string name="pause_prompt_yes" msgid="3564467212025151797">"Yebo"</string>
+ <string name="pause_prompt_no" msgid="6686238803236884877">"Cha"</string>
+ <string name="wild_prompt_str" msgid="5543521676355533577">"Miselela uhlamvu lwasendle nge"</string>
+ <string name="caller_manage_header" msgid="3231519674734638786">"Ikholi yengqungquthela <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="8524164258691887790">"Inombolo yevoyisimeyili"</string>
+ <string name="card_title_dialing" msgid="5769417478498348054">"Iyadayela"</string>
+ <string name="card_title_redialing" msgid="8253487008234167266">"Iphinda iyashaya"</string>
+ <string name="card_title_conf_call" msgid="1162980346189744501">"Ikholi yengqungquthela"</string>
+ <string name="card_title_incoming_call" msgid="7364539451234646909">"Ikholi engenayo"</string>
+ <string name="card_title_incoming_work_call" msgid="5601475030981264422">"Ikholi engenayo yomsebenzi"</string>
+ <string name="card_title_call_ended" msgid="5544730338889702298">"Ikholi iqediwe"</string>
+ <string name="card_title_on_hold" msgid="821463117892339942">"Ibambile"</string>
+ <string name="card_title_hanging_up" msgid="3999101620995182450">"Iyavala"</string>
+ <string name="card_title_in_call" msgid="6346543933068225205">"Isecingweni"</string>
+ <string name="card_title_my_phone_number" msgid="112428362494434191">"Inombolo yami ngu <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="297586766381973954">"Ixhuma ividiyo"</string>
+ <string name="card_title_video_call" msgid="5898636679563320218">"Ikholi yevidiyo"</string>
+ <string name="card_title_video_call_requesting" msgid="4587504939739340937">"Icela ividiyo"</string>
+ <string name="card_title_video_call_error" msgid="9000555878389539225">"Ayikwazi ukuxhuma ikholi yevidiyo"</string>
+ <string name="card_title_video_call_rejected" msgid="462358296694719787">"Isicelo sevidiyo sinqatshelwe"</string>
+ <string name="card_title_callback_number" msgid="7307938207564217293">"Inombolo yakho okumele ishayelwe futhi ngu-\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8634765419223426754">"Inombolo yakho yesimo esiphuthumayo okumele iphinde ishayelwe ngu-\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="2107666444937350731">"Iyadayela"</string>
+ <string name="notification_missedCallTitle" msgid="7554385905572364535">"Ikholi ekulahlekele"</string>
+ <string name="notification_missedCallsTitle" msgid="1361677948941502522">"Amakholi akuphuthele"</string>
+ <string name="notification_missedCallsMsg" msgid="4575787816055205600">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> amakholi akulahlekele"</string>
+ <string name="notification_missedCallTicker" msgid="504686252427747209">"Uphuthelwe ikholi ephuma ku-<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="7068688957273482989">"Ikholi eqhubekayo"</string>
+ <string name="notification_ongoing_work_call" msgid="4071124825337695596">"Ikholi yomsebenzi eqhubekayo"</string>
+ <string name="notification_ongoing_call_wifi" msgid="8521553590606569379">"Ikholi ye-Wi-Fi eqhubekayo"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="2914071877370405192">"Ikholi yomsebenzi eqhubekayo ye-Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3480694969511790465">"Ibambile"</string>
+ <string name="notification_incoming_call" msgid="2820429205043529642">"Ikholi engenayo"</string>
+ <string name="notification_incoming_work_call" msgid="3581021176870685239">"Ikholi engenayo yomsebenzi"</string>
+ <string name="notification_incoming_call_wifi" msgid="9210706506594546627">"Ikholi ye-Wi-Fi engenayo"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="7126555701581469722">"Ikholi engenayo yomsebenzi ye-Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7356836933934464805">"Ikholi yevidiyo engenayo"</string>
+ <string name="notification_requesting_video_call" msgid="1405576812892369451">"Isicelo sevidiyo engenayo"</string>
+ <string name="notification_voicemail_title" msgid="8933468752045550523">"Umlayezo wezwi omusha"</string>
+ <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Umyalezo wezwi omusha (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Dayela <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Inombolo yevoyisimeyili ayaziwa"</string>
+ <string name="notification_network_selection_title" msgid="4224455487793492772">"Ayikho isevisi"</string>
+ <string name="notification_network_selection_text" msgid="2607085729661923269">"Inethiwekhi ekhethiwe <xliff:g id="OPERATOR_NAME">%s</xliff:g> ayitholakali"</string>
+ <string name="notification_action_answer" msgid="6700362365135365143">"Phendula"</string>
+ <string name="notification_action_end_call" msgid="6069460915123531620">"Vala ikholi"</string>
+ <string name="notification_action_answer_video" msgid="7809271910870211729">"Ividiyo"</string>
+ <string name="notification_action_answer_voice" msgid="1770796916369437773">"Izwi"</string>
+ <string name="notification_action_accept" msgid="2898609801209468429">"Yamukela"</string>
+ <string name="notification_action_dismiss" msgid="2679969397930852858">"Cashisa"</string>
+ <string name="notification_missedCall_call_back" msgid="2684890353590890187">"Phinda ushaye"</string>
+ <string name="notification_missedCall_message" msgid="3049928912736917988">"Umlayezo"</string>
+ <string name="incall_error_power_off" msgid="6550191216405193368">"Ukwenza ikholi, vala kuqala imodi Yendiza."</string>
+ <string name="incall_error_emergency_only" msgid="4678640422710818317">"Ayibhalisiwe kwinethiwekhi."</string>
+ <string name="incall_error_out_of_service" msgid="4100065333878929223">"Inethiwekhi yeselula ayitholakali."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="1150414018684246528">"Ukuze wenze ikholi, faka inombolo evumelekile."</string>
+ <string name="incall_error_call_failed" msgid="6302746943230078197">"Ayikwazi ukushaya."</string>
+ <string name="incall_status_dialed_mmi" msgid="3672498861336189563">"Iqalisa ukulandelana kwe-MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="323435289607131929">"Isevisi ayisekelwe."</string>
+ <string name="incall_error_supp_service_switch" msgid="5237002176899962862">"Ayikwazi ukushintsha amakholi."</string>
+ <string name="incall_error_supp_service_separate" msgid="7224393405134545246">"Ayikwazi ukuhlukanisa ikholi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="7235952238189391438">"Ayikwazi ukudlulisela."</string>
+ <string name="incall_error_supp_service_conference" msgid="7010354362202271726">"Ayikwazi ukwenza inkomfa."</string>
+ <string name="incall_error_supp_service_reject" msgid="8998568661508655638">"Ayikwazi ukunqabela ikholi."</string>
+ <string name="incall_error_supp_service_hangup" msgid="7434513517153834426">"Ayikwazi ukukhipha amakholi."</string>
+ <string name="incall_call_type_label_sip" msgid="4931428719494190371">"Ikholi ye-SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="4627849966634578257">"Ikholi ephuthumayo"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="207613549344420291">"Ivula umsakazo..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="5960061579996526883">"Ayikho isevisi. Iyazama futhi…"</string>
+ <string name="dial_emergency_error" msgid="1509085166367420355">"Ayikwazi ukushaya. I-<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> akuyona inombolo yesimo esiphuthumayo."</string>
+ <string name="dial_emergency_empty_error" msgid="9130194953830414638">"Ayikwazi ukushaya. Shayela inombolo yesimo esiphuthumayo."</string>
+ <string name="dialerKeyboardHintText" msgid="9192914825413747792">"Sebenzisa ikhibhodi ukudayela"</string>
+ <string name="onscreenHoldText_unselected" msgid="7092499303393171276">"Bamba ikholi"</string>
+ <string name="onscreenHoldText_selected" msgid="7127901498507384249">"Qalisa kabusha ikholi"</string>
+ <string name="onscreenEndCallText" msgid="9039601192595655846">"Qeda ikholi"</string>
+ <string name="onscreenShowDialpadText" msgid="8561805492659639893">"Iphedi yokudayela"</string>
+ <string name="onscreenMuteText" msgid="5011369181754261374">"Thulisa"</string>
+ <string name="onscreenAddCallText" msgid="5140385634712287403">"Yengeza ikholi"</string>
+ <string name="onscreenMergeCallsText" msgid="6640195098064538950">"Hlanganisa amakholi"</string>
+ <string name="onscreenSwapCallsText" msgid="1602990689244030047">"Shintsha"</string>
+ <string name="onscreenManageCallsText" msgid="5473231160123254154">"Phatha amakholi"</string>
+ <string name="onscreenManageConferenceText" msgid="6801708317570467407">"Phatha ikholi yenkomfa"</string>
+ <string name="onscreenAudioText" msgid="1710087112800041743">"Umsindo"</string>
+ <string name="onscreenVideoCallText" msgid="4800924186056115442">"Ikholi yevidiyo ye-Hangout"</string>
+ <string name="onscreenChangeToVoiceText" msgid="5311407863653867937">"Shintshela kukholi yezwi"</string>
+ <string name="onscreenSwitchCameraText" msgid="5324543493442787798">"Shintsha ikhamela"</string>
+ <string name="onscreenPauseVideoText" msgid="5663965924921429203">"Misa isikhashana ividiyo"</string>
+ <string name="onscreenOverflowText" msgid="2702376562345723132">"Izinketho eziningi"</string>
+ <string name="player_started" msgid="6046262510243983589">"Umdlali uqalile"</string>
+ <string name="player_stopped" msgid="8856926759436364963">"Umdlali umisiwe"</string>
+ <string name="camera_not_ready" msgid="4955261496193316240">"Ikhamela ayilungile"</string>
+ <string name="camera_ready" msgid="1903335385405807324">"Ikhamela ilungile"</string>
+ <string name="unknown_call_session_event" msgid="2431061946920253582">"Umcimbi wesikhathi sekholi ongaziwa"</string>
+ <string name="voicemail_provider" msgid="5135942703327136909">"Isevisi"</string>
+ <string name="voicemail_settings" msgid="72448049107749316">"Ukumisa"</string>
+ <string name="voicemail_number_not_set" msgid="6724904736891087856">"<Ayisethiwe>"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Ezinye izilungiselelo zekholi"</string>
+ <string name="calling_via_template" msgid="4839419581866928142">"Ishaya ucingo nge <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="1696993226115570960">"Ingena nge-<xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="4713193418046639466">"isithombe sothintana naye"</string>
+ <string name="goPrivate" msgid="865837794424530980">"yenza kube imfihlo"</string>
+ <string name="selectContact" msgid="781975788478987237">"khetha othintana naye"</string>
+ <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Bhala okwakho…"</string>
+ <string name="custom_message_cancel" msgid="7516406059429609296">"Khansela"</string>
+ <string name="custom_message_send" msgid="5795754217085747742">"Thumela"</string>
+ <string name="description_target_answer" msgid="7205604197797472471">"Phendula"</string>
+ <string name="description_target_send_sms" msgid="2098326025587950144">"Thumela i-SMS"</string>
+ <string name="description_target_decline" msgid="4789834364389731957">"Nqaba"</string>
+ <string name="description_target_answer_video_call" msgid="3495965588512395026">"Phendula njengekholi yevidiyo"</string>
+ <string name="description_target_answer_audio_call" msgid="8396296303320994450">"Phendula njengekholi yomsindo"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="2894072808324604062">"Yamukela isicelo sevidiyo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="4093888612888538776">"Yenqaba isicelo sevidiyo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="5311037889642077468">"Yamukela isicelo sokudlulisa ividiyo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="3636108065510415975">"Yenqaba isicelo sokudlulisa ividiyo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="8668058323593087912">"Yamukela isicelo sokwamukela ividiyo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="2355776509656298367">"Yenqaba isicelo sokwamukela ividiyo"</string>
+ <string name="description_direction_up" msgid="4441409581444516690">"Slayidela phezulu ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="7129873384376533287">"Slayida ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="2122584234531957308">"Slayida ngakwesokudla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="4317245625565166742">"Slayida ngezansi ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="8361970092063604886">"Dlidliza"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="5739583146522136440">"Dlidliza"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="2609519527849101590">"Umsindo"</string>
+ <string name="default_notification_description" msgid="78174796906240970">"Umsindo ozenzakalelayo (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="6374978286202084684">"Ithoni yokukhala kocingo"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Dlidlizisa uma ikhala"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Ithoni yokukhala nokudlidliza"</string>
+ <string name="manageConferenceLabel" msgid="4691922394301969053">"Phatha ucingo lwengqungquthela"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="8373041754188879871">"Inombolo yesimo esiphuthumayo"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="59971978269163609">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> amsekhondi</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> amsekhondi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="1103289948818175408">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> amaminithi</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> amaminithi</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7560637459014865969">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> amahora</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> amahora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="5609894336203315400">"Isithombe sephrofayela"</string>
+ <string name="camera_off_description" msgid="5689494614359429889">"Ikhamela ivaliwe"</string>
+ <string name="child_number" msgid="7437330400723805538">"nge-<xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="3548700178238244595">"Inothi lithunyelwe"</string>
+ <string name="person_contact_context_title" msgid="723266617256740572">"Imilayezo yakamuva"</string>
+ <string name="business_contact_context_title" msgid="5334864183374669765">"Ulwazi lwebhizinisi"</string>
+ <string name="distance_imperial_away" msgid="437508440176409037">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi kude"</string>
+ <string name="distance_metric_away" msgid="166931929505893599">"<xliff:g id="DISTANCE">%.1f</xliff:g> km kude"</string>
+ <string name="display_address" msgid="7307400970699471708">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="6709726401179550381">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="8524931350345922176">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="9168271983241323946">"Kuvulwa kusasa ngo-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="9011139983701379907">"Kuvulwa namuhla ngo-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="2623384032475495193">"Kuvalwa ngo-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="324294933330883529">"Kuvalwe namuhla ngo-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="6439301193613349163">"Kuvuliwe manje"</string>
+ <string name="closed_now" msgid="9175774453982778909">"Kuvaliwe manje"</string>
+</resources>
diff --git a/InCallUI/res/values/animation_constants.xml b/InCallUI/res/values/animation_constants.xml
new file mode 100644
index 0000000..8df6a72
--- /dev/null
+++ b/InCallUI/res/values/animation_constants.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+ <!-- Duration of the InCallUI reveal and shrink animations after a call is placed -->
+ <integer name="reveal_animation_duration">333</integer>
+ <integer name="shrink_animation_duration">333</integer>
+ <integer name="video_animation_duration">257</integer>
+</resources>
diff --git a/InCallUI/res/values/array.xml b/InCallUI/res/values/array.xml
new file mode 100644
index 0000000..8744d3e
--- /dev/null
+++ b/InCallUI/res/values/array.xml
@@ -0,0 +1,135 @@
+<?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
+ -->
+
+<!-- Array resources for the Phone app. -->
+<resources>
+ <!-- "Target" resources for the GlowPadView widget used for incoming calls;
+ see InCallTouchUi.showIncomingCallWidget() and incall_touch_ui.xml. -->
+
+ <!-- For audio calls, if respond via SMS is disabled:
+ - Answer (drag right)
+ - Decline (drag left) -->
+ <array name="incoming_call_widget_audio_without_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@null</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_target_descriptions">
+ <item>@string/description_target_answer</item>
+ <item>@null</item>
+ <item>@string/description_target_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@null</item>
+ </array>
+
+ <!-- For audio calls, if respond via SMS is enabled:
+ - Answer (drag right)
+ - Respond via SMS (drag up)
+ - Decline (drag left) -->
+ <array name="incoming_call_widget_audio_with_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@drawable/ic_lockscreen_text</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_target_descriptions">
+ <item>@string/description_target_answer</item>
+ <item>@string/description_target_send_sms</item>
+ <item>@string/description_target_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@string/description_direction_up</item>
+ <item>@string/description_direction_left</item>
+ <item>@null</item>
+ </array>
+
+ <!-- For video calls, if respond via SMS is disabled:
+ - Answer as video call (drag right)
+ - Decline (drag left)
+ - Answer as audio call (drag down) -->
+ <array name="incoming_call_widget_video_without_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@null</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@drawable/ic_lockscreen_answer_video</item>
+ </array>
+ <array name="incoming_call_widget_video_without_sms_target_descriptions">
+ <item>@string/description_target_answer_audio_call</item>
+ <item>@null</item>
+ <item>@string/description_target_decline</item>
+ <item>@string/description_target_answer_video_call</item>
+ </array>
+ <array name="incoming_call_widget_video_without_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@string/description_direction_down</item>
+ </array>
+
+ <!-- For video calls, if respond via SMS is enabled:
+ - Answer as audio call (drag right)
+ - Respond via SMS (drag up)
+ - Decline (drag left)
+ - Answer as video call (drag down) -->
+ <array name="incoming_call_widget_video_with_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@drawable/ic_lockscreen_text</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@drawable/ic_lockscreen_answer_video</item>
+ </array>
+ <array name="incoming_call_widget_video_with_sms_target_descriptions">
+ <item>@string/description_target_answer_audio_call</item>
+ <item>@string/description_target_send_sms</item>
+ <item>@string/description_target_decline</item>
+ <item>@string/description_target_answer_video_call</item>
+ </array>
+ <array name="incoming_call_widget_video_with_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@string/description_direction_up</item>
+ <item>@string/description_direction_left</item>
+ <item>@string/description_direction_down</item>
+ </array>
+
+ <!-- For accept/reject upgrade to video in active video call
+ - Accept upgrade to video request (drag right)
+ - Decline upgrade to video request (drag left)-->
+ <array name="incoming_call_widget_video_request_targets">
+ <item>@drawable/ic_lockscreen_answer_video</item>
+ <item>@drawable/ic_lockscreen_decline_video</item>
+ </array>
+
+ <array name="incoming_call_widget_video_request_target_descriptions">
+ <item>@string/description_target_accept_upgrade_to_video_request</item>
+ <item>@null</item>
+ <item>@string/description_target_decline_upgrade_to_video_request</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_video_request_target_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@null</item>
+ </array>
+</resources>
diff --git a/InCallUI/res/values/attrs.xml b/InCallUI/res/values/attrs.xml
new file mode 100644
index 0000000..e135fb7
--- /dev/null
+++ b/InCallUI/res/values/attrs.xml
@@ -0,0 +1,71 @@
+<?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>
+ <declare-styleable name="GlowPadView">
+ <attr name="android:gravity"/>
+
+ <!-- Reference to an array resource that be shown as targets around a circle. -->
+ <attr name="targetDrawables" format="reference"/>
+
+ <!-- Reference to an array resource that be used as description for the targets around the circle. -->
+ <attr name="targetDescriptions" format="reference"/>
+
+ <!-- Reference to an array resource that be used to announce the directions with targets around the circle. -->
+ <attr name="directionDescriptions" format="reference"/>
+
+ <!-- Sets a drawable as the center. -->
+ <attr name="handleDrawable" format="reference"/>
+
+ <!-- Drawable to use for wave ripple animation. -->
+ <attr name="outerRingDrawable" format="reference"/>
+
+ <!-- Drawble used for drawing points -->
+ <attr name="pointDrawable" format="reference"/>
+
+ <!-- Inner radius of glow area. -->
+ <attr name="innerRadius" format="dimension"/>
+
+ <!-- Outer radius of glow area. Target icons will be drawn on this circle. -->
+ <attr name="outerRadius" format="dimension"/>
+
+ <!-- Size of target radius. Points within this distance of target center is a "hit". -->
+ <!--
+ <attr name="hitRadius" format="dimension"/>
+ -->
+
+ <!-- Radius of glow under finger. -->
+ <attr name="glowRadius" format="dimension"/>
+
+ <!-- Tactile feedback duration for actions. Set to '0' for no vibration. -->
+ <attr name="vibrationDuration" format="integer"/>
+
+ <!-- How close we need to be before snapping to a target. -->
+ <attr name="snapMargin" format="dimension"/>
+
+ <!-- Number of waves/chevrons to show in animation. -->
+ <attr name="feedbackCount" format="integer"/>
+
+ <!-- Used when the handle shouldn't wait to be hit before following the finger -->
+ <attr name="alwaysTrackFinger" format="boolean"/>
+
+ <!-- Determine whether the glow pad is allowed to scale to fit the bounds indicated
+ by its parent. If this is set to false, no scaling will occur. If this is set to true
+ scaling will occur to fit for any axis in which gravity is set to center. -->
+ <attr name="allowScaling" format="boolean" />
+ </declare-styleable>
+</resources>
diff --git a/InCallUI/res/values/colors.xml b/InCallUI/res/values/colors.xml
new file mode 100644
index 0000000..60a017c
--- /dev/null
+++ b/InCallUI/res/values/colors.xml
@@ -0,0 +1,122 @@
+<?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>
+
+ <!-- In-call UI background color. -->
+ <color name="incall_background_color">@color/dialer_theme_color</color>
+ <color name="incall_accent_color">#ffffff</color>
+
+ <!-- Background color of main banner. -->
+ <color name="incall_call_banner_background_color">@color/incall_background_color</color>
+ <color name="incall_call_banner_text_color">#ffffff</color>
+ <!-- 80% opacity, white -->
+ <color name="incall_call_banner_subtext_color">#ccffffff</color>
+ <color name="incall_banner_secondary_background_color">#f5f5f5</color>
+ <color name="incall_banner_secondary_text_color">#333333</color>
+
+ <color name="incall_action_bar_background_color">@color/incall_background_color</color>
+ <color name="incall_action_bar_text_color">@color/incall_call_banner_text_color</color>
+
+ <color name="incall_photo_background_color">#545454</color>
+
+ <!-- Put on top of each photo, implying 80% darker than usual. -->
+ <color name="on_hold_dim_effect">#cc000000</color>
+
+ <color name="conference_call_manager_background_color">#f8f8f8</color>
+ <color name="conference_call_manager_caller_name_text_color">#4d4d4d</color>
+ <color name="conference_call_manager_icon_color">#999999</color>
+ <!-- Used with some smaller texts in manage conference screen. -->
+ <color name="conference_call_manager_secondary_text_color">#999999</color>
+ <color name="secondary_call_info_divider_highlight_color">#ffffff</color>
+
+ <color name="end_call_touch_feedback_tint">#dddddd</color>
+
+ <!-- Color of dialpad digits -->
+ <color name="dialpad_digits_text_color">#333</color>
+
+ <color name="incall_dialpad_background">#ffffff</color>
+ <color name="incall_dialpad_background_pressed">#ccaaaaaa</color>
+
+ <color name="button_background_color">@color/incall_background_color</color>
+ <color name="button_selected_color">@color/dialer_theme_color_dark</color>
+ <!-- 70% opacity, white. -->
+ <color name="button_default_color">#b3ffffff</color>
+ <!-- 20% opacity, white. -->
+ <color name="button_disabled_color">#33ffffff</color>
+
+ <!-- Background color of action bars -->
+ <color name="actionbar_background_color">@color/dialer_theme_color</color>
+ <!-- Background color for status bar. For portrait this will be ignored. -->
+ <color name="statusbar_background_color">@color/dialer_theme_color</color>
+
+ <color name="translucent_shadow">#33999999</color>
+
+ <!-- 70% opacity, black. -->
+ <color name="glowpad_background_color">#b3000000</color>
+ <!-- 15% opacity, white. -->
+ <color name="glowpad_outer_ring_color">#26ffffff</color>
+ <color name="glowpad_text_widget_ring_color">#ffffff</color>
+ <color name="glowpad_widget_active_color">#ffffff</color>
+ <color name="glowpad_text_widget_normal_tint">#cccccc</color>
+ <color name="glowpad_call_widget_normal_tint">#00c853</color>
+ <color name="glowpad_end_call_widget_normal_tint">#ff1744</color>
+ <color name="glowpad_incoming_widget_tint">#a3a3a3</color>
+ <color name="glowpad_incoming_widget_background_tint">#ffffff</color>
+
+ <!-- 70% opacity, white. -->
+ <color name="accessible_answer_hint_text_color">#B2FFFFFF</color>
+
+ <!-- 20% opacity, theme color. -->
+ <color name="incall_dialpad_touch_tint">#330288d1</color>
+
+ <!-- Background colors for InCallUI. This set of colors is a subset of
+ https://spec.googleplex.com/quantumpalette#extended which pass WCAG AA and all have a
+ contrast ratio over 5:1.
+
+ These colors are also used by InCallUIMaterialColorMapUtils to generate primary
+ activity colors.
+ -->
+ <array name="background_colors">
+ <item>#00796B</item>
+ <item>#3367D6</item>
+ <item>#303F9F</item>
+ <item>#7B1FA2</item>
+ <item>#C2185B</item>
+ <item>#C53929</item>
+ </array>
+
+ <!-- Darker versions of background_colors, two shades darker. These colors are used for the
+ status bar. -->
+ <array name="background_colors_dark">
+ <item>#00695C</item>
+ <item>#2A56C6</item>
+ <item>#283593</item>
+ <item>#6A1B9A</item>
+ <item>#AD1457</item>
+ <item>#B93221</item>
+ </array>
+
+ <!-- Ripple color used over light backgrounds. -->
+ <color name="ripple_light">#40000000</color>
+
+ <color name="contact_context_title_text_color">@color/incall_call_banner_subtext_color</color>
+ <color name="person_contact_context_message_text_color">@color/dialer_theme_color</color>
+ <color name="person_contact_context_message_background_color">@color/incall_call_banner_subtext_color</color>
+ <color name="person_contact_context_detail_text_color">@color/incall_call_banner_subtext_color</color>
+ <color name="business_contact_context_text_color">@color/incall_call_banner_subtext_color</color>
+</resources>
diff --git a/InCallUI/res/values/config.xml b/InCallUI/res/values/config.xml
new file mode 100644
index 0000000..b81ba3c
--- /dev/null
+++ b/InCallUI/res/values/config.xml
@@ -0,0 +1,27 @@
+<!--
+ ~ 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
+ -->
+<resources>
+ <!-- Determines the maximum number of buttons visible on the call card. Any buttons over this
+ count are put into the overflow menu. -->
+ <integer name="call_card_max_buttons">5</integer>
+
+ <!-- Determines video calls will automatically enter fullscreen mode after the start of the
+ call. -->
+ <bool name="video_call_auto_fullscreen">true</bool>
+ <!-- The number of milliseconds after which a video call will automatically enter fullscreen
+ mode (requires video_call_auto_fullscreen to be true). -->
+ <integer name="video_call_auto_fullscreen_timeout">5000</integer>
+</resources>
\ No newline at end of file
diff --git a/InCallUI/res/values/dimens.xml b/InCallUI/res/values/dimens.xml
new file mode 100644
index 0000000..439bb41
--- /dev/null
+++ b/InCallUI/res/values/dimens.xml
@@ -0,0 +1,145 @@
+<?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>
+ <!-- Whether or not the landscape mode layout is currently being used -->
+ <bool name="is_layout_landscape">false</bool>
+
+ <!-- Dimensions for CallCard elements (the normal in-call UI) -->
+
+ <dimen name="call_banner_height">90dp</dimen>
+ <dimen name="incall_action_bar_elevation">3dp</dimen>
+
+ <!-- Margin between the bottom of the "call card" photo
+ and the top of the in-call button cluster. -->
+ <dimen name="in_call_touch_ui_upper_margin">2dp</dimen>
+
+ <!-- Padding at the left and right edges of the "call banner". -->
+ <dimen name="call_banner_side_padding">24dp</dimen>
+ <!-- Padding at the top and bottom edges of the "call banner". -->
+ <dimen name="call_banner_primary_call_container_top_padding">16dp</dimen>
+ <dimen name="secondary_call_info_horizontal_padding">24dp</dimen>
+ <dimen name="secondary_call_info_vertical_padding">32dp</dimen>
+ <dimen name="secondary_call_info_text_size">16sp</dimen>
+
+ <!-- Padding at the top and bottom edges of the "provider information" -->
+ <dimen name="provider_info_top_bottom_padding">8dp</dimen>
+
+ <!-- Text sizes for information in the call card.
+ Note: These are the default sizes for small (<600dp height) devices: larger screen sizes
+ apply the values in values-sw360dp/dimens.xml. -->
+ <dimen name="call_status_text_size">16sp</dimen>
+ <dimen name="call_status_text_min_size">12sp</dimen>
+ <dimen name="call_name_text_size">34dp</dimen>
+ <dimen name="call_name_text_min_size">28sp</dimen>
+ <dimen name="call_label_text_size">16sp</dimen>
+ <!-- Right padding for name and number fields in the call banner.
+ This padding is used to ensure that ultra-long names or
+ numbers won't overlap the elapsed time indication. -->
+ <dimen name="call_banner_name_number_right_padding">50sp</dimen>
+
+ <!-- Height and width of the in-call buttons. -->
+ <dimen name="in_call_button_dimension">48dp</dimen>
+
+ <dimen name="primary_call_elevation">5dp</dimen>
+ <dimen name="dialpad_elevation">2dp</dimen>
+
+ <!-- The InCallUI dialpad will sometimes want digits sizes that are different from dialer.
+ Note: These are the default sizes for small (<600dp height) devices: larger screen sizes
+ apply the values in values-h600dp/dimens.xml. -->
+ <dimen name="dialpad_key_number_margin_bottom">1dp</dimen>
+ <!-- Zero key should have less space between self and text because "+" is smaller -->
+ <dimen name="dialpad_zero_key_number_margin_bottom">0dp</dimen>
+ <dimen name="dialpad_digits_adjustable_text_size">20sp</dimen>
+ <dimen name="dialpad_digits_adjustable_height">50dp</dimen>
+ <dimen name="dialpad_key_numbers_size">36dp</dimen>
+
+ <dimen name="floating_action_button_vertical_offset">-24dp</dimen>
+
+ <dimen name="call_button_margin_vertical">8dp</dimen>
+ <dimen name="call_button_margin_horizontal">6dp</dimen>
+
+ <!-- Dimensions for OTA Call Card -->
+ <dimen name="otaactivate_layout_marginTop">10dp</dimen>
+ <dimen name="otalistenprogress_layout_marginTop">5dp</dimen>
+ <dimen name="otasuccessfail_layout_marginTop">10dp</dimen>
+
+ <!-- Dimension used to possibly down-scale high-res photo into what is suitable
+ for notification's large icon. -->
+ <dimen name="notification_icon_size">64dp</dimen>
+
+ <!-- Circle size for incoming call widget's each item. -->
+ <dimen name="incoming_call_widget_circle_size">56dp</dimen>
+
+ <!-- Size of alarm alert outer ring. -->
+ <dimen name="glowpadview_outerring_diameter">250dp</dimen>
+ <!-- Default target placement radius for GlowPadView. Should be 1/2 of outerring diameter. -->
+ <dimen name="glowpadview_target_placement_radius">125dp</dimen>
+
+ <!-- Default glow radius for GlowPadView -->
+ <dimen name="glowpadview_glow_radius">70dip</dimen>
+
+ <!-- Default distance beyond which GlowPadView snaps to the matching target -->
+ <dimen name="glowpadview_snap_margin">40dip</dimen>
+
+ <!-- Default distance from each snap target that GlowPadView considers a "hit" -->
+ <dimen name="glowpadview_inner_radius">15dip</dimen>
+
+ <dimen name="glowpadview_margin_bottom">-48dip</dimen>
+ <dimen name="glowpadview_margin_right">0dip</dimen>
+ <!-- Height of translucent shadow effect -->
+ <dimen name="translucent_shadow_height">2dp</dimen>
+
+ <dimen name="end_call_button_margin_bottom">8dp</dimen>
+
+ <dimen name="call_card_anim_translate_y_offset">50dp</dimen>
+
+ <!-- The smaller dimension of the video preview. When in portrait orientation this is the
+ width of the preview. When in landscape, this is the height. -->
+ <dimen name="video_preview_small_dimension">90dp</dimen>
+
+ <dimen name="video_preview_margin">20dp</dimen>
+
+ <dimen name="end_call_floating_action_button_diameter">72dp</dimen>
+ <dimen name="end_call_floating_action_button_small_diameter">56dp</dimen>
+
+ <dimen name="conference_call_manager_padding_top">64dp</dimen>
+ <dimen name="conference_call_manager_button_dimension">46dp</dimen>
+
+ <dimen name="contact_context_title_text_size">14sp</dimen>
+ <dimen name="contact_context_title_image_size">19dp</dimen>
+ <dimen name="contact_context_title_image_side_padding">23dp</dimen>
+ <dimen name="contact_context_title_margin_bottom">13dp</dimen>
+ <dimen name="contact_context_list_item_padding">13dp</dimen>
+
+ <dimen name="person_contact_context_horizontal_padding">30dp</dimen>
+ <dimen name="person_contact_context_message_text_size">16sp</dimen>
+ <dimen name="person_contact_context_message_vertical_padding">7dp</dimen>
+ <dimen name="person_contact_context_message_horizontal_padding">12dp</dimen>
+ <dimen name="person_contact_context_message_background_main_radius">15dp</dimen>
+ <dimen name="person_contact_context_message_background_accent_radius">2dp</dimen>
+ <dimen name="person_contact_context_detail_padding_top">7dp</dimen>
+ <dimen name="person_contact_context_detail_text_size">14sp</dimen>
+
+ <dimen name="business_contact_context_end_padding">10dp</dimen>
+ <dimen name="business_contact_context_image_size">25dp</dimen>
+ <dimen name="business_contact_context_image_padding">20dp</dimen>
+ <dimen name="business_contact_context_heading_font_size">16sp</dimen>
+ <dimen name="business_contact_context_detail_font_size">12sp</dimen>
+
+ <dimen name="contact_context_small_photo_size">40dp</dimen>
+</resources>
diff --git a/InCallUI/res/values/ids.xml b/InCallUI/res/values/ids.xml
new file mode 100644
index 0000000..accb8fb
--- /dev/null
+++ b/InCallUI/res/values/ids.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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>
+ <item type="id" name="fadeState" />
+ <item type="id" name="view_tag_callcard_actual_height" />
+</resources>
diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml
new file mode 100644
index 0000000..df588d5
--- /dev/null
+++ b/InCallUI/res/values/strings.xml
@@ -0,0 +1,514 @@
+<?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:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Official label of the phone app, as seen in "Manage Applications"
+ and other settings UIs. -->
+ <string name="phoneAppLabel" product="default">Phone</string>
+
+ <!-- Official label for the in-call UI. DO NOT TRANSLATE. -->
+ <string name="inCallLabel" translate="false">InCallUI</string>
+
+ <!-- Call status -->
+
+ <!-- In-call screen: status label for a call that's on hold -->
+ <string name="onHold">On hold</string>
+
+ <!-- Incoming call screen, name of "unknown" caller -->
+ <string name="unknown">Unknown</string>
+ <!-- Incoming call screen, string when number hidden -->
+ <string name="private_num">Private number</string>
+ <!-- Incoming call screen, string when called from a pay phone -->
+ <string name="payphone">Payphone</string>
+
+ <!-- In-call screen: status label for a conference call -->
+ <string name="confCall">Conference call</string>
+ <!-- In-call screen: call lost dialog text -->
+ <string name="call_lost">Call dropped</string>
+
+ <!-- MMI dialog strings -->
+ <!-- Dialog label when an MMI code starts running -->
+
+ <!-- "Audio mode" popup menu: Item label to select the speakerphone [CHAR LIMIT=25] -->
+ <string name="audio_mode_speaker">Speaker</string>
+ <!-- "Audio mode" popup menu: Item label to select the handset earpiece [CHAR LIMIT=25] -->
+ <string name="audio_mode_earpiece">Handset earpiece</string>
+ <!-- "Audio mode" popup menu: Item label to select the wired headset [CHAR LIMIT=25] -->
+ <string name="audio_mode_wired_headset">Wired headset</string>
+ <!-- "Audio mode" popup menu: Item label to select the bluetooth headset [CHAR LIMIT=25] -->
+ <string name="audio_mode_bluetooth">Bluetooth</string>
+
+ <!-- post dial -->
+ <!-- In-call screen: body text of the dialog that appears when we encounter
+ the "wait" character in a phone number to be dialed; this dialog asks the
+ user if it's OK to send the numbers following the "wait". -->
+ <string name="wait_prompt_str">Send the following tones?\n</string>
+ <!-- In-call screen: body text of the dialog that appears when we encounter
+ the "PAUSE" character in a phone number to be dialed; this dialog gives
+ informative message to the user to show the sending numbers following the "Pause". -->
+ <string name="pause_prompt_str">Sending tones\n</string>
+ <!-- In-call screen: button label on the "wait" prompt dialog -->
+ <string name="send_button">Send</string>
+ <!-- In-call screen: button label on the "wait" prompt dialog in CDMA Mode-->
+ <string name="pause_prompt_yes">Yes</string>
+ <!-- In-call screen: button label on the "wait" prompt dialog in CDMA Mode-->
+ <string name="pause_prompt_no">No</string>
+ <!-- In-call screen: on the "wild" character dialog, this is the label
+ for a text widget that lets the user enter the digits that should
+ replace the "wild" character. -->
+ <string name="wild_prompt_str">Replace wild character with</string>
+
+ <!-- In-call screen: status label for a conference call -->
+ <string name="caller_manage_header">Conference call <xliff:g id="conf_call_time">%s</xliff:g></string>
+
+ <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
+ <string name="fake_phone_activity_phoneNumber_text" translatable="false">(650) 555-1234</string>
+ <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
+ <string name="fake_phone_activity_infoText_text" translatable="false">Incoming phone number</string>
+ <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
+ <string name="fake_phone_activity_placeCall_text" translatable="false">Fake Incoming Call</string>
+
+ <!-- Call settings screen, Set voicemail dialog title -->
+ <string name="voicemail_settings_number_label">Voicemail number</string>
+
+ <!-- Card titles -->
+ <!-- In-call screen: status label for a call in the "dialing" state [CHAR LIMIT=25] -->
+ <string name="card_title_dialing">Dialing</string>
+ <!-- In-call screen: status label for a re-dialing call [CHAR LIMIT=25] -->
+ <string name="card_title_redialing">Redialing</string>
+ <!-- In-call screen: status label for a conference call [CHAR LIMIT=25] -->
+ <string name="card_title_conf_call">Conference call</string>
+ <!-- In-call screen: status label for an incoming call [CHAR LIMIT=25] -->
+ <string name="card_title_incoming_call">Incoming call</string>
+ <!-- In-call screen: status label for an incoming work call [CHAR LIMIT=25] -->
+ <string name="card_title_incoming_work_call">Incoming work call</string>
+ <!-- In-call screen: status label displayed briefly after a call ends [CHAR LIMIT=25] -->
+ <string name="card_title_call_ended">Call ended</string>
+ <!-- In-call screen: status label for call that's on hold [CHAR LIMIT=25] -->
+ <string name="card_title_on_hold">On hold</string>
+ <!-- In-call screen: status label for a call that's in the process of hanging up [CHAR LIMIT=25] -->
+ <string name="card_title_hanging_up">Hanging up</string>
+ <!-- In-call screen: status label for a call that's in CDMA flash mode [CHAR LIMIT=25] -->
+ <string name="card_title_in_call">In call</string>
+ <!-- In-call screen: special status label that shows your own phone
+ number during emergency callback mode (ECM) [CHAR LIMIT=30] -->
+ <string name="card_title_my_phone_number">My number is <xliff:g id="my_phone_number">%s</xliff:g></string>
+ <!-- In-call screen: status label when connecting video. -->
+ <string name="card_title_video_call_connecting">Connecting video</string>
+ <!-- In-call screen: status label when in a video call. -->
+ <string name="card_title_video_call">Video call</string>
+ <!-- In-call screen: status label when requesting video. -->
+ <string name="card_title_video_call_requesting">Requesting video</string>
+ <!-- In-call screen: status label when there is a problem connecting a video call. -->
+ <string name="card_title_video_call_error">Can\'t connect video call</string>
+ <!-- In-call screen: status label when the remote party rejects a video call request. -->
+ <string name="card_title_video_call_rejected">Video request rejected</string>
+
+ <!-- In-call screen: string shown to the user when their outgoing number is different than the
+ number reported by TelephonyManager#getLine1Number() -->
+ <string name="card_title_callback_number">Your callback number\n
+ <xliff:g id="dark_number">%1$s</xliff:g>
+ </string>
+
+ <!-- In-call screen: string shown to the user when their outgoing number is different than the
+ number reported by TelephonyManager#getLine1Number() and they're calling emergency
+ services. -->
+ <string name="card_title_callback_number_emergency">Your emergency callback number\n
+ <xliff:g id="dark_number">%1$s</xliff:g>
+ </string>
+
+ <!-- Notification strings -->
+ <!-- The "label" of the in-call Notification for a dialing call, used
+ as the format string for a Chronometer widget. [CHAR LIMIT=60] -->
+ <string name="notification_dialing">Dialing</string>
+ <!-- Missed call notification label, used when there's exactly one missed call -->
+ <string name="notification_missedCallTitle">Missed call</string>
+ <!-- Missed call notification label, used when there are two or more missed calls -->
+ <string name="notification_missedCallsTitle">Missed calls</string>
+ <!-- Missed call notification message used when there are multiple missed calls -->
+ <string name="notification_missedCallsMsg"><xliff:g id="num_missed_calls">%s</xliff:g> missed calls</string>
+ <!-- Missed call notification message used for a single missed call, including
+ the caller-id info from the missed call -->
+ <string name="notification_missedCallTicker">Missed call from <xliff:g id="missed_call_from">%s</xliff:g></string>
+ <!-- The "label" of the in-call Notification for an ongoing call. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_call">Ongoing call</string>
+ <!-- The "label" of the in-call Notification for an ongoing work call. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_work_call">Ongoing work call</string>
+ <!-- The "label" of the in-call Notification for an ongoing call, which is being made over
+ Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_call_wifi">Ongoing Wi-Fi call</string>
+ <!-- The "label" of the in-call Notification for an ongoing work call, which is being made
+ over Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_work_call_wifi">Ongoing Wi-Fi work call</string>
+ <!-- The "label" of the in-call Notification for a call that's on hold -->
+ <string name="notification_on_hold">On hold</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing call. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_call">Incoming call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing call. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_work_call">Incoming work call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing call,
+ which is being made over Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_call_wifi">Incoming Wi-Fi call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing work call,
+ which is being made over Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_work_call_wifi">Incoming Wi-Fi work call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing video call. -->
+ <string name="notification_incoming_video_call">Incoming video call</string>
+ <!-- The "label" of the in-call Notification for upgrading an existing call to a video call. -->
+ <string name="notification_requesting_video_call">Incoming video request</string>
+ <!-- Label for the "Voicemail" notification item, when expanded. -->
+ <string name="notification_voicemail_title">New voicemail</string>
+ <!-- Label for the expanded "Voicemail" notification item,
+ including a count of messages. -->
+ <string name="notification_voicemail_title_count">New voicemail (<xliff:g id="count">%d</xliff:g>)</string>
+ <!-- Message displayed in the "Voicemail" notification item, allowing the user
+ to dial the indicated number. -->
+ <string name="notification_voicemail_text_format">Dial <xliff:g id="voicemail_number">%s</xliff:g></string>
+ <!-- Message displayed in the "Voicemail" notification item,
+ indicating that there's no voicemail number available -->
+ <string name="notification_voicemail_no_vm_number">Voicemail number unknown</string>
+ <!-- Label for the "No service" notification item, when expanded. -->
+ <string name="notification_network_selection_title">No service</string>
+ <!-- Label for the expanded "No service" notification item, including the
+ operator name set by user -->
+ <string name="notification_network_selection_text">Selected network (<xliff:g id="operator_name">%s</xliff:g>) unavailable</string>
+ <!-- Label for the "Answer call" action. This is the displayed label for the action that answers
+ an incoming call. [CHAR LIMIT=12] -->
+ <string name="notification_action_answer">Answer</string>
+ <!-- Label for "end call" Action.
+ It is displayed in the "Ongoing call" notification, which is shown
+ when the user is outside the in-call screen while the phone call is still
+ active. [CHAR LIMIT=12] -->
+ <string name="notification_action_end_call">Hang up</string>
+ <!-- Label for "Video Call" notification action. This is a displayed on the notification for an
+ incoming video call, and answers the call as a video call. [CHAR LIMIT=12] -->
+ <string name="notification_action_answer_video">Video</string>
+ <!-- Label for "Voice" notification action. This is a displayed on the notification for an
+ incoming video call, and answers the call as an audio call. [CHAR LIMIT=12] -->
+ <string name="notification_action_answer_voice">Voice</string>
+ <!-- Label for "Accept" notification action. This is somewhat generic, and may refer to
+ scenarios such as accepting an incoming call or accepting a video call request.
+ [CHAR LIMIT=12] -->
+ <string name="notification_action_accept">Accept</string>
+ <!-- Label for "Dismiss" notification action. This is somewhat generic, and may refer to
+ scenarios such as declining an incoming call or declining a video call request.
+ [CHAR LIMIT=12] -->
+ <string name="notification_action_dismiss">Dismiss</string>
+
+ <!-- Message for "call back" Action, which is displayed in the missed call notification.
+ The user will be able to call back to the person or the phone number.
+ [CHAR LIMIT=12] -->
+ <string name="notification_missedCall_call_back">Call back</string>
+ <!-- Message for "reply via sms" action, which is displayed in the missed call notification.
+ The user will be able to send text messages using the phone number.
+ [CHAR LIMIT=12] -->
+ <string name="notification_missedCall_message">Message</string>
+
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_power_off">To place a call, first turn off Airplane mode.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog.
+ This string is currently unused (see comments in InCallActivity.java.) -->
+ <string name="incall_error_emergency_only">Not registered on network.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_out_of_service">Cellular network not available.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_no_phone_number_supplied">To place a call, enter a valid number.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_call_failed">Can\'t call.</string>
+ <!-- In-call screen: status message displayed in a dialog when starting an MMI -->
+ <string name="incall_status_dialed_mmi">Starting MMI sequence\u2026</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_unknown">Service not supported.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_switch">Can\'t switch calls.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_separate">Can\'t separate call.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_transfer">Can\'t transfer.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_conference">Can\'t conference.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_reject">Can\'t reject call.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_hangup">Can\'t release call(s).</string>
+
+ <!-- In-call screen: "call type" indication for a SIP call [CHAR LIMIT=30] -->
+ <string name="incall_call_type_label_sip">SIP call</string>
+
+ <!-- Dialog title for the "radio enable" UI for emergency calls -->
+ <string name="emergency_enable_radio_dialog_title">Emergency call</string>
+ <!-- Status message for the "radio enable" UI for emergency calls -->
+ <string name="emergency_enable_radio_dialog_message">Turning on radio\u2026</string>
+ <!-- Status message for the "radio enable" UI for emergency calls -->
+ <string name="emergency_enable_radio_dialog_retry">No service. Trying again\u2026</string>
+
+ <!-- Dialer text on Emergency Dialer -->
+ <!-- Emergency dialer: message displayed in an error dialog -->
+ <string name="dial_emergency_error">Can\'t call. <xliff:g id="non_emergency_number">%s</xliff:g> is not an emergency number.</string>
+ <!-- Emergency dialer: message displayed in an error dialog -->
+ <string name="dial_emergency_empty_error">Can\'t call. Dial an emergency number.</string>
+
+ <!-- Displayed in the text entry box in the dialer when in landscape mode to guide the user
+ to dial using the physical keyboard -->
+ <string name="dialerKeyboardHintText">Use keyboard to dial</string>
+
+ <!-- Text for the onscreen "Hold" button when it is not selected. Pressing it will put
+ the call on hold. -->
+ <string name="onscreenHoldText_unselected">Hold Call</string>
+ <!-- Text for the onscreen "Hold" button when it is selected. Pressing it will resume
+ the call from a previously held state. -->
+ <string name="onscreenHoldText_selected">Resume Call</string>
+ <!-- Text for the onscreen "End call" button -->
+ <string name="onscreenEndCallText">End Call</string>
+ <!-- Text for the onscreen "Show Dialpad" button -->
+ <string name="onscreenShowDialpadText">Dialpad</string>
+ <!-- Text for the onscreen "Mute" button -->
+ <string name="onscreenMuteText">Mute</string>
+ <!-- Text for the onscreen "Add call" button -->
+ <string name="onscreenAddCallText">Add call</string>
+ <!-- Text for the onscreen "Merge calls" button -->
+ <string name="onscreenMergeCallsText">Merge calls</string>
+ <!-- Text for the onscreen "Swap calls" button -->
+ <string name="onscreenSwapCallsText">Swap</string>
+ <!-- Text for the onscreen "Manage calls" button -->
+ <string name="onscreenManageCallsText">Manage calls</string>
+ <!-- Text for the onscreen "Manage conference" button [CHAR LIMIT=30] -->
+ <string name="onscreenManageConferenceText">Manage conference call</string>
+ <!-- Text for the onscreen "Audio" button that lets you switch
+ between speaker / bluetooth / earpiece [CHAR LIMIT=10] -->
+ <string name="onscreenAudioText">Audio</string>
+ <!-- Text for the onscreen "Video call" button used to change a voice call
+ to a video call. [CHAR LIMIT=10] -->
+ <string name="onscreenVideoCallText">Video call</string>
+ <!-- Text for the onscreen "Change to voice" button. When clicked, this downgrades a video call
+ to a voice call. -->
+ <string name="onscreenChangeToVoiceText">Change to voice call</string>
+ <!-- Text for the onscreen "Switch camera" button. When clicked, this switches the user's camera
+ for video calling between the front-facing camera and the back-facing camera. -->
+ <string name="onscreenSwitchCameraText">Switch camera</string>
+ <!-- Text for the onscreen "Pause video" button. -->
+ <string name="onscreenPauseVideoText">Pause video</string>
+ <!-- Text for the onscreen overflow button, to see additional actions which can be done. -->
+ <string name="onscreenOverflowText">More options</string>
+
+ <!-- Message indicating that Video Started flowing for IMS-VT calls -->
+ <string name="player_started">Player Started</string>
+ <!-- Message indicating that Video Stopped flowing for IMS-VT calls -->
+ <string name="player_stopped">Player Stopped</string>
+ <!-- Message indicating that camera failure has occurred for the selected camera and
+ as result camera is not ready -->
+ <string name="camera_not_ready">Camera not ready</string>
+ <!-- Message indicating that camera is ready/available -->
+ <string name="camera_ready">Camera ready</string>
+ <!-- Message indicating unknown call session event -->
+ <string name="unknown_call_session_event">"Unkown call session event"</string>
+
+ <!-- For incoming calls, this is a string we can get from a CDMA network instead of
+ the actual phone number, to indicate there's no number present. DO NOT TRANSLATE. -->
+ <string-array name="absent_num" translatable="false">
+ <item>ABSENT NUMBER</item>
+ <item>ABSENTNUMBER</item>
+ </string-array>
+
+ <!-- Preference for Voicemail service provider under "Voicemail" settings.
+ [CHAR LIMIT=40] -->
+ <string name="voicemail_provider">Service</string>
+
+ <!-- Preference for Voicemail setting of each provider.
+ [CHAR LIMIT=40] -->
+ <string name="voicemail_settings">Setup</string>
+
+ <!-- String to display in voicemail number summary when no voicemail num is set -->
+ <string name="voicemail_number_not_set"><Not set></string>
+
+ <!-- Title displayed above settings coming after voicemail in the call features screen -->
+ <string name="other_settings">Other call settings</string>
+
+ <!-- Title displayed in the overlay for outgoing calls which include the name of the provider.
+ [CHAR LIMIT=40] -->
+ <string name="calling_via_template">Calling via <xliff:g id="provider_name">%s</xliff:g></string>
+ <!-- Title displayed in the overlay for incoming calls which include the name of the provider.
+ [CHAR LIMIT=40] -->
+ <string name="incoming_via_template">Incoming via <xliff:g id="provider_name">%s</xliff:g></string>
+
+ <!-- Use this as a default to describe the contact photo; currently for screen readers through accessibility. -->
+ <string name="contactPhoto">contact photo</string>
+ <!-- Use this to describe the separate conference call button; currently for screen readers through accessibility. -->
+ <string name="goPrivate">go private</string>
+ <!-- Use this to describe the select contact button in EditPhoneNumberPreference; currently for screen readers through accessibility. -->
+ <string name="selectContact">select contact</string>
+
+ <!-- "Respond via SMS" option that lets you compose a custom response. [CHAR LIMIT=30] -->
+ <string name="respond_via_sms_custom_message">Write your own...</string>
+ <!-- "Custom Message" Cancel alert dialog button -->
+ <string name="custom_message_cancel">Cancel</string>
+ <!-- "Custom Message" Send alert dialog button -->
+ <string name="custom_message_send">Send</string>
+
+ <!-- Description of the answer target in the Slide unlock screen of Phone. [CHAR LIMIT=NONE] -->
+ <string name="description_target_answer">Answer</string>
+ <!-- Description of the send_sms target in the Slide unlock screen of Phone. [CHAR LIMIT=NONE] -->
+ <string name="description_target_send_sms">Send SMS</string>
+ <!-- Description of the decline target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline">Decline</string>
+ <!-- Description of the target to answer a call as a video call in the Slide unlock screen.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_answer_video_call">Answer as video call</string>
+ <!-- Description of the target to answer a call as an audio call in the Slide unlock screen.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_answer_audio_call">Answer as audio call</string>
+ <!-- Description of the target to accept a request to upgrade from an audio call to a video call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_accept_upgrade_to_video_request">Accept video request</string>
+ <!-- Description of the target to decline a request to upgrade from an audio call to a video call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline_upgrade_to_video_request">Decline video request</string>
+ <!-- Description of the target to accept a request to upgrade from any call to a video transmit call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_accept_upgrade_to_video_transmit_request">Accept video transmit request</string>
+ <!-- Description of the target to decline a request to upgrade from any call to a video transmit call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline_upgrade_to_video_transmit_request">Decline video transmit request</string>
+ <!-- Description of the target to accept a request to upgrade from any call to a video receive call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_accept_upgrade_to_video_receive_request">Accept video receive request</string>
+ <!-- Description of the target to decline a request to upgrade from any call to a video receive call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline_upgrade_to_video_receive_request">Decline video receive request</string>
+
+ <!-- Description of the up direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_up">Slide up for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+ <!-- Description of the left direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_left">"Slide left for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+ <!-- Description of the right direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_right">Slide right for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+ <!-- Description of the down direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_down">Slide down for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+
+ <!-- Dialog title for the vibration settings for voicemail notifications [CHAR LIMIT=40] -->
+ <string name="voicemail_notification_vibrate_when_title" msgid="8731372580674292759">Vibrate</string>
+ <!-- Dialog title for the vibration settings for voice mail notifications [CHAR LIMIT=40]-->
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="8995274609647451109">Vibrate</string>
+
+ <!-- Voicemail ringtone title. The user clicks on this preference to select
+ which sound to play when a voicemail notification is received.
+ [CHAR LIMIT=30] -->
+ <string name="voicemail_notification_ringtone_title">Sound</string>
+
+ <!-- The string used to describe a notification if it is the default one in the system. For
+ example, if the user selects the default notification, it will appear as something like
+ Default sound(Capella) in the notification summary.
+ [CHAR LIMIT=40] -->
+ <string name="default_notification_description">Default sound (<xliff:g id="default_sound_title">%1$s</xliff:g>)</string>
+
+ <!-- The default value value for voicemail notification. -->
+ <string name="voicemail_notification_vibrate_when_default" translatable="false">never</string>
+
+ <!-- Actual values used in our code for voicemail notifications. DO NOT TRANSLATE -->
+ <string-array name="voicemail_notification_vibrate_when_values" translatable="false">
+ <item>always</item>
+ <item>silent</item>
+ <item>never</item>
+ </string-array>
+
+ <!-- Setting option name to pick ringtone (a list dialog comes up). [CHAR LIMIT=30] -->
+ <string name="ringtone_title" msgid="5379026328015343686">Phone ringtone</string>
+
+ <!-- Setting option name to enable or disable vibration when ringing
+ the phone.
+ [CHAR LIMIT=30] -->
+ <string name="vibrate_on_ring_title">Vibrate when ringing</string>
+
+ <!-- Title for the category "ringtone", which is shown above ringtone and vibration
+ related settings.
+ [CHAR LIMIT=30] -->
+ <string name="preference_category_ringtone">Ringtone & Vibrate</string>
+
+ <!-- Label for "Manage conference call" panel [CHAR LIMIT=40] -->
+ <string name="manageConferenceLabel">Manage conference call</string>
+
+ <!-- This can be used in any application wanting to disable the text "Emergency number" -->
+ <string name="emergency_call_dialog_number_for_display">Emergency number</string>
+
+ <!-- Phrase describing a time duration using seconds [CHAR LIMIT=16] -->
+ <plurals name="duration_seconds">
+ <item quantity="one">1 second</item>
+ <item quantity="other"><xliff:g id="count">%d</xliff:g> seconds</item>
+ </plurals>
+ <!-- Phrase describing a time duration using minutes [CHAR LIMIT=16] -->
+ <plurals name="duration_minutes">
+ <item quantity="one">1 minute</item>
+ <item quantity="other"><xliff:g id="count">%d</xliff:g> minutes</item>
+ </plurals>
+ <!-- Phrase describing a time duration using hours [CHAR LIMIT=16] -->
+ <plurals name="duration_hours">
+ <item quantity="one">1 hour</item>
+ <item quantity="other"><xliff:g id="count">%d</xliff:g> hours</item>
+ </plurals>
+
+ <!-- Description of the profile photo shown when the device's camera is disabled udring a video
+ call. [CHAR LIMIT=NONE] -->
+ <string name="profile_photo_description">Profile photo</string>
+
+ <!-- Description of the "camera off" icon displayed when the device's camera is disabled during
+ a video call. [CHAR LIMIT=NONE] -->
+ <string name="camera_off_description">Camera off</string>
+
+ <!-- Used to inform the user that a call was received via a number other than the primary
+ phone number associated with their device. [CHAR LIMIT=16] -->
+ <string name="child_number">via <xliff:g id="child_number" example="650-555-1212">%s</xliff:g></string>
+
+ <!-- Used to inform the user that the note associated with an outgoing call has been sent.
+ [CHAR LIMIT=32] -->
+ <string name="note_sent">Note sent</string>
+
+ <!-- Title for the call context with a person-type contact. [CHAR LIMIT=40] -->
+ <string name="person_contact_context_title">Recent messages</string>
+
+ <!-- Title for the call context with a business-type contact. [CHAR LIMIT=40] -->
+ <string name="business_contact_context_title">Business info</string>
+
+ <!-- Distance strings for business caller ID context. -->
+
+ <!-- Used to inform the user how far away a location is in miles. [CHAR LIMIT=NONE] -->
+ <string name="distance_imperial_away"><xliff:g id="distance">%.1f</xliff:g> mi away</string>
+ <!-- Used to inform the user how far away a location is in kilometers. [CHAR LIMIT=NONE] -->
+ <string name="distance_metric_away"><xliff:g id="distance">%.1f</xliff:g> km away</string>
+ <!-- A shortened way to display a business address. Formatted [street address], [city/locality]. -->
+ <string name="display_address"><xliff:g id="street_address">%1$s</xliff:g>, <xliff:g id="locality">%2$s</xliff:g></string>
+ <!-- Used to indicate hours of operation for a location as a time span. e.g. "11 am - 9 pm" [CHAR LIMIT=NONE] -->
+ <string name="open_time_span"><xliff:g id="open_time">%1$s</xliff:g> - <xliff:g id="close_time">%2$s</xliff:g></string>
+ <!-- Used to indicate a series of opening hours for a location.
+ This first argument may be one or more time spans. e.g. "11 am - 9 pm, 9 pm - 11 pm"
+ The second argument is an additional time span. e.g. "11 pm - 1 am"
+ The string is used to build a list of opening hours.
+ [CHAR LIMIT=NONE] -->
+ <string name="opening_hours"><xliff:g id="earlier_times">%1$s</xliff:g>, <xliff:g id="later_time">%2$s</xliff:g></string>
+ <!-- Used to express when a location will open the next day. [CHAR LIMIT=NONE] -->
+ <string name="opens_tomorrow_at">Opens tomorrow at <xliff:g id="open_time">%s</xliff:g></string>
+ <!-- Used to express the next time at which a location will be open today. [CHAR LIMIT=NONE] -->
+ <string name="opens_today_at">Opens today at <xliff:g id="open_time">%s</xliff:g></string>
+ <!-- Used to express the next time at which a location will close today. [CHAR LIMIT=NONE] -->
+ <string name="closes_today_at">Closes at <xliff:g id="close_time">%s</xliff:g></string>
+ <!-- Used to express the next time at which a location closed today if it is already closed. [CHAR LIMIT=NONE] -->
+ <string name="closed_today_at">Closed today at <xliff:g id="close_time">%s</xliff:g></string>
+ <!-- Displayed when a place is open. -->
+ <string name="open_now">Open now</string>
+ <!-- Displayed when a place is closed. -->
+ <string name="closed_now">Closed now</string>
+</resources>
diff --git a/InCallUI/res/values/styles.xml b/InCallUI/res/values/styles.xml
new file mode 100644
index 0000000..11d6362
--- /dev/null
+++ b/InCallUI/res/values/styles.xml
@@ -0,0 +1,100 @@
+<?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>
+ <drawable name="grayBg">#FF333333</drawable>
+
+ <style name="info_label">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_label</item>
+ <item name="android:paddingEnd">4dip</item>
+ </style>
+
+ <style name="info_layout">
+ <item name="android:orientation">vertical</item>
+ <item name="android:paddingStart">10dip</item>
+ <item name="android:paddingTop">10dip</item>
+ <item name="android:paddingEnd">10dip</item>
+ <item name="android:paddingBottom">10dip</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ </style>
+
+ <style name="entry_layout">
+ <item name="android:orientation">vertical</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.info_label">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+
+ <!-- Buttons in the main "button row" of the in-call onscreen touch UI. -->
+ <style name="InCallButton">
+ <item name="android:layout_width">@dimen/in_call_button_dimension</item>
+ <item name="android:layout_height">@dimen/in_call_button_dimension</item>
+ <item name="android:layout_marginBottom">@dimen/call_button_margin_vertical</item>
+ <item name="android:layout_marginLeft">@dimen/call_button_margin_horizontal</item>
+ <item name="android:layout_marginRight">@dimen/call_button_margin_horizontal</item>
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ </style>
+
+ <!-- "Compound button" variation of InCallButton.
+ These buttons have the concept of two states: checked and unchecked. This style is just
+ like "InCallButton" except that we also clear out android:background, android:textOn,
+ android:textOff, to avoid the default behavior of the ToggleButton class. -->
+ <style name="InCallCompoundButton" parent="InCallButton">
+ <item name="android:background">@null</item>
+ <item name="android:textOn">@null</item>
+ <item name="android:textOff">@null</item>
+ </style>
+
+ <!-- Theme for the InCallActivity activity. Should have a transparent background for the
+ circular reveal animation for a new outgoing call to work correctly. We don't just use
+ Theme.Black.NoTitleBar directly, since we want any popups or dialogs from the
+ InCallActivity to have the correct Material style. -->
+ <style name="Theme.InCallScreen" parent="@android:style/Theme.Material.Light">
+ <item name="android:windowAnimationStyle">@null</item>
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="dialpad_key_button_touch_tint">@color/incall_dialpad_touch_tint</item>
+ <item name="android:textColorPrimary">@color/incall_call_banner_text_color</item>
+ <item name="android:colorPrimaryDark">@color/dialer_theme_color_dark</item>
+ <item name="android:popupMenuStyle">@style/InCallPopupMenuStyle</item>
+ <item name="android:actionBarStyle">@style/InCallActionBarStyle</item>
+ <item name="android:buttonStyleToggle">@style/InCallCompoundButton</item>
+ <item name="android:alertDialogTheme">@android:style/Theme.Material.Light.Dialog.Alert</item>
+ </style>
+
+ <style name="InCallPopupMenuStyle" parent="@android:style/Theme.Material.Light">
+ <item name="android:textColorPrimary">@color/popup_menu_color</item>
+ </style>
+
+ <style name="InCallActionBarStyle" parent="@android:style/Widget.Material.Light.ActionBar">
+ <item name="android:background">@color/incall_action_bar_background_color</item>
+ <item name="android:textColor">@color/incall_action_bar_text_color</item>
+ </style>
+
+</resources>
diff --git a/InCallUI/src/com/android/incallui/AccelerometerListener.java b/InCallUI/src/com/android/incallui/AccelerometerListener.java
new file mode 100644
index 0000000..b5ad296
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AccelerometerListener.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2009 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.incallui;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+/**
+ * This class is used to listen to the accelerometer to monitor the
+ * orientation of the phone. The client of this class is notified when
+ * the orientation changes between horizontal and vertical.
+ */
+public class AccelerometerListener {
+ private static final String TAG = "AccelerometerListener";
+ private static final boolean DEBUG = true;
+ private static final boolean VDEBUG = false;
+
+ private SensorManager mSensorManager;
+ private Sensor mSensor;
+
+ // mOrientation is the orientation value most recently reported to the client.
+ private int mOrientation;
+
+ // mPendingOrientation is the latest orientation computed based on the sensor value.
+ // This is sent to the client after a rebounce delay, at which point it is copied to
+ // mOrientation.
+ private int mPendingOrientation;
+
+ private OrientationListener mListener;
+
+ // Device orientation
+ public static final int ORIENTATION_UNKNOWN = 0;
+ public static final int ORIENTATION_VERTICAL = 1;
+ public static final int ORIENTATION_HORIZONTAL = 2;
+
+ private static final int ORIENTATION_CHANGED = 1234;
+
+ private static final int VERTICAL_DEBOUNCE = 100;
+ private static final int HORIZONTAL_DEBOUNCE = 500;
+ private static final double VERTICAL_ANGLE = 50.0;
+
+ public interface OrientationListener {
+ public void orientationChanged(int orientation);
+ }
+
+ public AccelerometerListener(Context context) {
+ mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
+ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ }
+
+ public void setListener(OrientationListener listener) {
+ mListener = listener;
+ }
+
+ public void enable(boolean enable) {
+ if (DEBUG) Log.d(TAG, "enable(" + enable + ")");
+ synchronized (this) {
+ if (enable) {
+ mOrientation = ORIENTATION_UNKNOWN;
+ mPendingOrientation = ORIENTATION_UNKNOWN;
+ mSensorManager.registerListener(mSensorListener, mSensor,
+ SensorManager.SENSOR_DELAY_NORMAL);
+ } else {
+ mSensorManager.unregisterListener(mSensorListener);
+ mHandler.removeMessages(ORIENTATION_CHANGED);
+ }
+ }
+ }
+
+ private void setOrientation(int orientation) {
+ synchronized (this) {
+ if (mPendingOrientation == orientation) {
+ // Pending orientation has not changed, so do nothing.
+ return;
+ }
+
+ // Cancel any pending messages.
+ // We will either start a new timer or cancel alltogether
+ // if the orientation has not changed.
+ mHandler.removeMessages(ORIENTATION_CHANGED);
+
+ if (mOrientation != orientation) {
+ // Set timer to send an event if the orientation has changed since its
+ // previously reported value.
+ mPendingOrientation = orientation;
+ final Message m = mHandler.obtainMessage(ORIENTATION_CHANGED);
+ // set delay to our debounce timeout
+ int delay = (orientation == ORIENTATION_VERTICAL ? VERTICAL_DEBOUNCE
+ : HORIZONTAL_DEBOUNCE);
+ mHandler.sendMessageDelayed(m, delay);
+ } else {
+ // no message is pending
+ mPendingOrientation = ORIENTATION_UNKNOWN;
+ }
+ }
+ }
+
+ private void onSensorEvent(double x, double y, double z) {
+ if (VDEBUG) Log.d(TAG, "onSensorEvent(" + x + ", " + y + ", " + z + ")");
+
+ // If some values are exactly zero, then likely the sensor is not powered up yet.
+ // ignore these events to avoid false horizontal positives.
+ if (x == 0.0 || y == 0.0 || z == 0.0) return;
+
+ // magnitude of the acceleration vector projected onto XY plane
+ final double xy = Math.hypot(x, y);
+ // compute the vertical angle
+ double angle = Math.atan2(xy, z);
+ // convert to degrees
+ angle = angle * 180.0 / Math.PI;
+ final int orientation = (angle > VERTICAL_ANGLE ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL);
+ if (VDEBUG) Log.d(TAG, "angle: " + angle + " orientation: " + orientation);
+ setOrientation(orientation);
+ }
+
+ SensorEventListener mSensorListener = new SensorEventListener() {
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ onSensorEvent(event.values[0], event.values[1], event.values[2]);
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // ignore
+ }
+ };
+
+ Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case ORIENTATION_CHANGED:
+ synchronized (this) {
+ mOrientation = mPendingOrientation;
+ if (DEBUG) {
+ Log.d(TAG, "orientation: " +
+ (mOrientation == ORIENTATION_HORIZONTAL ? "horizontal"
+ : (mOrientation == ORIENTATION_VERTICAL ? "vertical"
+ : "unknown")));
+ }
+ if (mListener != null) {
+ mListener.orientationChanged(mOrientation);
+ }
+ }
+ break;
+ }
+ }
+ };
+}
diff --git a/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java b/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java
new file mode 100644
index 0000000..89c78ec
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java
@@ -0,0 +1,157 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+import android.telecom.VideoProfile;
+import android.view.GestureDetector;
+import android.view.GestureDetector.SimpleOnGestureListener;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.dialer.R;
+
+/**
+ * AnswerFragment to use when touch exploration is enabled in accessibility.
+ */
+public class AccessibleAnswerFragment extends AnswerFragment {
+
+ private static final String TAG = AccessibleAnswerFragment.class.getSimpleName();
+ private static final int SWIPE_THRESHOLD = 100;
+
+ private View mAnswer;
+ private View mDecline;
+ private View mText;
+
+ private TouchListener mTouchListener;
+ private GestureDetector mGestureDetector;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ ViewGroup group = (ViewGroup) inflater.inflate(R.layout.accessible_answer_fragment,
+ container, false);
+
+ mTouchListener = new TouchListener();
+ mGestureDetector = new GestureDetector(getContext(), new SimpleOnGestureListener() {
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ float velocityY) {
+ return AccessibleAnswerFragment.this.onFling(e1, e2, velocityX, velocityX);
+ }
+ });
+
+ mAnswer = group.findViewById(R.id.accessible_answer_fragment_answer);
+ mAnswer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "Answer Button Clicked");
+ onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext());
+ }
+ });
+ mDecline = group.findViewById(R.id.accessible_answer_fragment_decline);
+ mDecline.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "Decline Button Clicked");
+ onDecline(getContext());
+ }
+ });
+
+ mText = group.findViewById(R.id.accessible_answer_fragment_text);
+ mText.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "Text Button Clicked");
+ onText();
+ }
+ });
+ return group;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Intercept all touch events for full screen swiping gesture.
+ InCallActivity activity = (InCallActivity) getActivity();
+ activity.setDispatchTouchEventListener(mTouchListener);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ InCallActivity activity = (InCallActivity) getActivity();
+ activity.setDispatchTouchEventListener(null);
+ }
+
+ private class TouchListener implements View.OnTouchListener {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ return mGestureDetector.onTouchEvent(event);
+ }
+ }
+
+ private boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ float velocityY) {
+ if (hasPendingDialogs()) {
+ return false;
+ }
+
+ float diffY = e2.getY() - e1.getY();
+ float diffX = e2.getX() - e1.getX();
+ if (Math.abs(diffX) > Math.abs(diffY)) {
+ if (Math.abs(diffX) > SWIPE_THRESHOLD) {
+ if (diffX > 0) {
+ onSwipeRight();
+ } else {
+ onSwipeLeft();
+ }
+ }
+ return true;
+ } else if (Math.abs(diffY) > SWIPE_THRESHOLD) {
+ if (diffY > 0) {
+ onSwipeDown();
+ } else {
+ onSwipeUp();
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ private void onSwipeUp() {
+ Log.d(TAG, "onSwipeUp");
+ onText();
+ }
+
+ private void onSwipeDown() {
+ Log.d(TAG, "onSwipeDown");
+ }
+
+ private void onSwipeLeft() {
+ Log.d(TAG, "onSwipeLeft");
+ onDecline(getContext());
+ }
+
+ private void onSwipeRight() {
+ Log.d(TAG, "onSwipeRight");
+ onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext());
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
new file mode 100644
index 0000000..44ddfcd
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -0,0 +1,307 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ListView;
+
+import com.android.dialer.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Provides only common interface and functions. Should be derived to implement the actual UI.
+ */
+public abstract class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresenter.AnswerUi>
+ implements AnswerPresenter.AnswerUi {
+
+ public static final int TARGET_SET_FOR_AUDIO_WITHOUT_SMS = 0;
+ public static final int TARGET_SET_FOR_AUDIO_WITH_SMS = 1;
+ public static final int TARGET_SET_FOR_VIDEO_WITHOUT_SMS = 2;
+ public static final int TARGET_SET_FOR_VIDEO_WITH_SMS = 3;
+ public static final int TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST = 4;
+
+ /**
+ * This fragment implement no UI at all. Derived class should do it.
+ */
+ @Override
+ public abstract View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState);
+
+ /**
+ * The popup showing the list of canned responses.
+ *
+ * This is an AlertDialog containing a ListView showing the possible choices. This may be null
+ * if the InCallScreen hasn't ever called showRespondViaSmsPopup() yet, or if the popup was
+ * visible once but then got dismissed.
+ */
+ private Dialog mCannedResponsePopup = null;
+
+ /**
+ * The popup showing a text field for users to type in their custom message.
+ */
+ private AlertDialog mCustomMessagePopup = null;
+
+ private ArrayAdapter<String> mSmsResponsesAdapter;
+
+ private final List<String> mSmsResponses = new ArrayList<>();
+
+ @Override
+ public AnswerPresenter createPresenter() {
+ return InCallPresenter.getInstance().getAnswerPresenter();
+ }
+
+ @Override
+ public AnswerPresenter.AnswerUi getUi() {
+ return this;
+ }
+
+ @Override
+ public void showMessageDialog() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+
+ mSmsResponsesAdapter = new ArrayAdapter<>(builder.getContext(),
+ android.R.layout.simple_list_item_1, android.R.id.text1, mSmsResponses);
+
+ final ListView lv = new ListView(getActivity());
+ lv.setAdapter(mSmsResponsesAdapter);
+ lv.setOnItemClickListener(new RespondViaSmsItemClickListener());
+
+ builder.setCancelable(true).setView(lv).setOnCancelListener(
+ new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialogInterface) {
+ onMessageDialogCancel();
+ dismissCannedResponsePopup();
+ getPresenter().onDismissDialog();
+ }
+ });
+ mCannedResponsePopup = builder.create();
+ mCannedResponsePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ mCannedResponsePopup.show();
+ }
+
+ private boolean isCannedResponsePopupShowing() {
+ if (mCannedResponsePopup != null) {
+ return mCannedResponsePopup.isShowing();
+ }
+ return false;
+ }
+
+ private boolean isCustomMessagePopupShowing() {
+ if (mCustomMessagePopup != null) {
+ return mCustomMessagePopup.isShowing();
+ }
+ return false;
+ }
+
+ /**
+ * Dismiss the canned response list popup.
+ *
+ * This is safe to call even if the popup is already dismissed, and even if you never called
+ * showRespondViaSmsPopup() in the first place.
+ */
+ protected void dismissCannedResponsePopup() {
+ if (mCannedResponsePopup != null) {
+ mCannedResponsePopup.dismiss(); // safe even if already dismissed
+ mCannedResponsePopup = null;
+ }
+ }
+
+ /**
+ * Dismiss the custom compose message popup.
+ */
+ private void dismissCustomMessagePopup() {
+ if (mCustomMessagePopup != null) {
+ mCustomMessagePopup.dismiss();
+ mCustomMessagePopup = null;
+ }
+ }
+
+ public void dismissPendingDialogs() {
+ if (isCannedResponsePopupShowing()) {
+ dismissCannedResponsePopup();
+ }
+
+ if (isCustomMessagePopupShowing()) {
+ dismissCustomMessagePopup();
+ }
+ }
+
+ public boolean hasPendingDialogs() {
+ return !(mCannedResponsePopup == null && mCustomMessagePopup == null);
+ }
+
+ /**
+ * Shows the custom message entry dialog.
+ */
+ public void showCustomMessageDialog() {
+ // Create an alert dialog containing an EditText
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ final EditText et = new EditText(builder.getContext());
+ builder.setCancelable(true).setView(et)
+ .setPositiveButton(R.string.custom_message_send,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // The order is arranged in a way that the popup will be destroyed
+ // when the InCallActivity is about to finish.
+ final String textMessage = et.getText().toString().trim();
+ dismissCustomMessagePopup();
+ getPresenter().rejectCallWithMessage(textMessage);
+ }
+ })
+ .setNegativeButton(R.string.custom_message_cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dismissCustomMessagePopup();
+ getPresenter().onDismissDialog();
+ }
+ })
+ .setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialogInterface) {
+ dismissCustomMessagePopup();
+ getPresenter().onDismissDialog();
+ }
+ })
+ .setTitle(R.string.respond_via_sms_custom_message);
+ mCustomMessagePopup = builder.create();
+
+ // Enable/disable the send button based on whether there is a message in the EditText
+ et.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ final Button sendButton = mCustomMessagePopup.getButton(
+ DialogInterface.BUTTON_POSITIVE);
+ sendButton.setEnabled(s != null && s.toString().trim().length() != 0);
+ }
+ });
+
+ // Keyboard up, show the dialog
+ mCustomMessagePopup.getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+ mCustomMessagePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ mCustomMessagePopup.show();
+
+ // Send button starts out disabled
+ final Button sendButton = mCustomMessagePopup.getButton(DialogInterface.BUTTON_POSITIVE);
+ sendButton.setEnabled(false);
+ }
+
+ @Override
+ public void configureMessageDialog(List<String> textResponses) {
+ mSmsResponses.clear();
+ mSmsResponses.addAll(textResponses);
+ mSmsResponses.add(getResources().getString(
+ R.string.respond_via_sms_custom_message));
+ if (mSmsResponsesAdapter != null) {
+ mSmsResponsesAdapter.notifyDataSetChanged();
+ }
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ public void onAnswer(int videoState, Context context) {
+ Log.d(this, "onAnswer videoState=" + videoState + " context=" + context);
+ getPresenter().onAnswer(videoState, context);
+ }
+
+ public void onDecline(Context context) {
+ getPresenter().onDecline(context);
+ }
+
+ public void onDeclineUpgradeRequest(Context context) {
+ InCallPresenter.getInstance().declineUpgradeRequest(context);
+ }
+
+ public void onText() {
+ getPresenter().onText();
+ }
+
+ /**
+ * OnItemClickListener for the "Respond via SMS" popup.
+ */
+ public class RespondViaSmsItemClickListener implements AdapterView.OnItemClickListener {
+
+ /**
+ * Handles the user selecting an item from the popup.
+ */
+ @Override
+ public void onItemClick(AdapterView<?> parent, // The ListView
+ View view, // The TextView that was clicked
+ int position, long id) {
+ Log.d(this, "RespondViaSmsItemClickListener.onItemClick(" + position + ")...");
+ final String message = (String) parent.getItemAtPosition(position);
+ Log.v(this, "- message: '" + message + "'");
+ dismissCannedResponsePopup();
+
+ // The "Custom" choice is a special case.
+ // (For now, it's guaranteed to be the last item.)
+ if (position == (parent.getCount() - 1)) {
+ // Show the custom message dialog
+ showCustomMessageDialog();
+ } else {
+ getPresenter().rejectCallWithMessage(message);
+ }
+ }
+ }
+
+ public void onShowAnswerUi(boolean shown) {
+ // Do Nothing
+ }
+
+ public void showTargets(int targetSet) {
+ // Do Nothing
+ }
+
+ public void showTargets(int targetSet, int videoState) {
+ // Do Nothing
+ }
+
+ protected void onMessageDialogCancel() {
+ // Do nothing.
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
new file mode 100644
index 0000000..6e1fb3c
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -0,0 +1,314 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+
+import com.android.dialer.compat.UserManagerCompat;
+import com.android.dialer.util.TelecomUtil;
+import com.android.incallui.InCallPresenter.InCallState;
+
+import java.util.List;
+
+/**
+ * Presenter for the Incoming call widget. The {@link AnswerPresenter} handles the logic during
+ * incoming calls. It is also in charge of responding to incoming calls, so there needs to be
+ * an instance alive so that it can receive onIncomingCall callbacks.
+ *
+ * An instance of {@link AnswerPresenter} is created by InCallPresenter at startup, registers
+ * for callbacks via InCallPresenter, and shows/hides the {@link AnswerFragment} via IncallActivity.
+ *
+ */
+public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
+ implements CallList.CallUpdateListener, InCallPresenter.InCallUiListener,
+ InCallPresenter.IncomingCallListener,
+ CallList.Listener {
+
+ private static final String TAG = AnswerPresenter.class.getSimpleName();
+
+ private String mCallId;
+ private Call mCall = null;
+ private boolean mHasTextMessages = false;
+
+ @Override
+ public void onUiShowing(boolean showing) {
+ if (showing) {
+ CallList.getInstance().addListener(this);
+ final CallList calls = CallList.getInstance();
+ Call call;
+ call = calls.getIncomingCall();
+ if (call != null) {
+ processIncomingCall(call);
+ }
+ call = calls.getVideoUpgradeRequestCall();
+ Log.d(this, "getVideoUpgradeRequestCall call =" + call);
+ if (call != null) {
+ processVideoUpgradeRequestCall(call);
+ }
+ } else {
+ CallList.getInstance().removeListener(this);
+ // This is necessary because the activity can be destroyed while an incoming call exists.
+ // This happens when back button is pressed while incoming call is still being shown.
+ if (mCallId != null) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+ }
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ Log.d(this, "onIncomingCall: " + this);
+ Call modifyCall = CallList.getInstance().getVideoUpgradeRequestCall();
+ if (modifyCall != null) {
+ showAnswerUi(false);
+ Log.d(this, "declining upgrade request id: ");
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ InCallPresenter.getInstance().declineUpgradeRequest(getUi().getContext());
+ }
+ if (!call.getId().equals(mCallId)) {
+ // A new call is coming in.
+ processIncomingCall(call);
+ }
+ }
+
+ @Override
+ public void onIncomingCall(Call call) {
+ }
+
+ @Override
+ public void onCallListChange(CallList list) {
+ }
+
+ @Override
+ public void onDisconnect(Call call) {
+ // no-op
+ }
+
+ public void onSessionModificationStateChange(int sessionModificationState) {
+ boolean isUpgradePending = sessionModificationState ==
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+
+ if (!isUpgradePending) {
+ // Stop listening for updates.
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ showAnswerUi(false);
+ }
+ }
+
+ @Override
+ public void onLastForwardedNumberChange() {
+ // no-op
+ }
+
+ @Override
+ public void onChildNumberChange() {
+ // no-op
+ }
+
+ private boolean isVideoUpgradePending(Call call) {
+ return call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+ }
+
+ @Override
+ public void onUpgradeToVideo(Call call) {
+ Log.d(this, "onUpgradeToVideo: " + this + " call=" + call);
+ if (getUi() == null) {
+ Log.d(this, "onUpgradeToVideo ui is null");
+ return;
+ }
+ boolean isUpgradePending = isVideoUpgradePending(call);
+ InCallPresenter inCallPresenter = InCallPresenter.getInstance();
+ if (isUpgradePending
+ && inCallPresenter.getInCallState() == InCallPresenter.InCallState.INCOMING) {
+ Log.d(this, "declining upgrade request");
+ //If there is incoming call reject upgrade request
+ inCallPresenter.declineUpgradeRequest(getUi().getContext());
+ } else if (isUpgradePending) {
+ Log.d(this, "process upgrade request as no MT call");
+ processVideoUpgradeRequestCall(call);
+ }
+ }
+
+ private void processIncomingCall(Call call) {
+ mCallId = call.getId();
+ mCall = call;
+
+ // Listen for call updates for the current call.
+ CallList.getInstance().addCallUpdateListener(mCallId, this);
+
+ Log.d(TAG, "Showing incoming for call id: " + mCallId + " " + this);
+ if (showAnswerUi(true)) {
+ final List<String> textMsgs = CallList.getInstance().getTextResponses(call.getId());
+ configureAnswerTargetsForSms(call, textMsgs);
+ }
+ }
+
+ private boolean showAnswerUi(boolean show) {
+ final InCallActivity activity = InCallPresenter.getInstance().getActivity();
+ if (activity != null) {
+ activity.showAnswerFragment(show);
+ if (getUi() != null) {
+ getUi().onShowAnswerUi(show);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void processVideoUpgradeRequestCall(Call call) {
+ Log.d(this, " processVideoUpgradeRequestCall call=" + call);
+ mCallId = call.getId();
+ mCall = call;
+
+ // Listen for call updates for the current call.
+ CallList.getInstance().addCallUpdateListener(mCallId, this);
+
+ final int currentVideoState = call.getVideoState();
+ final int modifyToVideoState = call.getRequestedVideoState();
+
+ if (currentVideoState == modifyToVideoState) {
+ Log.w(this, "processVideoUpgradeRequestCall: Video states are same. Return.");
+ return;
+ }
+
+ AnswerUi ui = getUi();
+
+ if (ui == null) {
+ Log.e(this, "Ui is null. Can't process upgrade request");
+ return;
+ }
+ showAnswerUi(true);
+ ui.showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST,
+ modifyToVideoState);
+ }
+
+ private boolean isEnabled(int videoState, int mask) {
+ return (videoState & mask) == mask;
+ }
+
+ @Override
+ public void onCallChanged(Call call) {
+ Log.d(this, "onCallStateChange() " + call + " " + this);
+ if (call.getState() != Call.State.INCOMING) {
+ boolean isUpgradePending = isVideoUpgradePending(call);
+ if (!isUpgradePending) {
+ // Stop listening for updates.
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+
+ final Call incall = CallList.getInstance().getIncomingCall();
+ if (incall != null || isUpgradePending) {
+ showAnswerUi(true);
+ } else {
+ showAnswerUi(false);
+ }
+
+ mHasTextMessages = false;
+ } else if (!mHasTextMessages) {
+ final List<String> textMsgs = CallList.getInstance().getTextResponses(call.getId());
+ if (textMsgs != null) {
+ configureAnswerTargetsForSms(call, textMsgs);
+ }
+ }
+ }
+
+ public void onAnswer(int videoState, Context context) {
+ if (mCallId == null) {
+ return;
+ }
+
+ if (mCall.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ Log.d(this, "onAnswer (upgradeCall) mCallId=" + mCallId + " videoState=" + videoState);
+ InCallPresenter.getInstance().acceptUpgradeRequest(videoState, context);
+ } else {
+ Log.d(this, "onAnswer (answerCall) mCallId=" + mCallId + " videoState=" + videoState);
+ TelecomAdapter.getInstance().answerCall(mCall.getId(), videoState);
+ }
+ }
+
+ /**
+ * TODO: We are using reject and decline interchangeably. We should settle on
+ * reject since it seems to be more prevalent.
+ */
+ public void onDecline(Context context) {
+ Log.d(this, "onDecline " + mCallId);
+ if (mCall.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ InCallPresenter.getInstance().declineUpgradeRequest(context);
+ } else {
+ TelecomAdapter.getInstance().rejectCall(mCall.getId(), false, null);
+ }
+ }
+
+ public void onText() {
+ if (getUi() != null) {
+ TelecomUtil.silenceRinger(getUi().getContext());
+ getUi().showMessageDialog();
+ }
+ }
+
+ public void rejectCallWithMessage(String message) {
+ Log.d(this, "sendTextToDefaultActivity()...");
+ TelecomAdapter.getInstance().rejectCall(mCall.getId(), true, message);
+
+ onDismissDialog();
+ }
+
+ public void onDismissDialog() {
+ InCallPresenter.getInstance().onDismissDialog();
+ }
+
+ private void configureAnswerTargetsForSms(Call call, List<String> textMsgs) {
+ if (getUi() == null) {
+ return;
+ }
+ mHasTextMessages = textMsgs != null;
+ boolean withSms = UserManagerCompat.isUserUnlocked(getUi().getContext())
+ && call.can(android.telecom.Call.Details.CAPABILITY_RESPOND_VIA_TEXT)
+ && mHasTextMessages;
+
+ // Only present the user with the option to answer as a video call if the incoming call is
+ // a bi-directional video call.
+ if (VideoUtils.isBidirectionalVideoCall(call)) {
+ if (withSms) {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_WITH_SMS);
+ getUi().configureMessageDialog(textMsgs);
+ } else {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_WITHOUT_SMS);
+ }
+ } else {
+ if (withSms) {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS);
+ getUi().configureMessageDialog(textMsgs);
+ } else {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS);
+ }
+ }
+ }
+
+ interface AnswerUi extends Ui {
+ public void onShowAnswerUi(boolean shown);
+ public void showTargets(int targetSet);
+ public void showTargets(int targetSet, int videoState);
+ public void showMessageDialog();
+ public void configureMessageDialog(List<String> textResponses);
+ public Context getContext();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/AudioModeProvider.java b/InCallUI/src/com/android/incallui/AudioModeProvider.java
new file mode 100644
index 0000000..961fb11
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AudioModeProvider.java
@@ -0,0 +1,105 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import com.google.common.collect.Lists;
+
+import com.android.dialer.compat.CallAudioStateCompat;
+
+import java.util.List;
+
+/**
+ * Proxy class for getting and setting the audio mode.
+ */
+public class AudioModeProvider {
+
+ static final int AUDIO_MODE_INVALID = 0;
+
+ private static AudioModeProvider sAudioModeProvider = new AudioModeProvider();
+ private int mAudioMode = CallAudioStateCompat.ROUTE_EARPIECE;
+ private boolean mMuted = false;
+ private int mSupportedModes = CallAudioStateCompat.ROUTE_EARPIECE
+ | CallAudioStateCompat.ROUTE_BLUETOOTH | CallAudioStateCompat.ROUTE_WIRED_HEADSET
+ | CallAudioStateCompat.ROUTE_SPEAKER;
+ private final List<AudioModeListener> mListeners = Lists.newArrayList();
+
+ public static AudioModeProvider getInstance() {
+ return sAudioModeProvider;
+ }
+
+ public void onAudioStateChanged(boolean isMuted, int route, int supportedRouteMask) {
+ onAudioModeChange(route, isMuted);
+ onSupportedAudioModeChange(supportedRouteMask);
+ }
+
+ public void onAudioModeChange(int newMode, boolean muted) {
+ if (mAudioMode != newMode) {
+ mAudioMode = newMode;
+ for (AudioModeListener l : mListeners) {
+ l.onAudioMode(mAudioMode);
+ }
+ }
+
+ if (mMuted != muted) {
+ mMuted = muted;
+ for (AudioModeListener l : mListeners) {
+ l.onMute(mMuted);
+ }
+ }
+ }
+
+ public void onSupportedAudioModeChange(int newModeMask) {
+ mSupportedModes = newModeMask;
+
+ for (AudioModeListener l : mListeners) {
+ l.onSupportedAudioMode(mSupportedModes);
+ }
+ }
+
+ public void addListener(AudioModeListener listener) {
+ if (!mListeners.contains(listener)) {
+ mListeners.add(listener);
+ listener.onSupportedAudioMode(mSupportedModes);
+ listener.onAudioMode(mAudioMode);
+ listener.onMute(mMuted);
+ }
+ }
+
+ public void removeListener(AudioModeListener listener) {
+ if (mListeners.contains(listener)) {
+ mListeners.remove(listener);
+ }
+ }
+
+ public int getSupportedModes() {
+ return mSupportedModes;
+ }
+
+ public int getAudioMode() {
+ return mAudioMode;
+ }
+
+ public boolean getMute() {
+ return mMuted;
+ }
+
+ /* package */ interface AudioModeListener {
+ void onAudioMode(int newMode);
+ void onMute(boolean muted);
+ void onSupportedAudioMode(int modeMask);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/BaseFragment.java b/InCallUI/src/com/android/incallui/BaseFragment.java
new file mode 100644
index 0000000..58d991a
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/BaseFragment.java
@@ -0,0 +1,84 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+
+/**
+ * Parent for all fragments that use Presenters and Ui design.
+ */
+public abstract class BaseFragment<T extends Presenter<U>, U extends Ui> extends Fragment {
+
+ private static final String KEY_FRAGMENT_HIDDEN = "key_fragment_hidden";
+
+ private T mPresenter;
+
+ public abstract T createPresenter();
+
+ public abstract U getUi();
+
+ protected BaseFragment() {
+ mPresenter = createPresenter();
+ }
+
+ /**
+ * Presenter will be available after onActivityCreated().
+ *
+ * @return The presenter associated with this fragment.
+ */
+ public T getPresenter() {
+ return mPresenter;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ mPresenter.onUiReady(getUi());
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ mPresenter.onRestoreInstanceState(savedInstanceState);
+ if (savedInstanceState.getBoolean(KEY_FRAGMENT_HIDDEN)) {
+ getFragmentManager().beginTransaction().hide(this).commit();
+ }
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ mPresenter.onUiDestroy(getUi());
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mPresenter.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_FRAGMENT_HIDDEN, isHidden());
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ ((FragmentDisplayManager) activity).onFragmentAttached(this);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java
new file mode 100644
index 0000000..aec806f
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Call.java
@@ -0,0 +1,1004 @@
+/*
+ * 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.
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.hardware.camera2.CameraCharacteristics;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Trace;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.telecom.GatewayInfo;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.text.TextUtils;
+
+import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.util.IntentUtil;
+import com.android.incallui.compat.telecom.DetailsCompat;
+import com.android.incallui.compat.telecom.VideoProfileCompat;
+import com.android.incallui.util.TelecomCallUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * Describes a single call and its state.
+ */
+@NeededForTesting
+public class Call {
+ /* Defines different states of this call */
+ public static class State {
+ public static final int INVALID = 0;
+ public static final int NEW = 1; /* The call is new. */
+ public static final int IDLE = 2; /* The call is idle. Nothing active */
+ public static final int ACTIVE = 3; /* There is an active call */
+ public static final int INCOMING = 4; /* A normal incoming phone call */
+ public static final int CALL_WAITING = 5; /* Incoming call while another is active */
+ public static final int DIALING = 6; /* An outgoing call during dial phase */
+ public static final int REDIALING = 7; /* Subsequent dialing attempt after a failure */
+ public static final int ONHOLD = 8; /* An active phone call placed on hold */
+ public static final int DISCONNECTING = 9; /* A call is being ended. */
+ public static final int DISCONNECTED = 10; /* State after a call disconnects */
+ public static final int CONFERENCED = 11; /* Call part of a conference call */
+ public static final int SELECT_PHONE_ACCOUNT = 12; /* Waiting for account selection */
+ public static final int CONNECTING = 13; /* Waiting for Telecom broadcast to finish */
+ public static final int BLOCKED = 14; /* The number was found on the block list */
+
+
+ public static boolean isConnectingOrConnected(int state) {
+ switch(state) {
+ case ACTIVE:
+ case INCOMING:
+ case CALL_WAITING:
+ case CONNECTING:
+ case DIALING:
+ case REDIALING:
+ case ONHOLD:
+ case CONFERENCED:
+ return true;
+ default:
+ }
+ return false;
+ }
+
+ public static boolean isDialing(int state) {
+ return state == DIALING || state == REDIALING;
+ }
+
+ public static String toString(int state) {
+ switch (state) {
+ case INVALID:
+ return "INVALID";
+ case NEW:
+ return "NEW";
+ case IDLE:
+ return "IDLE";
+ case ACTIVE:
+ return "ACTIVE";
+ case INCOMING:
+ return "INCOMING";
+ case CALL_WAITING:
+ return "CALL_WAITING";
+ case DIALING:
+ return "DIALING";
+ case REDIALING:
+ return "REDIALING";
+ case ONHOLD:
+ return "ONHOLD";
+ case DISCONNECTING:
+ return "DISCONNECTING";
+ case DISCONNECTED:
+ return "DISCONNECTED";
+ case CONFERENCED:
+ return "CONFERENCED";
+ case SELECT_PHONE_ACCOUNT:
+ return "SELECT_PHONE_ACCOUNT";
+ case CONNECTING:
+ return "CONNECTING";
+ case BLOCKED:
+ return "BLOCKED";
+ default:
+ return "UNKNOWN";
+ }
+ }
+ }
+
+ /**
+ * Defines different states of session modify requests, which are used to upgrade to video, or
+ * downgrade to audio.
+ */
+ public static class SessionModificationState {
+ public static final int NO_REQUEST = 0;
+ public static final int WAITING_FOR_RESPONSE = 1;
+ public static final int REQUEST_FAILED = 2;
+ public static final int RECEIVED_UPGRADE_TO_VIDEO_REQUEST = 3;
+ public static final int UPGRADE_TO_VIDEO_REQUEST_TIMED_OUT = 4;
+ public static final int REQUEST_REJECTED = 5;
+ }
+
+ public static class VideoSettings {
+ public static final int CAMERA_DIRECTION_UNKNOWN = -1;
+ public static final int CAMERA_DIRECTION_FRONT_FACING =
+ CameraCharacteristics.LENS_FACING_FRONT;
+ public static final int CAMERA_DIRECTION_BACK_FACING =
+ CameraCharacteristics.LENS_FACING_BACK;
+
+ private int mCameraDirection = CAMERA_DIRECTION_UNKNOWN;
+
+ /**
+ * Sets the camera direction. if camera direction is set to CAMERA_DIRECTION_UNKNOWN,
+ * the video state of the call should be used to infer the camera direction.
+ *
+ * @see {@link CameraCharacteristics#LENS_FACING_FRONT}
+ * @see {@link CameraCharacteristics#LENS_FACING_BACK}
+ */
+ public void setCameraDir(int cameraDirection) {
+ if (cameraDirection == CAMERA_DIRECTION_FRONT_FACING
+ || cameraDirection == CAMERA_DIRECTION_BACK_FACING) {
+ mCameraDirection = cameraDirection;
+ } else {
+ mCameraDirection = CAMERA_DIRECTION_UNKNOWN;
+ }
+ }
+
+ /**
+ * Gets the camera direction. if camera direction is set to CAMERA_DIRECTION_UNKNOWN,
+ * the video state of the call should be used to infer the camera direction.
+ *
+ * @see {@link CameraCharacteristics#LENS_FACING_FRONT}
+ * @see {@link CameraCharacteristics#LENS_FACING_BACK}
+ */
+ public int getCameraDir() {
+ return mCameraDirection;
+ }
+
+ @Override
+ public String toString() {
+ return "(CameraDir:" + getCameraDir() + ")";
+ }
+ }
+
+ /**
+ * Tracks any state variables that is useful for logging. There is some amount of overlap with
+ * existing call member variables, but this duplication helps to ensure that none of these
+ * logging variables will interface with/and affect call logic.
+ */
+ public static class LogState {
+
+ // Contact lookup type constants
+ // Unknown lookup result (lookup not completed yet?)
+ public static final int LOOKUP_UNKNOWN = 0;
+ public static final int LOOKUP_NOT_FOUND = 1;
+ public static final int LOOKUP_LOCAL_CONTACT = 2;
+ public static final int LOOKUP_LOCAL_CACHE = 3;
+ public static final int LOOKUP_REMOTE_CONTACT = 4;
+ public static final int LOOKUP_EMERGENCY = 5;
+ public static final int LOOKUP_VOICEMAIL = 6;
+
+ // Call initiation type constants
+ public static final int INITIATION_UNKNOWN = 0;
+ public static final int INITIATION_INCOMING = 1;
+ public static final int INITIATION_DIALPAD = 2;
+ public static final int INITIATION_SPEED_DIAL = 3;
+ public static final int INITIATION_REMOTE_DIRECTORY = 4;
+ public static final int INITIATION_SMART_DIAL = 5;
+ public static final int INITIATION_REGULAR_SEARCH = 6;
+ public static final int INITIATION_CALL_LOG = 7;
+ public static final int INITIATION_CALL_LOG_FILTER = 8;
+ public static final int INITIATION_VOICEMAIL_LOG = 9;
+ public static final int INITIATION_CALL_DETAILS = 10;
+ public static final int INITIATION_QUICK_CONTACTS = 11;
+ public static final int INITIATION_EXTERNAL = 12;
+
+ public DisconnectCause disconnectCause;
+ public boolean isIncoming = false;
+ public int contactLookupResult = LOOKUP_UNKNOWN;
+ public int callInitiationMethod = INITIATION_EXTERNAL;
+ // If this was a conference call, the total number of calls involved in the conference.
+ public int conferencedCalls = 0;
+ public long duration = 0;
+ public boolean isLogged = false;
+
+ @Override
+ public String toString() {
+ return String.format(Locale.US, "["
+ + "%s, " // DisconnectCause toString already describes the object type
+ + "isIncoming: %s, "
+ + "contactLookup: %s, "
+ + "callInitiation: %s, "
+ + "duration: %s"
+ + "]",
+ disconnectCause,
+ isIncoming,
+ lookupToString(contactLookupResult),
+ initiationToString(callInitiationMethod),
+ duration);
+ }
+
+ private static String lookupToString(int lookupType) {
+ switch (lookupType) {
+ case LOOKUP_LOCAL_CONTACT:
+ return "Local";
+ case LOOKUP_LOCAL_CACHE:
+ return "Cache";
+ case LOOKUP_REMOTE_CONTACT:
+ return "Remote";
+ case LOOKUP_EMERGENCY:
+ return "Emergency";
+ case LOOKUP_VOICEMAIL:
+ return "Voicemail";
+ default:
+ return "Not found";
+ }
+ }
+
+ private static String initiationToString(int initiationType) {
+ switch (initiationType) {
+ case INITIATION_INCOMING:
+ return "Incoming";
+ case INITIATION_DIALPAD:
+ return "Dialpad";
+ case INITIATION_SPEED_DIAL:
+ return "Speed Dial";
+ case INITIATION_REMOTE_DIRECTORY:
+ return "Remote Directory";
+ case INITIATION_SMART_DIAL:
+ return "Smart Dial";
+ case INITIATION_REGULAR_SEARCH:
+ return "Regular Search";
+ case INITIATION_CALL_LOG:
+ return "Call Log";
+ case INITIATION_CALL_LOG_FILTER:
+ return "Call Log Filter";
+ case INITIATION_VOICEMAIL_LOG:
+ return "Voicemail Log";
+ case INITIATION_CALL_DETAILS:
+ return "Call Details";
+ case INITIATION_QUICK_CONTACTS:
+ return "Quick Contacts";
+ default:
+ return "Unknown";
+ }
+ }
+ }
+
+
+ private static final String ID_PREFIX = Call.class.getSimpleName() + "_";
+ private static int sIdCounter = 0;
+
+ private Object mTelecomCallCallback = newTelecomCallCallback();
+
+ private Object newTelecomCallCallback() {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ return newMarshmallowTelecomCallCallback();
+ }
+ return newLollipopTelecomCallCallback();
+ }
+
+ private Object newMarshmallowTelecomCallCallback() {
+ Log.i(this, "Using an android.telecom.Call$Callback");
+ return new android.telecom.Call.Callback() {
+ @Override
+ public void onStateChanged(android.telecom.Call call, int newState) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " newState="
+ + newState);
+ update();
+ }
+
+ @Override
+ public void onParentChanged(android.telecom.Call call,
+ android.telecom.Call newParent) {
+ Log.d(this, "TelecomCallCallback onParentChanged call=" + call + " newParent="
+ + newParent);
+ update();
+ }
+
+ @Override
+ public void onChildrenChanged(android.telecom.Call call,
+ List<android.telecom.Call> children) {
+ update();
+ }
+
+ @Override
+ public void onDetailsChanged(android.telecom.Call call,
+ android.telecom.Call.Details details) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " details="
+ + details);
+ update();
+ }
+
+ @Override
+ public void onCannedTextResponsesLoaded(android.telecom.Call call,
+ List<String> cannedTextResponses) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call
+ + " cannedTextResponses=" + cannedTextResponses);
+ update();
+ }
+
+ @Override
+ public void onPostDialWait(android.telecom.Call call,
+ String remainingPostDialSequence) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call
+ + " remainingPostDialSequence=" + remainingPostDialSequence);
+ update();
+ }
+
+ @Override
+ public void onVideoCallChanged(android.telecom.Call call,
+ VideoCall videoCall) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " videoCall="
+ + videoCall);
+ update();
+ }
+
+ @Override
+ public void onCallDestroyed(android.telecom.Call call) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call);
+ call.unregisterCallback(this);
+ }
+
+ @Override
+ public void onConferenceableCallsChanged(android.telecom.Call call,
+ List<android.telecom.Call> conferenceableCalls) {
+ update();
+ }
+ };
+ }
+
+ private Object newLollipopTelecomCallCallback() {
+ // This code only runs for Google Experience phones on the pre-M sdk since only the system
+ // dialer can invoke the InCallUI code. This allows us to safely use the
+ // android.telecom.Call.Listener interface
+ Log.i(this, "Using an android.telecom.Call$Listener");
+ return new android.telecom.Call.Listener() {
+ @Override
+ public void onStateChanged(android.telecom.Call call, int newState) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " newState="
+ + newState);
+ update();
+ }
+
+ @Override
+ public void onParentChanged(android.telecom.Call call,
+ android.telecom.Call newParent) {
+ Log.d(this, "TelecomCallCallback onParentChanged call=" + call + " newParent="
+ + newParent);
+ update();
+ }
+
+ @Override
+ public void onChildrenChanged(android.telecom.Call call,
+ List<android.telecom.Call> children) {
+ update();
+ }
+
+ @Override
+ public void onDetailsChanged(android.telecom.Call call,
+ android.telecom.Call.Details details) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " details="
+ + details);
+ update();
+ }
+
+ @Override
+ public void onCannedTextResponsesLoaded(android.telecom.Call call,
+ List<String> cannedTextResponses) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call
+ + " cannedTextResponses=" + cannedTextResponses);
+ update();
+ }
+
+ @Override
+ public void onPostDialWait(android.telecom.Call call,
+ String remainingPostDialSequence) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call
+ + " remainingPostDialSequence=" + remainingPostDialSequence);
+ update();
+ }
+
+ @Override
+ public void onVideoCallChanged(android.telecom.Call call,
+ VideoCall videoCall) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " videoCall="
+ + videoCall);
+ update();
+ }
+
+ @Override
+ public void onCallDestroyed(android.telecom.Call call) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call);
+ call.removeListener(this);
+ }
+
+ @Override
+ public void onConferenceableCallsChanged(android.telecom.Call call,
+ List<android.telecom.Call> conferenceableCalls) {
+ update();
+ }
+ };
+ }
+
+ private android.telecom.Call mTelecomCall;
+ private boolean mIsEmergencyCall;
+ private Uri mHandle;
+ private final String mId;
+ private int mState = State.INVALID;
+ private DisconnectCause mDisconnectCause;
+ private int mSessionModificationState;
+ private final List<String> mChildCallIds = new ArrayList<>();
+ private final VideoSettings mVideoSettings = new VideoSettings();
+ private int mVideoState;
+
+ /**
+ * mRequestedVideoState is used to store requested upgrade / downgrade video state
+ */
+ private int mRequestedVideoState = VideoProfile.STATE_AUDIO_ONLY;
+
+ private InCallVideoCallCallback mVideoCallCallback;
+ private String mChildNumber;
+ private String mLastForwardedNumber;
+ private String mCallSubject;
+ private PhoneAccountHandle mPhoneAccountHandle;
+
+ /**
+ * Indicates whether the phone account associated with this call supports specifying a call
+ * subject.
+ */
+ private boolean mIsCallSubjectSupported;
+
+ private long mTimeAddedMs;
+
+ private LogState mLogState = new LogState();
+
+ /**
+ * Used only to create mock calls for testing
+ */
+ @NeededForTesting
+ Call(int state) {
+ mTelecomCall = null;
+ mId = ID_PREFIX + Integer.toString(sIdCounter++);
+ setState(state);
+ }
+
+ public Call(android.telecom.Call telecomCall) {
+ mTelecomCall = telecomCall;
+ mId = ID_PREFIX + Integer.toString(sIdCounter++);
+
+ updateFromTelecomCall();
+
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ mTelecomCall.registerCallback((android.telecom.Call.Callback) mTelecomCallCallback);
+ } else {
+ mTelecomCall.addListener((android.telecom.Call.Listener) mTelecomCallCallback);
+ }
+
+ mTimeAddedMs = System.currentTimeMillis();
+ }
+
+ public android.telecom.Call getTelecomCall() {
+ return mTelecomCall;
+ }
+
+ /**
+ * @return video settings of the call, null if the call is not a video call.
+ * @see VideoProfile
+ */
+ public VideoSettings getVideoSettings() {
+ return mVideoSettings;
+ }
+
+ private void update() {
+ Trace.beginSection("Update");
+ int oldState = getState();
+ updateFromTelecomCall();
+ if (oldState != getState() && getState() == Call.State.DISCONNECTED) {
+ CallList.getInstance().onDisconnect(this);
+ } else {
+ CallList.getInstance().onUpdate(this);
+ }
+ Trace.endSection();
+ }
+
+ private void updateFromTelecomCall() {
+ Log.d(this, "updateFromTelecomCall: " + mTelecomCall.toString());
+ final int translatedState = translateState(mTelecomCall.getState());
+ if (mState != State.BLOCKED) {
+ setState(translatedState);
+ setDisconnectCause(mTelecomCall.getDetails().getDisconnectCause());
+ maybeCancelVideoUpgrade(mTelecomCall.getDetails().getVideoState());
+ }
+
+ if (mTelecomCall.getVideoCall() != null) {
+ if (mVideoCallCallback == null) {
+ mVideoCallCallback = new InCallVideoCallCallback(this);
+ }
+ mTelecomCall.getVideoCall().registerCallback(mVideoCallCallback);
+ }
+
+ mChildCallIds.clear();
+ final int numChildCalls = mTelecomCall.getChildren().size();
+ for (int i = 0; i < numChildCalls; i++) {
+ mChildCallIds.add(
+ CallList.getInstance().getCallByTelecomCall(
+ mTelecomCall.getChildren().get(i)).getId());
+ }
+
+ // The number of conferenced calls can change over the course of the call, so use the
+ // maximum number of conferenced child calls as the metric for conference call usage.
+ mLogState.conferencedCalls = Math.max(numChildCalls, mLogState.conferencedCalls);
+
+ updateFromCallExtras(mTelecomCall.getDetails().getExtras());
+
+ // If the handle of the call has changed, update state for the call determining if it is an
+ // emergency call.
+ Uri newHandle = mTelecomCall.getDetails().getHandle();
+ if (!Objects.equals(mHandle, newHandle)) {
+ mHandle = newHandle;
+ updateEmergencyCallState();
+ }
+
+ // If the phone account handle of the call is set, cache capability bit indicating whether
+ // the phone account supports call subjects.
+ PhoneAccountHandle newPhoneAccountHandle = mTelecomCall.getDetails().getAccountHandle();
+ if (!Objects.equals(mPhoneAccountHandle, newPhoneAccountHandle)) {
+ mPhoneAccountHandle = newPhoneAccountHandle;
+
+ if (mPhoneAccountHandle != null) {
+ TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+ PhoneAccount phoneAccount =
+ TelecomManagerCompat.getPhoneAccount(mgr, mPhoneAccountHandle);
+ if (phoneAccount != null) {
+ mIsCallSubjectSupported = phoneAccount.hasCapabilities(
+ PhoneAccount.CAPABILITY_CALL_SUBJECT);
+ }
+ }
+ }
+ }
+
+ /**
+ * Tests corruption of the {@code callExtras} bundle by calling {@link
+ * Bundle#containsKey(String)}. If the bundle is corrupted a {@link IllegalArgumentException}
+ * will be thrown and caught by this function.
+ *
+ * @param callExtras the bundle to verify
+ * @returns {@code true} if the bundle is corrupted, {@code false} otherwise.
+ */
+ protected boolean areCallExtrasCorrupted(Bundle callExtras) {
+ /**
+ * There's currently a bug in Telephony service (b/25613098) that could corrupt the
+ * extras bundle, resulting in a IllegalArgumentException while validating data under
+ * {@link Bundle#containsKey(String)}.
+ */
+ try {
+ callExtras.containsKey(Connection.EXTRA_CHILD_ADDRESS);
+ return false;
+ } catch (IllegalArgumentException e) {
+ Log.e(this, "CallExtras is corrupted, ignoring exception", e);
+ return true;
+ }
+ }
+
+ protected void updateFromCallExtras(Bundle callExtras) {
+ if (callExtras == null || areCallExtrasCorrupted(callExtras)) {
+ /**
+ * If the bundle is corrupted, abandon information update as a work around. These are
+ * not critical for the dialer to function.
+ */
+ return;
+ }
+ // Check for a change in the child address and notify any listeners.
+ if (callExtras.containsKey(Connection.EXTRA_CHILD_ADDRESS)) {
+ String childNumber = callExtras.getString(Connection.EXTRA_CHILD_ADDRESS);
+ if (!Objects.equals(childNumber, mChildNumber)) {
+ mChildNumber = childNumber;
+ CallList.getInstance().onChildNumberChange(this);
+ }
+ }
+
+ // Last forwarded number comes in as an array of strings. We want to choose the
+ // last item in the array. The forwarding numbers arrive independently of when the
+ // call is originally set up, so we need to notify the the UI of the change.
+ if (callExtras.containsKey(Connection.EXTRA_LAST_FORWARDED_NUMBER)) {
+ ArrayList<String> lastForwardedNumbers =
+ callExtras.getStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER);
+
+ if (lastForwardedNumbers != null) {
+ String lastForwardedNumber = null;
+ if (!lastForwardedNumbers.isEmpty()) {
+ lastForwardedNumber = lastForwardedNumbers.get(
+ lastForwardedNumbers.size() - 1);
+ }
+
+ if (!Objects.equals(lastForwardedNumber, mLastForwardedNumber)) {
+ mLastForwardedNumber = lastForwardedNumber;
+ CallList.getInstance().onLastForwardedNumberChange(this);
+ }
+ }
+ }
+
+ // Call subject is present in the extras at the start of call, so we do not need to
+ // notify any other listeners of this.
+ if (callExtras.containsKey(Connection.EXTRA_CALL_SUBJECT)) {
+ String callSubject = callExtras.getString(Connection.EXTRA_CALL_SUBJECT);
+ if (!Objects.equals(mCallSubject, callSubject)) {
+ mCallSubject = callSubject;
+ }
+ }
+ }
+
+ /**
+ * Determines if a received upgrade to video request should be cancelled. This can happen if
+ * another InCall UI responds to the upgrade to video request.
+ *
+ * @param newVideoState The new video state.
+ */
+ private void maybeCancelVideoUpgrade(int newVideoState) {
+ boolean isVideoStateChanged = mVideoState != newVideoState;
+
+ if (mSessionModificationState == SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST
+ && isVideoStateChanged) {
+
+ Log.v(this, "maybeCancelVideoUpgrade : cancelling upgrade notification");
+ setSessionModificationState(SessionModificationState.NO_REQUEST);
+ }
+ mVideoState = newVideoState;
+ }
+ private static int translateState(int state) {
+ switch (state) {
+ case android.telecom.Call.STATE_NEW:
+ case android.telecom.Call.STATE_CONNECTING:
+ return Call.State.CONNECTING;
+ case android.telecom.Call.STATE_SELECT_PHONE_ACCOUNT:
+ return Call.State.SELECT_PHONE_ACCOUNT;
+ case android.telecom.Call.STATE_DIALING:
+ return Call.State.DIALING;
+ case android.telecom.Call.STATE_RINGING:
+ return Call.State.INCOMING;
+ case android.telecom.Call.STATE_ACTIVE:
+ return Call.State.ACTIVE;
+ case android.telecom.Call.STATE_HOLDING:
+ return Call.State.ONHOLD;
+ case android.telecom.Call.STATE_DISCONNECTED:
+ return Call.State.DISCONNECTED;
+ case android.telecom.Call.STATE_DISCONNECTING:
+ return Call.State.DISCONNECTING;
+ default:
+ return Call.State.INVALID;
+ }
+ }
+
+ public String getId() {
+ return mId;
+ }
+
+ public long getTimeAddedMs() {
+ return mTimeAddedMs;
+ }
+
+ public String getNumber() {
+ return TelecomCallUtil.getNumber(mTelecomCall);
+ }
+
+ public void blockCall() {
+ mTelecomCall.reject(false, null);
+ setState(State.BLOCKED);
+ }
+
+ public Uri getHandle() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getHandle();
+ }
+
+ public boolean isEmergencyCall() {
+ return mIsEmergencyCall;
+ }
+
+ public int getState() {
+ if (mTelecomCall != null && mTelecomCall.getParent() != null) {
+ return State.CONFERENCED;
+ } else {
+ return mState;
+ }
+ }
+
+ public void setState(int state) {
+ mState = state;
+ if (mState == State.INCOMING) {
+ mLogState.isIncoming = true;
+ } else if (mState == State.DISCONNECTED) {
+ mLogState.duration = getConnectTimeMillis() == 0 ?
+ 0: System.currentTimeMillis() - getConnectTimeMillis();
+ }
+ }
+
+ public int getNumberPresentation() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getHandlePresentation();
+ }
+
+ public int getCnapNamePresentation() {
+ return mTelecomCall == null ? null
+ : mTelecomCall.getDetails().getCallerDisplayNamePresentation();
+ }
+
+ public String getCnapName() {
+ return mTelecomCall == null ? null
+ : getTelecomCall().getDetails().getCallerDisplayName();
+ }
+
+ public Bundle getIntentExtras() {
+ return DetailsCompat.getIntentExtras(mTelecomCall.getDetails());
+ }
+
+ public Bundle getExtras() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getExtras();
+ }
+
+ /**
+ * @return The child number for the call, or {@code null} if none specified.
+ */
+ public String getChildNumber() {
+ return mChildNumber;
+ }
+
+ /**
+ * @return The last forwarded number for the call, or {@code null} if none specified.
+ */
+ public String getLastForwardedNumber() {
+ return mLastForwardedNumber;
+ }
+
+ /**
+ * @return The call subject, or {@code null} if none specified.
+ */
+ public String getCallSubject() {
+ return mCallSubject;
+ }
+
+ /**
+ * @return {@code true} if the call's phone account supports call subjects, {@code false}
+ * otherwise.
+ */
+ public boolean isCallSubjectSupported() {
+ return mIsCallSubjectSupported;
+ }
+
+ /** Returns call disconnect cause, defined by {@link DisconnectCause}. */
+ public DisconnectCause getDisconnectCause() {
+ if (mState == State.DISCONNECTED || mState == State.IDLE) {
+ return mDisconnectCause;
+ }
+
+ return new DisconnectCause(DisconnectCause.UNKNOWN);
+ }
+
+ public void setDisconnectCause(DisconnectCause disconnectCause) {
+ mDisconnectCause = disconnectCause;
+ mLogState.disconnectCause = mDisconnectCause;
+ }
+
+ /** Returns the possible text message responses. */
+ public List<String> getCannedSmsResponses() {
+ return mTelecomCall.getCannedTextResponses();
+ }
+
+ /** Checks if the call supports the given set of capabilities supplied as a bit mask. */
+ public boolean can(int capabilities) {
+ int supportedCapabilities = mTelecomCall.getDetails().getCallCapabilities();
+
+ if ((capabilities & android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE) != 0) {
+ // We allow you to merge if the capabilities allow it or if it is a call with
+ // conferenceable calls.
+ if (mTelecomCall.getConferenceableCalls().isEmpty() &&
+ ((android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE
+ & supportedCapabilities) == 0)) {
+ // Cannot merge calls if there are no calls to merge with.
+ return false;
+ }
+ capabilities &= ~android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE;
+ }
+ return (capabilities == (capabilities & mTelecomCall.getDetails().getCallCapabilities()));
+ }
+
+ public boolean hasProperty(int property) {
+ return DetailsCompat.hasProperty(mTelecomCall.getDetails(), property);
+ }
+
+ /** Gets the time when the call first became active. */
+ public long getConnectTimeMillis() {
+ return mTelecomCall.getDetails().getConnectTimeMillis();
+ }
+
+ public boolean isConferenceCall() {
+ return hasProperty(android.telecom.Call.Details.PROPERTY_CONFERENCE);
+ }
+
+ public GatewayInfo getGatewayInfo() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getGatewayInfo();
+ }
+
+ public PhoneAccountHandle getAccountHandle() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getAccountHandle();
+ }
+
+ public VideoCall getVideoCall() {
+ return mTelecomCall == null ? null : mTelecomCall.getVideoCall();
+ }
+
+ public List<String> getChildCallIds() {
+ return mChildCallIds;
+ }
+
+ public String getParentId() {
+ android.telecom.Call parentCall = mTelecomCall.getParent();
+ if (parentCall != null) {
+ return CallList.getInstance().getCallByTelecomCall(parentCall).getId();
+ }
+ return null;
+ }
+
+ public int getVideoState() {
+ return mTelecomCall.getDetails().getVideoState();
+ }
+
+ public boolean isVideoCall(Context context) {
+ return CallUtil.isVideoEnabled(context) &&
+ VideoUtils.isVideoCall(getVideoState());
+ }
+
+ /**
+ * Handles incoming session modification requests. Stores the pending video request and sets
+ * the session modification state to
+ * {@link SessionModificationState#RECEIVED_UPGRADE_TO_VIDEO_REQUEST} so that we can keep track
+ * of the fact the request was received. Only upgrade requests require user confirmation and
+ * will be handled by this method. The remote user can turn off their own camera without
+ * confirmation.
+ *
+ * @param videoState The requested video state.
+ */
+ public void setRequestedVideoState(int videoState) {
+ Log.d(this, "setRequestedVideoState - video state= " + videoState);
+ if (videoState == getVideoState()) {
+ mSessionModificationState = Call.SessionModificationState.NO_REQUEST;
+ Log.w(this,"setRequestedVideoState - Clearing session modification state");
+ return;
+ }
+
+ mSessionModificationState = Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+ mRequestedVideoState = videoState;
+ CallList.getInstance().onUpgradeToVideo(this);
+
+ Log.d(this, "setRequestedVideoState - mSessionModificationState="
+ + mSessionModificationState + " video state= " + videoState);
+ update();
+ }
+
+ /**
+ * Set the session modification state. Used to keep track of pending video session modification
+ * operations and to inform listeners of these changes.
+ *
+ * @param state the new session modification state.
+ */
+ public void setSessionModificationState(int state) {
+ boolean hasChanged = mSessionModificationState != state;
+ mSessionModificationState = state;
+ Log.d(this, "setSessionModificationState " + state + " mSessionModificationState="
+ + mSessionModificationState);
+ if (hasChanged) {
+ CallList.getInstance().onSessionModificationStateChange(this, state);
+ }
+ }
+
+ /**
+ * Determines if the call handle is an emergency number or not and caches the result to avoid
+ * repeated calls to isEmergencyNumber.
+ */
+ private void updateEmergencyCallState() {
+ mIsEmergencyCall = TelecomCallUtil.isEmergencyCall(mTelecomCall);
+ }
+
+ /**
+ * Gets the video state which was requested via a session modification request.
+ *
+ * @return The video state.
+ */
+ public int getRequestedVideoState() {
+ return mRequestedVideoState;
+ }
+
+ public static boolean areSame(Call call1, Call call2) {
+ if (call1 == null && call2 == null) {
+ return true;
+ } else if (call1 == null || call2 == null) {
+ return false;
+ }
+
+ // otherwise compare call Ids
+ return call1.getId().equals(call2.getId());
+ }
+
+ public static boolean areSameNumber(Call call1, Call call2) {
+ if (call1 == null && call2 == null) {
+ return true;
+ } else if (call1 == null || call2 == null) {
+ return false;
+ }
+
+ // otherwise compare call Numbers
+ return TextUtils.equals(call1.getNumber(), call2.getNumber());
+ }
+
+ /**
+ * Gets the current video session modification state.
+ *
+ * @return The session modification state.
+ */
+ public int getSessionModificationState() {
+ return mSessionModificationState;
+ }
+
+ public LogState getLogState() {
+ return mLogState;
+ }
+
+ /**
+ * Logging utility methods
+ */
+ public void logCallInitiationType() {
+ if (getState() == State.INCOMING) {
+ getLogState().callInitiationMethod = LogState.INITIATION_INCOMING;
+ } else if (getIntentExtras() != null) {
+ getLogState().callInitiationMethod =
+ getIntentExtras().getInt(IntentUtil.EXTRA_CALL_INITIATION_TYPE,
+ LogState.INITIATION_EXTERNAL);
+ }
+ }
+
+ @Override
+ public String toString() {
+ if (mTelecomCall == null) {
+ // This should happen only in testing since otherwise we would never have a null
+ // Telecom call.
+ return String.valueOf(mId);
+ }
+
+ return String.format(Locale.US, "[%s, %s, %s, children:%s, parent:%s, conferenceable:%s, " +
+ "videoState:%s, mSessionModificationState:%d, VideoSettings:%s]",
+ mId,
+ State.toString(getState()),
+ DetailsCompat.capabilitiesToString(mTelecomCall.getDetails().getCallCapabilities()),
+ mChildCallIds,
+ getParentId(),
+ this.mTelecomCall.getConferenceableCalls(),
+ VideoProfileCompat.videoStateToString(mTelecomCall.getDetails().getVideoState()),
+ mSessionModificationState,
+ getVideoSettings());
+ }
+
+ public String toSimpleString() {
+ return super.toString();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
new file mode 100644
index 0000000..1904ab0
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -0,0 +1,829 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_ADD_CALL;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_COUNT;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DIALPAD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DOWNGRADE_TO_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_HOLD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MANAGE_VIDEO_CONFERENCE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MERGE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MUTE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_PAUSE_VIDEO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWAP;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWITCH_CAMERA;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_UPGRADE_TO_VIDEO;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.LayerDrawable;
+import android.graphics.drawable.RippleDrawable;
+import android.graphics.drawable.StateListDrawable;
+import android.os.Bundle;
+import android.util.SparseIntArray;
+import android.view.ContextThemeWrapper;
+import android.view.HapticFeedbackConstants;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.ImageButton;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnDismissListener;
+import android.widget.PopupMenu.OnMenuItemClickListener;
+
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.dialer.compat.CallAudioStateCompat;
+
+/**
+ * Fragment for call control buttons
+ */
+public class CallButtonFragment
+ extends BaseFragment<CallButtonPresenter, CallButtonPresenter.CallButtonUi>
+ implements CallButtonPresenter.CallButtonUi, OnMenuItemClickListener, OnDismissListener,
+ View.OnClickListener {
+
+ private static final int INVALID_INDEX = -1;
+ private int mButtonMaxVisible;
+ // The button is currently visible in the UI
+ private static final int BUTTON_VISIBLE = 1;
+ // The button is hidden in the UI
+ private static final int BUTTON_HIDDEN = 2;
+ // The button has been collapsed into the overflow menu
+ private static final int BUTTON_MENU = 3;
+
+ public interface Buttons {
+
+ public static final int BUTTON_AUDIO = 0;
+ public static final int BUTTON_MUTE = 1;
+ public static final int BUTTON_DIALPAD = 2;
+ public static final int BUTTON_HOLD = 3;
+ public static final int BUTTON_SWAP = 4;
+ public static final int BUTTON_UPGRADE_TO_VIDEO = 5;
+ public static final int BUTTON_SWITCH_CAMERA = 6;
+ public static final int BUTTON_DOWNGRADE_TO_AUDIO = 7;
+ public static final int BUTTON_ADD_CALL = 8;
+ public static final int BUTTON_MERGE = 9;
+ public static final int BUTTON_PAUSE_VIDEO = 10;
+ public static final int BUTTON_MANAGE_VIDEO_CONFERENCE = 11;
+ public static final int BUTTON_COUNT = 12;
+ }
+
+ private SparseIntArray mButtonVisibilityMap = new SparseIntArray(BUTTON_COUNT);
+
+ private CompoundButton mAudioButton;
+ private CompoundButton mMuteButton;
+ private CompoundButton mShowDialpadButton;
+ private CompoundButton mHoldButton;
+ private ImageButton mSwapButton;
+ private ImageButton mChangeToVideoButton;
+ private ImageButton mChangeToVoiceButton;
+ private CompoundButton mSwitchCameraButton;
+ private ImageButton mAddCallButton;
+ private ImageButton mMergeButton;
+ private CompoundButton mPauseVideoButton;
+ private ImageButton mOverflowButton;
+ private ImageButton mManageVideoCallConferenceButton;
+
+ private PopupMenu mAudioModePopup;
+ private boolean mAudioModePopupVisible;
+ private PopupMenu mOverflowPopup;
+
+ private int mPrevAudioMode = 0;
+
+ // Constants for Drawable.setAlpha()
+ private static final int HIDDEN = 0;
+ private static final int VISIBLE = 255;
+
+ private boolean mIsEnabled;
+ private MaterialPalette mCurrentThemeColors;
+
+ @Override
+ public CallButtonPresenter createPresenter() {
+ // TODO: find a cleaner way to include audio mode provider than having a singleton instance.
+ return new CallButtonPresenter();
+ }
+
+ @Override
+ public CallButtonPresenter.CallButtonUi getUi() {
+ return this;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ for (int i = 0; i < BUTTON_COUNT; i++) {
+ mButtonVisibilityMap.put(i, BUTTON_HIDDEN);
+ }
+
+ mButtonMaxVisible = getResources().getInteger(R.integer.call_card_max_buttons);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View parent = inflater.inflate(R.layout.call_button_fragment, container, false);
+
+ mAudioButton = (CompoundButton) parent.findViewById(R.id.audioButton);
+ mAudioButton.setOnClickListener(this);
+ mMuteButton = (CompoundButton) parent.findViewById(R.id.muteButton);
+ mMuteButton.setOnClickListener(this);
+ mShowDialpadButton = (CompoundButton) parent.findViewById(R.id.dialpadButton);
+ mShowDialpadButton.setOnClickListener(this);
+ mHoldButton = (CompoundButton) parent.findViewById(R.id.holdButton);
+ mHoldButton.setOnClickListener(this);
+ mSwapButton = (ImageButton) parent.findViewById(R.id.swapButton);
+ mSwapButton.setOnClickListener(this);
+ mChangeToVideoButton = (ImageButton) parent.findViewById(R.id.changeToVideoButton);
+ mChangeToVideoButton.setOnClickListener(this);
+ mChangeToVoiceButton = (ImageButton) parent.findViewById(R.id.changeToVoiceButton);
+ mChangeToVoiceButton.setOnClickListener(this);
+ mSwitchCameraButton = (CompoundButton) parent.findViewById(R.id.switchCameraButton);
+ mSwitchCameraButton.setOnClickListener(this);
+ mAddCallButton = (ImageButton) parent.findViewById(R.id.addButton);
+ mAddCallButton.setOnClickListener(this);
+ mMergeButton = (ImageButton) parent.findViewById(R.id.mergeButton);
+ mMergeButton.setOnClickListener(this);
+ mPauseVideoButton = (CompoundButton) parent.findViewById(R.id.pauseVideoButton);
+ mPauseVideoButton.setOnClickListener(this);
+ mOverflowButton = (ImageButton) parent.findViewById(R.id.overflowButton);
+ mOverflowButton.setOnClickListener(this);
+ mManageVideoCallConferenceButton = (ImageButton) parent.findViewById(
+ R.id.manageVideoCallConferenceButton);
+ mManageVideoCallConferenceButton.setOnClickListener(this);
+ return parent;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ // set the buttons
+ updateAudioButtons(getPresenter().getSupportedAudio());
+ }
+
+ @Override
+ public void onResume() {
+ if (getPresenter() != null) {
+ getPresenter().refreshMuteState();
+ }
+ super.onResume();
+
+ updateColors();
+ }
+
+ @Override
+ public void onClick(View view) {
+ int id = view.getId();
+ Log.d(this, "onClick(View " + view + ", id " + id + ")...");
+
+ switch (id) {
+ case R.id.audioButton:
+ onAudioButtonClicked();
+ break;
+ case R.id.addButton:
+ getPresenter().addCallClicked();
+ break;
+ case R.id.muteButton: {
+ getPresenter().muteClicked(!mMuteButton.isSelected());
+ break;
+ }
+ case R.id.mergeButton:
+ getPresenter().mergeClicked();
+ mMergeButton.setEnabled(false);
+ break;
+ case R.id.holdButton: {
+ getPresenter().holdClicked(!mHoldButton.isSelected());
+ break;
+ }
+ case R.id.swapButton:
+ getPresenter().swapClicked();
+ break;
+ case R.id.dialpadButton:
+ getPresenter().showDialpadClicked(!mShowDialpadButton.isSelected());
+ break;
+ case R.id.changeToVideoButton:
+ getPresenter().changeToVideoClicked();
+ break;
+ case R.id.changeToVoiceButton:
+ getPresenter().changeToVoiceClicked();
+ break;
+ case R.id.switchCameraButton:
+ getPresenter().switchCameraClicked(
+ mSwitchCameraButton.isSelected() /* useFrontFacingCamera */);
+ break;
+ case R.id.pauseVideoButton:
+ getPresenter().pauseVideoClicked(
+ !mPauseVideoButton.isSelected() /* pause */);
+ break;
+ case R.id.overflowButton:
+ if (mOverflowPopup != null) {
+ mOverflowPopup.show();
+ }
+ break;
+ case R.id.manageVideoCallConferenceButton:
+ onManageVideoCallConferenceClicked();
+ break;
+ default:
+ Log.wtf(this, "onClick: unexpected");
+ return;
+ }
+
+ view.performHapticFeedback(
+ HapticFeedbackConstants.VIRTUAL_KEY,
+ HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
+ }
+
+ public void updateColors() {
+ MaterialPalette themeColors = InCallPresenter.getInstance().getThemeColors();
+
+ if (mCurrentThemeColors != null && mCurrentThemeColors.equals(themeColors)) {
+ return;
+ }
+
+ View[] compoundButtons = {
+ mAudioButton,
+ mMuteButton,
+ mShowDialpadButton,
+ mHoldButton,
+ mSwitchCameraButton,
+ mPauseVideoButton
+ };
+
+ for (View button : compoundButtons) {
+ final LayerDrawable layers = (LayerDrawable) button.getBackground();
+ final RippleDrawable btnCompoundDrawable = compoundBackgroundDrawable(themeColors);
+ layers.setDrawableByLayerId(R.id.compoundBackgroundItem, btnCompoundDrawable);
+ }
+
+ ImageButton[] normalButtons = {
+ mSwapButton,
+ mChangeToVideoButton,
+ mChangeToVoiceButton,
+ mAddCallButton,
+ mMergeButton,
+ mOverflowButton
+ };
+
+ for (ImageButton button : normalButtons) {
+ final LayerDrawable layers = (LayerDrawable) button.getBackground();
+ final RippleDrawable btnDrawable = backgroundDrawable(themeColors);
+ layers.setDrawableByLayerId(R.id.backgroundItem, btnDrawable);
+ }
+
+ mCurrentThemeColors = themeColors;
+ }
+
+ /**
+ * Generate a RippleDrawable which will be the background for a compound button, i.e.
+ * a button with pressed and unpressed states. The unpressed state will be the same color
+ * as the rest of the call card, the pressed state will be the dark version of that color.
+ */
+ private RippleDrawable compoundBackgroundDrawable(MaterialPalette palette) {
+ Resources res = getResources();
+ ColorStateList rippleColor =
+ ColorStateList.valueOf(res.getColor(R.color.incall_accent_color));
+
+ StateListDrawable stateListDrawable = new StateListDrawable();
+ addSelectedAndFocused(res, stateListDrawable);
+ addFocused(res, stateListDrawable);
+ addSelected(res, stateListDrawable, palette);
+ addUnselected(res, stateListDrawable, palette);
+
+ return new RippleDrawable(rippleColor, stateListDrawable, null);
+ }
+
+ /**
+ * Generate a RippleDrawable which will be the background of a button to ensure it
+ * is the same color as the rest of the call card.
+ */
+ private RippleDrawable backgroundDrawable(MaterialPalette palette) {
+ Resources res = getResources();
+ ColorStateList rippleColor =
+ ColorStateList.valueOf(res.getColor(R.color.incall_accent_color));
+
+ StateListDrawable stateListDrawable = new StateListDrawable();
+ addFocused(res, stateListDrawable);
+ addUnselected(res, stateListDrawable, palette);
+
+ return new RippleDrawable(rippleColor, stateListDrawable, null);
+ }
+
+ // state_selected and state_focused
+ private void addSelectedAndFocused(Resources res, StateListDrawable drawable) {
+ int[] selectedAndFocused = {android.R.attr.state_selected, android.R.attr.state_focused};
+ Drawable selectedAndFocusedDrawable = res.getDrawable(R.drawable.btn_selected_focused);
+ drawable.addState(selectedAndFocused, selectedAndFocusedDrawable);
+ }
+
+ // state_focused
+ private void addFocused(Resources res, StateListDrawable drawable) {
+ int[] focused = {android.R.attr.state_focused};
+ Drawable focusedDrawable = res.getDrawable(R.drawable.btn_unselected_focused);
+ drawable.addState(focused, focusedDrawable);
+ }
+
+ // state_selected
+ private void addSelected(Resources res, StateListDrawable drawable, MaterialPalette palette) {
+ int[] selected = {android.R.attr.state_selected};
+ LayerDrawable selectedDrawable = (LayerDrawable) res.getDrawable(R.drawable.btn_selected);
+ ((GradientDrawable) selectedDrawable.getDrawable(0)).setColor(palette.mSecondaryColor);
+ drawable.addState(selected, selectedDrawable);
+ }
+
+ // default
+ private void addUnselected(Resources res, StateListDrawable drawable, MaterialPalette palette) {
+ LayerDrawable unselectedDrawable =
+ (LayerDrawable) res.getDrawable(R.drawable.btn_unselected);
+ ((GradientDrawable) unselectedDrawable.getDrawable(0)).setColor(palette.mPrimaryColor);
+ drawable.addState(new int[0], unselectedDrawable);
+ }
+
+ @Override
+ public void setEnabled(boolean isEnabled) {
+ mIsEnabled = isEnabled;
+
+ mAudioButton.setEnabled(isEnabled);
+ mMuteButton.setEnabled(isEnabled);
+ mShowDialpadButton.setEnabled(isEnabled);
+ mHoldButton.setEnabled(isEnabled);
+ mSwapButton.setEnabled(isEnabled);
+ mChangeToVideoButton.setEnabled(isEnabled);
+ mChangeToVoiceButton.setEnabled(isEnabled);
+ mSwitchCameraButton.setEnabled(isEnabled);
+ mAddCallButton.setEnabled(isEnabled);
+ mMergeButton.setEnabled(isEnabled);
+ mPauseVideoButton.setEnabled(isEnabled);
+ mOverflowButton.setEnabled(isEnabled);
+ mManageVideoCallConferenceButton.setEnabled(isEnabled);
+ }
+
+ @Override
+ public void showButton(int buttonId, boolean show) {
+ mButtonVisibilityMap.put(buttonId, show ? BUTTON_VISIBLE : BUTTON_HIDDEN);
+ }
+
+ @Override
+ public void enableButton(int buttonId, boolean enable) {
+ final View button = getButtonById(buttonId);
+ if (button != null) {
+ button.setEnabled(enable);
+ }
+ }
+
+ private View getButtonById(int id) {
+ switch (id) {
+ case BUTTON_AUDIO:
+ return mAudioButton;
+ case BUTTON_MUTE:
+ return mMuteButton;
+ case BUTTON_DIALPAD:
+ return mShowDialpadButton;
+ case BUTTON_HOLD:
+ return mHoldButton;
+ case BUTTON_SWAP:
+ return mSwapButton;
+ case BUTTON_UPGRADE_TO_VIDEO:
+ return mChangeToVideoButton;
+ case BUTTON_DOWNGRADE_TO_AUDIO:
+ return mChangeToVoiceButton;
+ case BUTTON_SWITCH_CAMERA:
+ return mSwitchCameraButton;
+ case BUTTON_ADD_CALL:
+ return mAddCallButton;
+ case BUTTON_MERGE:
+ return mMergeButton;
+ case BUTTON_PAUSE_VIDEO:
+ return mPauseVideoButton;
+ case BUTTON_MANAGE_VIDEO_CONFERENCE:
+ return mManageVideoCallConferenceButton;
+ default:
+ Log.w(this, "Invalid button id");
+ return null;
+ }
+ }
+
+ @Override
+ public void setHold(boolean value) {
+ if (mHoldButton.isSelected() != value) {
+ mHoldButton.setSelected(value);
+ mHoldButton.setContentDescription(getContext().getString(
+ value ? R.string.onscreenHoldText_selected
+ : R.string.onscreenHoldText_unselected));
+ }
+ }
+
+ @Override
+ public void setCameraSwitched(boolean isBackFacingCamera) {
+ mSwitchCameraButton.setSelected(isBackFacingCamera);
+ }
+
+ @Override
+ public void setVideoPaused(boolean isPaused) {
+ mPauseVideoButton.setSelected(isPaused);
+ }
+
+ @Override
+ public void setMute(boolean value) {
+ if (mMuteButton.isSelected() != value) {
+ mMuteButton.setSelected(value);
+ }
+ }
+
+ private void addToOverflowMenu(int id, View button, PopupMenu menu) {
+ button.setVisibility(View.GONE);
+ menu.getMenu().add(Menu.NONE, id, Menu.NONE, button.getContentDescription());
+ mButtonVisibilityMap.put(id, BUTTON_MENU);
+ }
+
+ private PopupMenu getPopupMenu() {
+ return new PopupMenu(new ContextThemeWrapper(getActivity(), R.style.InCallPopupMenuStyle),
+ mOverflowButton);
+ }
+
+ /**
+ * Iterates through the list of buttons and toggles their visibility depending on the
+ * setting configured by the CallButtonPresenter. If there are more visible buttons than
+ * the allowed maximum, the excess buttons are collapsed into a single overflow menu.
+ */
+ @Override
+ public void updateButtonStates() {
+ View prevVisibleButton = null;
+ int prevVisibleId = -1;
+ PopupMenu menu = null;
+ int visibleCount = 0;
+ for (int i = 0; i < BUTTON_COUNT; i++) {
+ final int visibility = mButtonVisibilityMap.get(i);
+ final View button = getButtonById(i);
+ if (visibility == BUTTON_VISIBLE) {
+ visibleCount++;
+ if (visibleCount <= mButtonMaxVisible) {
+ button.setVisibility(View.VISIBLE);
+ prevVisibleButton = button;
+ prevVisibleId = i;
+ } else {
+ if (menu == null) {
+ menu = getPopupMenu();
+ }
+ // Collapse the current button into the overflow menu. If is the first visible
+ // button that exceeds the threshold, also collapse the previous visible button
+ // so that the total number of visible buttons will never exceed the threshold.
+ if (prevVisibleButton != null) {
+ addToOverflowMenu(prevVisibleId, prevVisibleButton, menu);
+ prevVisibleButton = null;
+ prevVisibleId = -1;
+ }
+ addToOverflowMenu(i, button, menu);
+ }
+ } else if (visibility == BUTTON_HIDDEN) {
+ button.setVisibility(View.GONE);
+ }
+ }
+
+ mOverflowButton.setVisibility(menu != null ? View.VISIBLE : View.GONE);
+ if (menu != null) {
+ mOverflowPopup = menu;
+ mOverflowPopup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ final int id = item.getItemId();
+ getButtonById(id).performClick();
+ return true;
+ }
+ });
+ }
+ }
+
+ @Override
+ public void setAudio(int mode) {
+ updateAudioButtons(getPresenter().getSupportedAudio());
+ refreshAudioModePopup();
+
+ if (mPrevAudioMode != mode) {
+ updateAudioButtonContentDescription(mode);
+ mPrevAudioMode = mode;
+ }
+ }
+
+ @Override
+ public void setSupportedAudio(int modeMask) {
+ updateAudioButtons(modeMask);
+ refreshAudioModePopup();
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ Log.d(this, "- onMenuItemClick: " + item);
+ Log.d(this, " id: " + item.getItemId());
+ Log.d(this, " title: '" + item.getTitle() + "'");
+
+ int mode = CallAudioStateCompat.ROUTE_WIRED_OR_EARPIECE;
+
+ switch (item.getItemId()) {
+ case R.id.audio_mode_speaker:
+ mode = CallAudioStateCompat.ROUTE_SPEAKER;
+ break;
+ case R.id.audio_mode_earpiece:
+ case R.id.audio_mode_wired_headset:
+ // InCallCallAudioState.ROUTE_EARPIECE means either the handset earpiece,
+ // or the wired headset (if connected.)
+ mode = CallAudioStateCompat.ROUTE_WIRED_OR_EARPIECE;
+ break;
+ case R.id.audio_mode_bluetooth:
+ mode = CallAudioStateCompat.ROUTE_BLUETOOTH;
+ break;
+ default:
+ Log.e(this, "onMenuItemClick: unexpected View ID " + item.getItemId()
+ + " (MenuItem = '" + item + "')");
+ break;
+ }
+
+ getPresenter().setAudioMode(mode);
+
+ return true;
+ }
+
+ // PopupMenu.OnDismissListener implementation; see showAudioModePopup().
+ // This gets called when the PopupMenu gets dismissed for *any* reason, like
+ // the user tapping outside its bounds, or pressing Back, or selecting one
+ // of the menu items.
+ @Override
+ public void onDismiss(PopupMenu menu) {
+ Log.d(this, "- onDismiss: " + menu);
+ mAudioModePopupVisible = false;
+ updateAudioButtons(getPresenter().getSupportedAudio());
+ }
+
+ /**
+ * Checks for supporting modes. If bluetooth is supported, it uses the audio
+ * pop up menu. Otherwise, it toggles the speakerphone.
+ */
+ private void onAudioButtonClicked() {
+ Log.d(this, "onAudioButtonClicked: " +
+ CallAudioStateCompat.audioRouteToString(getPresenter().getSupportedAudio()));
+
+ if (isSupported(CallAudioStateCompat.ROUTE_BLUETOOTH)) {
+ showAudioModePopup();
+ } else {
+ getPresenter().toggleSpeakerphone();
+ }
+ }
+
+ private void onManageVideoCallConferenceClicked() {
+ Log.d(this, "onManageVideoCallConferenceClicked");
+ InCallPresenter.getInstance().showConferenceCallManager(true);
+ }
+
+ /**
+ * Refreshes the "Audio mode" popup if it's visible. This is useful
+ * (for example) when a wired headset is plugged or unplugged,
+ * since we need to switch back and forth between the "earpiece"
+ * and "wired headset" items.
+ *
+ * This is safe to call even if the popup is already dismissed, or even if
+ * you never called showAudioModePopup() in the first place.
+ */
+ public void refreshAudioModePopup() {
+ if (mAudioModePopup != null && mAudioModePopupVisible) {
+ // Dismiss the previous one
+ mAudioModePopup.dismiss(); // safe even if already dismissed
+ // And bring up a fresh PopupMenu
+ showAudioModePopup();
+ }
+ }
+
+ /**
+ * Updates the audio button so that the appriopriate visual layers
+ * are visible based on the supported audio formats.
+ */
+ private void updateAudioButtons(int supportedModes) {
+ final boolean bluetoothSupported = isSupported(CallAudioStateCompat.ROUTE_BLUETOOTH);
+ final boolean speakerSupported = isSupported(CallAudioStateCompat.ROUTE_SPEAKER);
+
+ boolean audioButtonEnabled = false;
+ boolean audioButtonChecked = false;
+ boolean showMoreIndicator = false;
+
+ boolean showBluetoothIcon = false;
+ boolean showSpeakerphoneIcon = false;
+ boolean showHandsetIcon = false;
+
+ boolean showToggleIndicator = false;
+
+ if (bluetoothSupported) {
+ Log.d(this, "updateAudioButtons - popup menu mode");
+
+ audioButtonEnabled = true;
+ audioButtonChecked = true;
+ showMoreIndicator = true;
+
+ // Update desired layers:
+ if (isAudio(CallAudioStateCompat.ROUTE_BLUETOOTH)) {
+ showBluetoothIcon = true;
+ } else if (isAudio(CallAudioStateCompat.ROUTE_SPEAKER)) {
+ showSpeakerphoneIcon = true;
+ } else {
+ showHandsetIcon = true;
+ // TODO: if a wired headset is plugged in, that takes precedence
+ // over the handset earpiece. If so, maybe we should show some
+ // sort of "wired headset" icon here instead of the "handset
+ // earpiece" icon. (Still need an asset for that, though.)
+ }
+
+ // The audio button is NOT a toggle in this state, so set selected to false.
+ mAudioButton.setSelected(false);
+ } else if (speakerSupported) {
+ Log.d(this, "updateAudioButtons - speaker toggle mode");
+
+ audioButtonEnabled = true;
+
+ // The audio button *is* a toggle in this state, and indicated the
+ // current state of the speakerphone.
+ audioButtonChecked = isAudio(CallAudioStateCompat.ROUTE_SPEAKER);
+ mAudioButton.setSelected(audioButtonChecked);
+
+ // update desired layers:
+ showToggleIndicator = true;
+ showSpeakerphoneIcon = true;
+ } else {
+ Log.d(this, "updateAudioButtons - disabled...");
+
+ // The audio button is a toggle in this state, but that's mostly
+ // irrelevant since it's always disabled and unchecked.
+ audioButtonEnabled = false;
+ audioButtonChecked = false;
+ mAudioButton.setSelected(false);
+
+ // update desired layers:
+ showToggleIndicator = true;
+ showSpeakerphoneIcon = true;
+ }
+
+ // Finally, update it all!
+
+ Log.v(this, "audioButtonEnabled: " + audioButtonEnabled);
+ Log.v(this, "audioButtonChecked: " + audioButtonChecked);
+ Log.v(this, "showMoreIndicator: " + showMoreIndicator);
+ Log.v(this, "showBluetoothIcon: " + showBluetoothIcon);
+ Log.v(this, "showSpeakerphoneIcon: " + showSpeakerphoneIcon);
+ Log.v(this, "showHandsetIcon: " + showHandsetIcon);
+
+ // Only enable the audio button if the fragment is enabled.
+ mAudioButton.setEnabled(audioButtonEnabled && mIsEnabled);
+ mAudioButton.setChecked(audioButtonChecked);
+
+ final LayerDrawable layers = (LayerDrawable) mAudioButton.getBackground();
+ Log.d(this, "'layers' drawable: " + layers);
+
+ layers.findDrawableByLayerId(R.id.compoundBackgroundItem)
+ .setAlpha(showToggleIndicator ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.moreIndicatorItem)
+ .setAlpha(showMoreIndicator ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.bluetoothItem)
+ .setAlpha(showBluetoothIcon ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.handsetItem)
+ .setAlpha(showHandsetIcon ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.speakerphoneItem)
+ .setAlpha(showSpeakerphoneIcon ? VISIBLE : HIDDEN);
+
+ }
+
+ /**
+ * Update the content description of the audio button.
+ */
+ private void updateAudioButtonContentDescription(int mode) {
+ int stringId = 0;
+
+ // If bluetooth is not supported, the audio buttion will toggle, so use the label "speaker".
+ // Otherwise, use the label of the currently selected audio mode.
+ if (!isSupported(CallAudioStateCompat.ROUTE_BLUETOOTH)) {
+ stringId = R.string.audio_mode_speaker;
+ } else {
+ switch (mode) {
+ case CallAudioStateCompat.ROUTE_EARPIECE:
+ stringId = R.string.audio_mode_earpiece;
+ break;
+ case CallAudioStateCompat.ROUTE_BLUETOOTH:
+ stringId = R.string.audio_mode_bluetooth;
+ break;
+ case CallAudioStateCompat.ROUTE_WIRED_HEADSET:
+ stringId = R.string.audio_mode_wired_headset;
+ break;
+ case CallAudioStateCompat.ROUTE_SPEAKER:
+ stringId = R.string.audio_mode_speaker;
+ break;
+ }
+ }
+
+ if (stringId != 0) {
+ mAudioButton.setContentDescription(getResources().getString(stringId));
+ }
+ }
+
+ private void showAudioModePopup() {
+ Log.d(this, "showAudioPopup()...");
+
+ final ContextThemeWrapper contextWrapper = new ContextThemeWrapper(getActivity(),
+ R.style.InCallPopupMenuStyle);
+ mAudioModePopup = new PopupMenu(contextWrapper, mAudioButton /* anchorView */);
+ mAudioModePopup.getMenuInflater().inflate(R.menu.incall_audio_mode_menu,
+ mAudioModePopup.getMenu());
+ mAudioModePopup.setOnMenuItemClickListener(this);
+ mAudioModePopup.setOnDismissListener(this);
+
+ final Menu menu = mAudioModePopup.getMenu();
+
+ // TODO: Still need to have the "currently active" audio mode come
+ // up pre-selected (or focused?) with a blue highlight. Still
+ // need exact visual design, and possibly framework support for this.
+ // See comments below for the exact logic.
+
+ final MenuItem speakerItem = menu.findItem(R.id.audio_mode_speaker);
+ speakerItem.setEnabled(isSupported(CallAudioStateCompat.ROUTE_SPEAKER));
+ // TODO: Show speakerItem as initially "selected" if
+ // speaker is on.
+
+ // We display *either* "earpiece" or "wired headset", never both,
+ // depending on whether a wired headset is physically plugged in.
+ final MenuItem earpieceItem = menu.findItem(R.id.audio_mode_earpiece);
+ final MenuItem wiredHeadsetItem = menu.findItem(R.id.audio_mode_wired_headset);
+
+ final boolean usingHeadset = isSupported(CallAudioStateCompat.ROUTE_WIRED_HEADSET);
+ earpieceItem.setVisible(!usingHeadset);
+ earpieceItem.setEnabled(!usingHeadset);
+ wiredHeadsetItem.setVisible(usingHeadset);
+ wiredHeadsetItem.setEnabled(usingHeadset);
+ // TODO: Show the above item (either earpieceItem or wiredHeadsetItem)
+ // as initially "selected" if speakerOn and
+ // bluetoothIndicatorOn are both false.
+
+ final MenuItem bluetoothItem = menu.findItem(R.id.audio_mode_bluetooth);
+ bluetoothItem.setEnabled(isSupported(CallAudioStateCompat.ROUTE_BLUETOOTH));
+ // TODO: Show bluetoothItem as initially "selected" if
+ // bluetoothIndicatorOn is true.
+
+ mAudioModePopup.show();
+
+ // Unfortunately we need to manually keep track of the popup menu's
+ // visiblity, since PopupMenu doesn't have an isShowing() method like
+ // Dialogs do.
+ mAudioModePopupVisible = true;
+ }
+
+ private boolean isSupported(int mode) {
+ return (mode == (getPresenter().getSupportedAudio() & mode));
+ }
+
+ private boolean isAudio(int mode) {
+ return (mode == getPresenter().getAudioMode());
+ }
+
+ @Override
+ public void displayDialpad(boolean value, boolean animate) {
+ if (getActivity() != null && getActivity() instanceof InCallActivity) {
+ boolean changed = ((InCallActivity) getActivity()).showDialpadFragment(value, animate);
+ if (changed) {
+ mShowDialpadButton.setSelected(value);
+ }
+ }
+ }
+
+ @Override
+ public boolean isDialpadVisible() {
+ if (getActivity() != null && getActivity() instanceof InCallActivity) {
+ return ((InCallActivity) getActivity()).isDialpadVisible();
+ }
+ return false;
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
new file mode 100644
index 0000000..dde6295
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -0,0 +1,483 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_ADD_CALL;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DIALPAD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DOWNGRADE_TO_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_HOLD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MERGE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MUTE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_PAUSE_VIDEO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWAP;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWITCH_CAMERA;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_UPGRADE_TO_VIDEO;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.VideoProfile;
+
+import com.android.contacts.common.compat.CallSdkCompat;
+import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.dialer.compat.CallAudioStateCompat;
+import com.android.dialer.compat.UserManagerCompat;
+import com.android.incallui.AudioModeProvider.AudioModeListener;
+import com.android.incallui.InCallCameraManager.Listener;
+import com.android.incallui.InCallPresenter.CanAddCallListener;
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+
+/**
+ * Logic for call buttons.
+ */
+public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButtonUi>
+ implements InCallStateListener, AudioModeListener, IncomingCallListener,
+ InCallDetailsListener, CanAddCallListener, Listener {
+
+ private static final String KEY_AUTOMATICALLY_MUTED = "incall_key_automatically_muted";
+ private static final String KEY_PREVIOUS_MUTE_STATE = "incall_key_previous_mute_state";
+
+ private Call mCall;
+ private boolean mAutomaticallyMuted = false;
+ private boolean mPreviousMuteState = false;
+
+ public CallButtonPresenter() {
+ }
+
+ @Override
+ public void onUiReady(CallButtonUi ui) {
+ super.onUiReady(ui);
+
+ AudioModeProvider.getInstance().addListener(this);
+
+ // register for call state changes last
+ final InCallPresenter inCallPresenter = InCallPresenter.getInstance();
+ inCallPresenter.addListener(this);
+ inCallPresenter.addIncomingCallListener(this);
+ inCallPresenter.addDetailsListener(this);
+ inCallPresenter.addCanAddCallListener(this);
+ inCallPresenter.getInCallCameraManager().addCameraSelectionListener(this);
+
+ // Update the buttons state immediately for the current call
+ onStateChange(InCallState.NO_CALLS, inCallPresenter.getInCallState(),
+ CallList.getInstance());
+ }
+
+ @Override
+ public void onUiUnready(CallButtonUi ui) {
+ super.onUiUnready(ui);
+
+ InCallPresenter.getInstance().removeListener(this);
+ AudioModeProvider.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ InCallPresenter.getInstance().removeDetailsListener(this);
+ InCallPresenter.getInstance().getInCallCameraManager().removeCameraSelectionListener(this);
+ InCallPresenter.getInstance().removeCanAddCallListener(this);
+ }
+
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ CallButtonUi ui = getUi();
+
+ if (newState == InCallState.OUTGOING) {
+ mCall = callList.getOutgoingCall();
+ } else if (newState == InCallState.INCALL) {
+ mCall = callList.getActiveOrBackgroundCall();
+
+ // When connected to voice mail, automatically shows the dialpad.
+ // (On previous releases we showed it when in-call shows up, before waiting for
+ // OUTGOING. We may want to do that once we start showing "Voice mail" label on
+ // the dialpad too.)
+ if (ui != null) {
+ if (oldState == InCallState.OUTGOING && mCall != null) {
+ if (CallerInfoUtils.isVoiceMailNumber(ui.getContext(), mCall)) {
+ ui.displayDialpad(true /* show */, true /* animate */);
+ }
+ }
+ }
+ } else if (newState == InCallState.INCOMING) {
+ if (ui != null) {
+ ui.displayDialpad(false /* show */, true /* animate */);
+ }
+ mCall = callList.getIncomingCall();
+ } else {
+ mCall = null;
+ }
+ updateUi(newState, mCall);
+ }
+
+ /**
+ * Updates the user interface in response to a change in the details of a call.
+ * Currently handles changes to the call buttons in response to a change in the details for a
+ * call. This is important to ensure changes to the active call are reflected in the available
+ * buttons.
+ *
+ * @param call The active call.
+ * @param details The call details.
+ */
+ @Override
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details) {
+ // Only update if the changes are for the currently active call
+ if (getUi() != null && call != null && call.equals(mCall)) {
+ updateButtonsState(call);
+ }
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ onStateChange(oldState, newState, CallList.getInstance());
+ }
+
+ @Override
+ public void onCanAddCallChanged(boolean canAddCall) {
+ if (getUi() != null && mCall != null) {
+ updateButtonsState(mCall);
+ }
+ }
+
+ @Override
+ public void onAudioMode(int mode) {
+ if (getUi() != null) {
+ getUi().setAudio(mode);
+ }
+ }
+
+ @Override
+ public void onSupportedAudioMode(int mask) {
+ if (getUi() != null) {
+ getUi().setSupportedAudio(mask);
+ }
+ }
+
+ @Override
+ public void onMute(boolean muted) {
+ if (getUi() != null && !mAutomaticallyMuted) {
+ getUi().setMute(muted);
+ }
+ }
+
+ public int getAudioMode() {
+ return AudioModeProvider.getInstance().getAudioMode();
+ }
+
+ public int getSupportedAudio() {
+ return AudioModeProvider.getInstance().getSupportedModes();
+ }
+
+ public void setAudioMode(int mode) {
+
+ // TODO: Set a intermediate state in this presenter until we get
+ // an update for onAudioMode(). This will make UI response immediate
+ // if it turns out to be slow
+
+ Log.d(this, "Sending new Audio Mode: " + CallAudioStateCompat.audioRouteToString(mode));
+ TelecomAdapter.getInstance().setAudioRoute(mode);
+ }
+
+ /**
+ * Function assumes that bluetooth is not supported.
+ */
+ public void toggleSpeakerphone() {
+ // this function should not be called if bluetooth is available
+ if (0 != (CallAudioStateCompat.ROUTE_BLUETOOTH & getSupportedAudio())) {
+
+ // It's clear the UI is wrong, so update the supported mode once again.
+ Log.e(this, "toggling speakerphone not allowed when bluetooth supported.");
+ getUi().setSupportedAudio(getSupportedAudio());
+ return;
+ }
+
+ int newMode = CallAudioStateCompat.ROUTE_SPEAKER;
+
+ // if speakerphone is already on, change to wired/earpiece
+ if (getAudioMode() == CallAudioStateCompat.ROUTE_SPEAKER) {
+ newMode = CallAudioStateCompat.ROUTE_WIRED_OR_EARPIECE;
+ }
+
+ setAudioMode(newMode);
+ }
+
+ public void muteClicked(boolean checked) {
+ Log.d(this, "turning on mute: " + checked);
+ TelecomAdapter.getInstance().mute(checked);
+ }
+
+ public void holdClicked(boolean checked) {
+ if (mCall == null) {
+ return;
+ }
+ if (checked) {
+ Log.i(this, "Putting the call on hold: " + mCall);
+ TelecomAdapter.getInstance().holdCall(mCall.getId());
+ } else {
+ Log.i(this, "Removing the call from hold: " + mCall);
+ TelecomAdapter.getInstance().unholdCall(mCall.getId());
+ }
+ }
+
+ public void swapClicked() {
+ if (mCall == null) {
+ return;
+ }
+
+ Log.i(this, "Swapping the call: " + mCall);
+ TelecomAdapter.getInstance().swap(mCall.getId());
+ }
+
+ public void mergeClicked() {
+ TelecomAdapter.getInstance().merge(mCall.getId());
+ }
+
+ public void addCallClicked() {
+ // Automatically mute the current call
+ mAutomaticallyMuted = true;
+ mPreviousMuteState = AudioModeProvider.getInstance().getMute();
+ // Simulate a click on the mute button
+ muteClicked(true);
+ TelecomAdapter.getInstance().addCall();
+ }
+
+ public void changeToVoiceClicked() {
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+
+ VideoProfile videoProfile = new VideoProfile(VideoProfile.STATE_AUDIO_ONLY);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ }
+
+ public void showDialpadClicked(boolean checked) {
+ Log.v(this, "Show dialpad " + String.valueOf(checked));
+ getUi().displayDialpad(checked /* show */, true /* animate */);
+ }
+
+ public void changeToVideoClicked() {
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+ int currVideoState = mCall.getVideoState();
+ int currUnpausedVideoState = VideoUtils.getUnPausedVideoState(currVideoState);
+ currUnpausedVideoState |= VideoProfile.STATE_BIDIRECTIONAL;
+
+ VideoProfile videoProfile = new VideoProfile(currUnpausedVideoState);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ mCall.setSessionModificationState(Call.SessionModificationState.WAITING_FOR_RESPONSE);
+ }
+
+ /**
+ * Switches the camera between the front-facing and back-facing camera.
+ * @param useFrontFacingCamera True if we should switch to using the front-facing camera, or
+ * false if we should switch to using the back-facing camera.
+ */
+ public void switchCameraClicked(boolean useFrontFacingCamera) {
+ InCallCameraManager cameraManager = InCallPresenter.getInstance().getInCallCameraManager();
+ cameraManager.setUseFrontFacingCamera(useFrontFacingCamera);
+
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+
+ String cameraId = cameraManager.getActiveCameraId();
+ if (cameraId != null) {
+ final int cameraDir = cameraManager.isUsingFrontFacingCamera()
+ ? Call.VideoSettings.CAMERA_DIRECTION_FRONT_FACING
+ : Call.VideoSettings.CAMERA_DIRECTION_BACK_FACING;
+ mCall.getVideoSettings().setCameraDir(cameraDir);
+ videoCall.setCamera(cameraId);
+ videoCall.requestCameraCapabilities();
+ }
+ }
+
+
+ /**
+ * Stop or start client's video transmission.
+ * @param pause True if pausing the local user's video, or false if starting the local user's
+ * video.
+ */
+ public void pauseVideoClicked(boolean pause) {
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+
+ if (pause) {
+ videoCall.setCamera(null);
+ VideoProfile videoProfile = new VideoProfile(
+ mCall.getVideoState() & ~VideoProfile.STATE_TX_ENABLED);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ } else {
+ InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+ videoCall.setCamera(cameraManager.getActiveCameraId());
+ VideoProfile videoProfile = new VideoProfile(
+ mCall.getVideoState() | VideoProfile.STATE_TX_ENABLED);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ mCall.setSessionModificationState(Call.SessionModificationState.WAITING_FOR_RESPONSE);
+ }
+ getUi().setVideoPaused(pause);
+ }
+
+ private void updateUi(InCallState state, Call call) {
+ Log.d(this, "Updating call UI for call: ", call);
+
+ final CallButtonUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ final boolean isEnabled =
+ state.isConnectingOrConnected() &&!state.isIncoming() && call != null;
+ ui.setEnabled(isEnabled);
+
+ if (call == null) {
+ return;
+ }
+
+ updateButtonsState(call);
+ }
+
+ /**
+ * Updates the buttons applicable for the UI.
+ *
+ * @param call The active call.
+ */
+ private void updateButtonsState(Call call) {
+ Log.v(this, "updateButtonsState");
+ final CallButtonUi ui = getUi();
+
+ final boolean isVideo = VideoUtils.isVideoCall(call);
+
+ // Common functionality (audio, hold, etc).
+ // Show either HOLD or SWAP, but not both. If neither HOLD or SWAP is available:
+ // (1) If the device normally can hold, show HOLD in a disabled state.
+ // (2) If the device doesn't have the concept of hold/swap, remove the button.
+ final boolean showSwap = call.can(
+ android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE);
+ final boolean showHold = !showSwap
+ && call.can(android.telecom.Call.Details.CAPABILITY_SUPPORT_HOLD)
+ && call.can(android.telecom.Call.Details.CAPABILITY_HOLD);
+ final boolean isCallOnHold = call.getState() == Call.State.ONHOLD;
+
+ final boolean showAddCall = TelecomAdapter.getInstance().canAddCall(call)
+ && UserManagerCompat.isUserUnlocked(ui.getContext());
+ final boolean showMerge = call.can(
+ android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE);
+ final boolean showUpgradeToVideo = !isVideo && hasVideoCallCapabilities(call);
+ final boolean showDowngradeToAudio = isVideo && isDowngradeToAudioSupported(call);
+ final boolean showMute = call.can(android.telecom.Call.Details.CAPABILITY_MUTE);
+
+ ui.showButton(BUTTON_AUDIO, true);
+ ui.showButton(BUTTON_SWAP, showSwap);
+ ui.showButton(BUTTON_HOLD, showHold);
+ ui.setHold(isCallOnHold);
+ ui.showButton(BUTTON_MUTE, showMute);
+ ui.showButton(BUTTON_ADD_CALL, showAddCall);
+ ui.showButton(BUTTON_UPGRADE_TO_VIDEO, showUpgradeToVideo);
+ ui.showButton(BUTTON_DOWNGRADE_TO_AUDIO, showDowngradeToAudio);
+ ui.showButton(BUTTON_SWITCH_CAMERA, isVideo);
+ ui.showButton(BUTTON_PAUSE_VIDEO, isVideo);
+ ui.showButton(BUTTON_DIALPAD, true);
+ ui.showButton(BUTTON_MERGE, showMerge);
+
+ ui.updateButtonStates();
+ }
+
+ private boolean hasVideoCallCapabilities(Call call) {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ return call.can(android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX)
+ && call.can(android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_RX);
+ }
+ // In L, this single flag represents both video transmitting and receiving capabilities
+ return call.can(android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX);
+ }
+
+ /**
+ * Determines if downgrading from a video call to an audio-only call is supported. In order to
+ * support downgrade to audio, the SDK version must be >= N and the call should NOT have the
+ * {@link android.telecom.Call.Details#CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO}.
+ * @param call The call.
+ * @return {@code true} if downgrading to an audio-only call from a video call is supported.
+ */
+ private boolean isDowngradeToAudioSupported(Call call) {
+ return !call.can(CallSdkCompat.Details.CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO);
+ }
+
+ public void refreshMuteState() {
+ // Restore the previous mute state
+ if (mAutomaticallyMuted &&
+ AudioModeProvider.getInstance().getMute() != mPreviousMuteState) {
+ if (getUi() == null) {
+ return;
+ }
+ muteClicked(mPreviousMuteState);
+ }
+ mAutomaticallyMuted = false;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_AUTOMATICALLY_MUTED, mAutomaticallyMuted);
+ outState.putBoolean(KEY_PREVIOUS_MUTE_STATE, mPreviousMuteState);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ mAutomaticallyMuted =
+ savedInstanceState.getBoolean(KEY_AUTOMATICALLY_MUTED, mAutomaticallyMuted);
+ mPreviousMuteState =
+ savedInstanceState.getBoolean(KEY_PREVIOUS_MUTE_STATE, mPreviousMuteState);
+ super.onRestoreInstanceState(savedInstanceState);
+ }
+
+ public interface CallButtonUi extends Ui {
+ void showButton(int buttonId, boolean show);
+ void enableButton(int buttonId, boolean enable);
+ void setEnabled(boolean on);
+ void setMute(boolean on);
+ void setHold(boolean on);
+ void setCameraSwitched(boolean isBackFacingCamera);
+ void setVideoPaused(boolean isPaused);
+ void setAudio(int mode);
+ void setSupportedAudio(int mask);
+ void displayDialpad(boolean on, boolean animate);
+ boolean isDialpadVisible();
+
+ /**
+ * Once showButton() has been called on each of the individual buttons in the UI, call
+ * this to configure the overflow menu appropriately.
+ */
+ void updateButtonStates();
+ Context getContext();
+ }
+
+ @Override
+ public void onActiveCameraSelectionChanged(boolean isUsingFrontFacingCamera) {
+ if (getUi() == null) {
+ return;
+ }
+ getUi().setCameraSwitched(!isUsingFrontFacingCamera);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
new file mode 100644
index 0000000..1a9f283
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -0,0 +1,1467 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Trace;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+import android.telecom.DisconnectCause;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnLayoutChangeListener;
+import android.view.ViewGroup;
+import android.view.ViewPropertyAnimator;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.contacts.common.widget.FloatingActionButtonController;
+import com.android.phone.common.animation.AnimUtils;
+
+import java.util.List;
+
+/**
+ * Fragment for call card.
+ */
+public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPresenter.CallCardUi>
+ implements CallCardPresenter.CallCardUi {
+ private static final String TAG = "CallCardFragment";
+
+ /**
+ * Internal class which represents the call state label which is to be applied.
+ */
+ private class CallStateLabel {
+ private CharSequence mCallStateLabel;
+ private boolean mIsAutoDismissing;
+
+ public CallStateLabel(CharSequence callStateLabel, boolean isAutoDismissing) {
+ mCallStateLabel = callStateLabel;
+ mIsAutoDismissing = isAutoDismissing;
+ }
+
+ public CharSequence getCallStateLabel() {
+ return mCallStateLabel;
+ }
+
+ /**
+ * Determines if the call state label should auto-dismiss.
+ *
+ * @return {@code true} if the call state label should auto-dismiss.
+ */
+ public boolean isAutoDismissing() {
+ return mIsAutoDismissing;
+ }
+ };
+
+ private static final String IS_DIALPAD_SHOWING_KEY = "is_dialpad_showing";
+
+ /**
+ * The duration of time (in milliseconds) a call state label should remain visible before
+ * resetting to its previous value.
+ */
+ private static final long CALL_STATE_LABEL_RESET_DELAY_MS = 3000;
+ /**
+ * Amount of time to wait before sending an announcement via the accessibility manager.
+ * When the call state changes to an outgoing or incoming state for the first time, the
+ * UI can often be changing due to call updates or contact lookup. This allows the UI
+ * to settle to a stable state to ensure that the correct information is announced.
+ */
+ private static final long ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS = 500;
+
+ private AnimatorSet mAnimatorSet;
+ private int mShrinkAnimationDuration;
+ private int mFabNormalDiameter;
+ private int mFabSmallDiameter;
+ private boolean mIsLandscape;
+ private boolean mIsDialpadShowing;
+
+ // Primary caller info
+ private TextView mPhoneNumber;
+ private TextView mNumberLabel;
+ private TextView mPrimaryName;
+ private View mCallStateButton;
+ private ImageView mCallStateIcon;
+ private ImageView mCallStateVideoCallIcon;
+ private TextView mCallStateLabel;
+ private TextView mCallTypeLabel;
+ private ImageView mHdAudioIcon;
+ private ImageView mForwardIcon;
+ private View mCallNumberAndLabel;
+ private TextView mElapsedTime;
+ private Drawable mPrimaryPhotoDrawable;
+ private TextView mCallSubject;
+ private ImageView mWorkProfileIcon;
+
+ // Container view that houses the entire primary call card, including the call buttons
+ private View mPrimaryCallCardContainer;
+ // Container view that houses the primary call information
+ private ViewGroup mPrimaryCallInfo;
+ private View mCallButtonsContainer;
+ private ImageView mPhotoSmall;
+
+ // Secondary caller info
+ private View mSecondaryCallInfo;
+ private TextView mSecondaryCallName;
+ private View mSecondaryCallProviderInfo;
+ private TextView mSecondaryCallProviderLabel;
+ private View mSecondaryCallConferenceCallIcon;
+ private View mSecondaryCallVideoCallIcon;
+ private View mProgressSpinner;
+
+ // Call card content
+ private View mCallCardContent;
+ private ImageView mPhotoLarge;
+ private View mContactContext;
+ private TextView mContactContextTitle;
+ private ListView mContactContextListView;
+ private LinearLayout mContactContextListHeaders;
+
+ private View mManageConferenceCallButton;
+
+ // Dark number info bar
+ private TextView mInCallMessageLabel;
+
+ private FloatingActionButtonController mFloatingActionButtonController;
+ private View mFloatingActionButtonContainer;
+ private ImageButton mFloatingActionButton;
+ private int mFloatingActionButtonVerticalOffset;
+
+ private float mTranslationOffset;
+ private Animation mPulseAnimation;
+
+ private int mVideoAnimationDuration;
+ // Whether or not the call card is currently in the process of an animation
+ private boolean mIsAnimating;
+
+ private MaterialPalette mCurrentThemeColors;
+
+ /**
+ * Call state label to set when an auto-dismissing call state label is dismissed.
+ */
+ private CharSequence mPostResetCallStateLabel;
+ private boolean mCallStateLabelResetPending = false;
+ private Handler mHandler;
+
+ /**
+ * Determines if secondary call info is populated in the secondary call info UI.
+ */
+ private boolean mHasSecondaryCallInfo = false;
+
+ @Override
+ public CallCardPresenter.CallCardUi getUi() {
+ return this;
+ }
+
+ @Override
+ public CallCardPresenter createPresenter() {
+ return new CallCardPresenter();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mHandler = new Handler(Looper.getMainLooper());
+ mShrinkAnimationDuration = getResources().getInteger(R.integer.shrink_animation_duration);
+ mVideoAnimationDuration = getResources().getInteger(R.integer.video_animation_duration);
+ mFloatingActionButtonVerticalOffset = getResources().getDimensionPixelOffset(
+ R.dimen.floating_action_button_vertical_offset);
+ mFabNormalDiameter = getResources().getDimensionPixelOffset(
+ R.dimen.end_call_floating_action_button_diameter);
+ mFabSmallDiameter = getResources().getDimensionPixelOffset(
+ R.dimen.end_call_floating_action_button_small_diameter);
+
+ if (savedInstanceState != null) {
+ mIsDialpadShowing = savedInstanceState.getBoolean(IS_DIALPAD_SHOWING_KEY, false);
+ }
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ final CallList calls = CallList.getInstance();
+ final Call call = calls.getFirstCall();
+ getPresenter().init(getActivity(), call);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(IS_DIALPAD_SHOWING_KEY, mIsDialpadShowing);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ Trace.beginSection(TAG + " onCreate");
+ mTranslationOffset =
+ getResources().getDimensionPixelSize(R.dimen.call_card_anim_translate_y_offset);
+ final View view = inflater.inflate(R.layout.call_card_fragment, container, false);
+ Trace.endSection();
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ mPulseAnimation =
+ AnimationUtils.loadAnimation(view.getContext(), R.anim.call_status_pulse);
+
+ mPhoneNumber = (TextView) view.findViewById(R.id.phoneNumber);
+ mPrimaryName = (TextView) view.findViewById(R.id.name);
+ mNumberLabel = (TextView) view.findViewById(R.id.label);
+ mSecondaryCallInfo = view.findViewById(R.id.secondary_call_info);
+ mSecondaryCallProviderInfo = view.findViewById(R.id.secondary_call_provider_info);
+ mCallCardContent = view.findViewById(R.id.call_card_content);
+ mPhotoLarge = (ImageView) view.findViewById(R.id.photoLarge);
+ mPhotoLarge.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().onContactPhotoClick();
+ }
+ });
+
+ mContactContext = view.findViewById(R.id.contact_context);
+ mContactContextTitle = (TextView) view.findViewById(R.id.contactContextTitle);
+ mContactContextListView = (ListView) view.findViewById(R.id.contactContextInfo);
+ // This layout stores all the list header layouts so they can be easily removed.
+ mContactContextListHeaders = new LinearLayout(getView().getContext());
+ mContactContextListView.addHeaderView(mContactContextListHeaders);
+
+ mCallStateIcon = (ImageView) view.findViewById(R.id.callStateIcon);
+ mCallStateVideoCallIcon = (ImageView) view.findViewById(R.id.videoCallIcon);
+ mWorkProfileIcon = (ImageView) view.findViewById(R.id.workProfileIcon);
+ mCallStateLabel = (TextView) view.findViewById(R.id.callStateLabel);
+ mHdAudioIcon = (ImageView) view.findViewById(R.id.hdAudioIcon);
+ mForwardIcon = (ImageView) view.findViewById(R.id.forwardIcon);
+ mCallNumberAndLabel = view.findViewById(R.id.labelAndNumber);
+ mCallTypeLabel = (TextView) view.findViewById(R.id.callTypeLabel);
+ mElapsedTime = (TextView) view.findViewById(R.id.elapsedTime);
+ mPrimaryCallCardContainer = view.findViewById(R.id.primary_call_info_container);
+ mPrimaryCallInfo = (ViewGroup) view.findViewById(R.id.primary_call_banner);
+ mCallButtonsContainer = view.findViewById(R.id.callButtonFragment);
+ mPhotoSmall = (ImageView) view.findViewById(R.id.photoSmall);
+ mPhotoSmall.setVisibility(View.GONE);
+ mInCallMessageLabel = (TextView) view.findViewById(R.id.connectionServiceMessage);
+ mProgressSpinner = view.findViewById(R.id.progressSpinner);
+
+ mFloatingActionButtonContainer = view.findViewById(
+ R.id.floating_end_call_action_button_container);
+ mFloatingActionButton = (ImageButton) view.findViewById(
+ R.id.floating_end_call_action_button);
+ mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().endCallClicked();
+ }
+ });
+ mFloatingActionButtonController = new FloatingActionButtonController(getActivity(),
+ mFloatingActionButtonContainer, mFloatingActionButton);
+
+ mSecondaryCallInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().secondaryInfoClicked();
+ updateFabPositionForSecondaryCallInfo();
+ }
+ });
+
+ mCallStateButton = view.findViewById(R.id.callStateButton);
+ mCallStateButton.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ getPresenter().onCallStateButtonTouched();
+ return false;
+ }
+ });
+
+ mManageConferenceCallButton = view.findViewById(R.id.manage_conference_call_button);
+ mManageConferenceCallButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ InCallActivity activity = (InCallActivity) getActivity();
+ activity.showConferenceFragment(true);
+ }
+ });
+
+ mPrimaryName.setElegantTextHeight(false);
+ mCallStateLabel.setElegantTextHeight(false);
+ mCallSubject = (TextView) view.findViewById(R.id.callSubject);
+ }
+
+ @Override
+ public void setVisible(boolean on) {
+ if (on) {
+ getView().setVisibility(View.VISIBLE);
+ } else {
+ getView().setVisibility(View.INVISIBLE);
+ }
+ }
+
+ /**
+ * Hides or shows the progress spinner.
+ *
+ * @param visible {@code True} if the progress spinner should be visible.
+ */
+ @Override
+ public void setProgressSpinnerVisible(boolean visible) {
+ mProgressSpinner.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void setContactContextTitle(View headerView) {
+ mContactContextListHeaders.removeAllViews();
+ mContactContextListHeaders.addView(headerView);
+ }
+
+ @Override
+ public void setContactContextContent(ListAdapter listAdapter) {
+ mContactContextListView.setAdapter(listAdapter);
+ }
+
+ @Override
+ public void showContactContext(boolean show) {
+ showImageView(mPhotoLarge, !show);
+ showImageView(mPhotoSmall, show);
+ mPrimaryCallCardContainer.setElevation(
+ show ? 0 : getResources().getDimension(R.dimen.primary_call_elevation));
+ mContactContext.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Sets the visibility of the primary call card.
+ * Ensures that when the primary call card is hidden, the video surface slides over to fill the
+ * entire screen.
+ *
+ * @param visible {@code True} if the primary call card should be visible.
+ */
+ @Override
+ public void setCallCardVisible(final boolean visible) {
+ Log.v(this, "setCallCardVisible : isVisible = " + visible);
+ // When animating the hide/show of the views in a landscape layout, we need to take into
+ // account whether we are in a left-to-right locale or a right-to-left locale and adjust
+ // the animations accordingly.
+ final boolean isLayoutRtl = InCallPresenter.isRtl();
+
+ // Retrieve here since at fragment creation time the incoming video view is not inflated.
+ final View videoView = getView().findViewById(R.id.incomingVideo);
+ if (videoView == null) {
+ return;
+ }
+
+ // Determine how much space there is below or to the side of the call card.
+ final float spaceBesideCallCard = getSpaceBesideCallCard();
+
+ // We need to translate the video surface, but we need to know its position after the layout
+ // has occurred so use a {@code ViewTreeObserver}.
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+ observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ // We don't want to continue getting called.
+ getView().getViewTreeObserver().removeOnPreDrawListener(this);
+
+ float videoViewTranslation = 0f;
+
+ // Translate the call card to its pre-animation state.
+ if (!mIsLandscape) {
+ mPrimaryCallCardContainer.setTranslationY(visible ?
+ -mPrimaryCallCardContainer.getHeight() : 0);
+
+ ViewGroup.LayoutParams p = videoView.getLayoutParams();
+ videoViewTranslation = p.height / 2 - spaceBesideCallCard / 2;
+ }
+
+ // Perform animation of video view.
+ ViewPropertyAnimator videoViewAnimator = videoView.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mVideoAnimationDuration);
+ if (mIsLandscape) {
+ videoViewAnimator
+ .translationX(visible ? videoViewTranslation : 0);
+ } else {
+ videoViewAnimator
+ .translationY(visible ? videoViewTranslation : 0);
+ }
+ videoViewAnimator.start();
+
+ // Animate the call card sliding.
+ ViewPropertyAnimator callCardAnimator = mPrimaryCallCardContainer.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mVideoAnimationDuration)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ if (!visible) {
+ mPrimaryCallCardContainer.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ super.onAnimationStart(animation);
+ if (visible) {
+ mPrimaryCallCardContainer.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+
+ if (mIsLandscape) {
+ float translationX = mPrimaryCallCardContainer.getWidth();
+ translationX *= isLayoutRtl ? 1 : -1;
+ callCardAnimator
+ .translationX(visible ? 0 : translationX)
+ .start();
+ } else {
+ callCardAnimator
+ .translationY(visible ? 0 : -mPrimaryCallCardContainer.getHeight())
+ .start();
+ }
+
+ return true;
+ }
+ });
+ }
+
+ /**
+ * Determines the amount of space below the call card for portrait layouts), or beside the
+ * call card for landscape layouts.
+ *
+ * @return The amount of space below or beside the call card.
+ */
+ public float getSpaceBesideCallCard() {
+ if (mIsLandscape) {
+ return getView().getWidth() - mPrimaryCallCardContainer.getWidth();
+ } else {
+ final int callCardHeight;
+ // Retrieve the actual height of the call card, independent of whether or not the
+ // outgoing call animation is in progress. The animation does not run in landscape mode
+ // so this only needs to be done for portrait.
+ if (mPrimaryCallCardContainer.getTag(R.id.view_tag_callcard_actual_height) != null) {
+ callCardHeight = (int) mPrimaryCallCardContainer.getTag(
+ R.id.view_tag_callcard_actual_height);
+ } else {
+ callCardHeight = mPrimaryCallCardContainer.getHeight();
+ }
+ return getView().getHeight() - callCardHeight;
+ }
+ }
+
+ @Override
+ public void setPrimaryName(String name, boolean nameIsNumber) {
+ if (TextUtils.isEmpty(name)) {
+ mPrimaryName.setText(null);
+ } else {
+ mPrimaryName.setText(nameIsNumber
+ ? PhoneNumberUtilsCompat.createTtsSpannable(name)
+ : name);
+
+ // Set direction of the name field
+ int nameDirection = View.TEXT_DIRECTION_INHERIT;
+ if (nameIsNumber) {
+ nameDirection = View.TEXT_DIRECTION_LTR;
+ }
+ mPrimaryName.setTextDirection(nameDirection);
+ }
+ }
+
+ /**
+ * Sets the primary image for the contact photo.
+ *
+ * @param image The drawable to set.
+ * @param isVisible Whether the contact photo should be visible after being set.
+ */
+ @Override
+ public void setPrimaryImage(Drawable image, boolean isVisible) {
+ if (image != null) {
+ setDrawableToImageViews(image);
+ showImageView(mPhotoLarge, isVisible);
+ }
+ }
+
+ @Override
+ public void setPrimaryPhoneNumber(String number) {
+ // Set the number
+ if (TextUtils.isEmpty(number)) {
+ mPhoneNumber.setText(null);
+ mPhoneNumber.setVisibility(View.GONE);
+ } else {
+ mPhoneNumber.setText(PhoneNumberUtilsCompat.createTtsSpannable(number));
+ mPhoneNumber.setVisibility(View.VISIBLE);
+ mPhoneNumber.setTextDirection(View.TEXT_DIRECTION_LTR);
+ }
+ }
+
+ @Override
+ public void setPrimaryLabel(String label) {
+ if (!TextUtils.isEmpty(label)) {
+ mNumberLabel.setText(label);
+ mNumberLabel.setVisibility(View.VISIBLE);
+ } else {
+ mNumberLabel.setVisibility(View.GONE);
+ }
+
+ }
+
+ /**
+ * Sets the primary caller information.
+ *
+ * @param number The caller phone number.
+ * @param name The caller name.
+ * @param nameIsNumber {@code true} if the name should be shown in place of the phone number.
+ * @param label The label.
+ * @param photo The contact photo drawable.
+ * @param isSipCall {@code true} if this is a SIP call.
+ * @param isContactPhotoShown {@code true} if the contact photo should be shown (it will be
+ * updated even if it is not shown).
+ * @param isWorkCall Whether the call is placed through a work phone account or caller is a work
+ contact.
+ */
+ @Override
+ public void setPrimary(String number, String name, boolean nameIsNumber, String label,
+ Drawable photo, boolean isSipCall, boolean isContactPhotoShown, boolean isWorkCall) {
+ Log.d(this, "Setting primary call");
+ // set the name field.
+ setPrimaryName(name, nameIsNumber);
+
+ if (TextUtils.isEmpty(number) && TextUtils.isEmpty(label)) {
+ mCallNumberAndLabel.setVisibility(View.GONE);
+ mElapsedTime.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
+ } else {
+ mCallNumberAndLabel.setVisibility(View.VISIBLE);
+ mElapsedTime.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
+ }
+
+ setPrimaryPhoneNumber(number);
+
+ // Set the label (Mobile, Work, etc)
+ setPrimaryLabel(label);
+
+ showInternetCallLabel(isSipCall);
+
+ setDrawableToImageViews(photo);
+ showImageView(mPhotoLarge, isContactPhotoShown);
+ showImageView(mWorkProfileIcon, isWorkCall);
+ }
+
+ @Override
+ public void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
+ String providerLabel, boolean isConference, boolean isVideoCall, boolean isFullscreen) {
+
+ if (show) {
+ mHasSecondaryCallInfo = true;
+ boolean hasProvider = !TextUtils.isEmpty(providerLabel);
+ initializeSecondaryCallInfo(hasProvider);
+
+ // Do not show the secondary caller info in fullscreen mode, but ensure it is populated
+ // in case fullscreen mode is exited in the future.
+ setSecondaryInfoVisible(!isFullscreen);
+
+ mSecondaryCallConferenceCallIcon.setVisibility(isConference ? View.VISIBLE : View.GONE);
+ mSecondaryCallVideoCallIcon.setVisibility(isVideoCall ? View.VISIBLE : View.GONE);
+
+ mSecondaryCallName.setText(nameIsNumber
+ ? PhoneNumberUtilsCompat.createTtsSpannable(name)
+ : name);
+ if (hasProvider) {
+ mSecondaryCallProviderLabel.setText(providerLabel);
+ }
+
+ int nameDirection = View.TEXT_DIRECTION_INHERIT;
+ if (nameIsNumber) {
+ nameDirection = View.TEXT_DIRECTION_LTR;
+ }
+ mSecondaryCallName.setTextDirection(nameDirection);
+ } else {
+ mHasSecondaryCallInfo = false;
+ setSecondaryInfoVisible(false);
+ }
+ }
+
+ /**
+ * Sets the visibility of the secondary caller info box. Note, if the {@code visible} parameter
+ * is passed in {@code true}, and there is no secondary caller info populated (as determined by
+ * {@code mHasSecondaryCallInfo}, the secondary caller info box will not be shown.
+ *
+ * @param visible {@code true} if the secondary caller info should be shown, {@code false}
+ * otherwise.
+ */
+ @Override
+ public void setSecondaryInfoVisible(final boolean visible) {
+ boolean wasVisible = mSecondaryCallInfo.isShown();
+ final boolean isVisible = visible && mHasSecondaryCallInfo;
+ Log.v(this, "setSecondaryInfoVisible: wasVisible = " + wasVisible + " isVisible = "
+ + isVisible);
+
+ // If visibility didn't change, nothing to do.
+ if (wasVisible == isVisible) {
+ return;
+ }
+
+ // If we are showing the secondary info, we need to show it before animating so that its
+ // height will be determined on layout.
+ if (isVisible) {
+ mSecondaryCallInfo.setVisibility(View.VISIBLE);
+ }
+
+ updateFabPositionForSecondaryCallInfo();
+ // We need to translate the secondary caller info, but we need to know its position after
+ // the layout has occurred so use a {@code ViewTreeObserver}.
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+
+ observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ // We don't want to continue getting called.
+ getView().getViewTreeObserver().removeOnPreDrawListener(this);
+
+ // Get the height of the secondary call info now, and then re-hide the view prior
+ // to doing the actual animation.
+ int secondaryHeight = mSecondaryCallInfo.getHeight();
+ if (isVisible) {
+ mSecondaryCallInfo.setVisibility(View.GONE);
+ }
+ Log.v(this, "setSecondaryInfoVisible: secondaryHeight = " + secondaryHeight);
+
+ // Set the position of the secondary call info card to its starting location.
+ mSecondaryCallInfo.setTranslationY(visible ? secondaryHeight : 0);
+
+ // Animate the secondary card info slide up/down as it appears and disappears.
+ ViewPropertyAnimator secondaryInfoAnimator = mSecondaryCallInfo.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mVideoAnimationDuration)
+ .translationY(isVisible ? 0 : secondaryHeight)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!isVisible) {
+ mSecondaryCallInfo.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ if (isVisible) {
+ mSecondaryCallInfo.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ secondaryInfoAnimator.start();
+
+ // Notify listeners of a change in the visibility of the secondary info. This is
+ // important when in a video call so that the video call presenter can shift the
+ // video preview up or down to accommodate the secondary caller info.
+ InCallPresenter.getInstance().notifySecondaryCallerInfoVisibilityChanged(visible,
+ secondaryHeight);
+
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void setCallState(
+ int state,
+ int videoState,
+ int sessionModificationState,
+ DisconnectCause disconnectCause,
+ String connectionLabel,
+ Drawable callStateIcon,
+ String gatewayNumber,
+ boolean isWifi,
+ boolean isConference,
+ boolean isWorkCall) {
+ boolean isGatewayCall = !TextUtils.isEmpty(gatewayNumber);
+ CallStateLabel callStateLabel = getCallStateLabelFromState(state, videoState,
+ sessionModificationState, disconnectCause, connectionLabel, isGatewayCall, isWifi,
+ isConference, isWorkCall);
+
+ Log.v(this, "setCallState " + callStateLabel.getCallStateLabel());
+ Log.v(this, "AutoDismiss " + callStateLabel.isAutoDismissing());
+ Log.v(this, "DisconnectCause " + disconnectCause.toString());
+ Log.v(this, "gateway " + connectionLabel + gatewayNumber);
+
+ // Check for video state change and update the visibility of the contact photo. The contact
+ // photo is hidden when the incoming video surface is shown.
+ // The contact photo visibility can also change in setPrimary().
+ boolean showContactPhoto = !VideoCallPresenter.showIncomingVideo(videoState, state);
+ mPhotoLarge.setVisibility(showContactPhoto ? View.VISIBLE : View.GONE);
+
+ // Check if the call subject is showing -- if it is, we want to bypass showing the call
+ // state.
+ boolean isSubjectShowing = mCallSubject.getVisibility() == View.VISIBLE;
+
+ if (TextUtils.equals(callStateLabel.getCallStateLabel(), mCallStateLabel.getText()) &&
+ !isSubjectShowing) {
+ // Nothing to do if the labels are the same
+ if (state == Call.State.ACTIVE || state == Call.State.CONFERENCED) {
+ mCallStateLabel.clearAnimation();
+ mCallStateIcon.clearAnimation();
+ }
+ return;
+ }
+
+ if (isSubjectShowing) {
+ changeCallStateLabel(null);
+ callStateIcon = null;
+ } else {
+ // Update the call state label and icon.
+ setCallStateLabel(callStateLabel);
+ }
+
+ if (!TextUtils.isEmpty(callStateLabel.getCallStateLabel())) {
+ if (state == Call.State.ACTIVE || state == Call.State.CONFERENCED) {
+ mCallStateLabel.clearAnimation();
+ } else {
+ mCallStateLabel.startAnimation(mPulseAnimation);
+ }
+ } else {
+ mCallStateLabel.clearAnimation();
+ }
+
+ if (callStateIcon != null) {
+ mCallStateIcon.setVisibility(View.VISIBLE);
+ // Invoke setAlpha(float) instead of setAlpha(int) to set the view's alpha. This is
+ // needed because the pulse animation operates on the view alpha.
+ mCallStateIcon.setAlpha(1.0f);
+ mCallStateIcon.setImageDrawable(callStateIcon);
+
+ if (state == Call.State.ACTIVE || state == Call.State.CONFERENCED
+ || TextUtils.isEmpty(callStateLabel.getCallStateLabel())) {
+ mCallStateIcon.clearAnimation();
+ } else {
+ mCallStateIcon.startAnimation(mPulseAnimation);
+ }
+
+ if (callStateIcon instanceof AnimationDrawable) {
+ ((AnimationDrawable) callStateIcon).start();
+ }
+ } else {
+ mCallStateIcon.clearAnimation();
+
+ // Invoke setAlpha(float) instead of setAlpha(int) to set the view's alpha. This is
+ // needed because the pulse animation operates on the view alpha.
+ mCallStateIcon.setAlpha(0.0f);
+ mCallStateIcon.setVisibility(View.GONE);
+ }
+
+ if (VideoUtils.isVideoCall(videoState)
+ || (state == Call.State.ACTIVE && sessionModificationState
+ == Call.SessionModificationState.WAITING_FOR_RESPONSE)) {
+ mCallStateVideoCallIcon.setVisibility(View.VISIBLE);
+ } else {
+ mCallStateVideoCallIcon.setVisibility(View.GONE);
+ }
+ }
+
+ private void setCallStateLabel(CallStateLabel callStateLabel) {
+ Log.v(this, "setCallStateLabel : label = " + callStateLabel.getCallStateLabel());
+
+ if (callStateLabel.isAutoDismissing()) {
+ mCallStateLabelResetPending = true;
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Log.v(this, "restoringCallStateLabel : label = " +
+ mPostResetCallStateLabel);
+ changeCallStateLabel(mPostResetCallStateLabel);
+ mCallStateLabelResetPending = false;
+ }
+ }, CALL_STATE_LABEL_RESET_DELAY_MS);
+
+ changeCallStateLabel(callStateLabel.getCallStateLabel());
+ } else {
+ // Keep track of the current call state label; used when resetting auto dismissing
+ // call state labels.
+ mPostResetCallStateLabel = callStateLabel.getCallStateLabel();
+
+ if (!mCallStateLabelResetPending) {
+ changeCallStateLabel(callStateLabel.getCallStateLabel());
+ }
+ }
+ }
+
+ private void changeCallStateLabel(CharSequence callStateLabel) {
+ Log.v(this, "changeCallStateLabel : label = " + callStateLabel);
+ if (!TextUtils.isEmpty(callStateLabel)) {
+ mCallStateLabel.setText(callStateLabel);
+ mCallStateLabel.setAlpha(1);
+ mCallStateLabel.setVisibility(View.VISIBLE);
+ } else {
+ Animation callStateLabelAnimation = mCallStateLabel.getAnimation();
+ if (callStateLabelAnimation != null) {
+ callStateLabelAnimation.cancel();
+ }
+ mCallStateLabel.setText(null);
+ mCallStateLabel.setAlpha(0);
+ mCallStateLabel.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void setCallbackNumber(String callbackNumber, boolean isEmergencyCall) {
+ if (mInCallMessageLabel == null) {
+ return;
+ }
+
+ if (TextUtils.isEmpty(callbackNumber)) {
+ mInCallMessageLabel.setVisibility(View.GONE);
+ return;
+ }
+
+ // TODO: The new Locale-specific methods don't seem to be working. Revisit this.
+ callbackNumber = PhoneNumberUtils.formatNumber(callbackNumber);
+
+ int stringResourceId = isEmergencyCall ? R.string.card_title_callback_number_emergency
+ : R.string.card_title_callback_number;
+
+ String text = getString(stringResourceId, callbackNumber);
+ mInCallMessageLabel.setText(text);
+
+ mInCallMessageLabel.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * Sets and shows the call subject if it is not empty. Hides the call subject otherwise.
+ *
+ * @param callSubject The call subject.
+ */
+ @Override
+ public void setCallSubject(String callSubject) {
+ boolean showSubject = !TextUtils.isEmpty(callSubject);
+
+ mCallSubject.setVisibility(showSubject ? View.VISIBLE : View.GONE);
+ if (showSubject) {
+ mCallSubject.setText(callSubject);
+ } else {
+ mCallSubject.setText(null);
+ }
+ }
+
+ public boolean isAnimating() {
+ return mIsAnimating;
+ }
+
+ private void showInternetCallLabel(boolean show) {
+ if (show) {
+ final String label = getView().getContext().getString(
+ R.string.incall_call_type_label_sip);
+ mCallTypeLabel.setVisibility(View.VISIBLE);
+ mCallTypeLabel.setText(label);
+ } else {
+ mCallTypeLabel.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void setPrimaryCallElapsedTime(boolean show, long duration) {
+ if (show) {
+ if (mElapsedTime.getVisibility() != View.VISIBLE) {
+ AnimUtils.fadeIn(mElapsedTime, AnimUtils.DEFAULT_DURATION);
+ }
+ String callTimeElapsed = DateUtils.formatElapsedTime(duration / 1000);
+ mElapsedTime.setText(callTimeElapsed);
+
+ String durationDescription =
+ InCallDateUtils.formatDuration(getView().getContext(), duration);
+ mElapsedTime.setContentDescription(
+ !TextUtils.isEmpty(durationDescription) ? durationDescription : null);
+ } else {
+ // hide() animation has no effect if it is already hidden.
+ AnimUtils.fadeOut(mElapsedTime, AnimUtils.DEFAULT_DURATION);
+ }
+ }
+
+ /**
+ * Set all the ImageViews to the same photo. Currently there are 2 photo views: the large one
+ * (which fills about the bottom half of the screen) and the small one, which displays as a
+ * circle next to the primary contact info. This method does not handle whether the ImageView
+ * is shown or not.
+ *
+ * @param photo The photo to set for the image views.
+ */
+ private void setDrawableToImageViews(Drawable photo) {
+ if (photo == null) {
+ photo = ContactInfoCache.getInstance(getView().getContext())
+ .getDefaultContactPhotoDrawable();
+ }
+
+ if (mPrimaryPhotoDrawable == photo){
+ return;
+ }
+ mPrimaryPhotoDrawable = photo;
+
+ mPhotoLarge.setImageDrawable(photo);
+
+ // Modify the drawable to be round for the smaller ImageView.
+ Bitmap bitmap = drawableToBitmap(photo);
+ if (bitmap != null) {
+ final RoundedBitmapDrawable drawable =
+ RoundedBitmapDrawableFactory.create(getResources(), bitmap);
+ drawable.setAntiAlias(true);
+ drawable.setCornerRadius(bitmap.getHeight() / 2);
+ photo = drawable;
+ }
+ mPhotoSmall.setImageDrawable(photo);
+ }
+
+ /**
+ * Helper method for image view to handle animations.
+ *
+ * @param view The image view to show or hide.
+ * @param isVisible {@code true} if we want to show the image, {@code false} to hide it.
+ */
+ private void showImageView(ImageView view, boolean isVisible) {
+ if (view.getDrawable() == null) {
+ if (isVisible) {
+ AnimUtils.fadeIn(mElapsedTime, AnimUtils.DEFAULT_DURATION);
+ }
+ } else {
+ // Cross fading is buggy and not noticeable due to the multiple calls to this method
+ // that switch drawables in the middle of the cross-fade animations. Just show the
+ // photo directly instead.
+ view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ /**
+ * Converts a drawable into a bitmap.
+ *
+ * @param drawable the drawable to be converted.
+ */
+ public static Bitmap drawableToBitmap(Drawable drawable) {
+ Bitmap bitmap;
+ if (drawable instanceof BitmapDrawable) {
+ bitmap = ((BitmapDrawable) drawable).getBitmap();
+ } else {
+ if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
+ // Needed for drawables that are just a colour.
+ bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ } else {
+ bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+ drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+ }
+
+ Log.i(TAG, "Created bitmap with width " + bitmap.getWidth() + ", height "
+ + bitmap.getHeight());
+
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ }
+ return bitmap;
+ }
+
+ /**
+ * Gets the call state label based on the state of the call or cause of disconnect.
+ *
+ * Additional labels are applied as follows:
+ * 1. All outgoing calls with display "Calling via [Provider]".
+ * 2. Ongoing calls will display the name of the provider.
+ * 3. Incoming calls will only display "Incoming via..." for accounts.
+ * 4. Video calls, and session modification states (eg. requesting video).
+ * 5. Incoming and active Wi-Fi calls will show label provided by hint.
+ *
+ * TODO: Move this to the CallCardPresenter.
+ */
+ private CallStateLabel getCallStateLabelFromState(int state, int videoState,
+ int sessionModificationState, DisconnectCause disconnectCause, String label,
+ boolean isGatewayCall, boolean isWifi, boolean isConference, boolean isWorkCall) {
+ final Context context = getView().getContext();
+ CharSequence callStateLabel = null; // Label to display as part of the call banner
+
+ boolean hasSuggestedLabel = label != null;
+ boolean isAccount = hasSuggestedLabel && !isGatewayCall;
+ boolean isAutoDismissing = false;
+
+ switch (state) {
+ case Call.State.IDLE:
+ // "Call state" is meaningless in this state.
+ break;
+ case Call.State.ACTIVE:
+ // We normally don't show a "call state label" at all in this state
+ // (but we can use the call state label to display the provider name).
+ if ((isAccount || isWifi || isConference) && hasSuggestedLabel) {
+ callStateLabel = label;
+ } else if (sessionModificationState
+ == Call.SessionModificationState.REQUEST_REJECTED) {
+ callStateLabel = context.getString(R.string.card_title_video_call_rejected);
+ isAutoDismissing = true;
+ } else if (sessionModificationState
+ == Call.SessionModificationState.REQUEST_FAILED) {
+ callStateLabel = context.getString(R.string.card_title_video_call_error);
+ isAutoDismissing = true;
+ } else if (sessionModificationState
+ == Call.SessionModificationState.WAITING_FOR_RESPONSE) {
+ callStateLabel = context.getString(R.string.card_title_video_call_requesting);
+ } else if (sessionModificationState
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ callStateLabel = context.getString(R.string.card_title_video_call_requesting);
+ } else if (VideoUtils.isVideoCall(videoState)) {
+ callStateLabel = context.getString(R.string.card_title_video_call);
+ }
+ break;
+ case Call.State.ONHOLD:
+ callStateLabel = context.getString(R.string.card_title_on_hold);
+ break;
+ case Call.State.CONNECTING:
+ case Call.State.DIALING:
+ if (hasSuggestedLabel && !isWifi) {
+ callStateLabel = context.getString(R.string.calling_via_template, label);
+ } else {
+ callStateLabel = context.getString(R.string.card_title_dialing);
+ }
+ break;
+ case Call.State.REDIALING:
+ callStateLabel = context.getString(R.string.card_title_redialing);
+ break;
+ case Call.State.INCOMING:
+ case Call.State.CALL_WAITING:
+ if (isWifi && hasSuggestedLabel) {
+ callStateLabel = label;
+ } else if (isAccount) {
+ callStateLabel = context.getString(R.string.incoming_via_template, label);
+ } else if (VideoUtils.isVideoCall(videoState)) {
+ callStateLabel = context.getString(R.string.notification_incoming_video_call);
+ } else {
+ callStateLabel =
+ context.getString(isWorkCall ? R.string.card_title_incoming_work_call
+ : R.string.card_title_incoming_call);
+ }
+ break;
+ case Call.State.DISCONNECTING:
+ // While in the DISCONNECTING state we display a "Hanging up"
+ // message in order to make the UI feel more responsive. (In
+ // GSM it's normal to see a delay of a couple of seconds while
+ // negotiating the disconnect with the network, so the "Hanging
+ // up" state at least lets the user know that we're doing
+ // something. This state is currently not used with CDMA.)
+ callStateLabel = context.getString(R.string.card_title_hanging_up);
+ break;
+ case Call.State.DISCONNECTED:
+ callStateLabel = disconnectCause.getLabel();
+ if (TextUtils.isEmpty(callStateLabel)) {
+ callStateLabel = context.getString(R.string.card_title_call_ended);
+ }
+ break;
+ case Call.State.CONFERENCED:
+ callStateLabel = context.getString(R.string.card_title_conf_call);
+ break;
+ default:
+ Log.wtf(this, "updateCallStateWidgets: unexpected call: " + state);
+ }
+ return new CallStateLabel(callStateLabel, isAutoDismissing);
+ }
+
+ private void initializeSecondaryCallInfo(boolean hasProvider) {
+ // mSecondaryCallName is initialized here (vs. onViewCreated) because it is inaccessible
+ // until mSecondaryCallInfo is inflated in the call above.
+ if (mSecondaryCallName == null) {
+ mSecondaryCallName = (TextView) getView().findViewById(R.id.secondaryCallName);
+ mSecondaryCallConferenceCallIcon =
+ getView().findViewById(R.id.secondaryCallConferenceCallIcon);
+ mSecondaryCallVideoCallIcon =
+ getView().findViewById(R.id.secondaryCallVideoCallIcon);
+ }
+
+ if (mSecondaryCallProviderLabel == null && hasProvider) {
+ mSecondaryCallProviderInfo.setVisibility(View.VISIBLE);
+ mSecondaryCallProviderLabel = (TextView) getView()
+ .findViewById(R.id.secondaryCallProviderLabel);
+ }
+ }
+
+ public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (event.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) {
+ dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+ dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+ dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+ dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+ return;
+ }
+ dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+ dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+ dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+ dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+ dispatchPopulateAccessibilityEvent(event, mSecondaryCallName);
+ dispatchPopulateAccessibilityEvent(event, mSecondaryCallProviderLabel);
+
+ return;
+ }
+
+ @Override
+ public void sendAccessibilityAnnouncement() {
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (getView() != null && getView().getParent() != null) {
+ AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_ANNOUNCEMENT);
+ dispatchPopulateAccessibilityEvent(event);
+ getView().getParent().requestSendAccessibilityEvent(getView(), event);
+ }
+ }
+ }, ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS);
+ }
+
+ @Override
+ public void setEndCallButtonEnabled(boolean enabled, boolean animate) {
+ if (enabled != mFloatingActionButton.isEnabled()) {
+ if (animate) {
+ if (enabled) {
+ mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY);
+ } else {
+ mFloatingActionButtonController.scaleOut();
+ }
+ } else {
+ if (enabled) {
+ mFloatingActionButtonContainer.setScaleX(1);
+ mFloatingActionButtonContainer.setScaleY(1);
+ mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
+ } else {
+ mFloatingActionButtonContainer.setVisibility(View.GONE);
+ }
+ }
+ mFloatingActionButton.setEnabled(enabled);
+ updateFabPosition();
+ }
+ }
+
+ /**
+ * Changes the visibility of the HD audio icon.
+ *
+ * @param visible {@code true} if the UI should show the HD audio icon.
+ */
+ @Override
+ public void showHdAudioIndicator(boolean visible) {
+ mHdAudioIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Changes the visibility of the forward icon.
+ *
+ * @param visible {@code true} if the UI should show the forward icon.
+ */
+ @Override
+ public void showForwardIndicator(boolean visible) {
+ mForwardIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+
+ /**
+ * Changes the visibility of the "manage conference call" button.
+ *
+ * @param visible Whether to set the button to be visible or not.
+ */
+ @Override
+ public void showManageConferenceCallButton(boolean visible) {
+ mManageConferenceCallButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Determines the current visibility of the manage conference button.
+ *
+ * @return {@code true} if the button is visible.
+ */
+ @Override
+ public boolean isManageConferenceVisible() {
+ return mManageConferenceCallButton.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Determines the current visibility of the call subject.
+ *
+ * @return {@code true} if the subject is visible.
+ */
+ @Override
+ public boolean isCallSubjectVisible() {
+ return mCallSubject.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Get the overall InCallUI background colors and apply to call card.
+ */
+ public void updateColors() {
+ MaterialPalette themeColors = InCallPresenter.getInstance().getThemeColors();
+
+ if (mCurrentThemeColors != null && mCurrentThemeColors.equals(themeColors)) {
+ return;
+ }
+
+ if (getResources().getBoolean(R.bool.is_layout_landscape)) {
+ final GradientDrawable drawable =
+ (GradientDrawable) mPrimaryCallCardContainer.getBackground();
+ drawable.setColor(themeColors.mPrimaryColor);
+ } else {
+ mPrimaryCallCardContainer.setBackgroundColor(themeColors.mPrimaryColor);
+ }
+ mCallButtonsContainer.setBackgroundColor(themeColors.mPrimaryColor);
+ mCallSubject.setTextColor(themeColors.mPrimaryColor);
+ mContactContext.setBackgroundColor(themeColors.mPrimaryColor);
+ //TODO: set color of message text in call context "recent messages" to be the theme color.
+
+ mCurrentThemeColors = themeColors;
+ }
+
+ private void dispatchPopulateAccessibilityEvent(AccessibilityEvent event, View view) {
+ if (view == null) return;
+ final List<CharSequence> eventText = event.getText();
+ int size = eventText.size();
+ view.dispatchPopulateAccessibilityEvent(event);
+ // if no text added write null to keep relative position
+ if (size == eventText.size()) {
+ eventText.add(null);
+ }
+ }
+
+ @Override
+ public void animateForNewOutgoingCall() {
+ final ViewGroup parent = (ViewGroup) mPrimaryCallCardContainer.getParent();
+
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+
+ mIsAnimating = true;
+
+ observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+ if (!observer.isAlive()) {
+ return;
+ }
+ observer.removeOnGlobalLayoutListener(this);
+
+ final LayoutIgnoringListener listener = new LayoutIgnoringListener();
+ mPrimaryCallCardContainer.addOnLayoutChangeListener(listener);
+
+ // Prepare the state of views before the slide animation
+ final int originalHeight = mPrimaryCallCardContainer.getHeight();
+ mPrimaryCallCardContainer.setTag(R.id.view_tag_callcard_actual_height,
+ originalHeight);
+ mPrimaryCallCardContainer.setBottom(parent.getHeight());
+
+ // Set up FAB.
+ mFloatingActionButtonContainer.setVisibility(View.GONE);
+ mFloatingActionButtonController.setScreenWidth(parent.getWidth());
+
+ mCallButtonsContainer.setAlpha(0);
+ mCallStateLabel.setAlpha(0);
+ mPrimaryName.setAlpha(0);
+ mCallTypeLabel.setAlpha(0);
+ mCallNumberAndLabel.setAlpha(0);
+
+ assignTranslateAnimation(mCallStateLabel, 1);
+ assignTranslateAnimation(mCallStateIcon, 1);
+ assignTranslateAnimation(mPrimaryName, 2);
+ assignTranslateAnimation(mCallNumberAndLabel, 3);
+ assignTranslateAnimation(mCallTypeLabel, 4);
+ assignTranslateAnimation(mCallButtonsContainer, 5);
+
+ final Animator animator = getShrinkAnimator(parent.getHeight(), originalHeight);
+
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mPrimaryCallCardContainer.setTag(R.id.view_tag_callcard_actual_height,
+ null);
+ setViewStatePostAnimation(listener);
+ mIsAnimating = false;
+ InCallPresenter.getInstance().onShrinkAnimationComplete();
+ }
+ });
+ animator.start();
+ }
+ });
+ }
+
+ @Override
+ public void showNoteSentToast() {
+ Toast.makeText(getContext(), R.string.note_sent, Toast.LENGTH_LONG).show();
+ }
+
+ public void onDialpadVisibilityChange(boolean isShown) {
+ mIsDialpadShowing = isShown;
+ updateFabPosition();
+ }
+
+ private void updateFabPosition() {
+ int offsetY = 0;
+ if (!mIsDialpadShowing) {
+ offsetY = mFloatingActionButtonVerticalOffset;
+ if (mSecondaryCallInfo.isShown()) {
+ offsetY -= mSecondaryCallInfo.getHeight();
+ }
+ }
+
+ mFloatingActionButtonController.align(
+ FloatingActionButtonController.ALIGN_MIDDLE,
+ 0 /* offsetX */,
+ offsetY,
+ true);
+
+ mFloatingActionButtonController.resize(
+ mIsDialpadShowing ? mFabSmallDiameter : mFabNormalDiameter, true);
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // If the previous launch animation is still running, cancel it so that we don't get
+ // stuck in an intermediate animation state.
+ if (mAnimatorSet != null && mAnimatorSet.isRunning()) {
+ mAnimatorSet.cancel();
+ }
+
+ mIsLandscape = getResources().getBoolean(R.bool.is_layout_landscape);
+
+ final ViewGroup parent = ((ViewGroup) mPrimaryCallCardContainer.getParent());
+ final ViewTreeObserver observer = parent.getViewTreeObserver();
+ parent.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ ViewTreeObserver viewTreeObserver = observer;
+ if (!viewTreeObserver.isAlive()) {
+ viewTreeObserver = parent.getViewTreeObserver();
+ }
+ viewTreeObserver.removeOnGlobalLayoutListener(this);
+ mFloatingActionButtonController.setScreenWidth(parent.getWidth());
+ updateFabPosition();
+ }
+ });
+
+ updateColors();
+ }
+
+ /**
+ * Adds a global layout listener to update the FAB's positioning on the next layout. This allows
+ * us to position the FAB after the secondary call info's height has been calculated.
+ */
+ private void updateFabPositionForSecondaryCallInfo() {
+ mSecondaryCallInfo.getViewTreeObserver().addOnGlobalLayoutListener(
+ new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ final ViewTreeObserver observer = mSecondaryCallInfo.getViewTreeObserver();
+ if (!observer.isAlive()) {
+ return;
+ }
+ observer.removeOnGlobalLayoutListener(this);
+
+ onDialpadVisibilityChange(mIsDialpadShowing);
+ }
+ });
+ }
+
+ /**
+ * Animator that performs the upwards shrinking animation of the blue call card scrim.
+ * At the start of the animation, each child view is moved downwards by a pre-specified amount
+ * and then translated upwards together with the scrim.
+ */
+ private Animator getShrinkAnimator(int startHeight, int endHeight) {
+ final ObjectAnimator shrinkAnimator =
+ ObjectAnimator.ofInt(mPrimaryCallCardContainer, "bottom", startHeight, endHeight);
+ shrinkAnimator.setDuration(mShrinkAnimationDuration);
+ shrinkAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mFloatingActionButton.setEnabled(true);
+ }
+ });
+ shrinkAnimator.setInterpolator(AnimUtils.EASE_IN);
+ return shrinkAnimator;
+ }
+
+ private void assignTranslateAnimation(View view, int offset) {
+ view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ view.buildLayer();
+ view.setTranslationY(mTranslationOffset * offset);
+ view.animate().translationY(0).alpha(1).withLayer()
+ .setDuration(mShrinkAnimationDuration).setInterpolator(AnimUtils.EASE_IN);
+ }
+
+ private void setViewStatePostAnimation(View view) {
+ view.setTranslationY(0);
+ view.setAlpha(1);
+ }
+
+ private void setViewStatePostAnimation(OnLayoutChangeListener layoutChangeListener) {
+ setViewStatePostAnimation(mCallButtonsContainer);
+ setViewStatePostAnimation(mCallStateLabel);
+ setViewStatePostAnimation(mPrimaryName);
+ setViewStatePostAnimation(mCallTypeLabel);
+ setViewStatePostAnimation(mCallNumberAndLabel);
+ setViewStatePostAnimation(mCallStateIcon);
+
+ mPrimaryCallCardContainer.removeOnLayoutChangeListener(layoutChangeListener);
+
+ mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY);
+ }
+
+ private final class LayoutIgnoringListener implements View.OnLayoutChangeListener {
+ @Override
+ public void onLayoutChange(View v,
+ int left,
+ int top,
+ int right,
+ int bottom,
+ int oldLeft,
+ int oldTop,
+ int oldRight,
+ int oldBottom) {
+ v.setLeft(oldLeft);
+ v.setRight(oldRight);
+ v.setTop(oldTop);
+ v.setBottom(oldBottom);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
new file mode 100644
index 0000000..7749118
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -0,0 +1,1146 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.telecom.Call.Details;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.ListAdapter;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.incallui.Call.State;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallEventListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+import com.android.incallui.compat.telecom.DetailsCompat;
+import com.android.incalluibind.ObjectFactory;
+
+import java.lang.ref.WeakReference;
+
+import static com.android.contacts.common.compat.CallSdkCompat.Details.PROPERTY_WORK_CALL;
+/**
+ * Presenter for the Call Card Fragment.
+ * <p>
+ * This class listens for changes to InCallState and passes it along to the fragment.
+ */
+public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
+ implements InCallStateListener, IncomingCallListener, InCallDetailsListener,
+ InCallEventListener, CallList.CallUpdateListener, DistanceHelper.Listener {
+
+ public interface EmergencyCallListener {
+ public void onCallUpdated(BaseFragment fragment, boolean isEmergency);
+ }
+
+ private static final String TAG = CallCardPresenter.class.getSimpleName();
+ private static final long CALL_TIME_UPDATE_INTERVAL_MS = 1000;
+
+ private final EmergencyCallListener mEmergencyCallListener =
+ ObjectFactory.newEmergencyCallListener();
+ private DistanceHelper mDistanceHelper;
+
+ private Call mPrimary;
+ private Call mSecondary;
+ private ContactCacheEntry mPrimaryContactInfo;
+ private ContactCacheEntry mSecondaryContactInfo;
+ private CallTimer mCallTimer;
+ private Context mContext;
+ @Nullable private ContactsPreferences mContactsPreferences;
+ private boolean mSpinnerShowing = false;
+ private boolean mHasShownToast = false;
+ private InCallContactInteractions mInCallContactInteractions;
+ private boolean mIsFullscreen = false;
+
+ public static class ContactLookupCallback implements ContactInfoCacheCallback {
+ private final WeakReference<CallCardPresenter> mCallCardPresenter;
+ private final boolean mIsPrimary;
+
+ public ContactLookupCallback(CallCardPresenter callCardPresenter, boolean isPrimary) {
+ mCallCardPresenter = new WeakReference<CallCardPresenter>(callCardPresenter);
+ mIsPrimary = isPrimary;
+ }
+
+ @Override
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onContactInfoComplete(callId, entry, mIsPrimary);
+ }
+ }
+
+ @Override
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onImageLoadComplete(callId, entry);
+ }
+ }
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onContactInteractionsInfoComplete(callId, entry);
+ }
+ }
+ }
+
+ public CallCardPresenter() {
+ // create the call timer
+ mCallTimer = new CallTimer(new Runnable() {
+ @Override
+ public void run() {
+ updateCallTime();
+ }
+ });
+ }
+
+ public void init(Context context, Call call) {
+ mContext = Preconditions.checkNotNull(context);
+ mDistanceHelper = ObjectFactory.newDistanceHelper(mContext, this);
+ mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+
+ // Call may be null if disconnect happened already.
+ if (call != null) {
+ mPrimary = call;
+ if (shouldShowNoteSentToast(mPrimary)) {
+ final CallCardUi ui = getUi();
+ if (ui != null) {
+ ui.showNoteSentToast();
+ }
+ }
+ CallList.getInstance().addCallUpdateListener(call.getId(), this);
+
+ // start processing lookups right away.
+ if (!call.isConferenceCall()) {
+ startContactInfoSearch(call, true, call.getState() == Call.State.INCOMING);
+ } else {
+ updateContactEntry(null, true);
+ }
+ }
+
+ onStateChange(null, InCallPresenter.getInstance().getInCallState(), CallList.getInstance());
+ }
+
+ @Override
+ public void onUiReady(CallCardUi ui) {
+ super.onUiReady(ui);
+
+ if (mContactsPreferences != null) {
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ }
+
+ // Contact search may have completed before ui is ready.
+ if (mPrimaryContactInfo != null) {
+ updatePrimaryDisplayInfo();
+ }
+
+ // Register for call state changes last
+ InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
+ InCallPresenter.getInstance().addDetailsListener(this);
+ InCallPresenter.getInstance().addInCallEventListener(this);
+ }
+
+ @Override
+ public void onUiUnready(CallCardUi ui) {
+ super.onUiUnready(ui);
+
+ // stop getting call state changes
+ InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ InCallPresenter.getInstance().removeDetailsListener(this);
+ InCallPresenter.getInstance().removeInCallEventListener(this);
+ if (mPrimary != null) {
+ CallList.getInstance().removeCallUpdateListener(mPrimary.getId(), this);
+ }
+
+ if (mDistanceHelper != null) {
+ mDistanceHelper.cleanUp();
+ }
+
+ mPrimary = null;
+ mPrimaryContactInfo = null;
+ mSecondaryContactInfo = null;
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ // same logic should happen as with onStateChange()
+ onStateChange(oldState, newState, CallList.getInstance());
+ }
+
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ Log.d(this, "onStateChange() " + newState);
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ Call primary = null;
+ Call secondary = null;
+
+ if (newState == InCallState.INCOMING) {
+ primary = callList.getIncomingCall();
+ } else if (newState == InCallState.PENDING_OUTGOING || newState == InCallState.OUTGOING) {
+ primary = callList.getOutgoingCall();
+ if (primary == null) {
+ primary = callList.getPendingOutgoingCall();
+ }
+
+ // getCallToDisplay doesn't go through outgoing or incoming calls. It will return the
+ // highest priority call to display as the secondary call.
+ secondary = getCallToDisplay(callList, null, true);
+ } else if (newState == InCallState.INCALL) {
+ primary = getCallToDisplay(callList, null, false);
+ secondary = getCallToDisplay(callList, primary, true);
+ }
+
+ if (mInCallContactInteractions != null &&
+ (oldState == InCallState.INCOMING || newState == InCallState.INCOMING)) {
+ ui.showContactContext(newState != InCallState.INCOMING);
+ }
+
+ Log.d(this, "Primary call: " + primary);
+ Log.d(this, "Secondary call: " + secondary);
+
+ final boolean primaryChanged = !(Call.areSame(mPrimary, primary) &&
+ Call.areSameNumber(mPrimary, primary));
+ final boolean secondaryChanged = !(Call.areSame(mSecondary, secondary) &&
+ Call.areSameNumber(mSecondary, secondary));
+ final boolean shouldShowCallSubject = shouldShowCallSubject(mPrimary);
+
+ mSecondary = secondary;
+ Call previousPrimary = mPrimary;
+ mPrimary = primary;
+
+ if (primaryChanged && shouldShowNoteSentToast(primary)) {
+ ui.showNoteSentToast();
+ }
+
+ // Refresh primary call information if either:
+ // 1. Primary call changed.
+ // 2. The call's ability to manage conference has changed.
+ if (mPrimary != null && (primaryChanged ||
+ ui.isManageConferenceVisible() != shouldShowManageConference()) ||
+ ui.isCallSubjectVisible() != shouldShowCallSubject) {
+ // primary call has changed
+ if (previousPrimary != null) {
+ //clear progess spinner (if any) related to previous primary call
+ maybeShowProgressSpinner(previousPrimary.getState(),
+ Call.SessionModificationState.NO_REQUEST);
+ CallList.getInstance().removeCallUpdateListener(previousPrimary.getId(), this);
+ }
+ CallList.getInstance().addCallUpdateListener(mPrimary.getId(), this);
+
+ mPrimaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext, mPrimary,
+ mPrimary.getState() == Call.State.INCOMING);
+ updatePrimaryDisplayInfo();
+ maybeStartSearch(mPrimary, true);
+ mPrimary.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+
+ if (previousPrimary != null && mPrimary == null) {
+ //clear progess spinner (if any) related to previous primary call
+ maybeShowProgressSpinner(previousPrimary.getState(),
+ Call.SessionModificationState.NO_REQUEST);
+ CallList.getInstance().removeCallUpdateListener(previousPrimary.getId(), this);
+ }
+
+ if (mSecondary == null) {
+ // Secondary call may have ended. Update the ui.
+ mSecondaryContactInfo = null;
+ updateSecondaryDisplayInfo();
+ } else if (secondaryChanged) {
+ // secondary call has changed
+ mSecondaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext, mSecondary,
+ mSecondary.getState() == Call.State.INCOMING);
+ updateSecondaryDisplayInfo();
+ maybeStartSearch(mSecondary, false);
+ mSecondary.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+
+ // Start/stop timers.
+ if (isPrimaryCallActive()) {
+ Log.d(this, "Starting the calltime timer");
+ mCallTimer.start(CALL_TIME_UPDATE_INTERVAL_MS);
+ } else {
+ Log.d(this, "Canceling the calltime timer");
+ mCallTimer.cancel();
+ ui.setPrimaryCallElapsedTime(false, 0);
+ }
+
+ // Set the call state
+ int callState = Call.State.IDLE;
+ if (mPrimary != null) {
+ callState = mPrimary.getState();
+ updatePrimaryCallState();
+ } else {
+ getUi().setCallState(
+ callState,
+ VideoProfile.STATE_AUDIO_ONLY,
+ Call.SessionModificationState.NO_REQUEST,
+ new DisconnectCause(DisconnectCause.UNKNOWN),
+ null,
+ null,
+ null,
+ false /* isWifi */,
+ false /* isConference */,
+ false /* isWorkCall */);
+ getUi().showHdAudioIndicator(false);
+ }
+
+ maybeShowManageConferenceCallButton();
+
+ // Hide the end call button instantly if we're receiving an incoming call.
+ getUi().setEndCallButtonEnabled(shouldShowEndCallButton(mPrimary, callState),
+ callState != Call.State.INCOMING /* animate */);
+
+ maybeSendAccessibilityEvent(oldState, newState);
+ }
+
+ @Override
+ public void onDetailsChanged(Call call, Details details) {
+ updatePrimaryCallState();
+
+ if (call.can(Details.CAPABILITY_MANAGE_CONFERENCE) !=
+ DetailsCompat.can(details, Details.CAPABILITY_MANAGE_CONFERENCE)) {
+ maybeShowManageConferenceCallButton();
+ }
+ }
+
+ @Override
+ public void onCallChanged(Call call) {
+ // No-op; specific call updates handled elsewhere.
+ }
+
+ /**
+ * Handles a change to the session modification state for a call. Triggers showing the progress
+ * spinner, as well as updating the call state label.
+ *
+ * @param sessionModificationState The new session modification state.
+ */
+ @Override
+ public void onSessionModificationStateChange(int sessionModificationState) {
+ Log.d(this, "onSessionModificationStateChange : sessionModificationState = " +
+ sessionModificationState);
+
+ if (mPrimary == null) {
+ return;
+ }
+ maybeShowProgressSpinner(mPrimary.getState(), sessionModificationState);
+ getUi().setEndCallButtonEnabled(sessionModificationState !=
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST,
+ true /* shouldAnimate */);
+ updatePrimaryCallState();
+ }
+
+ /**
+ * Handles a change to the last forwarding number by refreshing the primary call info.
+ */
+ @Override
+ public void onLastForwardedNumberChange() {
+ Log.v(this, "onLastForwardedNumberChange");
+
+ if (mPrimary == null) {
+ return;
+ }
+ updatePrimaryDisplayInfo();
+ }
+
+ /**
+ * Handles a change to the child number by refreshing the primary call info.
+ */
+ @Override
+ public void onChildNumberChange() {
+ Log.v(this, "onChildNumberChange");
+
+ if (mPrimary == null) {
+ return;
+ }
+ updatePrimaryDisplayInfo();
+ }
+
+ private String getSubscriptionNumber() {
+ // If it's an emergency call, and they're not populating the callback number,
+ // then try to fall back to the phone sub info (to hopefully get the SIM's
+ // number directly from the telephony layer).
+ PhoneAccountHandle accountHandle = mPrimary.getAccountHandle();
+ if (accountHandle != null) {
+ TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+ PhoneAccount account = TelecomManagerCompat.getPhoneAccount(mgr, accountHandle);
+ if (account != null) {
+ return getNumberFromHandle(account.getSubscriptionAddress());
+ }
+ }
+ return null;
+ }
+
+ private void updatePrimaryCallState() {
+ if (getUi() != null && mPrimary != null) {
+ boolean isWorkCall = mPrimary.hasProperty(PROPERTY_WORK_CALL)
+ || (mPrimaryContactInfo == null ? false
+ : mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
+ getUi().setCallState(
+ mPrimary.getState(),
+ mPrimary.getVideoState(),
+ mPrimary.getSessionModificationState(),
+ mPrimary.getDisconnectCause(),
+ getConnectionLabel(),
+ getCallStateIcon(),
+ getGatewayNumber(),
+ mPrimary.hasProperty(Details.PROPERTY_WIFI),
+ mPrimary.isConferenceCall(),
+ isWorkCall);
+
+ maybeShowHdAudioIcon();
+ setCallbackNumber();
+ }
+ }
+
+ /**
+ * Show the HD icon if the call is active and has {@link Details#PROPERTY_HIGH_DEF_AUDIO},
+ * except if the call has a last forwarded number (we will show that icon instead).
+ */
+ private void maybeShowHdAudioIcon() {
+ boolean showHdAudioIndicator =
+ isPrimaryCallActive() && mPrimary.hasProperty(Details.PROPERTY_HIGH_DEF_AUDIO) &&
+ TextUtils.isEmpty(mPrimary.getLastForwardedNumber());
+ getUi().showHdAudioIndicator(showHdAudioIndicator);
+ }
+
+ /**
+ * Only show the conference call button if we can manage the conference.
+ */
+ private void maybeShowManageConferenceCallButton() {
+ getUi().showManageConferenceCallButton(shouldShowManageConference());
+ }
+
+ /**
+ * Determines if a pending session modification exists for the current call. If so, the
+ * progress spinner is shown, and the call state is updated.
+ *
+ * @param callState The call state.
+ * @param sessionModificationState The session modification state.
+ */
+ private void maybeShowProgressSpinner(int callState, int sessionModificationState) {
+ final boolean show = sessionModificationState ==
+ Call.SessionModificationState.WAITING_FOR_RESPONSE
+ && callState == Call.State.ACTIVE;
+ if (show != mSpinnerShowing) {
+ getUi().setProgressSpinnerVisible(show);
+ mSpinnerShowing = show;
+ }
+ }
+
+ /**
+ * Determines if the manage conference button should be visible, based on the current primary
+ * call.
+ *
+ * @return {@code True} if the manage conference button should be visible.
+ */
+ private boolean shouldShowManageConference() {
+ if (mPrimary == null) {
+ return false;
+ }
+
+ return mPrimary.can(android.telecom.Call.Details.CAPABILITY_MANAGE_CONFERENCE)
+ && !mPrimary.isVideoCall(mContext);
+ }
+
+ private void setCallbackNumber() {
+ String callbackNumber = null;
+
+ // Show the emergency callback number if either:
+ // 1. This is an emergency call.
+ // 2. The phone is in Emergency Callback Mode, which means we should show the callback
+ // number.
+ boolean showCallbackNumber = mPrimary.hasProperty(Details.PROPERTY_EMERGENCY_CALLBACK_MODE);
+
+ if (mPrimary.isEmergencyCall() || showCallbackNumber) {
+ callbackNumber = getSubscriptionNumber();
+ } else {
+ StatusHints statusHints = mPrimary.getTelecomCall().getDetails().getStatusHints();
+ if (statusHints != null) {
+ Bundle extras = statusHints.getExtras();
+ if (extras != null) {
+ callbackNumber = extras.getString(TelecomManager.EXTRA_CALL_BACK_NUMBER);
+ }
+ }
+ }
+
+ final String simNumber = TelecomManagerCompat.getLine1Number(
+ InCallPresenter.getInstance().getTelecomManager(),
+ InCallPresenter.getInstance().getTelephonyManager(),
+ mPrimary.getAccountHandle());
+ if (!showCallbackNumber && PhoneNumberUtils.compare(callbackNumber, simNumber)) {
+ Log.d(this, "Numbers are the same (and callback number is not being forced to show);" +
+ " not showing the callback number");
+ callbackNumber = null;
+ }
+
+ getUi().setCallbackNumber(callbackNumber, mPrimary.isEmergencyCall() || showCallbackNumber);
+ }
+
+ public void updateCallTime() {
+ final CallCardUi ui = getUi();
+
+ if (ui == null) {
+ mCallTimer.cancel();
+ } else if (!isPrimaryCallActive()) {
+ ui.setPrimaryCallElapsedTime(false, 0);
+ mCallTimer.cancel();
+ } else {
+ final long callStart = mPrimary.getConnectTimeMillis();
+ final long duration = System.currentTimeMillis() - callStart;
+ ui.setPrimaryCallElapsedTime(true, duration);
+ }
+ }
+
+ public void onCallStateButtonTouched() {
+ Intent broadcastIntent = ObjectFactory.getCallStateButtonBroadcastIntent(mContext);
+ if (broadcastIntent != null) {
+ Log.d(this, "Sending call state button broadcast: ", broadcastIntent);
+ mContext.sendBroadcast(broadcastIntent, Manifest.permission.READ_PHONE_STATE);
+ }
+ }
+
+ /**
+ * Handles click on the contact photo by toggling fullscreen mode if the current call is a video
+ * call.
+ */
+ public void onContactPhotoClick() {
+ if (mPrimary != null && mPrimary.isVideoCall(mContext)) {
+ InCallPresenter.getInstance().toggleFullscreenMode();
+ }
+ }
+
+ private void maybeStartSearch(Call call, boolean isPrimary) {
+ // no need to start search for conference calls which show generic info.
+ if (call != null && !call.isConferenceCall()) {
+ startContactInfoSearch(call, isPrimary, call.getState() == Call.State.INCOMING);
+ }
+ }
+
+ /**
+ * Starts a query for more contact data for the save primary and secondary calls.
+ */
+ private void startContactInfoSearch(final Call call, final boolean isPrimary,
+ boolean isIncoming) {
+ final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+
+ cache.findInfo(call, isIncoming, new ContactLookupCallback(this, isPrimary));
+ }
+
+ private void onContactInfoComplete(String callId, ContactCacheEntry entry, boolean isPrimary) {
+ final boolean entryMatchesExistingCall =
+ (isPrimary && mPrimary != null && TextUtils.equals(callId, mPrimary.getId())) ||
+ (!isPrimary && mSecondary != null && TextUtils.equals(callId, mSecondary.getId()));
+ if (entryMatchesExistingCall) {
+ updateContactEntry(entry, isPrimary);
+ } else {
+ Log.w(this, "Dropping stale contact lookup info for " + callId);
+ }
+
+ final Call call = CallList.getInstance().getCallById(callId);
+ if (call != null) {
+ call.getLogState().contactLookupResult = entry.contactLookupResult;
+ }
+ if (entry.contactUri != null) {
+ CallerInfoUtils.sendViewNotification(mContext, entry.contactUri);
+ }
+ }
+
+ private void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ if (getUi() == null) {
+ return;
+ }
+
+ if (entry.photo != null) {
+ if (mPrimary != null && callId.equals(mPrimary.getId())) {
+ boolean showContactPhoto = !VideoCallPresenter.showIncomingVideo(
+ mPrimary.getVideoState(), mPrimary.getState());
+ getUi().setPrimaryImage(entry.photo, showContactPhoto);
+ }
+ }
+ }
+
+ private void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {
+ if (getUi() == null) {
+ return;
+ }
+
+ if (mPrimary != null && callId.equals(mPrimary.getId())) {
+ mPrimaryContactInfo.locationAddress = entry.locationAddress;
+ updateContactInteractions();
+ }
+ }
+
+ @Override
+ public void onLocationReady() {
+ // This will only update the contacts interactions data if the location returns after
+ // the contact information is found.
+ updateContactInteractions();
+ }
+
+ private void updateContactInteractions() {
+ if (mPrimary != null && mPrimaryContactInfo != null
+ && (mPrimaryContactInfo.locationAddress != null
+ || mPrimaryContactInfo.openingHours != null)) {
+ // TODO: This is hardcoded to "isBusiness" because functionality to differentiate
+ // between business and personal has not yet been added.
+ if (setInCallContactInteractionsType(true /* isBusiness */)) {
+ getUi().setContactContextTitle(
+ mInCallContactInteractions.getBusinessListHeaderView());
+ }
+
+ mInCallContactInteractions.setBusinessInfo(
+ mPrimaryContactInfo.locationAddress,
+ mDistanceHelper.calculateDistance(mPrimaryContactInfo.locationAddress),
+ mPrimaryContactInfo.openingHours);
+ getUi().setContactContextContent(mInCallContactInteractions.getListAdapter());
+ getUi().showContactContext(mPrimary.getState() != State.INCOMING);
+ } else {
+ getUi().showContactContext(false);
+ }
+ }
+
+ /**
+ * Update the contact interactions type so that the correct UI is shown.
+ *
+ * @param isBusiness {@code true} if the interaction is a business interaction, {@code false} if
+ * it is a personal contact.
+ *
+ * @return {@code true} if this is a new type of contact interaction (business or personal).
+ * {@code false} if it hasn't changed.
+ */
+ private boolean setInCallContactInteractionsType(boolean isBusiness) {
+ if (mInCallContactInteractions == null) {
+ mInCallContactInteractions =
+ new InCallContactInteractions(mContext, isBusiness);
+ return true;
+ }
+
+ return mInCallContactInteractions.switchContactType(isBusiness);
+ }
+
+ private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary) {
+ if (isPrimary) {
+ mPrimaryContactInfo = entry;
+ updatePrimaryDisplayInfo();
+ } else {
+ mSecondaryContactInfo = entry;
+ updateSecondaryDisplayInfo();
+ }
+ }
+
+ /**
+ * Get the highest priority call to display.
+ * Goes through the calls and chooses which to return based on priority of which type of call
+ * to display to the user. Callers can use the "ignore" feature to get the second best call
+ * by passing a previously found primary call as ignore.
+ *
+ * @param ignore A call to ignore if found.
+ */
+ private Call getCallToDisplay(CallList callList, Call ignore, boolean skipDisconnected) {
+ // Active calls come second. An active call always gets precedent.
+ Call retval = callList.getActiveCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+
+ // Disconnected calls get primary position if there are no active calls
+ // to let user know quickly what call has disconnected. Disconnected
+ // calls are very short lived.
+ if (!skipDisconnected) {
+ retval = callList.getDisconnectingCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+ retval = callList.getDisconnectedCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+ }
+
+ // Then we go to background call (calls on hold)
+ retval = callList.getBackgroundCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+
+ // Lastly, we go to a second background call.
+ retval = callList.getSecondBackgroundCall();
+
+ return retval;
+ }
+
+ private void updatePrimaryDisplayInfo() {
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ // TODO: May also occur if search result comes back after ui is destroyed. Look into
+ // removing that case completely.
+ Log.d(TAG, "updatePrimaryDisplayInfo called but ui is null!");
+ return;
+ }
+
+ if (mPrimary == null) {
+ // Clear the primary display info.
+ ui.setPrimary(null, null, false, null, null, false, false, false);
+ return;
+ }
+
+ // Hide the contact photo if we are in a video call and the incoming video surface is
+ // showing.
+ boolean showContactPhoto = !VideoCallPresenter
+ .showIncomingVideo(mPrimary.getVideoState(), mPrimary.getState());
+
+ // Call placed through a work phone account.
+ boolean hasWorkCallProperty = mPrimary.hasProperty(PROPERTY_WORK_CALL);
+
+ if (mPrimary.isConferenceCall()) {
+ Log.d(TAG, "Update primary display info for conference call.");
+
+ ui.setPrimary(
+ null /* number */,
+ getConferenceString(mPrimary),
+ false /* nameIsNumber */,
+ null /* label */,
+ getConferencePhoto(mPrimary),
+ false /* isSipCall */,
+ showContactPhoto,
+ hasWorkCallProperty);
+ } else if (mPrimaryContactInfo != null) {
+ Log.d(TAG, "Update primary display info for " + mPrimaryContactInfo);
+
+ String name = getNameForCall(mPrimaryContactInfo);
+ String number;
+
+ boolean isChildNumberShown = !TextUtils.isEmpty(mPrimary.getChildNumber());
+ boolean isForwardedNumberShown = !TextUtils.isEmpty(mPrimary.getLastForwardedNumber());
+ boolean isCallSubjectShown = shouldShowCallSubject(mPrimary);
+
+ if (isCallSubjectShown) {
+ ui.setCallSubject(mPrimary.getCallSubject());
+ } else {
+ ui.setCallSubject(null);
+ }
+
+ if (isCallSubjectShown) {
+ number = null;
+ } else if (isChildNumberShown) {
+ number = mContext.getString(R.string.child_number, mPrimary.getChildNumber());
+ } else if (isForwardedNumberShown) {
+ // Use last forwarded number instead of second line, if present.
+ number = mPrimary.getLastForwardedNumber();
+ } else {
+ number = getNumberForCall(mPrimaryContactInfo);
+ }
+
+ ui.showForwardIndicator(isForwardedNumberShown);
+ maybeShowHdAudioIcon();
+
+ boolean nameIsNumber = name != null && name.equals(mPrimaryContactInfo.number);
+ // Call with caller that is a work contact.
+ boolean isWorkContact = (mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
+ ui.setPrimary(
+ number,
+ name,
+ nameIsNumber,
+ isChildNumberShown || isCallSubjectShown ? null : mPrimaryContactInfo.label,
+ mPrimaryContactInfo.photo,
+ mPrimaryContactInfo.isSipCall,
+ showContactPhoto,
+ hasWorkCallProperty || isWorkContact);
+
+ updateContactInteractions();
+ } else {
+ // Clear the primary display info.
+ ui.setPrimary(null, null, false, null, null, false, false, false);
+ }
+
+ if (mEmergencyCallListener != null) {
+ boolean isEmergencyCall = mPrimary.isEmergencyCall();
+ mEmergencyCallListener.onCallUpdated((BaseFragment) ui, isEmergencyCall);
+ }
+ }
+
+ private void updateSecondaryDisplayInfo() {
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ if (mSecondary == null) {
+ // Clear the secondary display info.
+ ui.setSecondary(false, null, false, null, null, false /* isConference */,
+ false /* isVideoCall */, mIsFullscreen);
+ return;
+ }
+
+ if (mSecondary.isConferenceCall()) {
+ ui.setSecondary(
+ true /* show */,
+ getConferenceString(mSecondary),
+ false /* nameIsNumber */,
+ null /* label */,
+ getCallProviderLabel(mSecondary),
+ true /* isConference */,
+ mSecondary.isVideoCall(mContext),
+ mIsFullscreen);
+ } else if (mSecondaryContactInfo != null) {
+ Log.d(TAG, "updateSecondaryDisplayInfo() " + mSecondaryContactInfo);
+ String name = getNameForCall(mSecondaryContactInfo);
+ boolean nameIsNumber = name != null && name.equals(mSecondaryContactInfo.number);
+ ui.setSecondary(
+ true /* show */,
+ name,
+ nameIsNumber,
+ mSecondaryContactInfo.label,
+ getCallProviderLabel(mSecondary),
+ false /* isConference */,
+ mSecondary.isVideoCall(mContext),
+ mIsFullscreen);
+ } else {
+ // Clear the secondary display info.
+ ui.setSecondary(false, null, false, null, null, false /* isConference */,
+ false /* isVideoCall */, mIsFullscreen);
+ }
+ }
+
+
+ /**
+ * Gets the phone account to display for a call.
+ */
+ private PhoneAccount getAccountForCall(Call call) {
+ PhoneAccountHandle accountHandle = call.getAccountHandle();
+ if (accountHandle == null) {
+ return null;
+ }
+ return TelecomManagerCompat.getPhoneAccount(
+ InCallPresenter.getInstance().getTelecomManager(),
+ accountHandle);
+ }
+
+ /**
+ * Returns the gateway number for any existing outgoing call.
+ */
+ private String getGatewayNumber() {
+ if (hasOutgoingGatewayCall()) {
+ return getNumberFromHandle(mPrimary.getGatewayInfo().getGatewayAddress());
+ }
+ return null;
+ }
+
+ /**
+ * Return the string label to represent the call provider
+ */
+ private String getCallProviderLabel(Call call) {
+ PhoneAccount account = getAccountForCall(call);
+ TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+ if (account != null && !TextUtils.isEmpty(account.getLabel())
+ && TelecomManagerCompat.getCallCapablePhoneAccounts(mgr).size() > 1) {
+ return account.getLabel().toString();
+ }
+ return null;
+ }
+
+ /**
+ * Returns the label (line of text above the number/name) for any given call.
+ * For example, "calling via [Account/Google Voice]" for outgoing calls.
+ */
+ private String getConnectionLabel() {
+ StatusHints statusHints = mPrimary.getTelecomCall().getDetails().getStatusHints();
+ if (statusHints != null && !TextUtils.isEmpty(statusHints.getLabel())) {
+ return statusHints.getLabel().toString();
+ }
+
+ if (hasOutgoingGatewayCall() && getUi() != null) {
+ // Return the label for the gateway app on outgoing calls.
+ final PackageManager pm = mContext.getPackageManager();
+ try {
+ ApplicationInfo info = pm.getApplicationInfo(
+ mPrimary.getGatewayInfo().getGatewayProviderPackageName(), 0);
+ return pm.getApplicationLabel(info).toString();
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(this, "Gateway Application Not Found.", e);
+ return null;
+ }
+ }
+ return getCallProviderLabel(mPrimary);
+ }
+
+ private Drawable getCallStateIcon() {
+ // Return connection icon if one exists.
+ StatusHints statusHints = mPrimary.getTelecomCall().getDetails().getStatusHints();
+ if (statusHints != null && statusHints.getIcon() != null) {
+ Drawable icon = statusHints.getIcon().loadDrawable(mContext);
+ if (icon != null) {
+ return icon;
+ }
+ }
+
+ return null;
+ }
+
+ private boolean hasOutgoingGatewayCall() {
+ // We only display the gateway information while STATE_DIALING so return false for any other
+ // call state.
+ // TODO: mPrimary can be null because this is called from updatePrimaryDisplayInfo which
+ // is also called after a contact search completes (call is not present yet). Split the
+ // UI update so it can receive independent updates.
+ if (mPrimary == null) {
+ return false;
+ }
+ return Call.State.isDialing(mPrimary.getState()) && mPrimary.getGatewayInfo() != null &&
+ !mPrimary.getGatewayInfo().isEmpty();
+ }
+
+ /**
+ * Gets the name to display for the call.
+ */
+ @NeededForTesting
+ String getNameForCall(ContactCacheEntry contactInfo) {
+ String preferredName = ContactDisplayUtils.getPreferredDisplayName(
+ contactInfo.namePrimary,
+ contactInfo.nameAlternative,
+ mContactsPreferences);
+ if (TextUtils.isEmpty(preferredName)) {
+ return contactInfo.number;
+ }
+ return preferredName;
+ }
+
+ /**
+ * Gets the number to display for a call.
+ */
+ @NeededForTesting
+ String getNumberForCall(ContactCacheEntry contactInfo) {
+ // If the name is empty, we use the number for the name...so don't show a second
+ // number in the number field
+ String preferredName = ContactDisplayUtils.getPreferredDisplayName(
+ contactInfo.namePrimary,
+ contactInfo.nameAlternative,
+ mContactsPreferences);
+ if (TextUtils.isEmpty(preferredName)) {
+ return contactInfo.location;
+ }
+ return contactInfo.number;
+ }
+
+ public void secondaryInfoClicked() {
+ if (mSecondary == null) {
+ Log.w(this, "Secondary info clicked but no secondary call.");
+ return;
+ }
+
+ Log.i(this, "Swapping call to foreground: " + mSecondary);
+ TelecomAdapter.getInstance().unholdCall(mSecondary.getId());
+ }
+
+ public void endCallClicked() {
+ if (mPrimary == null) {
+ return;
+ }
+
+ Log.i(this, "Disconnecting call: " + mPrimary);
+ final String callId = mPrimary.getId();
+ mPrimary.setState(Call.State.DISCONNECTING);
+ CallList.getInstance().onUpdate(mPrimary);
+ TelecomAdapter.getInstance().disconnectCall(callId);
+ }
+
+ private String getNumberFromHandle(Uri handle) {
+ return handle == null ? "" : handle.getSchemeSpecificPart();
+ }
+
+ /**
+ * Handles a change to the fullscreen mode of the in-call UI.
+ *
+ * @param isFullscreenMode {@code True} if the in-call UI is entering full screen mode.
+ */
+ @Override
+ public void onFullscreenModeChanged(boolean isFullscreenMode) {
+ mIsFullscreen = isFullscreenMode;
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+ ui.setCallCardVisible(!isFullscreenMode);
+ ui.setSecondaryInfoVisible(!isFullscreenMode);
+ }
+
+ @Override
+ public void onSecondaryCallerInfoVisibilityChanged(boolean isVisible, int height) {
+ // No-op - the Call Card is the origin of this event.
+ }
+
+ private boolean isPrimaryCallActive() {
+ return mPrimary != null && mPrimary.getState() == Call.State.ACTIVE;
+ }
+
+ private String getConferenceString(Call call) {
+ boolean isGenericConference = call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE);
+ Log.v(this, "getConferenceString: " + isGenericConference);
+
+ final int resId = isGenericConference
+ ? R.string.card_title_in_call : R.string.card_title_conf_call;
+ return mContext.getResources().getString(resId);
+ }
+
+ private Drawable getConferencePhoto(Call call) {
+ boolean isGenericConference = call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE);
+ Log.v(this, "getConferencePhoto: " + isGenericConference);
+
+ final int resId = isGenericConference
+ ? R.drawable.img_phone : R.drawable.img_conference;
+ Drawable photo = mContext.getResources().getDrawable(resId);
+ photo.setAutoMirrored(true);
+ return photo;
+ }
+
+ private boolean shouldShowEndCallButton(Call primary, int callState) {
+ if (primary == null) {
+ return false;
+ }
+ if ((!Call.State.isConnectingOrConnected(callState)
+ && callState != Call.State.DISCONNECTING) || callState == Call.State.INCOMING) {
+ return false;
+ }
+ if (mPrimary.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ return false;
+ }
+ return true;
+ }
+
+ private void maybeSendAccessibilityEvent(InCallState oldState, InCallState newState) {
+ if (mContext == null) {
+ return;
+ }
+ final AccessibilityManager am = (AccessibilityManager) mContext.getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (!am.isEnabled()) {
+ return;
+ }
+ if ((oldState != InCallState.OUTGOING && newState == InCallState.OUTGOING)
+ || (oldState != InCallState.INCOMING && newState == InCallState.INCOMING)) {
+ if (getUi() != null) {
+ getUi().sendAccessibilityAnnouncement();
+ }
+ }
+ }
+
+ /**
+ * Determines whether the call subject should be visible on the UI. For the call subject to be
+ * visible, the call has to be in an incoming or waiting state, and the subject must not be
+ * empty.
+ *
+ * @param call The call.
+ * @return {@code true} if the subject should be shown, {@code false} otherwise.
+ */
+ private boolean shouldShowCallSubject(Call call) {
+ if (call == null) {
+ return false;
+ }
+
+ boolean isIncomingOrWaiting = mPrimary.getState() == Call.State.INCOMING ||
+ mPrimary.getState() == Call.State.CALL_WAITING;
+ return isIncomingOrWaiting && !TextUtils.isEmpty(call.getCallSubject()) &&
+ call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED &&
+ call.isCallSubjectSupported();
+ }
+
+ /**
+ * Determines whether the "note sent" toast should be shown. It should be shown for a new
+ * outgoing call with a subject.
+ *
+ * @param call The call
+ * @return {@code true} if the toast should be shown, {@code false} otherwise.
+ */
+ private boolean shouldShowNoteSentToast(Call call) {
+ return call != null && hasCallSubject(call) && (call.getState() == Call.State.DIALING
+ || call.getState() == Call.State.CONNECTING);
+ }
+
+ private static boolean hasCallSubject(Call call) {
+ return !TextUtils.isEmpty(DetailsCompat.getIntentExtras(
+ call.getTelecomCall().getDetails()).getString(TelecomManager.EXTRA_CALL_SUBJECT));
+ }
+
+ public interface CallCardUi extends Ui {
+ void setVisible(boolean on);
+ void setContactContextTitle(View listHeaderView);
+ void setContactContextContent(ListAdapter listAdapter);
+ void showContactContext(boolean show);
+ void setCallCardVisible(boolean visible);
+ void setPrimary(String number, String name, boolean nameIsNumber, String label,
+ Drawable photo, boolean isSipCall, boolean isContactPhotoShown, boolean isWorkCall);
+ void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
+ String providerLabel, boolean isConference, boolean isVideoCall,
+ boolean isFullscreen);
+ void setSecondaryInfoVisible(boolean visible);
+ void setCallState(int state, int videoState, int sessionModificationState,
+ DisconnectCause disconnectCause, String connectionLabel,
+ Drawable connectionIcon, String gatewayNumber, boolean isWifi,
+ boolean isConference, boolean isWorkCall);
+ void setPrimaryCallElapsedTime(boolean show, long duration);
+ void setPrimaryName(String name, boolean nameIsNumber);
+ void setPrimaryImage(Drawable image, boolean isVisible);
+ void setPrimaryPhoneNumber(String phoneNumber);
+ void setPrimaryLabel(String label);
+ void setEndCallButtonEnabled(boolean enabled, boolean animate);
+ void setCallbackNumber(String number, boolean isEmergencyCalls);
+ void setCallSubject(String callSubject);
+ void setProgressSpinnerVisible(boolean visible);
+ void showHdAudioIndicator(boolean visible);
+ void showForwardIndicator(boolean visible);
+ void showManageConferenceCallButton(boolean visible);
+ boolean isManageConferenceVisible();
+ boolean isCallSubjectVisible();
+ void animateForNewOutgoingCall();
+ void sendAccessibilityAnnouncement();
+ void showNoteSentToast();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
new file mode 100644
index 0000000..99def36
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -0,0 +1,674 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.os.Handler;
+import android.os.Message;
+import android.os.Trace;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.logging.Logger;
+import com.android.incallui.util.TelecomCallUtil;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Maintains the list of active calls and notifies interested classes of changes to the call list
+ * as they are received from the telephony stack. Primary listener of changes to this class is
+ * InCallPresenter.
+ */
+public class CallList {
+
+ private static final int DISCONNECTED_CALL_SHORT_TIMEOUT_MS = 200;
+ private static final int DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS = 2000;
+ private static final int DISCONNECTED_CALL_LONG_TIMEOUT_MS = 5000;
+
+ private static final int EVENT_DISCONNECTED_TIMEOUT = 1;
+ private static final long BLOCK_QUERY_TIMEOUT_MS = 1000;
+
+ private static CallList sInstance = new CallList();
+
+ private final HashMap<String, Call> mCallById = new HashMap<>();
+ private final HashMap<android.telecom.Call, Call> mCallByTelecomCall = new HashMap<>();
+ private final HashMap<String, List<String>> mCallTextReponsesMap = Maps.newHashMap();
+ /**
+ * 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 final HashMap<String, List<CallUpdateListener>> mCallUpdateListenerMap = Maps
+ .newHashMap();
+ private final Set<Call> mPendingDisconnectCalls = Collections.newSetFromMap(
+ new ConcurrentHashMap<Call, Boolean>(8, 0.9f, 1));
+ private FilteredNumberAsyncQueryHandler mFilteredQueryHandler;
+
+ /**
+ * Static singleton accessor method.
+ */
+ public static CallList getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * USED ONLY FOR TESTING
+ * Testing-only constructor. Instance should only be acquired through getInstance().
+ */
+ @NeededForTesting
+ CallList() {
+ }
+
+ public void onCallAdded(final android.telecom.Call telecomCall) {
+ Trace.beginSection("onCallAdded");
+ final Call call = new Call(telecomCall);
+ Log.d(this, "onCallAdded: callState=" + call.getState());
+
+ if (call.getState() == Call.State.INCOMING ||
+ call.getState() == Call.State.CALL_WAITING) {
+ onIncoming(call, call.getCannedSmsResponses());
+ } else {
+ onUpdate(call);
+ }
+
+ call.logCallInitiationType();
+ Trace.endSection();
+ }
+
+ public void onCallRemoved(android.telecom.Call telecomCall) {
+ if (mCallByTelecomCall.containsKey(telecomCall)) {
+ Call call = mCallByTelecomCall.get(telecomCall);
+ Logger.logCall(call);
+ if (updateCallInMap(call)) {
+ Log.w(this, "Removing call not previously disconnected " + call.getId());
+ }
+ updateCallTextMap(call, null);
+ }
+ }
+
+ /**
+ * Called when a single call disconnects.
+ */
+ public void onDisconnect(Call call) {
+ if (updateCallInMap(call)) {
+ Log.i(this, "onDisconnect: " + call);
+ // notify those listening for changes on this specific change
+ notifyCallUpdateListeners(call);
+ // notify those listening for all disconnects
+ notifyListenersOfDisconnect(call);
+ }
+ }
+
+ /**
+ * Called when a single call has changed.
+ */
+ public void onIncoming(Call call, List<String> textMessages) {
+ if (updateCallInMap(call)) {
+ Log.i(this, "onIncoming - " + call);
+ }
+ updateCallTextMap(call, textMessages);
+
+ for (Listener listener : mListeners) {
+ listener.onIncomingCall(call);
+ }
+ }
+
+ public void onUpgradeToVideo(Call call){
+ Log.d(this, "onUpgradeToVideo call=" + call);
+ for (Listener listener : mListeners) {
+ listener.onUpgradeToVideo(call);
+ }
+ }
+ /**
+ * Called when a single call has changed.
+ */
+ public void onUpdate(Call call) {
+ Trace.beginSection("onUpdate");
+ onUpdateCall(call);
+ notifyGenericListeners();
+ Trace.endSection();
+ }
+
+ /**
+ * Called when a single call has changed session modification state.
+ *
+ * @param call The call.
+ * @param sessionModificationState The new session modification state.
+ */
+ public void onSessionModificationStateChange(Call call, int sessionModificationState) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onSessionModificationStateChange(sessionModificationState);
+ }
+ }
+ }
+
+ /**
+ * Called when the last forwarded number changes for a call. With IMS, the last forwarded
+ * number changes due to a supplemental service notification, so it is not pressent at the
+ * start of the call.
+ *
+ * @param call The call.
+ */
+ public void onLastForwardedNumberChange(Call call) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onLastForwardedNumberChange();
+ }
+ }
+ }
+
+ /**
+ * Called when the child number changes for a call. The child number can be received after a
+ * call is initially set up, so we need to be able to inform listeners of the change.
+ *
+ * @param call The call.
+ */
+ public void onChildNumberChange(Call call) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onChildNumberChange();
+ }
+ }
+ }
+
+ public void notifyCallUpdateListeners(Call call) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onCallChanged(call);
+ }
+ }
+ }
+
+ /**
+ * Add a call update listener for a call id.
+ *
+ * @param callId The call id to get updates for.
+ * @param listener The listener to add.
+ */
+ public void addCallUpdateListener(String callId, CallUpdateListener listener) {
+ List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(callId);
+ if (listeners == null) {
+ listeners = new CopyOnWriteArrayList<CallUpdateListener>();
+ mCallUpdateListenerMap.put(callId, listeners);
+ }
+ listeners.add(listener);
+ }
+
+ /**
+ * Remove a call update listener for a call id.
+ *
+ * @param callId The call id to remove the listener for.
+ * @param listener The listener to remove.
+ */
+ public void removeCallUpdateListener(String callId, CallUpdateListener listener) {
+ List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(callId);
+ if (listeners != null) {
+ listeners.remove(listener);
+ }
+ }
+
+ public void addListener(Listener listener) {
+ Preconditions.checkNotNull(listener);
+
+ mListeners.add(listener);
+
+ // Let the listener know about the active calls immediately.
+ listener.onCallListChange(this);
+ }
+
+ public void removeListener(Listener listener) {
+ if (listener != null) {
+ mListeners.remove(listener);
+ }
+ }
+
+ /**
+ * TODO: Change so that this function is not needed. Instead of assuming there is an active
+ * call, the code should rely on the status of a specific Call and allow the presenters to
+ * update the Call object when the active call changes.
+ */
+ public Call getIncomingOrActive() {
+ Call retval = getIncomingCall();
+ if (retval == null) {
+ retval = getActiveCall();
+ }
+ return retval;
+ }
+
+ public Call getOutgoingOrActive() {
+ Call retval = getOutgoingCall();
+ if (retval == null) {
+ retval = getActiveCall();
+ }
+ return retval;
+ }
+
+ /**
+ * A call that is waiting for {@link PhoneAccount} selection
+ */
+ public Call getWaitingForAccountCall() {
+ return getFirstCallWithState(Call.State.SELECT_PHONE_ACCOUNT);
+ }
+
+ public Call getPendingOutgoingCall() {
+ return getFirstCallWithState(Call.State.CONNECTING);
+ }
+
+ public Call getOutgoingCall() {
+ Call call = getFirstCallWithState(Call.State.DIALING);
+ if (call == null) {
+ call = getFirstCallWithState(Call.State.REDIALING);
+ }
+ return call;
+ }
+
+ public Call getActiveCall() {
+ return getFirstCallWithState(Call.State.ACTIVE);
+ }
+
+ public Call getBackgroundCall() {
+ return getFirstCallWithState(Call.State.ONHOLD);
+ }
+
+ public Call getDisconnectedCall() {
+ return getFirstCallWithState(Call.State.DISCONNECTED);
+ }
+
+ public Call getDisconnectingCall() {
+ return getFirstCallWithState(Call.State.DISCONNECTING);
+ }
+
+ public Call getSecondBackgroundCall() {
+ return getCallWithState(Call.State.ONHOLD, 1);
+ }
+
+ public Call getActiveOrBackgroundCall() {
+ Call call = getActiveCall();
+ if (call == null) {
+ call = getBackgroundCall();
+ }
+ return call;
+ }
+
+ public Call getIncomingCall() {
+ Call call = getFirstCallWithState(Call.State.INCOMING);
+ if (call == null) {
+ call = getFirstCallWithState(Call.State.CALL_WAITING);
+ }
+
+ return call;
+ }
+
+ public Call getFirstCall() {
+ Call result = getIncomingCall();
+ if (result == null) {
+ result = getPendingOutgoingCall();
+ }
+ if (result == null) {
+ result = getOutgoingCall();
+ }
+ if (result == null) {
+ result = getFirstCallWithState(Call.State.ACTIVE);
+ }
+ if (result == null) {
+ result = getDisconnectingCall();
+ }
+ if (result == null) {
+ result = getDisconnectedCall();
+ }
+ return result;
+ }
+
+ public boolean hasLiveCall() {
+ Call call = getFirstCall();
+ if (call == null) {
+ return false;
+ }
+ return call != getDisconnectingCall() && call != getDisconnectedCall();
+ }
+
+ /**
+ * Returns the first call found in the call map with the specified call modification state.
+ * @param state The session modification state to search for.
+ * @return The first call with the specified state.
+ */
+ public Call getVideoUpgradeRequestCall() {
+ for(Call call : mCallById.values()) {
+ if (call.getSessionModificationState() ==
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ return call;
+ }
+ }
+ return null;
+ }
+
+ public Call getCallById(String callId) {
+ return mCallById.get(callId);
+ }
+
+ public Call getCallByTelecomCall(android.telecom.Call telecomCall) {
+ return mCallByTelecomCall.get(telecomCall);
+ }
+
+ public List<String> getTextResponses(String callId) {
+ return mCallTextReponsesMap.get(callId);
+ }
+
+ /**
+ * Returns first call found in the call map with the specified state.
+ */
+ public Call getFirstCallWithState(int state) {
+ return getCallWithState(state, 0);
+ }
+
+ /**
+ * Returns the [position]th call found in the call map with the specified state.
+ * TODO: Improve this logic to sort by call time.
+ */
+ public Call getCallWithState(int state, int positionToFind) {
+ Call retval = null;
+ int position = 0;
+ for (Call call : mCallById.values()) {
+ if (call.getState() == state) {
+ if (position >= positionToFind) {
+ retval = call;
+ break;
+ } else {
+ position++;
+ }
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * This is called when the service disconnects, either expectedly or unexpectedly.
+ * For the expected case, it's because we have no calls left. For the unexpected case,
+ * it is likely a crash of phone and we need to clean up our calls manually. Without phone,
+ * there can be no active calls, so this is relatively safe thing to do.
+ */
+ public void clearOnDisconnect() {
+ for (Call call : mCallById.values()) {
+ final int state = call.getState();
+ if (state != Call.State.IDLE &&
+ state != Call.State.INVALID &&
+ state != Call.State.DISCONNECTED) {
+
+ call.setState(Call.State.DISCONNECTED);
+ call.setDisconnectCause(new DisconnectCause(DisconnectCause.UNKNOWN));
+ updateCallInMap(call);
+ }
+ }
+ notifyGenericListeners();
+ }
+
+ /**
+ * Called when the user has dismissed an error dialog. This indicates acknowledgement of
+ * the disconnect cause, and that any pending disconnects should immediately occur.
+ */
+ public void onErrorDialogDismissed() {
+ final Iterator<Call> iterator = mPendingDisconnectCalls.iterator();
+ while (iterator.hasNext()) {
+ Call call = iterator.next();
+ iterator.remove();
+ finishDisconnectedCall(call);
+ }
+ }
+
+ /**
+ * Processes an update for a single call.
+ *
+ * @param call The call to update.
+ */
+ private void onUpdateCall(Call call) {
+ Log.d(this, "\t" + call);
+ if (updateCallInMap(call)) {
+ Log.i(this, "onUpdate - " + call);
+ }
+ updateCallTextMap(call, call.getCannedSmsResponses());
+ notifyCallUpdateListeners(call);
+ }
+
+ /**
+ * Sends a generic notification to all listeners that something has changed.
+ * It is up to the listeners to call back to determine what changed.
+ */
+ private void notifyGenericListeners() {
+ for (Listener listener : mListeners) {
+ listener.onCallListChange(this);
+ }
+ }
+
+ private void notifyListenersOfDisconnect(Call call) {
+ for (Listener listener : mListeners) {
+ listener.onDisconnect(call);
+ }
+ }
+
+ /**
+ * Updates the call entry in the local map.
+ * @return false if no call previously existed and no call was added, otherwise true.
+ */
+ private boolean updateCallInMap(Call call) {
+ Preconditions.checkNotNull(call);
+
+ boolean updated = false;
+
+ if (call.getState() == Call.State.DISCONNECTED) {
+ // update existing (but do not add!!) disconnected calls
+ if (mCallById.containsKey(call.getId())) {
+ // For disconnected calls, we want to keep them alive for a few seconds so that the
+ // UI has a chance to display anything it needs when a call is disconnected.
+
+ // Set up a timer to destroy the call after X seconds.
+ final Message msg = mHandler.obtainMessage(EVENT_DISCONNECTED_TIMEOUT, call);
+ mHandler.sendMessageDelayed(msg, getDelayForDisconnect(call));
+ mPendingDisconnectCalls.add(call);
+
+ mCallById.put(call.getId(), call);
+ mCallByTelecomCall.put(call.getTelecomCall(), call);
+ updated = true;
+ }
+ } else if (!isCallDead(call)) {
+ mCallById.put(call.getId(), call);
+ mCallByTelecomCall.put(call.getTelecomCall(), call);
+ updated = true;
+ } else if (mCallById.containsKey(call.getId())) {
+ mCallById.remove(call.getId());
+ mCallByTelecomCall.remove(call.getTelecomCall());
+ updated = true;
+ }
+
+ return updated;
+ }
+
+ private int getDelayForDisconnect(Call call) {
+ Preconditions.checkState(call.getState() == Call.State.DISCONNECTED);
+
+
+ final int cause = call.getDisconnectCause().getCode();
+ final int delay;
+ switch (cause) {
+ case DisconnectCause.LOCAL:
+ delay = DISCONNECTED_CALL_SHORT_TIMEOUT_MS;
+ break;
+ case DisconnectCause.REMOTE:
+ case DisconnectCause.ERROR:
+ delay = DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS;
+ break;
+ case DisconnectCause.REJECTED:
+ case DisconnectCause.MISSED:
+ case DisconnectCause.CANCELED:
+ // no delay for missed/rejected incoming calls and canceled outgoing calls.
+ delay = 0;
+ break;
+ default:
+ delay = DISCONNECTED_CALL_LONG_TIMEOUT_MS;
+ break;
+ }
+
+ return delay;
+ }
+
+ private void updateCallTextMap(Call call, List<String> textResponses) {
+ Preconditions.checkNotNull(call);
+
+ if (!isCallDead(call)) {
+ if (textResponses != null) {
+ mCallTextReponsesMap.put(call.getId(), textResponses);
+ }
+ } else if (mCallById.containsKey(call.getId())) {
+ mCallTextReponsesMap.remove(call.getId());
+ }
+ }
+
+ private boolean isCallDead(Call call) {
+ final int state = call.getState();
+ return Call.State.IDLE == state || Call.State.INVALID == state;
+ }
+
+ /**
+ * Sets up a call for deletion and notifies listeners of change.
+ */
+ private void finishDisconnectedCall(Call call) {
+ if (mPendingDisconnectCalls.contains(call)) {
+ mPendingDisconnectCalls.remove(call);
+ }
+ call.setState(Call.State.IDLE);
+ updateCallInMap(call);
+ notifyGenericListeners();
+ }
+
+ /**
+ * Notifies all video calls of a change in device orientation.
+ *
+ * @param rotation The new rotation angle (in degrees).
+ */
+ public void notifyCallsOfDeviceRotation(int rotation) {
+ for (Call call : mCallById.values()) {
+ // First, ensure that the call videoState has video enabled (there is no need to set
+ // device orientation on a voice call which has not yet been upgraded to video).
+ // Second, ensure a VideoCall is set on the call so that the change can be sent to the
+ // provider (a VideoCall can be present for a call that does not currently have video,
+ // but can be upgraded to video).
+
+ // NOTE: is it necessary to use this order because getVideoCall references the class
+ // VideoProfile which is not available on APIs <23 (M).
+ if (VideoUtils.isVideoCall(call) && call.getVideoCall() != null) {
+ call.getVideoCall().setDeviceOrientation(rotation);
+ }
+ }
+ }
+
+ /**
+ * Handles the timeout for destroying disconnected calls.
+ */
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_DISCONNECTED_TIMEOUT:
+ Log.d(this, "EVENT_DISCONNECTED_TIMEOUT ", msg.obj);
+ finishDisconnectedCall((Call) msg.obj);
+ break;
+ default:
+ Log.wtf(this, "Message not expected: " + msg.what);
+ break;
+ }
+ }
+ };
+
+ public void setFilteredNumberQueryHandler(FilteredNumberAsyncQueryHandler handler) {
+ mFilteredQueryHandler = handler;
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of changes
+ * to the call list.
+ */
+ public interface Listener {
+ /**
+ * Called when a new incoming call comes in.
+ * This is the only method that gets called for incoming calls. Listeners
+ * that want to perform an action on incoming call should respond in this method
+ * because {@link #onCallListChange} does not automatically get called for
+ * incoming calls.
+ */
+ public void onIncomingCall(Call call);
+ /**
+ * Called when a new modify call request comes in
+ * This is the only method that gets called for modify requests.
+ */
+ public void onUpgradeToVideo(Call call);
+ /**
+ * Called anytime there are changes to the call list. The change can be switching call
+ * states, updating information, etc. This method will NOT be called for new incoming
+ * calls and for calls that switch to disconnected state. Listeners must add actions
+ * to those method implementations if they want to deal with those actions.
+ */
+ public void onCallListChange(CallList callList);
+
+ /**
+ * Called when a call switches to the disconnected state. This is the only method
+ * that will get called upon disconnection.
+ */
+ public void onDisconnect(Call call);
+
+
+ }
+
+ public interface CallUpdateListener {
+ // TODO: refactor and limit arg to be call state. Caller info is not needed.
+ public void onCallChanged(Call call);
+
+ /**
+ * Notifies of a change to the session modification state for a call.
+ *
+ * @param sessionModificationState The new session modification state.
+ */
+ public void onSessionModificationStateChange(int sessionModificationState);
+
+ /**
+ * Notifies of a change to the last forwarded number for a call.
+ */
+ public void onLastForwardedNumberChange();
+
+ /**
+ * Notifies of a change to the child number for a call.
+ */
+ public void onChildNumberChange();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallTimer.java b/InCallUI/src/com/android/incallui/CallTimer.java
new file mode 100644
index 0000000..d65e633
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallTimer.java
@@ -0,0 +1,90 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.os.Handler;
+import android.os.SystemClock;
+
+/**
+ * Helper class used to keep track of events requiring regular intervals.
+ */
+public class CallTimer extends Handler {
+ private Runnable mInternalCallback;
+ private Runnable mCallback;
+ private long mLastReportedTime;
+ private long mInterval;
+ private boolean mRunning;
+
+ public CallTimer(Runnable callback) {
+ Preconditions.checkNotNull(callback);
+
+ mInterval = 0;
+ mLastReportedTime = 0;
+ mRunning = false;
+ mCallback = callback;
+ mInternalCallback = new CallTimerCallback();
+ }
+
+ public boolean start(long interval) {
+ if (interval <= 0) {
+ return false;
+ }
+
+ // cancel any previous timer
+ cancel();
+
+ mInterval = interval;
+ mLastReportedTime = SystemClock.uptimeMillis();
+
+ mRunning = true;
+ periodicUpdateTimer();
+
+ return true;
+ }
+
+ public void cancel() {
+ removeCallbacks(mInternalCallback);
+ mRunning = false;
+ }
+
+ private void periodicUpdateTimer() {
+ if (!mRunning) {
+ return;
+ }
+
+ final long now = SystemClock.uptimeMillis();
+ long nextReport = mLastReportedTime + mInterval;
+ while (now >= nextReport) {
+ nextReport += mInterval;
+ }
+
+ postAtTime(mInternalCallback, nextReport);
+ mLastReportedTime = nextReport;
+
+ // Run the callback
+ mCallback.run();
+ }
+
+ private class CallTimerCallback implements Runnable {
+ @Override
+ public void run() {
+ periodicUpdateTimer();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallerInfo.java b/InCallUI/src/com/android/incallui/CallerInfo.java
new file mode 100644
index 0000000..670c3fd
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallerInfo.java
@@ -0,0 +1,557 @@
+/*
+ * Copyright (C) 2006 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.incallui;
+
+import com.google.common.primitives.Longs;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.PhoneLookup;
+import android.provider.ContactsContract.RawContacts;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.contacts.common.util.TelephonyManagerUtils;
+import com.android.dialer.calllog.ContactInfoHelper;
+
+/**
+ * Looks up caller information for the given phone number.
+ */
+public class CallerInfo {
+ private static final String TAG = "CallerInfo";
+
+ public static final String[] DEFAULT_PHONELOOKUP_PROJECTION = new String[] {
+ PhoneLookup._ID,
+ PhoneLookup.DISPLAY_NAME,
+ PhoneLookup.LOOKUP_KEY,
+ PhoneLookup.NUMBER,
+ PhoneLookup.NORMALIZED_NUMBER,
+ PhoneLookup.LABEL,
+ PhoneLookup.TYPE,
+ PhoneLookup.PHOTO_URI,
+ PhoneLookup.CUSTOM_RINGTONE,
+ PhoneLookup.SEND_TO_VOICEMAIL
+ };
+
+ /**
+ * Please note that, any one of these member variables can be null,
+ * and any accesses to them should be prepared to handle such a case.
+ *
+ * Also, it is implied that phoneNumber is more often populated than
+ * name is, (think of calls being dialed/received using numbers where
+ * names are not known to the device), so phoneNumber should serve as
+ * a dependable fallback when name is unavailable.
+ *
+ * One other detail here is that this CallerInfo object reflects
+ * information found on a connection, it is an OUTPUT that serves
+ * mainly to display information to the user. In no way is this object
+ * used as input to make a connection, so we can choose to display
+ * whatever human-readable text makes sense to the user for a
+ * connection. This is especially relevant for the phone number field,
+ * since it is the one field that is most likely exposed to the user.
+ *
+ * As an example:
+ * 1. User dials "911"
+ * 2. Device recognizes that this is an emergency number
+ * 3. We use the "Emergency Number" string instead of "911" in the
+ * phoneNumber field.
+ *
+ * What we're really doing here is treating phoneNumber as an essential
+ * field here, NOT name. We're NOT always guaranteed to have a name
+ * for a connection, but the number should be displayable.
+ */
+ public String name;
+ public String nameAlternative;
+ public String phoneNumber;
+ public String normalizedNumber;
+ public String forwardingNumber;
+ public String geoDescription;
+
+ public String cnapName;
+ public int numberPresentation;
+ public int namePresentation;
+ public boolean contactExists;
+
+ public String phoneLabel;
+ /* Split up the phoneLabel into number type and label name */
+ public int numberType;
+ public String numberLabel;
+
+ public int photoResource;
+
+ // Contact ID, which will be 0 if a contact comes from the corp CP2.
+ public long contactIdOrZero;
+ public String lookupKeyOrNull;
+ public boolean needUpdate;
+ public Uri contactRefUri;
+ public @UserType long userType;
+
+ /**
+ * Contact display photo URI. If a contact has no display photo but a thumbnail, it'll be
+ * the thumbnail URI instead.
+ */
+ public Uri contactDisplayPhotoUri;
+
+ // fields to hold individual contact preference data,
+ // including the send to voicemail flag and the ringtone
+ // uri reference.
+ public Uri contactRingtoneUri;
+ public boolean shouldSendToVoicemail;
+
+ /**
+ * Drawable representing the caller image. This is essentially
+ * a cache for the image data tied into the connection /
+ * callerinfo object.
+ *
+ * This might be a high resolution picture which is more suitable
+ * for full-screen image view than for smaller icons used in some
+ * kinds of notifications.
+ *
+ * The {@link #isCachedPhotoCurrent} flag indicates if the image
+ * data needs to be reloaded.
+ */
+ public Drawable cachedPhoto;
+ /**
+ * Bitmap representing the caller image which has possibly lower
+ * resolution than {@link #cachedPhoto} and thus more suitable for
+ * icons (like notification icons).
+ *
+ * In usual cases this is just down-scaled image of {@link #cachedPhoto}.
+ * If the down-scaling fails, this will just become null.
+ *
+ * The {@link #isCachedPhotoCurrent} flag indicates if the image
+ * data needs to be reloaded.
+ */
+ public Bitmap cachedPhotoIcon;
+ /**
+ * Boolean which indicates if {@link #cachedPhoto} and
+ * {@link #cachedPhotoIcon} is fresh enough. If it is false,
+ * those images aren't pointing to valid objects.
+ */
+ public boolean isCachedPhotoCurrent;
+
+ /**
+ * String which holds the call subject sent as extra from the lower layers for this call. This
+ * is used to display the no-caller ID reason for restricted/unknown number presentation.
+ */
+ public String callSubject;
+
+ private boolean mIsEmergency;
+ private boolean mIsVoiceMail;
+
+ public CallerInfo() {
+ // TODO: Move all the basic initialization here?
+ mIsEmergency = false;
+ mIsVoiceMail = false;
+ userType = ContactsUtils.USER_TYPE_CURRENT;
+ }
+
+ /**
+ * getCallerInfo given a Cursor.
+ * @param context the context used to retrieve string constants
+ * @param contactRef the URI to attach to this CallerInfo object
+ * @param cursor the first object in the cursor is used to build the CallerInfo object.
+ * @return the CallerInfo which contains the caller id for the given
+ * number. The returned CallerInfo is null if no number is supplied.
+ */
+ public static CallerInfo getCallerInfo(Context context, Uri contactRef, Cursor cursor) {
+ CallerInfo info = new CallerInfo();
+ info.photoResource = 0;
+ info.phoneLabel = null;
+ info.numberType = 0;
+ info.numberLabel = null;
+ info.cachedPhoto = null;
+ info.isCachedPhotoCurrent = false;
+ info.contactExists = false;
+ info.userType = ContactsUtils.USER_TYPE_CURRENT;
+
+ Log.v(TAG, "getCallerInfo() based on cursor...");
+
+ if (cursor != null) {
+ if (cursor.moveToFirst()) {
+ // TODO: photo_id is always available but not taken
+ // care of here. Maybe we should store it in the
+ // CallerInfo object as well.
+
+ long contactId = 0L;
+ int columnIndex;
+
+ // Look for the name
+ columnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
+ if (columnIndex != -1) {
+ info.name = cursor.getString(columnIndex);
+ }
+
+ columnIndex = cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY);
+ if (columnIndex != -1) {
+ info.nameAlternative = ContactInfoHelper.lookUpDisplayNameAlternative(
+ context, cursor.getString(columnIndex));
+ }
+
+ // Look for the number
+ columnIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
+ if (columnIndex != -1) {
+ info.phoneNumber = cursor.getString(columnIndex);
+ }
+
+ // Look for the normalized number
+ columnIndex = cursor.getColumnIndex(PhoneLookup.NORMALIZED_NUMBER);
+ if (columnIndex != -1) {
+ info.normalizedNumber = cursor.getString(columnIndex);
+ }
+
+ // Look for the label/type combo
+ columnIndex = cursor.getColumnIndex(PhoneLookup.LABEL);
+ if (columnIndex != -1) {
+ int typeColumnIndex = cursor.getColumnIndex(PhoneLookup.TYPE);
+ if (typeColumnIndex != -1) {
+ info.numberType = cursor.getInt(typeColumnIndex);
+ info.numberLabel = cursor.getString(columnIndex);
+ info.phoneLabel = Phone.getTypeLabel(context.getResources(),
+ info.numberType, info.numberLabel)
+ .toString();
+ }
+ }
+
+ // Look for the person_id.
+ columnIndex = getColumnIndexForPersonId(contactRef, cursor);
+ if (columnIndex != -1) {
+ contactId = cursor.getLong(columnIndex);
+ // QuickContacts in M doesn't support enterprise contact id
+ if (contactId != 0 && (ContactsUtils.FLAG_N_FEATURE
+ || !Contacts.isEnterpriseContactId(contactId))) {
+ info.contactIdOrZero = contactId;
+ Log.v(TAG, "==> got info.contactIdOrZero: " + info.contactIdOrZero);
+
+ // cache the lookup key for later use with person_id to create lookup URIs
+ columnIndex = cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY);
+ if (columnIndex != -1) {
+ info.lookupKeyOrNull = cursor.getString(columnIndex);
+ }
+ }
+ } else {
+ // No valid columnIndex, so we can't look up person_id.
+ Log.v(TAG, "Couldn't find contactId column for " + contactRef);
+ // Watch out: this means that anything that depends on
+ // person_id will be broken (like contact photo lookups in
+ // the in-call UI, for example.)
+ }
+
+ // Display photo URI.
+ columnIndex = cursor.getColumnIndex(PhoneLookup.PHOTO_URI);
+ if ((columnIndex != -1) && (cursor.getString(columnIndex) != null)) {
+ info.contactDisplayPhotoUri = Uri.parse(cursor.getString(columnIndex));
+ } else {
+ info.contactDisplayPhotoUri = null;
+ }
+
+ // look for the custom ringtone, create from the string stored
+ // in the database.
+ columnIndex = cursor.getColumnIndex(PhoneLookup.CUSTOM_RINGTONE);
+ if ((columnIndex != -1) && (cursor.getString(columnIndex) != null)) {
+ if (TextUtils.isEmpty(cursor.getString(columnIndex))) {
+ // make it consistent with frameworks/base/.../CallerInfo.java
+ info.contactRingtoneUri = Uri.EMPTY;
+ } else {
+ info.contactRingtoneUri = Uri.parse(cursor.getString(columnIndex));
+ }
+ } else {
+ info.contactRingtoneUri = null;
+ }
+
+ // look for the send to voicemail flag, set it to true only
+ // under certain circumstances.
+ columnIndex = cursor.getColumnIndex(PhoneLookup.SEND_TO_VOICEMAIL);
+ info.shouldSendToVoicemail = (columnIndex != -1) &&
+ ((cursor.getInt(columnIndex)) == 1);
+ info.contactExists = true;
+
+ // Determine userType by directoryId and contactId
+ final String directory = contactRef == null ? null
+ : contactRef.getQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY);
+ final Long directoryId = directory == null ? null : Longs.tryParse(directory);
+ info.userType = ContactsUtils.determineUserType(directoryId, contactId);
+ }
+ cursor.close();
+ }
+
+ info.needUpdate = false;
+ info.name = normalize(info.name);
+ info.contactRefUri = contactRef;
+
+ return info;
+ }
+
+ /**
+ * getCallerInfo given a URI, look up in the call-log database
+ * for the uri unique key.
+ * @param context the context used to get the ContentResolver
+ * @param contactRef the URI used to lookup caller id
+ * @return the CallerInfo which contains the caller id for the given
+ * number. The returned CallerInfo is null if no number is supplied.
+ */
+ private static CallerInfo getCallerInfo(Context context, Uri contactRef) {
+
+ return getCallerInfo(context, contactRef,
+ context.getContentResolver().query(contactRef, null, null, null, null));
+ }
+
+ /**
+ * Performs another lookup if previous lookup fails and it's a SIP call
+ * and the peer's username is all numeric. Look up the username as it
+ * could be a PSTN number in the contact database.
+ *
+ * @param context the query context
+ * @param number the original phone number, could be a SIP URI
+ * @param previousResult the result of previous lookup
+ * @return previousResult if it's not the case
+ */
+ static CallerInfo doSecondaryLookupIfNecessary(Context context,
+ String number, CallerInfo previousResult) {
+ if (!previousResult.contactExists
+ && PhoneNumberHelper.isUriNumber(number)) {
+ String username = PhoneNumberHelper.getUsernameFromUriNumber(number);
+ if (PhoneNumberUtils.isGlobalPhoneNumber(username)) {
+ previousResult = getCallerInfo(context,
+ Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+ Uri.encode(username)));
+ }
+ }
+ return previousResult;
+ }
+
+ // Accessors
+
+ /**
+ * @return true if the caller info is an emergency number.
+ */
+ public boolean isEmergencyNumber() {
+ return mIsEmergency;
+ }
+
+ /**
+ * @return true if the caller info is a voicemail number.
+ */
+ public boolean isVoiceMailNumber() {
+ return mIsVoiceMail;
+ }
+
+ /**
+ * Mark this CallerInfo as an emergency call.
+ * @param context To lookup the localized 'Emergency Number' string.
+ * @return this instance.
+ */
+ /* package */ CallerInfo markAsEmergency(Context context) {
+ name = context.getString(R.string.emergency_call_dialog_number_for_display);
+ phoneNumber = null;
+
+ photoResource = R.drawable.img_phone;
+ mIsEmergency = true;
+ return this;
+ }
+
+
+ /**
+ * Mark this CallerInfo as a voicemail call. The voicemail label
+ * is obtained from the telephony manager. Caller must hold the
+ * READ_PHONE_STATE permission otherwise the phoneNumber will be
+ * set to null.
+ * @return this instance.
+ */
+ /* package */ CallerInfo markAsVoiceMail(Context context) {
+ mIsVoiceMail = true;
+
+ try {
+ // For voicemail calls, we display the voice mail tag
+ // instead of the real phone number in the "number"
+ // field.
+ name = TelephonyManagerUtils.getVoiceMailAlphaTag(context);
+ phoneNumber = null;
+ } catch (SecurityException se) {
+ // Should never happen: if this process does not have
+ // permission to retrieve VM tag, it should not have
+ // permission to retrieve VM number and would not call
+ // this method.
+ // Leave phoneNumber untouched.
+ Log.e(TAG, "Cannot access VoiceMail.", se);
+ }
+ // TODO: There is no voicemail picture?
+ // FIXME: FIND ANOTHER ICON
+ // photoResource = android.R.drawable.badge_voicemail;
+ return this;
+ }
+
+ private static String normalize(String s) {
+ if (s == null || s.length() > 0) {
+ return s;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the column index to use to find the "person_id" field in
+ * the specified cursor, based on the contact URI that was originally
+ * queried.
+ *
+ * This is a helper function for the getCallerInfo() method that takes
+ * a Cursor. Looking up the person_id is nontrivial (compared to all
+ * the other CallerInfo fields) since the column we need to use
+ * depends on what query we originally ran.
+ *
+ * Watch out: be sure to not do any database access in this method, since
+ * it's run from the UI thread (see comments below for more info.)
+ *
+ * @return the columnIndex to use (with cursor.getLong()) to get the
+ * person_id, or -1 if we couldn't figure out what colum to use.
+ *
+ * TODO: Add a unittest for this method. (This is a little tricky to
+ * test, since we'll need a live contacts database to test against,
+ * preloaded with at least some phone numbers and SIP addresses. And
+ * we'll probably have to hardcode the column indexes we expect, so
+ * the test might break whenever the contacts schema changes. But we
+ * can at least make sure we handle all the URI patterns we claim to,
+ * and that the mime types match what we expect...)
+ */
+ private static int getColumnIndexForPersonId(Uri contactRef, Cursor cursor) {
+ // TODO: This is pretty ugly now, see bug 2269240 for
+ // more details. The column to use depends upon the type of URL:
+ // - content://com.android.contacts/data/phones ==> use the "contact_id" column
+ // - content://com.android.contacts/phone_lookup ==> use the "_ID" column
+ // - content://com.android.contacts/data ==> use the "contact_id" column
+ // If it's none of the above, we leave columnIndex=-1 which means
+ // that the person_id field will be left unset.
+ //
+ // The logic here *used* to be based on the mime type of contactRef
+ // (for example Phone.CONTENT_ITEM_TYPE would tell us to use the
+ // RawContacts.CONTACT_ID column). But looking up the mime type requires
+ // a call to context.getContentResolver().getType(contactRef), which
+ // isn't safe to do from the UI thread since it can cause an ANR if
+ // the contacts provider is slow or blocked (like during a sync.)
+ //
+ // So instead, figure out the column to use for person_id by just
+ // looking at the URI itself.
+
+ Log.v(TAG, "- getColumnIndexForPersonId: contactRef URI = '"
+ + contactRef + "'...");
+ // Warning: Do not enable the following logging (due to ANR risk.)
+ // if (VDBG) Rlog.v(TAG, "- MIME type: "
+ // + context.getContentResolver().getType(contactRef));
+
+ String url = contactRef.toString();
+ String columnName = null;
+ if (url.startsWith("content://com.android.contacts/data/phones")) {
+ // Direct lookup in the Phone table.
+ // MIME type: Phone.CONTENT_ITEM_TYPE (= "vnd.android.cursor.item/phone_v2")
+ Log.v(TAG, "'data/phones' URI; using RawContacts.CONTACT_ID");
+ columnName = RawContacts.CONTACT_ID;
+ } else if (url.startsWith("content://com.android.contacts/data")) {
+ // Direct lookup in the Data table.
+ // MIME type: Data.CONTENT_TYPE (= "vnd.android.cursor.dir/data")
+ Log.v(TAG, "'data' URI; using Data.CONTACT_ID");
+ // (Note Data.CONTACT_ID and RawContacts.CONTACT_ID are equivalent.)
+ columnName = Data.CONTACT_ID;
+ } else if (url.startsWith("content://com.android.contacts/phone_lookup")) {
+ // Lookup in the PhoneLookup table, which provides "fuzzy matching"
+ // for phone numbers.
+ // MIME type: PhoneLookup.CONTENT_TYPE (= "vnd.android.cursor.dir/phone_lookup")
+ Log.v(TAG, "'phone_lookup' URI; using PhoneLookup._ID");
+ columnName = PhoneLookup._ID;
+ } else {
+ Log.v(TAG, "Unexpected prefix for contactRef '" + url + "'");
+ }
+ int columnIndex = (columnName != null) ? cursor.getColumnIndex(columnName) : -1;
+ Log.v(TAG, "==> Using column '" + columnName
+ + "' (columnIndex = " + columnIndex + ") for person_id lookup...");
+ return columnIndex;
+ }
+
+ /**
+ * Updates this CallerInfo's geoDescription field, based on the raw
+ * phone number in the phoneNumber field.
+ *
+ * (Note that the various getCallerInfo() methods do *not* set the
+ * geoDescription automatically; you need to call this method
+ * explicitly to get it.)
+ *
+ * @param context the context used to look up the current locale / country
+ * @param fallbackNumber if this CallerInfo's phoneNumber field is empty,
+ * this specifies a fallback number to use instead.
+ */
+ public void updateGeoDescription(Context context, String fallbackNumber) {
+ String number = TextUtils.isEmpty(phoneNumber) ? fallbackNumber : phoneNumber;
+ geoDescription = com.android.dialer.util.PhoneNumberUtil.getGeoDescription(context, number);
+ }
+
+ /**
+ * @return a string debug representation of this instance.
+ */
+ @Override
+ public String toString() {
+ // Warning: never check in this file with VERBOSE_DEBUG = true
+ // because that will result in PII in the system log.
+ final boolean VERBOSE_DEBUG = false;
+
+ if (VERBOSE_DEBUG) {
+ return new StringBuilder(384)
+ .append(super.toString() + " { ")
+ .append("\nname: " + name)
+ .append("\nphoneNumber: " + phoneNumber)
+ .append("\nnormalizedNumber: " + normalizedNumber)
+ .append("\forwardingNumber: " + forwardingNumber)
+ .append("\ngeoDescription: " + geoDescription)
+ .append("\ncnapName: " + cnapName)
+ .append("\nnumberPresentation: " + numberPresentation)
+ .append("\nnamePresentation: " + namePresentation)
+ .append("\ncontactExists: " + contactExists)
+ .append("\nphoneLabel: " + phoneLabel)
+ .append("\nnumberType: " + numberType)
+ .append("\nnumberLabel: " + numberLabel)
+ .append("\nphotoResource: " + photoResource)
+ .append("\ncontactIdOrZero: " + contactIdOrZero)
+ .append("\nneedUpdate: " + needUpdate)
+ .append("\ncontactRefUri: " + contactRefUri)
+ .append("\ncontactRingtoneUri: " + contactRingtoneUri)
+ .append("\ncontactDisplayPhotoUri: " + contactDisplayPhotoUri)
+ .append("\nshouldSendToVoicemail: " + shouldSendToVoicemail)
+ .append("\ncachedPhoto: " + cachedPhoto)
+ .append("\nisCachedPhotoCurrent: " + isCachedPhotoCurrent)
+ .append("\nemergency: " + mIsEmergency)
+ .append("\nvoicemail: " + mIsVoiceMail)
+ .append("\nuserType: " + userType)
+ .append(" }")
+ .toString();
+ } else {
+ return new StringBuilder(128)
+ .append(super.toString() + " { ")
+ .append("name " + ((name == null) ? "null" : "non-null"))
+ .append(", phoneNumber " + ((phoneNumber == null) ? "null" : "non-null"))
+ .append(" }")
+ .toString();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
new file mode 100644
index 0000000..8d45efb
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
@@ -0,0 +1,565 @@
+/*
+ * Copyright (C) 2006 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.incallui;
+
+import com.google.common.primitives.Longs;
+
+import android.content.AsyncQueryHandler;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Directory;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.DirectoryCompat;
+import com.android.contacts.common.util.TelephonyManagerUtils;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+import com.android.dialerbind.ObjectFactory;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+
+/**
+ * Helper class to make it easier to run asynchronous caller-id lookup queries.
+ * @see CallerInfo
+ *
+ */
+public class CallerInfoAsyncQuery {
+ private static final boolean DBG = false;
+ private static final String LOG_TAG = "CallerInfoAsyncQuery";
+
+ private static final int EVENT_NEW_QUERY = 1;
+ private static final int EVENT_ADD_LISTENER = 2;
+ private static final int EVENT_END_OF_QUEUE = 3;
+ private static final int EVENT_EMERGENCY_NUMBER = 4;
+ private static final int EVENT_VOICEMAIL_NUMBER = 5;
+
+ private CallerInfoAsyncQueryHandler mHandler;
+
+ // If the CallerInfo query finds no contacts, should we use the
+ // PhoneNumberOfflineGeocoder to look up a "geo description"?
+ // (TODO: This could become a flag in config.xml if it ever needs to be
+ // configured on a per-product basis.)
+ private static final boolean ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION = true;
+
+ /**
+ * Interface for a CallerInfoAsyncQueryHandler result return.
+ */
+ public interface OnQueryCompleteListener {
+ /**
+ * Called when the query is complete.
+ */
+ public void onQueryComplete(int token, Object cookie, CallerInfo ci);
+ }
+
+
+ /**
+ * Wrap the cookie from the WorkerArgs with additional information needed by our
+ * classes.
+ */
+ private static final class CookieWrapper {
+ public OnQueryCompleteListener listener;
+ public Object cookie;
+ public int event;
+ public String number;
+ }
+
+ /**
+ * Simple exception used to communicate problems with the query pool.
+ */
+ public static class QueryPoolException extends SQLException {
+ public QueryPoolException(String error) {
+ super(error);
+ }
+ }
+
+ /**
+ * Our own implementation of the AsyncQueryHandler.
+ */
+ private class CallerInfoAsyncQueryHandler extends AsyncQueryHandler {
+
+ @Override
+ public void startQuery(int token, Object cookie, Uri uri, String[] projection,
+ String selection, String[] selectionArgs, String orderBy) {
+ if (DBG) {
+ // Show stack trace with the arguments.
+ android.util.Log.d(LOG_TAG, "InCall: startQuery: url=" + uri +
+ " projection=[" + Arrays.toString(projection) + "]" +
+ " selection=" + selection + " " +
+ " args=[" + Arrays.toString(selectionArgs) + "]",
+ new RuntimeException("STACKTRACE"));
+ }
+ super.startQuery(token, cookie, uri, projection, selection, selectionArgs, orderBy);
+ }
+
+ /**
+ * The information relevant to each CallerInfo query. Each query may have multiple
+ * listeners, so each AsyncCursorInfo is associated with 2 or more CookieWrapper
+ * objects in the queue (one with a new query event, and one with a end event, with
+ * 0 or more additional listeners in between).
+ */
+ private Context mQueryContext;
+ private Uri mQueryUri;
+ private CallerInfo mCallerInfo;
+
+ /**
+ * Our own query worker thread.
+ *
+ * This thread handles the messages enqueued in the looper. The normal sequence
+ * of events is that a new query shows up in the looper queue, followed by 0 or
+ * more add listener requests, and then an end request. Of course, these requests
+ * can be interlaced with requests from other tokens, but is irrelevant to this
+ * handler since the handler has no state.
+ *
+ * Note that we depend on the queue to keep things in order; in other words, the
+ * looper queue must be FIFO with respect to input from the synchronous startQuery
+ * calls and output to this handleMessage call.
+ *
+ * This use of the queue is required because CallerInfo objects may be accessed
+ * multiple times before the query is complete. All accesses (listeners) must be
+ * queued up and informed in order when the query is complete.
+ */
+ protected class CallerInfoWorkerHandler extends WorkerHandler {
+ public CallerInfoWorkerHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ WorkerArgs args = (WorkerArgs) msg.obj;
+ CookieWrapper cw = (CookieWrapper) args.cookie;
+
+ if (cw == null) {
+ // Normally, this should never be the case for calls originating
+ // from within this code.
+ // However, if there is any code that this Handler calls (such as in
+ // super.handleMessage) that DOES place unexpected messages on the
+ // queue, then we need pass these messages on.
+ Log.d(this, "Unexpected command (CookieWrapper is null): " + msg.what +
+ " ignored by CallerInfoWorkerHandler, passing onto parent.");
+
+ super.handleMessage(msg);
+ } else {
+ Log.d(this, "Processing event: " + cw.event + " token (arg1): " + msg.arg1 +
+ " command: " + msg.what + " query URI: " +
+ sanitizeUriToString(args.uri));
+
+ switch (cw.event) {
+ case EVENT_NEW_QUERY:
+ //start the sql command.
+ super.handleMessage(msg);
+ break;
+
+ // shortcuts to avoid query for recognized numbers.
+ case EVENT_EMERGENCY_NUMBER:
+ case EVENT_VOICEMAIL_NUMBER:
+
+ case EVENT_ADD_LISTENER:
+ case EVENT_END_OF_QUEUE:
+ // query was already completed, so just send the reply.
+ // passing the original token value back to the caller
+ // on top of the event values in arg1.
+ Message reply = args.handler.obtainMessage(msg.what);
+ reply.obj = args;
+ reply.arg1 = msg.arg1;
+
+ reply.sendToTarget();
+
+ break;
+ default:
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Asynchronous query handler class for the contact / callerinfo object.
+ */
+ private CallerInfoAsyncQueryHandler(Context context) {
+ super(context.getContentResolver());
+ }
+
+ @Override
+ protected Handler createHandler(Looper looper) {
+ return new CallerInfoWorkerHandler(looper);
+ }
+
+ /**
+ * Overrides onQueryComplete from AsyncQueryHandler.
+ *
+ * This method takes into account the state of this class; we construct the CallerInfo
+ * object only once for each set of listeners. When the query thread has done its work
+ * and calls this method, we inform the remaining listeners in the queue, until we're
+ * out of listeners. Once we get the message indicating that we should expect no new
+ * listeners for this CallerInfo object, we release the AsyncCursorInfo back into the
+ * pool.
+ */
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ try {
+ Log.d(this, "##### onQueryComplete() ##### query complete for token: " + token);
+
+ //get the cookie and notify the listener.
+ CookieWrapper cw = (CookieWrapper) cookie;
+ if (cw == null) {
+ // Normally, this should never be the case for calls originating
+ // from within this code.
+ // However, if there is any code that calls this method, we should
+ // check the parameters to make sure they're viable.
+ Log.d(this, "Cookie is null, ignoring onQueryComplete() request.");
+ return;
+ }
+
+ if (cw.event == EVENT_END_OF_QUEUE) {
+ release();
+ return;
+ }
+
+ // check the token and if needed, create the callerinfo object.
+ if (mCallerInfo == null) {
+ if ((mQueryContext == null) || (mQueryUri == null)) {
+ throw new QueryPoolException
+ ("Bad context or query uri, or CallerInfoAsyncQuery already released.");
+ }
+
+ // adjust the callerInfo data as needed, and only if it was set from the
+ // initial query request.
+ // Change the callerInfo number ONLY if it is an emergency number or the
+ // voicemail number, and adjust other data (including photoResource)
+ // accordingly.
+ if (cw.event == EVENT_EMERGENCY_NUMBER) {
+ // Note we're setting the phone number here (refer to javadoc
+ // comments at the top of CallerInfo class).
+ mCallerInfo = new CallerInfo().markAsEmergency(mQueryContext);
+ } else if (cw.event == EVENT_VOICEMAIL_NUMBER) {
+ mCallerInfo = new CallerInfo().markAsVoiceMail(mQueryContext);
+ } else {
+ mCallerInfo = CallerInfo.getCallerInfo(mQueryContext, mQueryUri, cursor);
+ Log.d(this, "==> Got mCallerInfo: " + mCallerInfo);
+
+ CallerInfo newCallerInfo = CallerInfo.doSecondaryLookupIfNecessary(
+ mQueryContext, cw.number, mCallerInfo);
+ if (newCallerInfo != mCallerInfo) {
+ mCallerInfo = newCallerInfo;
+ Log.d(this, "#####async contact look up with numeric username"
+ + mCallerInfo);
+ }
+
+ // Final step: look up the geocoded description.
+ if (ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION) {
+ // Note we do this only if we *don't* have a valid name (i.e. if
+ // no contacts matched the phone number of the incoming call),
+ // since that's the only case where the incoming-call UI cares
+ // about this field.
+ //
+ // (TODO: But if we ever want the UI to show the geoDescription
+ // even when we *do* match a contact, we'll need to either call
+ // updateGeoDescription() unconditionally here, or possibly add a
+ // new parameter to CallerInfoAsyncQuery.startQuery() to force
+ // the geoDescription field to be populated.)
+
+ if (TextUtils.isEmpty(mCallerInfo.name)) {
+ // Actually when no contacts match the incoming phone number,
+ // the CallerInfo object is totally blank here (i.e. no name
+ // *or* phoneNumber). So we need to pass in cw.number as
+ // a fallback number.
+ mCallerInfo.updateGeoDescription(mQueryContext, cw.number);
+ }
+ }
+
+ // Use the number entered by the user for display.
+ if (!TextUtils.isEmpty(cw.number)) {
+ mCallerInfo.phoneNumber = PhoneNumberUtils.formatNumber(cw.number,
+ mCallerInfo.normalizedNumber,
+ TelephonyManagerUtils.getCurrentCountryIso(mQueryContext,
+ Locale.getDefault()));
+ }
+ }
+
+ Log.d(this, "constructing CallerInfo object for token: " + token);
+
+ //notify that we can clean up the queue after this.
+ CookieWrapper endMarker = new CookieWrapper();
+ endMarker.event = EVENT_END_OF_QUEUE;
+ startQuery(token, endMarker, null, null, null, null, null);
+ }
+
+ //notify the listener that the query is complete.
+ if (cw.listener != null) {
+ Log.d(this, "notifying listener: " + cw.listener.getClass().toString() +
+ " for token: " + token + mCallerInfo);
+ cw.listener.onQueryComplete(token, cw.cookie, mCallerInfo);
+ }
+ } finally {
+ // The cursor may have been closed in CallerInfo.getCallerInfo()
+ if (cursor != null && !cursor.isClosed()) {
+ cursor.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * Private constructor for factory methods.
+ */
+ private CallerInfoAsyncQuery() {
+ }
+
+ public static void startQuery(final int token, final Context context, final CallerInfo info,
+ final OnQueryCompleteListener listener, final Object cookie) {
+ Log.d(LOG_TAG, "##### CallerInfoAsyncQuery startContactProviderQuery()... #####");
+ Log.d(LOG_TAG, "- number: " + info.phoneNumber);
+ Log.d(LOG_TAG, "- cookie: " + cookie);
+ OnQueryCompleteListener contactsProviderQueryCompleteListener =
+ new OnQueryCompleteListener() {
+ @Override
+ public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
+ Log.d(LOG_TAG, "contactsProviderQueryCompleteListener done");
+ if (ci != null && ci.contactExists) {
+ if (listener != null) {
+ listener.onQueryComplete(token, cookie, ci);
+ }
+ } else {
+ startOtherDirectoriesQuery(token, context, info, listener, cookie);
+ }
+ }
+ };
+ startDefaultDirectoryQuery(token, context, info, contactsProviderQueryCompleteListener,
+ cookie);
+ }
+
+ // Private methods
+ private static CallerInfoAsyncQuery startDefaultDirectoryQuery(int token, Context context,
+ CallerInfo info, OnQueryCompleteListener listener, Object cookie) {
+ // Construct the URI object and query params, and start the query.
+ Uri uri = ContactInfoHelper.getContactInfoLookupUri(info.phoneNumber);
+ return startQueryInternal(token, context, info, listener, cookie, uri);
+ }
+
+ /**
+ * Factory method to start the query based on a CallerInfo object.
+ *
+ * Note: if the number contains an "@" character we treat it
+ * as a SIP address, and look it up directly in the Data table
+ * rather than using the PhoneLookup table.
+ * TODO: But eventually we should expose two separate methods, one for
+ * numbers and one for SIP addresses, and then have
+ * PhoneUtils.startGetCallerInfo() decide which one to call based on
+ * the phone type of the incoming connection.
+ */
+ private static CallerInfoAsyncQuery startQueryInternal(int token, Context context,
+ CallerInfo info, OnQueryCompleteListener listener, Object cookie, Uri contactRef) {
+ if (DBG) {
+ Log.d(LOG_TAG, "==> contactRef: " + sanitizeUriToString(contactRef));
+ }
+
+ CallerInfoAsyncQuery c = new CallerInfoAsyncQuery();
+ c.allocate(context, contactRef);
+
+ //create cookieWrapper, start query
+ CookieWrapper cw = new CookieWrapper();
+ cw.listener = listener;
+ cw.cookie = cookie;
+ cw.number = info.phoneNumber;
+
+ // check to see if these are recognized numbers, and use shortcuts if we can.
+ if (PhoneNumberUtils.isLocalEmergencyNumber(context, info.phoneNumber)) {
+ cw.event = EVENT_EMERGENCY_NUMBER;
+ } else if (info.isVoiceMailNumber()) {
+ cw.event = EVENT_VOICEMAIL_NUMBER;
+ } else {
+ cw.event = EVENT_NEW_QUERY;
+ }
+
+ c.mHandler.startQuery(token,
+ cw, // cookie
+ contactRef, // uri
+ CallerInfo.DEFAULT_PHONELOOKUP_PROJECTION, // projection
+ null, // selection
+ null, // selectionArgs
+ null); // orderBy
+ return c;
+ }
+
+ private static void startOtherDirectoriesQuery(int token, Context context, CallerInfo info,
+ OnQueryCompleteListener listener, Object cookie) {
+ long[] directoryIds = getDirectoryIds(context);
+ int size = directoryIds.length;
+ if (size == 0) {
+ if (listener != null) {
+ listener.onQueryComplete(token, cookie, info);
+ }
+ return;
+ }
+
+ DirectoryQueryCompleteListenerFactory listenerFactory =
+ new DirectoryQueryCompleteListenerFactory(context, size, listener);
+
+ // The current implementation of multiple async query runs in single handler thread
+ // in AsyncQueryHandler.
+ // intermediateListener.onQueryComplete is also called from the same caller thread.
+ // TODO(b/26019872): use thread pool instead of single thread.
+ for (int i = 0; i < size; i++) {
+ long directoryId = directoryIds[i];
+ Uri uri = ContactInfoHelper.getContactInfoLookupUri(info.phoneNumber, directoryId);
+ if (DBG) {
+ Log.d(LOG_TAG, "directoryId: " + directoryId + " uri: " + uri);
+ }
+ OnQueryCompleteListener intermediateListener =
+ listenerFactory.newListener(directoryId);
+ startQueryInternal(token, context, info, intermediateListener, cookie, uri);
+ }
+ }
+
+ /* Directory lookup related code - START */
+ private static final String[] DIRECTORY_PROJECTION = new String[] {Directory._ID};
+
+ private static long[] getDirectoryIds(Context context) {
+ ArrayList<Long> results = new ArrayList<>();
+
+ Uri uri = Directory.CONTENT_URI;
+ if (ContactsUtils.FLAG_N_FEATURE) {
+ uri = Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "directories_enterprise");
+ }
+
+ ContentResolver cr = context.getContentResolver();
+ Cursor cursor = cr.query(uri, DIRECTORY_PROJECTION, null, null, null);
+ addDirectoryIdsFromCursor(cursor, results);
+
+ return Longs.toArray(results);
+ }
+
+ private static void addDirectoryIdsFromCursor(Cursor cursor, ArrayList<Long> results) {
+ if (cursor != null) {
+ int idIndex = cursor.getColumnIndex(Directory._ID);
+ while (cursor.moveToNext()) {
+ long id = cursor.getLong(idIndex);
+ if (DirectoryCompat.isRemoteDirectory(id)) {
+ results.add(id);
+ }
+ }
+ cursor.close();
+ }
+ }
+
+ private static final class DirectoryQueryCompleteListenerFactory {
+ // Make sure listener to be called once and only once
+ int mCount;
+ boolean mIsListenerCalled;
+ OnQueryCompleteListener mListener;
+ Context mContext;
+ CachedNumberLookupService mCachedNumberLookupService =
+ ObjectFactory.newCachedNumberLookupService();
+
+ private class DirectoryQueryCompleteListener implements OnQueryCompleteListener {
+ long mDirectoryId;
+
+ DirectoryQueryCompleteListener(long directoryId) {
+ mDirectoryId = directoryId;
+ }
+
+ @Override
+ public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
+ if (ci.contactExists && mCachedNumberLookupService != null) {
+ CachedContactInfo cachedContactInfo =
+ CallerInfoUtils.buildCachedContactInfo(mCachedNumberLookupService, ci);
+ String directoryLabel = mContext.getString(R.string.directory_search_label);
+ cachedContactInfo.setDirectorySource(directoryLabel, mDirectoryId);
+ mCachedNumberLookupService.addContact(mContext, cachedContactInfo);
+ }
+
+ callListenerIfNecessary(token, cookie, ci);
+ }
+ }
+
+ DirectoryQueryCompleteListenerFactory(Context context, int size, OnQueryCompleteListener listener) {
+ mCount = size;
+ mListener = listener;
+ mIsListenerCalled = false;
+ mContext = context;
+ }
+
+ private void callListenerIfNecessary(int token, Object cookie, CallerInfo ci) {
+ boolean shouldCallListener = false;
+ synchronized (this) {
+ mCount = mCount - 1;
+ if (!mIsListenerCalled && (ci.contactExists || mCount == 0)) {
+ mIsListenerCalled = true;
+ shouldCallListener = true;
+ }
+ }
+ if (shouldCallListener && mListener != null) {
+ mListener.onQueryComplete(token, cookie, ci);
+ }
+ }
+
+ public OnQueryCompleteListener newListener(long directoryId) {
+ return new DirectoryQueryCompleteListener(directoryId);
+ }
+ }
+ /* Directory lookup related code - END */
+
+ /**
+ * Method to create a new CallerInfoAsyncQueryHandler object, ensuring correct
+ * state of context and uri.
+ */
+ private void allocate(Context context, Uri contactRef) {
+ if ((context == null) || (contactRef == null)){
+ throw new QueryPoolException("Bad context or query uri.");
+ }
+ mHandler = new CallerInfoAsyncQueryHandler(context);
+ mHandler.mQueryContext = context;
+ mHandler.mQueryUri = contactRef;
+ }
+
+ /**
+ * Releases the relevant data.
+ */
+ private void release() {
+ mHandler.mQueryContext = null;
+ mHandler.mQueryUri = null;
+ mHandler.mCallerInfo = null;
+ mHandler = null;
+ }
+
+ private static String sanitizeUriToString(Uri uri) {
+ if (uri != null) {
+ String uriString = uri.toString();
+ int indexOfLastSlash = uriString.lastIndexOf('/');
+ if (indexOfLastSlash > 0) {
+ return uriString.substring(0, indexOfLastSlash) + "/xxxxxxx";
+ } else {
+ return uriString;
+ }
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
new file mode 100644
index 0000000..ae59d7d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
@@ -0,0 +1,234 @@
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.Loader;
+import android.content.Loader.OnLoadCompleteListener;
+import android.net.Uri;
+import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.model.Contact;
+import com.android.contacts.common.model.ContactLoader;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+
+import java.util.Arrays;
+
+/**
+ * Utility methods for contact and caller info related functionality
+ */
+public class CallerInfoUtils {
+
+ private static final String TAG = CallerInfoUtils.class.getSimpleName();
+
+ /** Define for not a special CNAP string */
+ private static final int CNAP_SPECIAL_CASE_NO = -1;
+
+ public CallerInfoUtils() {
+ }
+
+ private static final int QUERY_TOKEN = -1;
+
+ /**
+ * This is called to get caller info for a call. This will return a CallerInfo
+ * object immediately based off information in the call, but
+ * more information is returned to the OnQueryCompleteListener (which contains
+ * information about the phone number label, user's name, etc).
+ */
+ public static CallerInfo getCallerInfoForCall(Context context, Call call,
+ CallerInfoAsyncQuery.OnQueryCompleteListener listener) {
+ CallerInfo info = buildCallerInfo(context, call);
+
+ // TODO: Have phoneapp send a Uri when it knows the contact that triggered this call.
+
+ if (info.numberPresentation == TelecomManager.PRESENTATION_ALLOWED) {
+ // Start the query with the number provided from the call.
+ Log.d(TAG, "==> Actually starting CallerInfoAsyncQuery.startQuery()...");
+ CallerInfoAsyncQuery.startQuery(QUERY_TOKEN, context, info, listener, call);
+ }
+ return info;
+ }
+
+ public static CallerInfo buildCallerInfo(Context context, Call call) {
+ CallerInfo info = new CallerInfo();
+
+ // Store CNAP information retrieved from the Connection (we want to do this
+ // here regardless of whether the number is empty or not).
+ info.cnapName = call.getCnapName();
+ info.name = info.cnapName;
+ info.numberPresentation = call.getNumberPresentation();
+ info.namePresentation = call.getCnapNamePresentation();
+ info.callSubject = call.getCallSubject();
+
+ String number = call.getNumber();
+ if (!TextUtils.isEmpty(number)) {
+ final String[] numbers = number.split("&");
+ number = numbers[0];
+ if (numbers.length > 1) {
+ info.forwardingNumber = numbers[1];
+ }
+
+ number = modifyForSpecialCnapCases(context, info, number, info.numberPresentation);
+ info.phoneNumber = number;
+ }
+
+ // Because the InCallUI is immediately launched before the call is connected, occasionally
+ // a voicemail call will be passed to InCallUI as a "voicemail:" URI without a number.
+ // This call should still be handled as a voicemail call.
+ if ((call.getHandle() != null &&
+ PhoneAccount.SCHEME_VOICEMAIL.equals(call.getHandle().getScheme())) ||
+ isVoiceMailNumber(context, call)) {
+ info.markAsVoiceMail(context);
+ }
+
+ ContactInfoCache.getInstance(context).maybeInsertCnapInformationIntoCache(context, call,
+ info);
+
+ return info;
+ }
+
+ /**
+ * Creates a new {@link CachedContactInfo} from a {@link CallerInfo}
+ *
+ * @param lookupService the {@link CachedNumberLookupService} used to build a
+ * new {@link CachedContactInfo}
+ * @param {@link CallerInfo} object
+ * @return a CachedContactInfo object created from this CallerInfo
+ * @throws NullPointerException if lookupService or ci are null
+ */
+ public static CachedContactInfo buildCachedContactInfo(CachedNumberLookupService lookupService,
+ CallerInfo ci) {
+ ContactInfo info = new ContactInfo();
+ info.name = ci.name;
+ info.type = ci.numberType;
+ info.label = ci.phoneLabel;
+ info.number = ci.phoneNumber;
+ info.normalizedNumber = ci.normalizedNumber;
+ info.photoUri = ci.contactDisplayPhotoUri;
+ info.userType = ci.userType;
+
+ CachedContactInfo cacheInfo = lookupService.buildCachedContactInfo(info);
+ cacheInfo.setLookupKey(ci.lookupKeyOrNull);
+ return cacheInfo;
+ }
+
+ public static boolean isVoiceMailNumber(Context context, Call call) {
+ return TelecomManagerCompat.isVoiceMailNumber(
+ (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE),
+ call.getTelecomCall().getDetails().getAccountHandle(),
+ call.getNumber());
+ }
+
+ /**
+ * Handles certain "corner cases" for CNAP. When we receive weird phone numbers
+ * from the network to indicate different number presentations, convert them to
+ * expected number and presentation values within the CallerInfo object.
+ * @param number number we use to verify if we are in a corner case
+ * @param presentation presentation value used to verify if we are in a corner case
+ * @return the new String that should be used for the phone number
+ */
+ /* package */static String modifyForSpecialCnapCases(Context context, CallerInfo ci,
+ String number, int presentation) {
+ // Obviously we return number if ci == null, but still return number if
+ // number == null, because in these cases the correct string will still be
+ // displayed/logged after this function returns based on the presentation value.
+ if (ci == null || number == null) return number;
+
+ Log.d(TAG, "modifyForSpecialCnapCases: initially, number="
+ + toLogSafePhoneNumber(number)
+ + ", presentation=" + presentation + " ci " + ci);
+
+ // "ABSENT NUMBER" is a possible value we could get from the network as the
+ // phone number, so if this happens, change it to "Unknown" in the CallerInfo
+ // and fix the presentation to be the same.
+ final String[] absentNumberValues =
+ context.getResources().getStringArray(R.array.absent_num);
+ if (Arrays.asList(absentNumberValues).contains(number)
+ && presentation == TelecomManager.PRESENTATION_ALLOWED) {
+ number = context.getString(R.string.unknown);
+ ci.numberPresentation = TelecomManager.PRESENTATION_UNKNOWN;
+ }
+
+ // Check for other special "corner cases" for CNAP and fix them similarly. Corner
+ // cases only apply if we received an allowed presentation from the network, so check
+ // if we think we have an allowed presentation, or if the CallerInfo presentation doesn't
+ // match the presentation passed in for verification (meaning we changed it previously
+ // because it's a corner case and we're being called from a different entry point).
+ if (ci.numberPresentation == TelecomManager.PRESENTATION_ALLOWED
+ || (ci.numberPresentation != presentation
+ && presentation == TelecomManager.PRESENTATION_ALLOWED)) {
+ // For all special strings, change number & numberPrentation.
+ if (isCnapSpecialCaseRestricted(number)) {
+ number = context.getString(R.string.private_num);
+ ci.numberPresentation = TelecomManager.PRESENTATION_RESTRICTED;
+ } else if (isCnapSpecialCaseUnknown(number)) {
+ number = context.getString(R.string.unknown);
+ ci.numberPresentation = TelecomManager.PRESENTATION_UNKNOWN;
+ }
+ Log.d(TAG, "SpecialCnap: number=" + toLogSafePhoneNumber(number)
+ + "; presentation now=" + ci.numberPresentation);
+ }
+ Log.d(TAG, "modifyForSpecialCnapCases: returning number string="
+ + toLogSafePhoneNumber(number));
+ return number;
+ }
+
+ private static boolean isCnapSpecialCaseRestricted(String n) {
+ return n.equals("PRIVATE") || n.equals("P") || n.equals("RES");
+ }
+
+ private static boolean isCnapSpecialCaseUnknown(String n) {
+ return n.equals("UNAVAILABLE") || n.equals("UNKNOWN") || n.equals("UNA") || n.equals("U");
+ }
+
+ /* package */static String toLogSafePhoneNumber(String number) {
+ // For unknown number, log empty string.
+ if (number == null) {
+ return "";
+ }
+
+ // Todo: Figure out an equivalent for VDBG
+ if (false) {
+ // When VDBG is true we emit PII.
+ return number;
+ }
+
+ // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
+ // sanitized phone numbers.
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < number.length(); i++) {
+ char c = number.charAt(i);
+ if (c == '-' || c == '@' || c == '.' || c == '&') {
+ builder.append(c);
+ } else {
+ builder.append('x');
+ }
+ }
+ return builder.toString();
+ }
+
+ /**
+ * Send a notification using a {@link ContactLoader} to inform the sync adapter that we are
+ * viewing a particular contact, so that it can download the high-res photo.
+ */
+ public static void sendViewNotification(Context context, Uri contactUri) {
+ final ContactLoader loader = new ContactLoader(context, contactUri,
+ true /* postViewNotification */);
+ loader.registerListener(0, new OnLoadCompleteListener<Contact>() {
+ @Override
+ public void onLoadComplete(
+ Loader<Contact> loader, Contact contact) {
+ try {
+ loader.reset();
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Error resetting loader", e);
+ }
+ }
+ });
+ loader.startLoading();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CircularRevealFragment.java b/InCallUI/src/com/android/incallui/CircularRevealFragment.java
new file mode 100644
index 0000000..f4a2e91
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CircularRevealFragment.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.graphics.Outline;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewAnimationUtils;
+import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnPreDrawListener;
+
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+
+public class CircularRevealFragment extends Fragment {
+ static final String TAG = "CircularRevealFragment";
+
+ private Point mTouchPoint;
+ private OnCircularRevealCompleteListener mListener;
+ private boolean mAnimationStarted;
+
+ interface OnCircularRevealCompleteListener {
+ public void onCircularRevealComplete(FragmentManager fm);
+ }
+
+ public static void startCircularReveal(FragmentManager fm, Point touchPoint,
+ OnCircularRevealCompleteListener listener) {
+ if (fm.findFragmentByTag(TAG) == null) {
+ fm.beginTransaction().add(R.id.main,
+ new CircularRevealFragment(touchPoint, listener), TAG)
+ .commitAllowingStateLoss();
+ } else {
+ Log.w(TAG, "An instance of CircularRevealFragment already exists");
+ }
+ }
+
+ public static void endCircularReveal(FragmentManager fm) {
+ final Fragment fragment = fm.findFragmentByTag(TAG);
+ if (fragment != null) {
+ fm.beginTransaction().remove(fragment).commitAllowingStateLoss();
+ }
+ }
+
+ /**
+ * Empty constructor used only by the {@link FragmentManager}.
+ */
+ public CircularRevealFragment() {}
+
+ public CircularRevealFragment(Point touchPoint, OnCircularRevealCompleteListener listener) {
+ mTouchPoint = touchPoint;
+ mListener = listener;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (!mAnimationStarted) {
+ // Only run the animation once for each instance of the fragment
+ startOutgoingAnimation(InCallPresenter.getInstance().getThemeColors());
+ }
+ mAnimationStarted = true;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.outgoing_call_animation, container, false);
+ }
+
+ public void startOutgoingAnimation(MaterialPalette palette) {
+ final Activity activity = getActivity();
+ if (activity == null) {
+ Log.w(this, "Asked to do outgoing call animation when not attached");
+ return;
+ }
+
+ final View view = activity.getWindow().getDecorView();
+
+ // The circle starts from an initial size of 0 so clip it such that it is invisible.
+ // Otherwise the first frame is drawn with a fully opaque screen which causes jank. When
+ // the animation later starts, this clip will be clobbered by the circular reveal clip.
+ // See ViewAnimationUtils.createCircularReveal.
+ view.setOutlineProvider(new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ // Using (0, 0, 0, 0) will not work since the outline will simply be treated as
+ // an empty outline.
+ outline.setOval(-1, -1, 0, 0);
+ }
+ });
+ view.setClipToOutline(true);
+
+ if (palette != null) {
+ view.findViewById(R.id.outgoing_call_animation_circle).setBackgroundColor(
+ palette.mPrimaryColor);
+ activity.getWindow().setStatusBarColor(palette.mSecondaryColor);
+ }
+
+ view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ final ViewTreeObserver vto = view.getViewTreeObserver();
+ if (vto.isAlive()) {
+ vto.removeOnPreDrawListener(this);
+ }
+ final Animator animator = getRevealAnimator(mTouchPoint);
+ if (animator != null) {
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setClipToOutline(false);
+ if (mListener != null) {
+ mListener.onCircularRevealComplete(getFragmentManager());
+ }
+ }
+ });
+ animator.start();
+ }
+ return false;
+ }
+ });
+ }
+
+ private Animator getRevealAnimator(Point touchPoint) {
+ final Activity activity = getActivity();
+ if (activity == null) {
+ return null;
+ }
+ final View view = activity.getWindow().getDecorView();
+ final Display display = activity.getWindowManager().getDefaultDisplay();
+ final Point size = new Point();
+ display.getSize(size);
+
+ int startX = size.x / 2;
+ int startY = size.y / 2;
+ if (touchPoint != null) {
+ startX = touchPoint.x;
+ startY = touchPoint.y;
+ }
+
+ final Animator valueAnimator = ViewAnimationUtils.createCircularReveal(view,
+ startX, startY, 0, Math.max(size.x, size.y));
+ valueAnimator.setDuration(getResources().getInteger(R.integer.reveal_animation_duration));
+ return valueAnimator;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java b/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java
new file mode 100644
index 0000000..f5f52fc
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java
@@ -0,0 +1,138 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.app.ActionBar;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import com.android.contacts.common.ContactPhotoManager;
+
+import java.util.List;
+
+/**
+ * Fragment that allows the user to manage a conference call.
+ */
+public class ConferenceManagerFragment
+ extends BaseFragment<ConferenceManagerPresenter,
+ ConferenceManagerPresenter.ConferenceManagerUi>
+ implements ConferenceManagerPresenter.ConferenceManagerUi {
+
+ private static final String KEY_IS_VISIBLE = "key_conference_is_visible";
+
+ private ListView mConferenceParticipantList;
+ private int mActionBarElevation;
+ private ContactPhotoManager mContactPhotoManager;
+ private LayoutInflater mInflater;
+ private ConferenceParticipantListAdapter mConferenceParticipantListAdapter;
+ private boolean mIsVisible;
+ private boolean mIsRecreating;
+
+ @Override
+ public ConferenceManagerPresenter createPresenter() {
+ return new ConferenceManagerPresenter();
+ }
+
+ @Override
+ public ConferenceManagerPresenter.ConferenceManagerUi getUi() {
+ return this;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ mIsRecreating = true;
+ mIsVisible = savedInstanceState.getBoolean(KEY_IS_VISIBLE);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View parent =
+ inflater.inflate(R.layout.conference_manager_fragment, container, false);
+
+ mConferenceParticipantList = (ListView) parent.findViewById(R.id.participantList);
+ mContactPhotoManager =
+ ContactPhotoManager.getInstance(getActivity().getApplicationContext());
+ mActionBarElevation =
+ (int) getResources().getDimension(R.dimen.incall_action_bar_elevation);
+ mInflater = LayoutInflater.from(getActivity().getApplicationContext());
+
+ return parent;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mIsRecreating) {
+ onVisibilityChanged(mIsVisible);
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(KEY_IS_VISIBLE, mIsVisible);
+ super.onSaveInstanceState(outState);
+ }
+
+ public void onVisibilityChanged(boolean isVisible) {
+ mIsVisible = isVisible;
+ ActionBar actionBar = getActivity().getActionBar();
+ if (isVisible) {
+ actionBar.setTitle(R.string.manageConferenceLabel);
+ actionBar.setElevation(mActionBarElevation);
+ actionBar.setHideOffset(0);
+ actionBar.show();
+
+ final CallList calls = CallList.getInstance();
+ getPresenter().init(getActivity(), calls);
+ // Request focus on the list of participants for accessibility purposes. This ensures
+ // that once the list of participants is shown, the first participant is announced.
+ mConferenceParticipantList.requestFocus();
+ } else {
+ actionBar.setElevation(0);
+ actionBar.setHideOffset(actionBar.getHeight());
+ }
+ }
+
+ @Override
+ public boolean isFragmentVisible() {
+ return isVisible();
+ }
+
+ @Override
+ public void update(Context context, List<Call> participants, boolean parentCanSeparate) {
+ if (mConferenceParticipantListAdapter == null) {
+ mConferenceParticipantListAdapter = new ConferenceParticipantListAdapter(
+ mConferenceParticipantList, context, mInflater, mContactPhotoManager);
+
+ mConferenceParticipantList.setAdapter(mConferenceParticipantListAdapter);
+ }
+ mConferenceParticipantListAdapter.updateParticipants(participants, parentCanSeparate);
+ }
+
+ @Override
+ public void refreshCall(Call call) {
+ mConferenceParticipantListAdapter.refreshCall(call);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
new file mode 100644
index 0000000..6fb6e5d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
@@ -0,0 +1,144 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+
+import com.google.common.base.Preconditions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Logic for call buttons.
+ */
+public class ConferenceManagerPresenter
+ extends Presenter<ConferenceManagerPresenter.ConferenceManagerUi>
+ implements InCallStateListener, InCallDetailsListener, IncomingCallListener {
+
+ private Context mContext;
+
+ @Override
+ public void onUiReady(ConferenceManagerUi ui) {
+ super.onUiReady(ui);
+
+ // register for call state changes last
+ InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
+ }
+
+ @Override
+ public void onUiUnready(ConferenceManagerUi ui) {
+ super.onUiUnready(ui);
+
+ InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ }
+
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ if (getUi().isFragmentVisible()) {
+ Log.v(this, "onStateChange" + newState);
+ if (newState == InCallState.INCALL) {
+ final Call call = callList.getActiveOrBackgroundCall();
+ if (call != null && call.isConferenceCall()) {
+ Log.v(this, "Number of existing calls is " +
+ String.valueOf(call.getChildCallIds().size()));
+ update(callList);
+ } else {
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ } else {
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ }
+ }
+
+ @Override
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details) {
+ boolean canDisconnect = details.can(
+ android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
+ boolean canSeparate = details.can(
+ android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE);
+
+ if (call.can(android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE)
+ != canDisconnect
+ || call.can(android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE)
+ != canSeparate) {
+ getUi().refreshCall(call);
+ }
+
+ if (!details.can(
+ android.telecom.Call.Details.CAPABILITY_MANAGE_CONFERENCE)) {
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ // When incoming call exists, set conference ui invisible.
+ if (getUi().isFragmentVisible()) {
+ Log.d(this, "onIncomingCall()... Conference ui is showing, hide it.");
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ }
+
+ public void init(Context context, CallList callList) {
+ mContext = Preconditions.checkNotNull(context);
+ mContext = context;
+ update(callList);
+ }
+
+ /**
+ * Updates the conference participant adapter.
+ *
+ * @param callList The callList.
+ */
+ private void update(CallList callList) {
+ // callList is non null, but getActiveOrBackgroundCall() may return null
+ final Call currentCall = callList.getActiveOrBackgroundCall();
+ if (currentCall == null) {
+ return;
+ }
+
+ ArrayList<Call> calls = new ArrayList<>(currentCall.getChildCallIds().size());
+ for (String callerId : currentCall.getChildCallIds()) {
+ calls.add(callList.getCallById(callerId));
+ }
+
+ Log.d(this, "Number of calls is " + String.valueOf(calls.size()));
+
+ // Users can split out a call from the conference call if either the active call or the
+ // holding call is empty. If both are filled, users can not split out another call.
+ final boolean hasActiveCall = (callList.getActiveCall() != null);
+ final boolean hasHoldingCall = (callList.getBackgroundCall() != null);
+ boolean canSeparate = !(hasActiveCall && hasHoldingCall);
+
+ getUi().update(mContext, calls, canSeparate);
+ }
+
+ public interface ConferenceManagerUi extends Ui {
+ boolean isFragmentVisible();
+ void update(Context context, List<Call> participants, boolean parentCanSeparate);
+ void refreshCall(Call call);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java b/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
new file mode 100644
index 0000000..86002b0
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -0,0 +1,534 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.MoreObjects;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+import com.android.incallui.compat.telecom.DetailsCompat;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Adapter for a ListView containing conference call participant information.
+ */
+public class ConferenceParticipantListAdapter extends BaseAdapter {
+
+ /**
+ * Internal class which represents a participant. Includes a reference to the {@link Call} and
+ * the corresponding {@link ContactCacheEntry} for the participant.
+ */
+ private class ParticipantInfo {
+ private Call mCall;
+ private ContactCacheEntry mContactCacheEntry;
+ private boolean mCacheLookupComplete = false;
+
+ public ParticipantInfo(Call call, ContactCacheEntry contactCacheEntry) {
+ mCall = call;
+ mContactCacheEntry = contactCacheEntry;
+ }
+
+ public Call getCall() {
+ return mCall;
+ }
+
+ public void setCall(Call call) {
+ mCall = call;
+ }
+
+ public ContactCacheEntry getContactCacheEntry() {
+ return mContactCacheEntry;
+ }
+
+ public void setContactCacheEntry(ContactCacheEntry entry) {
+ mContactCacheEntry = entry;
+ }
+
+ public boolean isCacheLookupComplete() {
+ return mCacheLookupComplete;
+ }
+
+ public void setCacheLookupComplete(boolean cacheLookupComplete) {
+ mCacheLookupComplete = cacheLookupComplete;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ParticipantInfo) {
+ ParticipantInfo p = (ParticipantInfo) o;
+ return
+ Objects.equals(p.getCall().getId(), mCall.getId());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return mCall.getId().hashCode();
+ }
+ }
+
+ /**
+ * Callback class used when making requests to the {@link ContactInfoCache} to resolve contact
+ * info and contact photos for conference participants.
+ */
+ public static class ContactLookupCallback implements ContactInfoCache.ContactInfoCacheCallback {
+ private final WeakReference<ConferenceParticipantListAdapter> mListAdapter;
+
+ public ContactLookupCallback(ConferenceParticipantListAdapter listAdapter) {
+ mListAdapter = new WeakReference<ConferenceParticipantListAdapter>(listAdapter);
+ }
+
+ /**
+ * Called when contact info has been resolved.
+ *
+ * @param callId The call id.
+ * @param entry The new contact information.
+ */
+ @Override
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
+ update(callId, entry);
+ }
+
+ /**
+ * Called when contact photo has been loaded into the cache.
+ *
+ * @param callId The call id.
+ * @param entry The new contact information.
+ */
+ @Override
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ update(callId, entry);
+ }
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {}
+
+ /**
+ * Updates the contact information for a participant.
+ *
+ * @param callId The call id.
+ * @param entry The new contact information.
+ */
+ private void update(String callId, ContactCacheEntry entry) {
+ ConferenceParticipantListAdapter listAdapter = mListAdapter.get();
+ if (listAdapter != null) {
+ listAdapter.updateContactInfo(callId, entry);
+ }
+ }
+ }
+
+ /**
+ * Listener used to handle tap of the "disconnect' button for a participant.
+ */
+ private View.OnClickListener mDisconnectListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ View parent = (View) v.getParent();
+ String callId = (String) parent.getTag();
+ TelecomAdapter.getInstance().disconnectCall(callId);
+ }
+ };
+
+ /**
+ * Listener used to handle tap of the "separate' button for a participant.
+ */
+ private View.OnClickListener mSeparateListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ View parent = (View) v.getParent();
+ String callId = (String) parent.getTag();
+ TelecomAdapter.getInstance().separateCall(callId);
+ }
+ };
+
+ /**
+ * The ListView containing the participant information.
+ */
+ private final ListView mListView;
+
+ /**
+ * The conference participants to show in the ListView.
+ */
+ private List<ParticipantInfo> mConferenceParticipants = new ArrayList<>();
+
+ /**
+ * Hashmap to make accessing participant info by call Id faster.
+ */
+ private final HashMap<String, ParticipantInfo> mParticipantsByCallId = new HashMap<>();
+
+ /**
+ * The context.
+ */
+ private final Context mContext;
+
+ /**
+ * ContactsPreferences used to lookup displayName preferences
+ */
+ @Nullable private final ContactsPreferences mContactsPreferences;
+
+ /**
+ * The layout inflater used to inflate new views.
+ */
+ private final LayoutInflater mLayoutInflater;
+
+ /**
+ * Contact photo manager to retrieve cached contact photo information.
+ */
+ private final ContactPhotoManager mContactPhotoManager;
+
+ /**
+ * {@code True} if the conference parent supports separating calls from the conference.
+ */
+ private boolean mParentCanSeparate;
+
+ /**
+ * Creates an instance of the ConferenceParticipantListAdapter.
+ *
+ * @param listView The listview.
+ * @param context The context.
+ * @param layoutInflater The layout inflater.
+ * @param contactPhotoManager The contact photo manager, used to load contact photos.
+ */
+ public ConferenceParticipantListAdapter(ListView listView, Context context,
+ LayoutInflater layoutInflater, ContactPhotoManager contactPhotoManager) {
+
+ mListView = listView;
+ mContext = context;
+ mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+ mLayoutInflater = layoutInflater;
+ mContactPhotoManager = contactPhotoManager;
+ }
+
+ /**
+ * Updates the adapter with the new conference participant information provided.
+ *
+ * @param conferenceParticipants The list of conference participants.
+ * @param parentCanSeparate {@code True} if the parent supports separating calls from the
+ * conference.
+ */
+ public void updateParticipants(List<Call> conferenceParticipants, boolean parentCanSeparate) {
+ if (mContactsPreferences != null) {
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
+ }
+ mParentCanSeparate = parentCanSeparate;
+ updateParticipantInfo(conferenceParticipants);
+ }
+
+ /**
+ * Determines the number of participants in the conference.
+ *
+ * @return The number of participants.
+ */
+ @Override
+ public int getCount() {
+ return mConferenceParticipants.size();
+ }
+
+ /**
+ * Retrieves an item from the list of participants.
+ *
+ * @param position Position of the item whose data we want within the adapter's
+ * data set.
+ * @return The {@link ParticipantInfo}.
+ */
+ @Override
+ public Object getItem(int position) {
+ return mConferenceParticipants.get(position);
+ }
+
+ /**
+ * Retreives the adapter-specific item id for an item at a specified position.
+ *
+ * @param position The position of the item within the adapter's data set whose row id we want.
+ * @return The item id.
+ */
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ /**
+ * Refreshes call information for the call passed in.
+ *
+ * @param call The new call information.
+ */
+ public void refreshCall(Call call) {
+ String callId = call.getId();
+
+ if (mParticipantsByCallId.containsKey(callId)) {
+ ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+ participantInfo.setCall(call);
+ refreshView(callId);
+ }
+ }
+
+ /**
+ * Attempts to refresh the view for the specified call ID. This ensures the contact info and
+ * photo loaded from cache are updated.
+ *
+ * @param callId The call id.
+ */
+ private void refreshView(String callId) {
+ int first = mListView.getFirstVisiblePosition();
+ int last = mListView.getLastVisiblePosition();
+
+ for (int position = 0; position <= last - first; position++) {
+ View view = mListView.getChildAt(position);
+ String rowCallId = (String) view.getTag();
+ if (rowCallId.equals(callId)) {
+ getView(position+first, view, mListView);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Creates or populates an existing conference participant row.
+ *
+ * @param position The position of the item within the adapter's data set of the item whose view
+ * we want.
+ * @param convertView The old view to reuse, if possible.
+ * @param parent The parent that this view will eventually be attached to
+ * @return The populated view.
+ */
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ // Make sure we have a valid convertView to start with
+ final View result = convertView == null
+ ? mLayoutInflater.inflate(R.layout.caller_in_conference, parent, false)
+ : convertView;
+
+ ParticipantInfo participantInfo = mConferenceParticipants.get(position);
+ Call call = participantInfo.getCall();
+ ContactCacheEntry contactCache = participantInfo.getContactCacheEntry();
+
+ final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+
+ // If a cache lookup has not yet been performed to retrieve the contact information and
+ // photo, do it now.
+ if (!participantInfo.isCacheLookupComplete()) {
+ cache.findInfo(participantInfo.getCall(),
+ participantInfo.getCall().getState() == Call.State.INCOMING,
+ new ContactLookupCallback(this));
+ }
+
+ boolean thisRowCanSeparate = mParentCanSeparate && DetailsCompat.can(
+ call.getTelecomCall().getDetails(),
+ android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE);
+ boolean thisRowCanDisconnect = DetailsCompat.can(call.getTelecomCall().getDetails(),
+ android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
+
+ setCallerInfoForRow(result, contactCache.namePrimary,
+ ContactDisplayUtils.getPreferredDisplayName(contactCache.namePrimary,
+ contactCache.nameAlternative, mContactsPreferences),
+ contactCache.number, contactCache.label,
+ contactCache.lookupKey, contactCache.displayPhotoUri, thisRowCanSeparate,
+ thisRowCanDisconnect);
+
+ // Tag the row in the conference participant list with the call id to make it easier to
+ // find calls when contact cache information is loaded.
+ result.setTag(call.getId());
+
+ return result;
+ }
+
+ /**
+ * Replaces the contact info for a participant and triggers a refresh of the UI.
+ *
+ * @param callId The call id.
+ * @param entry The new contact info.
+ */
+ /* package */ void updateContactInfo(String callId, ContactCacheEntry entry) {
+ if (mParticipantsByCallId.containsKey(callId)) {
+ ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+ participantInfo.setContactCacheEntry(entry);
+ participantInfo.setCacheLookupComplete(true);
+ refreshView(callId);
+ }
+ }
+
+ /**
+ * Sets the caller information for a row in the conference participant list.
+ *
+ * @param view The view to set the details on.
+ * @param callerName The participant's name.
+ * @param callerNumber The participant's phone number.
+ * @param callerNumberType The participant's phone number typ.e
+ * @param lookupKey The lookup key for the participant (for photo lookup).
+ * @param photoUri The URI of the contact photo.
+ * @param thisRowCanSeparate {@code True} if this participant can separate from the conference.
+ * @param thisRowCanDisconnect {@code True} if this participant can be disconnected.
+ */
+ private final void setCallerInfoForRow(View view, String callerName, String preferredName,
+ String callerNumber, String callerNumberType, String lookupKey, Uri photoUri,
+ boolean thisRowCanSeparate, boolean thisRowCanDisconnect) {
+
+ final ImageView photoView = (ImageView) view.findViewById(R.id.callerPhoto);
+ final TextView nameTextView = (TextView) view.findViewById(R.id.conferenceCallerName);
+ final TextView numberTextView = (TextView) view.findViewById(R.id.conferenceCallerNumber);
+ final TextView numberTypeTextView = (TextView) view.findViewById(
+ R.id.conferenceCallerNumberType);
+ final View endButton = view.findViewById(R.id.conferenceCallerDisconnect);
+ final View separateButton = view.findViewById(R.id.conferenceCallerSeparate);
+
+ endButton.setVisibility(thisRowCanDisconnect ? View.VISIBLE : View.GONE);
+ if (thisRowCanDisconnect) {
+ endButton.setOnClickListener(mDisconnectListener);
+ } else {
+ endButton.setOnClickListener(null);
+ }
+
+ separateButton.setVisibility(thisRowCanSeparate ? View.VISIBLE : View.GONE);
+ if (thisRowCanSeparate) {
+ separateButton.setOnClickListener(mSeparateListener);
+ } else {
+ separateButton.setOnClickListener(null);
+ }
+
+ DefaultImageRequest imageRequest = (photoUri != null) ? null :
+ new DefaultImageRequest(callerName, lookupKey, true /* isCircularPhoto */);
+
+ mContactPhotoManager.loadDirectoryPhoto(photoView, photoUri, false, true, imageRequest);
+
+ // set the caller name
+ nameTextView.setText(preferredName);
+
+ // set the caller number in subscript, or make the field disappear.
+ if (TextUtils.isEmpty(callerNumber)) {
+ numberTextView.setVisibility(View.GONE);
+ numberTypeTextView.setVisibility(View.GONE);
+ } else {
+ numberTextView.setVisibility(View.VISIBLE);
+ numberTextView.setText(PhoneNumberUtilsCompat.createTtsSpannable(
+ BidiFormatter.getInstance().unicodeWrap(
+ callerNumber, TextDirectionHeuristics.LTR)));
+ numberTypeTextView.setVisibility(View.VISIBLE);
+ numberTypeTextView.setText(callerNumberType);
+ }
+ }
+
+ /**
+ * Updates the participant info list which is bound to the ListView. Stores the call and
+ * contact info for all entries. The list is sorted alphabetically by participant name.
+ *
+ * @param conferenceParticipants The calls which make up the conference participants.
+ */
+ private void updateParticipantInfo(List<Call> conferenceParticipants) {
+ final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+ boolean newParticipantAdded = false;
+ HashSet<String> newCallIds = new HashSet<>(conferenceParticipants.size());
+
+ // Update or add conference participant info.
+ for (Call call : conferenceParticipants) {
+ String callId = call.getId();
+ newCallIds.add(callId);
+ ContactCacheEntry contactCache = cache.getInfo(callId);
+ if (contactCache == null) {
+ contactCache = ContactInfoCache.buildCacheEntryFromCall(mContext, call,
+ call.getState() == Call.State.INCOMING);
+ }
+
+ if (mParticipantsByCallId.containsKey(callId)) {
+ ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+ participantInfo.setCall(call);
+ participantInfo.setContactCacheEntry(contactCache);
+ } else {
+ newParticipantAdded = true;
+ ParticipantInfo participantInfo = new ParticipantInfo(call, contactCache);
+ mConferenceParticipants.add(participantInfo);
+ mParticipantsByCallId.put(call.getId(), participantInfo);
+ }
+ }
+
+ // Remove any participants that no longer exist.
+ Iterator<Map.Entry<String, ParticipantInfo>> it =
+ mParticipantsByCallId.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry<String, ParticipantInfo> entry = it.next();
+ String existingCallId = entry.getKey();
+ if (!newCallIds.contains(existingCallId)) {
+ ParticipantInfo existingInfo = entry.getValue();
+ mConferenceParticipants.remove(existingInfo);
+ it.remove();
+ }
+ }
+
+ if (newParticipantAdded) {
+ // Sort the list of participants by contact name.
+ sortParticipantList();
+ }
+ notifyDataSetChanged();
+ }
+
+ /**
+ * Sorts the participant list by contact name.
+ */
+ private void sortParticipantList() {
+ Collections.sort(mConferenceParticipants, new Comparator<ParticipantInfo>() {
+ public int compare(ParticipantInfo p1, ParticipantInfo p2) {
+ // Contact names might be null, so replace with empty string.
+ ContactCacheEntry c1 = p1.getContactCacheEntry();
+ String p1Name = MoreObjects.firstNonNull(
+ ContactDisplayUtils.getPreferredSortName(
+ c1.namePrimary,
+ c1.nameAlternative,
+ mContactsPreferences),
+ "");
+
+ ContactCacheEntry c2 = p2.getContactCacheEntry();
+ String p2Name = MoreObjects.firstNonNull(
+ ContactDisplayUtils.getPreferredSortName(
+ c2.namePrimary,
+ c2.nameAlternative,
+ mContactsPreferences),
+ "");
+
+ return p1Name.compareToIgnoreCase(p2Name);
+ }
+ });
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
new file mode 100644
index 0000000..ab4150b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -0,0 +1,698 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.location.Address;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Looper;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.DisplayNameSources;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
+import android.util.Pair;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+import com.android.dialer.util.MoreStrings;
+import com.android.incallui.Call.LogState;
+import com.android.incallui.service.PhoneNumberService;
+import com.android.incalluibind.ObjectFactory;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Class responsible for querying Contact Information for Call objects. Can perform asynchronous
+ * requests to the Contact Provider for information as well as respond synchronously for any data
+ * that it currently has cached from previous queries. This class always gets called from the UI
+ * thread so it does not need thread protection.
+ */
+public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadCompleteListener {
+
+ private static final String TAG = ContactInfoCache.class.getSimpleName();
+ private static final int TOKEN_UPDATE_PHOTO_FOR_CALL_STATE = 0;
+
+ private final Context mContext;
+ private final PhoneNumberService mPhoneNumberService;
+ private final CachedNumberLookupService mCachedNumberLookupService;
+ private final HashMap<String, ContactCacheEntry> mInfoMap = Maps.newHashMap();
+ private final HashMap<String, Set<ContactInfoCacheCallback>> mCallBacks = Maps.newHashMap();
+
+ private static ContactInfoCache sCache = null;
+
+ private Drawable mDefaultContactPhotoDrawable;
+ private Drawable mConferencePhotoDrawable;
+ private ContactUtils mContactUtils;
+
+ public static synchronized ContactInfoCache getInstance(Context mContext) {
+ if (sCache == null) {
+ sCache = new ContactInfoCache(mContext.getApplicationContext());
+ }
+ return sCache;
+ }
+
+ private ContactInfoCache(Context context) {
+ mContext = context;
+ mPhoneNumberService = ObjectFactory.newPhoneNumberService(context);
+ mCachedNumberLookupService =
+ com.android.dialerbind.ObjectFactory.newCachedNumberLookupService();
+ mContactUtils = ObjectFactory.getContactUtilsInstance(context);
+
+ }
+
+ public ContactCacheEntry getInfo(String callId) {
+ return mInfoMap.get(callId);
+ }
+
+ public static ContactCacheEntry buildCacheEntryFromCall(Context context, Call call,
+ boolean isIncoming) {
+ final ContactCacheEntry entry = new ContactCacheEntry();
+
+ // TODO: get rid of caller info.
+ final CallerInfo info = CallerInfoUtils.buildCallerInfo(context, call);
+ ContactInfoCache.populateCacheEntry(context, info, entry, call.getNumberPresentation(),
+ isIncoming);
+ return entry;
+ }
+
+ public void maybeInsertCnapInformationIntoCache(Context context, final Call call,
+ final CallerInfo info) {
+ if (mCachedNumberLookupService == null || TextUtils.isEmpty(info.cnapName)
+ || mInfoMap.get(call.getId()) != null) {
+ return;
+ }
+ final Context applicationContext = context.getApplicationContext();
+ Log.i(TAG, "Found contact with CNAP name - inserting into cache");
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ ContactInfo contactInfo = new ContactInfo();
+ CachedContactInfo cacheInfo = mCachedNumberLookupService.buildCachedContactInfo(
+ contactInfo);
+ cacheInfo.setSource(CachedContactInfo.SOURCE_TYPE_CNAP, "CNAP", 0);
+ contactInfo.name = info.cnapName;
+ contactInfo.number = call.getNumber();
+ contactInfo.type = ContactsContract.CommonDataKinds.Phone.TYPE_MAIN;
+ try {
+ final JSONObject contactRows = new JSONObject().put(Phone.CONTENT_ITEM_TYPE,
+ new JSONObject()
+ .put(Phone.NUMBER, contactInfo.number)
+ .put(Phone.TYPE, Phone.TYPE_MAIN));
+ final String jsonString = new JSONObject()
+ .put(Contacts.DISPLAY_NAME, contactInfo.name)
+ .put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME)
+ .put(Contacts.CONTENT_ITEM_TYPE, contactRows).toString();
+ cacheInfo.setLookupKey(jsonString);
+ } catch (JSONException e) {
+ Log.w(TAG, "Creation of lookup key failed when caching CNAP information");
+ }
+ mCachedNumberLookupService.addContact(applicationContext, cacheInfo);
+ return null;
+ }
+ }.execute();
+ }
+
+ private class FindInfoCallback implements CallerInfoAsyncQuery.OnQueryCompleteListener {
+ private final boolean mIsIncoming;
+
+ public FindInfoCallback(boolean isIncoming) {
+ mIsIncoming = isIncoming;
+ }
+
+ @Override
+ public void onQueryComplete(int token, Object cookie, CallerInfo callerInfo) {
+ findInfoQueryComplete((Call) cookie, callerInfo, mIsIncoming, true);
+ }
+ }
+
+ /**
+ * Requests contact data for the Call object passed in.
+ * Returns the data through callback. If callback is null, no response is made, however the
+ * query is still performed and cached.
+ *
+ * @param callback The function to call back when the call is found. Can be null.
+ */
+ public void findInfo(final Call call, final boolean isIncoming,
+ ContactInfoCacheCallback callback) {
+ Preconditions.checkState(Looper.getMainLooper().getThread() == Thread.currentThread());
+ Preconditions.checkNotNull(callback);
+
+ final String callId = call.getId();
+ final ContactCacheEntry cacheEntry = mInfoMap.get(callId);
+ Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+
+ // If we have a previously obtained intermediate result return that now
+ if (cacheEntry != null) {
+ Log.d(TAG, "Contact lookup. In memory cache hit; lookup "
+ + (callBacks == null ? "complete" : "still running"));
+ callback.onContactInfoComplete(callId, cacheEntry);
+ // If no other callbacks are in flight, we're done.
+ if (callBacks == null) {
+ return;
+ }
+ }
+
+ // If the entry already exists, add callback
+ if (callBacks != null) {
+ callBacks.add(callback);
+ return;
+ }
+ Log.d(TAG, "Contact lookup. In memory cache miss; searching provider.");
+ // New lookup
+ callBacks = Sets.newHashSet();
+ callBacks.add(callback);
+ mCallBacks.put(callId, callBacks);
+
+ /**
+ * Performs a query for caller information.
+ * Save any immediate data we get from the query. An asynchronous query may also be made
+ * for any data that we do not already have. Some queries, such as those for voicemail and
+ * emergency call information, will not perform an additional asynchronous query.
+ */
+ final CallerInfo callerInfo = CallerInfoUtils.getCallerInfoForCall(
+ mContext, call, new FindInfoCallback(isIncoming));
+
+ findInfoQueryComplete(call, callerInfo, isIncoming, false);
+ }
+
+ private void findInfoQueryComplete(Call call, CallerInfo callerInfo, boolean isIncoming,
+ boolean didLocalLookup) {
+ final String callId = call.getId();
+ int presentationMode = call.getNumberPresentation();
+ if (callerInfo.contactExists || callerInfo.isEmergencyNumber() ||
+ callerInfo.isVoiceMailNumber()) {
+ presentationMode = TelecomManager.PRESENTATION_ALLOWED;
+ }
+
+ ContactCacheEntry cacheEntry = mInfoMap.get(callId);
+ // Ensure we always have a cacheEntry. Replace the existing entry if
+ // it has no name or if we found a local contact.
+ if (cacheEntry == null || TextUtils.isEmpty(cacheEntry.namePrimary) ||
+ callerInfo.contactExists) {
+ cacheEntry = buildEntry(mContext, callId, callerInfo, presentationMode, isIncoming);
+ mInfoMap.put(callId, cacheEntry);
+ }
+
+ sendInfoNotifications(callId, cacheEntry);
+
+ if (didLocalLookup) {
+ // Before issuing a request for more data from other services, we only check that the
+ // contact wasn't found in the local DB. We don't check the if the cache entry already
+ // has a name because we allow overriding cnap data with data from other services.
+ if (!callerInfo.contactExists && mPhoneNumberService != null) {
+ Log.d(TAG, "Contact lookup. Local contacts miss, checking remote");
+ final PhoneNumberServiceListener listener = new PhoneNumberServiceListener(callId);
+ mPhoneNumberService.getPhoneNumberInfo(cacheEntry.number, listener, listener,
+ isIncoming);
+ } else if (cacheEntry.displayPhotoUri != null) {
+ Log.d(TAG, "Contact lookup. Local contact found, starting image load");
+ // Load the image with a callback to update the image state.
+ // When the load is finished, onImageLoadComplete() will be called.
+ cacheEntry.isLoadingPhoto = true;
+ ContactsAsyncHelper.startObtainPhotoAsync(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE,
+ mContext, cacheEntry.displayPhotoUri, ContactInfoCache.this, callId);
+ } else {
+ if (callerInfo.contactExists) {
+ Log.d(TAG, "Contact lookup done. Local contact found, no image.");
+ } else {
+ Log.d(TAG, "Contact lookup done. Local contact not found and"
+ + " no remote lookup service available.");
+ }
+ clearCallbacks(callId);
+ }
+ }
+ }
+
+ class PhoneNumberServiceListener implements PhoneNumberService.NumberLookupListener,
+ PhoneNumberService.ImageLookupListener, ContactUtils.Listener {
+ private final String mCallId;
+
+ PhoneNumberServiceListener(String callId) {
+ mCallId = callId;
+ }
+
+ @Override
+ public void onPhoneNumberInfoComplete(
+ final PhoneNumberService.PhoneNumberInfo info) {
+ // If we got a miss, this is the end of the lookup pipeline,
+ // so clear the callbacks and return.
+ if (info == null) {
+ Log.d(TAG, "Contact lookup done. Remote contact not found.");
+ clearCallbacks(mCallId);
+ return;
+ }
+
+ ContactCacheEntry entry = new ContactCacheEntry();
+ entry.namePrimary = info.getDisplayName();
+ entry.number = info.getNumber();
+ entry.contactLookupResult = info.getLookupSource();
+ final int type = info.getPhoneType();
+ final String label = info.getPhoneLabel();
+ if (type == Phone.TYPE_CUSTOM) {
+ entry.label = label;
+ } else {
+ final CharSequence typeStr = Phone.getTypeLabel(
+ mContext.getResources(), type, label);
+ entry.label = typeStr == null ? null : typeStr.toString();
+ }
+ final ContactCacheEntry oldEntry = mInfoMap.get(mCallId);
+ if (oldEntry != null) {
+ // Location is only obtained from local lookup so persist
+ // the value for remote lookups. Once we have a name this
+ // field is no longer used; it is persisted here in case
+ // the UI is ever changed to use it.
+ entry.location = oldEntry.location;
+ // Contact specific ringtone is obtained from local lookup.
+ entry.contactRingtoneUri = oldEntry.contactRingtoneUri;
+ }
+
+ // If no image and it's a business, switch to using the default business avatar.
+ if (info.getImageUrl() == null && info.isBusiness()) {
+ Log.d(TAG, "Business has no image. Using default.");
+ entry.photo = mContext.getResources().getDrawable(R.drawable.img_business);
+ }
+
+ mInfoMap.put(mCallId, entry);
+ sendInfoNotifications(mCallId, entry);
+
+ if (mContactUtils != null) {
+ // This method will callback "onContactInteractionsFound".
+ entry.isLoadingContactInteractions =
+ mContactUtils.retrieveContactInteractionsFromLookupKey(
+ info.getLookupKey(), this);
+ }
+
+ entry.isLoadingPhoto = info.getImageUrl() != null;
+
+ // If there is no image or contact interactions then we should not expect another
+ // callback.
+ if (!entry.isLoadingPhoto && !entry.isLoadingContactInteractions) {
+ // We're done, so clear callbacks
+ clearCallbacks(mCallId);
+ }
+ }
+
+ @Override
+ public void onImageFetchComplete(Bitmap bitmap) {
+ onImageLoadComplete(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE, null, bitmap, mCallId);
+ }
+
+ @Override
+ public void onContactInteractionsFound(Address address,
+ List<Pair<Calendar, Calendar>> openingHours) {
+ final ContactCacheEntry entry = mInfoMap.get(mCallId);
+ if (entry == null) {
+ Log.e(this, "Contact context received for empty search entry.");
+ clearCallbacks(mCallId);
+ return;
+ }
+
+ entry.isLoadingContactInteractions = false;
+
+ Log.v(ContactInfoCache.this, "Setting contact interactions for entry: ", entry);
+
+ entry.locationAddress = address;
+ entry.openingHours = openingHours;
+ sendContactInteractionsNotifications(mCallId, entry);
+
+ if (!entry.isLoadingPhoto) {
+ clearCallbacks(mCallId);
+ }
+ }
+ }
+
+ /**
+ * Implemented for ContactsAsyncHelper.OnImageLoadCompleteListener interface.
+ * make sure that the call state is reflected after the image is loaded.
+ */
+ @Override
+ public void onImageLoadComplete(int token, Drawable photo, Bitmap photoIcon, Object cookie) {
+ Log.d(this, "Image load complete with context: ", mContext);
+ // TODO: may be nice to update the image view again once the newer one
+ // is available on contacts database.
+
+ final String callId = (String) cookie;
+ final ContactCacheEntry entry = mInfoMap.get(callId);
+
+ if (entry == null) {
+ Log.e(this, "Image Load received for empty search entry.");
+ clearCallbacks(callId);
+ return;
+ }
+
+ entry.isLoadingPhoto = false;
+
+ Log.d(this, "setting photo for entry: ", entry);
+
+ // Conference call icons are being handled in CallCardPresenter.
+ if (photo != null) {
+ Log.v(this, "direct drawable: ", photo);
+ entry.photo = photo;
+ } else if (photoIcon != null) {
+ Log.v(this, "photo icon: ", photoIcon);
+ entry.photo = new BitmapDrawable(mContext.getResources(), photoIcon);
+ } else {
+ Log.v(this, "unknown photo");
+ entry.photo = null;
+ }
+
+ sendImageNotifications(callId, entry);
+
+ if (!entry.isLoadingContactInteractions) {
+ clearCallbacks(callId);
+ }
+ }
+
+ /**
+ * Blows away the stored cache values.
+ */
+ public void clearCache() {
+ mInfoMap.clear();
+ mCallBacks.clear();
+ }
+
+ private ContactCacheEntry buildEntry(Context context, String callId,
+ CallerInfo info, int presentation, boolean isIncoming) {
+ // The actual strings we're going to display onscreen:
+ Drawable photo = null;
+
+ final ContactCacheEntry cce = new ContactCacheEntry();
+ populateCacheEntry(context, info, cce, presentation, isIncoming);
+
+ // This will only be true for emergency numbers
+ if (info.photoResource != 0) {
+ photo = context.getResources().getDrawable(info.photoResource);
+ } else if (info.isCachedPhotoCurrent) {
+ if (info.cachedPhoto != null) {
+ photo = info.cachedPhoto;
+ } else {
+ photo = getDefaultContactPhotoDrawable();
+ }
+ } else if (info.contactDisplayPhotoUri == null) {
+ photo = getDefaultContactPhotoDrawable();
+ } else {
+ cce.displayPhotoUri = info.contactDisplayPhotoUri;
+ }
+
+ // Support any contact id in N because QuickContacts in N starts supporting enterprise
+ // contact id
+ if (info.lookupKeyOrNull != null
+ && (ContactsUtils.FLAG_N_FEATURE || info.contactIdOrZero != 0)) {
+ cce.lookupUri = Contacts.getLookupUri(info.contactIdOrZero, info.lookupKeyOrNull);
+ } else {
+ Log.v(TAG, "lookup key is null or contact ID is 0 on M. Don't create a lookup uri.");
+ cce.lookupUri = null;
+ }
+
+ cce.photo = photo;
+ cce.lookupKey = info.lookupKeyOrNull;
+ cce.contactRingtoneUri = info.contactRingtoneUri;
+ if (cce.contactRingtoneUri == null || cce.contactRingtoneUri == Uri.EMPTY) {
+ cce.contactRingtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+ }
+
+ return cce;
+ }
+
+ /**
+ * Populate a cache entry from a call (which got converted into a caller info).
+ */
+ public static void populateCacheEntry(Context context, CallerInfo info, ContactCacheEntry cce,
+ int presentation, boolean isIncoming) {
+ Preconditions.checkNotNull(info);
+ String displayName = null;
+ String displayNumber = null;
+ String displayLocation = null;
+ String label = null;
+ boolean isSipCall = false;
+
+ // It appears that there is a small change in behaviour with the
+ // PhoneUtils' startGetCallerInfo whereby if we query with an
+ // empty number, we will get a valid CallerInfo object, but with
+ // fields that are all null, and the isTemporary boolean input
+ // parameter as true.
+
+ // In the past, we would see a NULL callerinfo object, but this
+ // ends up causing null pointer exceptions elsewhere down the
+ // line in other cases, so we need to make this fix instead. It
+ // appears that this was the ONLY call to PhoneUtils
+ // .getCallerInfo() that relied on a NULL CallerInfo to indicate
+ // an unknown contact.
+
+ // Currently, infi.phoneNumber may actually be a SIP address, and
+ // if so, it might sometimes include the "sip:" prefix. That
+ // prefix isn't really useful to the user, though, so strip it off
+ // if present. (For any other URI scheme, though, leave the
+ // prefix alone.)
+ // TODO: It would be cleaner for CallerInfo to explicitly support
+ // SIP addresses instead of overloading the "phoneNumber" field.
+ // Then we could remove this hack, and instead ask the CallerInfo
+ // for a "user visible" form of the SIP address.
+ String number = info.phoneNumber;
+
+ if (!TextUtils.isEmpty(number)) {
+ isSipCall = PhoneNumberHelper.isUriNumber(number);
+ if (number.startsWith("sip:")) {
+ number = number.substring(4);
+ }
+ }
+
+ if (TextUtils.isEmpty(info.name)) {
+ // No valid "name" in the CallerInfo, so fall back to
+ // something else.
+ // (Typically, we promote the phone number up to the "name" slot
+ // onscreen, and possibly display a descriptive string in the
+ // "number" slot.)
+ if (TextUtils.isEmpty(number)) {
+ // No name *or* number! Display a generic "unknown" string
+ // (or potentially some other default based on the presentation.)
+ displayName = getPresentationString(context, presentation, info.callSubject);
+ Log.d(TAG, " ==> no name *or* number! displayName = " + displayName);
+ } else if (presentation != TelecomManager.PRESENTATION_ALLOWED) {
+ // This case should never happen since the network should never send a phone #
+ // AND a restricted presentation. However we leave it here in case of weird
+ // network behavior
+ displayName = getPresentationString(context, presentation, info.callSubject);
+ Log.d(TAG, " ==> presentation not allowed! displayName = " + displayName);
+ } else if (!TextUtils.isEmpty(info.cnapName)) {
+ // No name, but we do have a valid CNAP name, so use that.
+ displayName = info.cnapName;
+ info.name = info.cnapName;
+ displayNumber = number;
+ Log.d(TAG, " ==> cnapName available: displayName '" + displayName +
+ "', displayNumber '" + displayNumber + "'");
+ } else {
+ // No name; all we have is a number. This is the typical
+ // case when an incoming call doesn't match any contact,
+ // or if you manually dial an outgoing number using the
+ // dialpad.
+ displayNumber = number;
+
+ // Display a geographical description string if available
+ // (but only for incoming calls.)
+ if (isIncoming) {
+ // TODO (CallerInfoAsyncQuery cleanup): Fix the CallerInfo
+ // query to only do the geoDescription lookup in the first
+ // place for incoming calls.
+ displayLocation = info.geoDescription; // may be null
+ Log.d(TAG, "Geodescrption: " + info.geoDescription);
+ }
+
+ Log.d(TAG, " ==> no name; falling back to number:"
+ + " displayNumber '" + Log.pii(displayNumber)
+ + "', displayLocation '" + displayLocation + "'");
+ }
+ } else {
+ // We do have a valid "name" in the CallerInfo. Display that
+ // in the "name" slot, and the phone number in the "number" slot.
+ if (presentation != TelecomManager.PRESENTATION_ALLOWED) {
+ // This case should never happen since the network should never send a name
+ // AND a restricted presentation. However we leave it here in case of weird
+ // network behavior
+ displayName = getPresentationString(context, presentation, info.callSubject);
+ Log.d(TAG, " ==> valid name, but presentation not allowed!" +
+ " displayName = " + displayName);
+ } else {
+ // Causes cce.namePrimary to be set as info.name below. CallCardPresenter will
+ // later determine whether to use the name or nameAlternative when presenting
+ displayName = info.name;
+ cce.nameAlternative = info.nameAlternative;
+ displayNumber = number;
+ label = info.phoneLabel;
+ Log.d(TAG, " ==> name is present in CallerInfo: displayName '" + displayName
+ + "', displayNumber '" + displayNumber + "'");
+ }
+ }
+
+ cce.namePrimary = displayName;
+ cce.number = displayNumber;
+ cce.location = displayLocation;
+ cce.label = label;
+ cce.isSipCall = isSipCall;
+ cce.userType = info.userType;
+
+ if (info.contactExists) {
+ cce.contactLookupResult = LogState.LOOKUP_LOCAL_CONTACT;
+ }
+ }
+
+ /**
+ * Sends the updated information to call the callbacks for the entry.
+ */
+ private void sendInfoNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onContactInfoComplete(callId, entry);
+ }
+ }
+ }
+
+ private void sendImageNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null && entry.photo != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onImageLoadComplete(callId, entry);
+ }
+ }
+ }
+
+ private void sendContactInteractionsNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onContactInteractionsInfoComplete(callId, entry);
+ }
+ }
+ }
+
+ private void clearCallbacks(String callId) {
+ mCallBacks.remove(callId);
+ }
+
+ /**
+ * Gets name strings based on some special presentation modes and the associated custom label.
+ */
+ private static String getPresentationString(Context context, int presentation,
+ String customLabel) {
+ String name = context.getString(R.string.unknown);
+ if (!TextUtils.isEmpty(customLabel) &&
+ ((presentation == TelecomManager.PRESENTATION_UNKNOWN) ||
+ (presentation == TelecomManager.PRESENTATION_RESTRICTED))) {
+ name = customLabel;
+ return name;
+ } else {
+ if (presentation == TelecomManager.PRESENTATION_RESTRICTED) {
+ name = context.getString(R.string.private_num);
+ } else if (presentation == TelecomManager.PRESENTATION_PAYPHONE) {
+ name = context.getString(R.string.payphone);
+ }
+ }
+ return name;
+ }
+
+ public Drawable getDefaultContactPhotoDrawable() {
+ if (mDefaultContactPhotoDrawable == null) {
+ mDefaultContactPhotoDrawable =
+ mContext.getResources().getDrawable(R.drawable.img_no_image_automirrored);
+ }
+ return mDefaultContactPhotoDrawable;
+ }
+
+ public Drawable getConferenceDrawable() {
+ if (mConferencePhotoDrawable == null) {
+ mConferencePhotoDrawable =
+ mContext.getResources().getDrawable(R.drawable.img_conference_automirrored);
+ }
+ return mConferencePhotoDrawable;
+ }
+
+ /**
+ * Callback interface for the contact query.
+ */
+ public interface ContactInfoCacheCallback {
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry);
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry);
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry);
+ }
+
+ public static class ContactCacheEntry {
+ public String namePrimary;
+ public String nameAlternative;
+ public String number;
+ public String location;
+ public String label;
+ public Drawable photo;
+ public boolean isSipCall;
+ // Note in cache entry whether this is a pending async loading action to know whether to
+ // wait for its callback or not.
+ public boolean isLoadingPhoto;
+ public boolean isLoadingContactInteractions;
+ /** This will be used for the "view" notification. */
+ public Uri contactUri;
+ /** Either a display photo or a thumbnail URI. */
+ public Uri displayPhotoUri;
+ public Uri lookupUri; // Sent to NotificationMananger
+ public String lookupKey;
+ public Address locationAddress;
+ public List<Pair<Calendar, Calendar>> openingHours;
+ public int contactLookupResult = LogState.LOOKUP_NOT_FOUND;
+ public long userType = ContactsUtils.USER_TYPE_CURRENT;
+ public Uri contactRingtoneUri;
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("name", MoreStrings.toSafeString(namePrimary))
+ .add("nameAlternative", MoreStrings.toSafeString(nameAlternative))
+ .add("number", MoreStrings.toSafeString(number))
+ .add("location", MoreStrings.toSafeString(location))
+ .add("label", label)
+ .add("photo", photo)
+ .add("isSipCall", isSipCall)
+ .add("contactUri", contactUri)
+ .add("displayPhotoUri", displayPhotoUri)
+ .add("locationAddress", locationAddress)
+ .add("openingHours", openingHours)
+ .add("contactLookupResult", contactLookupResult)
+ .add("userType", userType)
+ .add("contactRingtoneUri", contactRingtoneUri)
+ .toString();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ContactUtils.java b/InCallUI/src/com/android/incallui/ContactUtils.java
new file mode 100644
index 0000000..0750af7
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactUtils.java
@@ -0,0 +1,48 @@
+/*
+ * 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.incallui;
+
+import android.content.Context;
+import android.location.Address;
+import android.util.Pair;
+
+import com.android.incalluibind.ObjectFactory;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * Utility functions to help manipulate contact data.
+ */
+public abstract class ContactUtils {
+ protected Context mContext;
+
+ public static ContactUtils getInstance(Context context) {
+ return ObjectFactory.getContactUtilsInstance(context);
+ }
+
+ protected ContactUtils(Context context) {
+ mContext = context;
+ }
+
+ public interface Listener {
+ public void onContactInteractionsFound(Address address,
+ List<Pair<Calendar, Calendar>> openingHours);
+ }
+
+ public abstract boolean retrieveContactInteractionsFromLookupKey(String lookupKey,
+ Listener listener);
+}
diff --git a/InCallUI/src/com/android/incallui/ContactsAsyncHelper.java b/InCallUI/src/com/android/incallui/ContactsAsyncHelper.java
new file mode 100644
index 0000000..011eef2
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactsAsyncHelper.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2008 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.incallui;
+
+import android.app.Notification;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.provider.ContactsContract.Contacts;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Helper class for loading contacts photo asynchronously.
+ */
+public class ContactsAsyncHelper {
+
+ /**
+ * Interface for a WorkerHandler result return.
+ */
+ public interface OnImageLoadCompleteListener {
+ /**
+ * Called when the image load is complete.
+ *
+ * @param token Integer passed in {@link ContactsAsyncHelper#startObtainPhotoAsync(int,
+ * Context, Uri, OnImageLoadCompleteListener, Object)}.
+ * @param photo Drawable object obtained by the async load.
+ * @param photoIcon Bitmap object obtained by the async load.
+ * @param cookie Object passed in {@link ContactsAsyncHelper#startObtainPhotoAsync(int,
+ * Context, Uri, OnImageLoadCompleteListener, Object)}. Can be null iff. the original
+ * cookie is null.
+ */
+ public void onImageLoadComplete(int token, Drawable photo, Bitmap photoIcon,
+ Object cookie);
+ }
+
+ // constants
+ private static final int EVENT_LOAD_IMAGE = 1;
+
+ private final Handler mResultHandler = new Handler() {
+ /** Called when loading is done. */
+ @Override
+ public void handleMessage(Message msg) {
+ WorkerArgs args = (WorkerArgs) msg.obj;
+ switch (msg.arg1) {
+ case EVENT_LOAD_IMAGE:
+ if (args.listener != null) {
+ Log.d(this, "Notifying listener: " + args.listener.toString() +
+ " image: " + args.displayPhotoUri + " completed");
+ args.listener.onImageLoadComplete(msg.what, args.photo, args.photoIcon,
+ args.cookie);
+ }
+ break;
+ default:
+ }
+ }
+ };
+
+ /** Handler run on a worker thread to load photo asynchronously. */
+ private static Handler sThreadHandler;
+
+ /** For forcing the system to call its constructor */
+ @SuppressWarnings("unused")
+ private static ContactsAsyncHelper sInstance;
+
+ static {
+ sInstance = new ContactsAsyncHelper();
+ }
+
+ private static final class WorkerArgs {
+ public Context context;
+ public Uri displayPhotoUri;
+ public Drawable photo;
+ public Bitmap photoIcon;
+ public Object cookie;
+ public OnImageLoadCompleteListener listener;
+ }
+
+ /**
+ * Thread worker class that handles the task of opening the stream and loading
+ * the images.
+ */
+ private class WorkerHandler extends Handler {
+ public WorkerHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ WorkerArgs args = (WorkerArgs) msg.obj;
+
+ switch (msg.arg1) {
+ case EVENT_LOAD_IMAGE:
+ InputStream inputStream = null;
+ try {
+ try {
+ inputStream = args.context.getContentResolver()
+ .openInputStream(args.displayPhotoUri);
+ } catch (Exception e) {
+ Log.e(this, "Error opening photo input stream", e);
+ }
+
+ if (inputStream != null) {
+ args.photo = Drawable.createFromStream(inputStream,
+ args.displayPhotoUri.toString());
+
+ // This assumes Drawable coming from contact database is usually
+ // BitmapDrawable and thus we can have (down)scaled version of it.
+ args.photoIcon = getPhotoIconWhenAppropriate(args.context, args.photo);
+
+ Log.d(ContactsAsyncHelper.this, "Loading image: " + msg.arg1 +
+ " token: " + msg.what + " image URI: " + args.displayPhotoUri);
+ } else {
+ args.photo = null;
+ args.photoIcon = null;
+ Log.d(ContactsAsyncHelper.this, "Problem with image: " + msg.arg1 +
+ " token: " + msg.what + " image URI: " + args.displayPhotoUri +
+ ", using default image.");
+ }
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ Log.e(this, "Unable to close input stream.", e);
+ }
+ }
+ }
+ break;
+ default:
+ }
+
+ // send the reply to the enclosing class.
+ Message reply = ContactsAsyncHelper.this.mResultHandler.obtainMessage(msg.what);
+ reply.arg1 = msg.arg1;
+ reply.obj = msg.obj;
+ reply.sendToTarget();
+ }
+
+ /**
+ * Returns a Bitmap object suitable for {@link Notification}'s large icon. This might
+ * return null when the given Drawable isn't BitmapDrawable, or if the system fails to
+ * create a scaled Bitmap for the Drawable.
+ */
+ private Bitmap getPhotoIconWhenAppropriate(Context context, Drawable photo) {
+ if (!(photo instanceof BitmapDrawable)) {
+ return null;
+ }
+ int iconSize = context.getResources()
+ .getDimensionPixelSize(R.dimen.notification_icon_size);
+ Bitmap orgBitmap = ((BitmapDrawable) photo).getBitmap();
+ int orgWidth = orgBitmap.getWidth();
+ int orgHeight = orgBitmap.getHeight();
+ int longerEdge = orgWidth > orgHeight ? orgWidth : orgHeight;
+ // We want downscaled one only when the original icon is too big.
+ if (longerEdge > iconSize) {
+ float ratio = ((float) longerEdge) / iconSize;
+ int newWidth = (int) (orgWidth / ratio);
+ int newHeight = (int) (orgHeight / ratio);
+ // If the longer edge is much longer than the shorter edge, the latter may
+ // become 0 which will cause a crash.
+ if (newWidth <= 0 || newHeight <= 0) {
+ Log.w(this, "Photo icon's width or height become 0.");
+ return null;
+ }
+
+ // It is sure ratio >= 1.0f in any case and thus the newly created Bitmap
+ // should be smaller than the original.
+ return Bitmap.createScaledBitmap(orgBitmap, newWidth, newHeight, true);
+ } else {
+ return orgBitmap;
+ }
+ }
+ }
+
+ /**
+ * Private constructor for static class
+ */
+ private ContactsAsyncHelper() {
+ HandlerThread thread = new HandlerThread("ContactsAsyncWorker");
+ thread.start();
+ sThreadHandler = new WorkerHandler(thread.getLooper());
+ }
+
+ /**
+ * Starts an asynchronous image load. After finishing the load,
+ * {@link OnImageLoadCompleteListener#onImageLoadComplete(int, Drawable, Bitmap, Object)}
+ * will be called.
+ *
+ * @param token Arbitrary integer which will be returned as the first argument of
+ * {@link OnImageLoadCompleteListener#onImageLoadComplete(int, Drawable, Bitmap, Object)}
+ * @param context Context object used to do the time-consuming operation.
+ * @param displayPhotoUri Uri to be used to fetch the photo
+ * @param listener Callback object which will be used when the asynchronous load is done.
+ * Can be null, which means only the asynchronous load is done while there's no way to
+ * obtain the loaded photos.
+ * @param cookie Arbitrary object the caller wants to remember, which will become the
+ * fourth argument of {@link OnImageLoadCompleteListener#onImageLoadComplete(int, Drawable,
+ * Bitmap, Object)}. Can be null, at which the callback will also has null for the argument.
+ */
+ public static final void startObtainPhotoAsync(int token, Context context, Uri displayPhotoUri,
+ OnImageLoadCompleteListener listener, Object cookie) {
+ // in case the source caller info is null, the URI will be null as well.
+ // just update using the placeholder image in this case.
+ if (displayPhotoUri == null) {
+ Log.wtf("startObjectPhotoAsync", "Uri is missing");
+ return;
+ }
+
+ // Added additional Cookie field in the callee to handle arguments
+ // sent to the callback function.
+
+ // setup arguments
+ WorkerArgs args = new WorkerArgs();
+ args.cookie = cookie;
+ args.context = context;
+ args.displayPhotoUri = displayPhotoUri;
+ args.listener = listener;
+
+ // setup message arguments
+ Message msg = sThreadHandler.obtainMessage(token);
+ msg.arg1 = EVENT_LOAD_IMAGE;
+ msg.obj = args;
+
+ Log.d("startObjectPhotoAsync", "Begin loading image: " + args.displayPhotoUri +
+ ", displaying default image for now.");
+
+ // notify the thread to begin working
+ sThreadHandler.sendMessage(msg);
+ }
+
+
+}
diff --git a/InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java b/InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java
new file mode 100644
index 0000000..a9cc93b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 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.incallui;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import com.android.dialer.compat.UserManagerCompat;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
+
+/**
+ * Factory class for {@link ContactsPreferences}.
+ */
+public class ContactsPreferencesFactory {
+
+ private static boolean sUseTestInstance;
+ private static ContactsPreferences sTestInstance;
+
+ /**
+ * Creates a new {@link ContactsPreferences} object if possible.
+ *
+ * @param context the context to use when creating the ContactsPreferences.
+ * @return a new ContactsPreferences object or {@code null} if the user is locked.
+ */
+ @Nullable
+ public static ContactsPreferences newContactsPreferences(Context context) {
+ if (sUseTestInstance) {
+ return sTestInstance;
+ }
+ if (UserManagerCompat.isUserUnlocked(context)) {
+ return new ContactsPreferences(context);
+ }
+ return null;
+ }
+
+ /**
+ * Sets the instance to be returned by all calls to {@link #newContactsPreferences(Context)}.
+ *
+ * @param testInstance the instance to return.
+ */
+ @NeededForTesting
+ static void setTestInstance(ContactsPreferences testInstance) {
+ sUseTestInstance = true;
+ sTestInstance = testInstance;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/DialpadFragment.java b/InCallUI/src/com/android/incallui/DialpadFragment.java
new file mode 100644
index 0000000..ab44cf2
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DialpadFragment.java
@@ -0,0 +1,556 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.Editable;
+import android.text.method.DialerKeyListener;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.phone.common.dialpad.DialpadKeyButton;
+import com.android.phone.common.dialpad.DialpadView;
+
+import java.util.HashMap;
+
+/**
+ * Fragment for call control buttons
+ */
+public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPresenter.DialpadUi>
+ implements DialpadPresenter.DialpadUi, View.OnTouchListener, View.OnKeyListener,
+ View.OnHoverListener, View.OnClickListener {
+
+ private static final int ACCESSIBILITY_DTMF_STOP_DELAY_MILLIS = 50;
+
+ private final int[] mButtonIds = new int[] {R.id.zero, R.id.one, R.id.two, R.id.three,
+ R.id.four, R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.star,
+ R.id.pound};
+
+ /**
+ * LinearLayout with getter and setter methods for the translationY property using floats,
+ * for animation purposes.
+ */
+ public static class DialpadSlidingLinearLayout extends LinearLayout {
+
+ public DialpadSlidingLinearLayout(Context context) {
+ super(context);
+ }
+
+ public DialpadSlidingLinearLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public DialpadSlidingLinearLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public float getYFraction() {
+ final int height = getHeight();
+ if (height == 0) return 0;
+ return getTranslationY() / height;
+ }
+
+ public void setYFraction(float yFraction) {
+ setTranslationY(yFraction * getHeight());
+ }
+ }
+
+ private EditText mDtmfDialerField;
+
+ /** Hash Map to map a view id to a character*/
+ private static final HashMap<Integer, Character> mDisplayMap =
+ new HashMap<Integer, Character>();
+
+ private static final Handler sHandler = new Handler(Looper.getMainLooper());
+
+
+ /** Set up the static maps*/
+ static {
+ // Map the buttons to the display characters
+ mDisplayMap.put(R.id.one, '1');
+ mDisplayMap.put(R.id.two, '2');
+ mDisplayMap.put(R.id.three, '3');
+ mDisplayMap.put(R.id.four, '4');
+ mDisplayMap.put(R.id.five, '5');
+ mDisplayMap.put(R.id.six, '6');
+ mDisplayMap.put(R.id.seven, '7');
+ mDisplayMap.put(R.id.eight, '8');
+ mDisplayMap.put(R.id.nine, '9');
+ mDisplayMap.put(R.id.zero, '0');
+ mDisplayMap.put(R.id.pound, '#');
+ mDisplayMap.put(R.id.star, '*');
+ }
+
+ // KeyListener used with the "dialpad digits" EditText widget.
+ private DTMFKeyListener mDialerKeyListener;
+
+ private DialpadView mDialpadView;
+
+ private int mCurrentTextColor;
+
+ /**
+ * Our own key listener, specialized for dealing with DTMF codes.
+ * 1. Ignore the backspace since it is irrelevant.
+ * 2. Allow ONLY valid DTMF characters to generate a tone and be
+ * sent as a DTMF code.
+ * 3. All other remaining characters are handled by the superclass.
+ *
+ * This code is purely here to handle events from the hardware keyboard
+ * while the DTMF dialpad is up.
+ */
+ private class DTMFKeyListener extends DialerKeyListener {
+
+ private DTMFKeyListener() {
+ super();
+ }
+
+ /**
+ * Overriden to return correct DTMF-dialable characters.
+ */
+ @Override
+ protected char[] getAcceptedChars(){
+ return DTMF_CHARACTERS;
+ }
+
+ /** special key listener ignores backspace. */
+ @Override
+ public boolean backspace(View view, Editable content, int keyCode,
+ KeyEvent event) {
+ return false;
+ }
+
+ /**
+ * Return true if the keyCode is an accepted modifier key for the
+ * dialer (ALT or SHIFT).
+ */
+ private boolean isAcceptableModifierKey(int keyCode) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_ALT_LEFT:
+ case KeyEvent.KEYCODE_ALT_RIGHT:
+ case KeyEvent.KEYCODE_SHIFT_LEFT:
+ case KeyEvent.KEYCODE_SHIFT_RIGHT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Overriden so that with each valid button press, we start sending
+ * a dtmf code and play a local dtmf tone.
+ */
+ @Override
+ public boolean onKeyDown(View view, Editable content,
+ int keyCode, KeyEvent event) {
+ // if (DBG) log("DTMFKeyListener.onKeyDown, keyCode " + keyCode + ", view " + view);
+
+ // find the character
+ char c = (char) lookup(event, content);
+
+ // if not a long press, and parent onKeyDown accepts the input
+ if (event.getRepeatCount() == 0 && super.onKeyDown(view, content, keyCode, event)) {
+
+ boolean keyOK = ok(getAcceptedChars(), c);
+
+ // if the character is a valid dtmf code, start playing the tone and send the
+ // code.
+ if (keyOK) {
+ Log.d(this, "DTMFKeyListener reading '" + c + "' from input.");
+ getPresenter().processDtmf(c);
+ } else {
+ Log.d(this, "DTMFKeyListener rejecting '" + c + "' from input.");
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Overriden so that with each valid button up, we stop sending
+ * a dtmf code and the dtmf tone.
+ */
+ @Override
+ public boolean onKeyUp(View view, Editable content,
+ int keyCode, KeyEvent event) {
+ // if (DBG) log("DTMFKeyListener.onKeyUp, keyCode " + keyCode + ", view " + view);
+
+ super.onKeyUp(view, content, keyCode, event);
+
+ // find the character
+ char c = (char) lookup(event, content);
+
+ boolean keyOK = ok(getAcceptedChars(), c);
+
+ if (keyOK) {
+ Log.d(this, "Stopping the tone for '" + c + "'");
+ getPresenter().stopDtmf();
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Handle individual keydown events when we DO NOT have an Editable handy.
+ */
+ public boolean onKeyDown(KeyEvent event) {
+ char c = lookup(event);
+ Log.d(this, "DTMFKeyListener.onKeyDown: event '" + c + "'");
+
+ // if not a long press, and parent onKeyDown accepts the input
+ if (event.getRepeatCount() == 0 && c != 0) {
+ // if the character is a valid dtmf code, start playing the tone and send the
+ // code.
+ if (ok(getAcceptedChars(), c)) {
+ Log.d(this, "DTMFKeyListener reading '" + c + "' from input.");
+ getPresenter().processDtmf(c);
+ return true;
+ } else {
+ Log.d(this, "DTMFKeyListener rejecting '" + c + "' from input.");
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Handle individual keyup events.
+ *
+ * @param event is the event we are trying to stop. If this is null,
+ * then we just force-stop the last tone without checking if the event
+ * is an acceptable dialer event.
+ */
+ public boolean onKeyUp(KeyEvent event) {
+ if (event == null) {
+ //the below piece of code sends stopDTMF event unnecessarily even when a null event
+ //is received, hence commenting it.
+ /*if (DBG) log("Stopping the last played tone.");
+ stopTone();*/
+ return true;
+ }
+
+ char c = lookup(event);
+ Log.d(this, "DTMFKeyListener.onKeyUp: event '" + c + "'");
+
+ // TODO: stopTone does not take in character input, we may want to
+ // consider checking for this ourselves.
+ if (ok(getAcceptedChars(), c)) {
+ Log.d(this, "Stopping the tone for '" + c + "'");
+ getPresenter().stopDtmf();
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Find the Dialer Key mapped to this event.
+ *
+ * @return The char value of the input event, otherwise
+ * 0 if no matching character was found.
+ */
+ private char lookup(KeyEvent event) {
+ // This code is similar to {@link DialerKeyListener#lookup(KeyEvent, Spannable) lookup}
+ int meta = event.getMetaState();
+ int number = event.getNumber();
+
+ if (!((meta & (KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON)) == 0) || (number == 0)) {
+ int match = event.getMatch(getAcceptedChars(), meta);
+ number = (match != 0) ? match : number;
+ }
+
+ return (char) number;
+ }
+
+ /**
+ * Check to see if the keyEvent is dialable.
+ */
+ boolean isKeyEventAcceptable (KeyEvent event) {
+ return (ok(getAcceptedChars(), lookup(event)));
+ }
+
+ /**
+ * Overrides the characters used in {@link DialerKeyListener#CHARACTERS}
+ * These are the valid dtmf characters.
+ */
+ public final char[] DTMF_CHARACTERS = new char[] {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '#', '*'
+ };
+ }
+
+ @Override
+ public void onClick(View v) {
+ final AccessibilityManager accessibilityManager = (AccessibilityManager)
+ v.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+ // When accessibility is on, simulate press and release to preserve the
+ // semantic meaning of performClick(). Required for Braille support.
+ if (accessibilityManager.isEnabled()) {
+ final int id = v.getId();
+ // Checking the press state prevents double activation.
+ if (!v.isPressed() && mDisplayMap.containsKey(id)) {
+ getPresenter().processDtmf(mDisplayMap.get(id));
+ sHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ getPresenter().stopDtmf();
+ }
+ }, ACCESSIBILITY_DTMF_STOP_DELAY_MILLIS);
+ }
+ }
+ }
+
+ @Override
+ public boolean onHover(View v, MotionEvent event) {
+ // When touch exploration is turned on, lifting a finger while inside
+ // the button's hover target bounds should perform a click action.
+ final AccessibilityManager accessibilityManager = (AccessibilityManager)
+ v.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+
+ if (accessibilityManager.isEnabled()
+ && accessibilityManager.isTouchExplorationEnabled()) {
+ final int left = v.getPaddingLeft();
+ final int right = (v.getWidth() - v.getPaddingRight());
+ final int top = v.getPaddingTop();
+ final int bottom = (v.getHeight() - v.getPaddingBottom());
+
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_HOVER_ENTER:
+ // Lift-to-type temporarily disables double-tap activation.
+ v.setClickable(false);
+ break;
+ case MotionEvent.ACTION_HOVER_EXIT:
+ final int x = (int) event.getX();
+ final int y = (int) event.getY();
+ if ((x > left) && (x < right) && (y > top) && (y < bottom)) {
+ v.performClick();
+ }
+ v.setClickable(true);
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ Log.d(this, "onKey: keyCode " + keyCode + ", view " + v);
+
+ if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
+ int viewId = v.getId();
+ if (mDisplayMap.containsKey(viewId)) {
+ switch (event.getAction()) {
+ case KeyEvent.ACTION_DOWN:
+ if (event.getRepeatCount() == 0) {
+ getPresenter().processDtmf(mDisplayMap.get(viewId));
+ }
+ break;
+ case KeyEvent.ACTION_UP:
+ getPresenter().stopDtmf();
+ break;
+ }
+ // do not return true [handled] here, since we want the
+ // press / click animation to be handled by the framework.
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ Log.d(this, "onTouch");
+ int viewId = v.getId();
+
+ // if the button is recognized
+ if (mDisplayMap.containsKey(viewId)) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ // Append the character mapped to this button, to the display.
+ // start the tone
+ getPresenter().processDtmf(mDisplayMap.get(viewId));
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ // stop the tone on ANY other event, except for MOVE.
+ getPresenter().stopDtmf();
+ break;
+ }
+ // do not return true [handled] here, since we want the
+ // press / click animation to be handled by the framework.
+ }
+ return false;
+ }
+
+ // TODO(klp) Adds hardware keyboard listener
+
+ @Override
+ public DialpadPresenter createPresenter() {
+ return new DialpadPresenter();
+ }
+
+ @Override
+ public DialpadPresenter.DialpadUi getUi() {
+ return this;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View parent = inflater.inflate(
+ R.layout.incall_dialpad_fragment, container, false);
+ mDialpadView = (DialpadView) parent.findViewById(R.id.dialpad_view);
+ mDialpadView.setCanDigitsBeEdited(false);
+ mDialpadView.setBackgroundResource(R.color.incall_dialpad_background);
+ mDtmfDialerField = (EditText) parent.findViewById(R.id.digits);
+ if (mDtmfDialerField != null) {
+ mDialerKeyListener = new DTMFKeyListener();
+ mDtmfDialerField.setKeyListener(mDialerKeyListener);
+ // remove the long-press context menus that support
+ // the edit (copy / paste / select) functions.
+ mDtmfDialerField.setLongClickable(false);
+ mDtmfDialerField.setElegantTextHeight(false);
+ configureKeypadListeners();
+ }
+
+ return parent;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateColors();
+ }
+
+ public void updateColors() {
+ int textColor = InCallPresenter.getInstance().getThemeColors().mPrimaryColor;
+
+ if (mCurrentTextColor == textColor) {
+ return;
+ }
+
+ DialpadKeyButton dialpadKey;
+ for (int i = 0; i < mButtonIds.length; i++) {
+ dialpadKey = (DialpadKeyButton) mDialpadView.findViewById(mButtonIds[i]);
+ ((TextView) dialpadKey.findViewById(R.id.dialpad_key_number)).setTextColor(textColor);
+ }
+
+ mCurrentTextColor = textColor;
+ }
+
+ @Override
+ public void onDestroyView() {
+ mDialerKeyListener = null;
+ super.onDestroyView();
+ }
+
+ /**
+ * Getter for Dialpad text.
+ *
+ * @return String containing current Dialpad EditText text.
+ */
+ public String getDtmfText() {
+ return mDtmfDialerField.getText().toString();
+ }
+
+ /**
+ * Sets the Dialpad text field with some text.
+ *
+ * @param text Text to set Dialpad EditText to.
+ */
+ public void setDtmfText(String text) {
+ mDtmfDialerField.setText(PhoneNumberUtilsCompat.createTtsSpannable(text));
+ }
+
+ @Override
+ public void setVisible(boolean on) {
+ if (on) {
+ getView().setVisibility(View.VISIBLE);
+ } else {
+ getView().setVisibility(View.INVISIBLE);
+ }
+ }
+
+ /**
+ * Starts the slide up animation for the Dialpad keys when the Dialpad is revealed.
+ */
+ public void animateShowDialpad() {
+ final DialpadView dialpadView = (DialpadView) getView().findViewById(R.id.dialpad_view);
+ dialpadView.animateShow();
+ }
+
+ @Override
+ public void appendDigitsToField(char digit) {
+ if (mDtmfDialerField != null) {
+ // TODO: maybe *don't* manually append this digit if
+ // mDialpadDigits is focused and this key came from the HW
+ // keyboard, since in that case the EditText field will
+ // get the key event directly and automatically appends
+ // whetever the user types.
+ // (Or, a cleaner fix would be to just make mDialpadDigits
+ // *not* handle HW key presses. That seems to be more
+ // complicated than just setting focusable="false" on it,
+ // though.)
+ mDtmfDialerField.getText().append(digit);
+ }
+ }
+
+ /**
+ * Called externally (from InCallScreen) to play a DTMF Tone.
+ */
+ /* package */ boolean onDialerKeyDown(KeyEvent event) {
+ Log.d(this, "Notifying dtmf key down.");
+ if (mDialerKeyListener != null) {
+ return mDialerKeyListener.onKeyDown(event);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Called externally (from InCallScreen) to cancel the last DTMF Tone played.
+ */
+ public boolean onDialerKeyUp(KeyEvent event) {
+ Log.d(this, "Notifying dtmf key up.");
+ if (mDialerKeyListener != null) {
+ return mDialerKeyListener.onKeyUp(event);
+ } else {
+ return false;
+ }
+ }
+
+ private void configureKeypadListeners() {
+ DialpadKeyButton dialpadKey;
+ for (int i = 0; i < mButtonIds.length; i++) {
+ dialpadKey = (DialpadKeyButton) mDialpadView.findViewById(mButtonIds[i]);
+ dialpadKey.setOnTouchListener(this);
+ dialpadKey.setOnKeyListener(this);
+ dialpadKey.setOnHoverListener(this);
+ dialpadKey.setOnClickListener(this);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/DialpadPresenter.java b/InCallUI/src/com/android/incallui/DialpadPresenter.java
new file mode 100644
index 0000000..5e24bed
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DialpadPresenter.java
@@ -0,0 +1,84 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * Logic for call buttons.
+ */
+public class DialpadPresenter extends Presenter<DialpadPresenter.DialpadUi>
+ implements InCallPresenter.InCallStateListener {
+
+ private Call mCall;
+
+ @Override
+ public void onUiReady(DialpadUi ui) {
+ super.onUiReady(ui);
+ InCallPresenter.getInstance().addListener(this);
+ mCall = CallList.getInstance().getOutgoingOrActive();
+ }
+
+ @Override
+ public void onUiUnready(DialpadUi ui) {
+ super.onUiUnready(ui);
+ InCallPresenter.getInstance().removeListener(this);
+ }
+
+ @Override
+ public void onStateChange(InCallPresenter.InCallState oldState,
+ InCallPresenter.InCallState newState, CallList callList) {
+ mCall = callList.getOutgoingOrActive();
+ Log.d(this, "DialpadPresenter mCall = " + mCall);
+ }
+
+ /**
+ * Processes the specified digit as a DTMF key, by playing the
+ * appropriate DTMF tone, and appending the digit to the EditText
+ * field that displays the DTMF digits sent so far.
+ *
+ */
+ public final void processDtmf(char c) {
+ Log.d(this, "Processing dtmf key " + c);
+ // if it is a valid key, then update the display and send the dtmf tone.
+ if (PhoneNumberUtils.is12Key(c) && mCall != null) {
+ Log.d(this, "updating display and sending dtmf tone for '" + c + "'");
+
+ // Append this key to the "digits" widget.
+ getUi().appendDigitsToField(c);
+ // Plays the tone through Telecom.
+ TelecomAdapter.getInstance().playDtmfTone(mCall.getId(), c);
+ } else {
+ Log.d(this, "ignoring dtmf request for '" + c + "'");
+ }
+ }
+
+ /**
+ * Stops the local tone based on the phone type.
+ */
+ public void stopDtmf() {
+ if (mCall != null) {
+ Log.d(this, "stopping remote tone");
+ TelecomAdapter.getInstance().stopDtmfTone(mCall.getId());
+ }
+ }
+
+ public interface DialpadUi extends Ui {
+ void setVisible(boolean on);
+ void appendDigitsToField(char digit);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/DistanceHelper.java b/InCallUI/src/com/android/incallui/DistanceHelper.java
new file mode 100644
index 0000000..a4db5fe
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DistanceHelper.java
@@ -0,0 +1,37 @@
+/*
+ * 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.incallui;
+
+import android.location.Address;
+
+/**
+ * Superclass for a helper class to get the current location and distance to other locations.
+ */
+public abstract class DistanceHelper {
+ public static final float DISTANCE_NOT_FOUND = -1;
+ public static final float MILES_PER_METER = (float) 0.000621371192;
+ public static final float KILOMETERS_PER_METER = (float) 0.001;
+
+ public interface Listener {
+ public void onLocationReady();
+ }
+
+ public void cleanUp() {}
+
+ public float calculateDistance(Address address) {
+ return DISTANCE_NOT_FOUND;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/FragmentDisplayManager.java b/InCallUI/src/com/android/incallui/FragmentDisplayManager.java
new file mode 100644
index 0000000..045d999
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/FragmentDisplayManager.java
@@ -0,0 +1,23 @@
+/*
+ * 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.incallui;
+
+import android.app.Fragment;
+
+interface FragmentDisplayManager {
+ public void onFragmentAttached(Fragment fragment);
+}
diff --git a/InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java b/InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java
new file mode 100644
index 0000000..62a8e78
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java
@@ -0,0 +1,155 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+import android.telecom.VideoProfile;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.dialer.R;
+
+public class GlowPadAnswerFragment extends AnswerFragment {
+
+ private GlowPadWrapper mGlowpad;
+
+ public GlowPadAnswerFragment() {
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mGlowpad = (GlowPadWrapper) inflater.inflate(R.layout.answer_fragment,
+ container, false);
+
+ Log.d(this, "Creating view for answer fragment ", this);
+ Log.d(this, "Created from activity", getActivity());
+ mGlowpad.setAnswerFragment(this);
+
+ return mGlowpad;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mGlowpad.requestFocus();
+ }
+
+ @Override
+ public void onDestroyView() {
+ Log.d(this, "onDestroyView");
+ if (mGlowpad != null) {
+ mGlowpad.stopPing();
+ mGlowpad = null;
+ }
+ super.onDestroyView();
+ }
+
+ @Override
+ public void onShowAnswerUi(boolean shown) {
+ Log.d(this, "Show answer UI: " + shown);
+ if (shown) {
+ mGlowpad.startPing();
+ } else {
+ mGlowpad.stopPing();
+ }
+ }
+
+ /**
+ * Sets targets on the glowpad according to target set identified by the parameter.
+ *
+ * @param targetSet Integer identifying the set of targets to use.
+ */
+ public void showTargets(int targetSet) {
+ showTargets(targetSet, VideoProfile.STATE_BIDIRECTIONAL);
+ }
+
+ /**
+ * Sets targets on the glowpad according to target set identified by the parameter.
+ *
+ * @param targetSet Integer identifying the set of targets to use.
+ */
+ @Override
+ public void showTargets(int targetSet, int videoState) {
+ final int targetResourceId;
+ final int targetDescriptionsResourceId;
+ final int directionDescriptionsResourceId;
+ final int handleDrawableResourceId;
+ mGlowpad.setVideoState(videoState);
+
+ switch (targetSet) {
+ case TARGET_SET_FOR_AUDIO_WITH_SMS:
+ targetResourceId = R.array.incoming_call_widget_audio_with_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_with_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_with_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_audio_handle;
+ break;
+ case TARGET_SET_FOR_VIDEO_WITHOUT_SMS:
+ targetResourceId = R.array.incoming_call_widget_video_without_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_video_without_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_video_without_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_video_handle;
+ break;
+ case TARGET_SET_FOR_VIDEO_WITH_SMS:
+ targetResourceId = R.array.incoming_call_widget_video_with_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_video_with_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_video_with_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_video_handle;
+ break;
+ case TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST:
+ targetResourceId =
+ R.array.incoming_call_widget_video_request_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_video_request_target_descriptions;
+ directionDescriptionsResourceId = R.array
+ .incoming_call_widget_video_request_target_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_video_handle;
+ break;
+ case TARGET_SET_FOR_AUDIO_WITHOUT_SMS:
+ default:
+ targetResourceId = R.array.incoming_call_widget_audio_without_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_without_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_without_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_audio_handle;
+ break;
+ }
+
+ if (targetResourceId != mGlowpad.getTargetResourceId()) {
+ mGlowpad.setTargetResources(targetResourceId);
+ mGlowpad.setTargetDescriptionsResourceId(targetDescriptionsResourceId);
+ mGlowpad.setDirectionDescriptionsResourceId(directionDescriptionsResourceId);
+ mGlowpad.setHandleDrawable(handleDrawableResourceId);
+ mGlowpad.reset(false);
+ }
+ }
+
+ @Override
+ protected void onMessageDialogCancel() {
+ if (mGlowpad != null) {
+ mGlowpad.startPing();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/GlowPadWrapper.java b/InCallUI/src/com/android/incallui/GlowPadWrapper.java
new file mode 100644
index 0000000..1bd6d39
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/GlowPadWrapper.java
@@ -0,0 +1,164 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.telecom.VideoProfile;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.android.incallui.widget.multiwaveview.GlowPadView;
+
+/**
+ *
+ */
+public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTriggerListener {
+
+ // Parameters for the GlowPadView "ping" animation; see triggerPing().
+ private static final int PING_MESSAGE_WHAT = 101;
+ private static final boolean ENABLE_PING_AUTO_REPEAT = true;
+ private static final long PING_REPEAT_DELAY_MS = 1200;
+
+ private final Handler mPingHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case PING_MESSAGE_WHAT:
+ triggerPing();
+ break;
+ }
+ }
+ };
+
+ private AnswerFragment mAnswerFragment;
+ private boolean mPingEnabled = true;
+ private boolean mTargetTriggered = false;
+ private int mVideoState = VideoProfile.STATE_BIDIRECTIONAL;
+
+ public GlowPadWrapper(Context context) {
+ super(context);
+ Log.d(this, "class created " + this + " ");
+ }
+
+ public GlowPadWrapper(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Log.d(this, "class created " + this);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ Log.d(this, "onFinishInflate()");
+ super.onFinishInflate();
+ setOnTriggerListener(this);
+ }
+
+ public void startPing() {
+ Log.d(this, "startPing");
+ mPingEnabled = true;
+ triggerPing();
+ }
+
+ public void stopPing() {
+ Log.d(this, "stopPing");
+ mPingEnabled = false;
+ mPingHandler.removeMessages(PING_MESSAGE_WHAT);
+ }
+
+ private void triggerPing() {
+ Log.d(this, "triggerPing(): " + mPingEnabled + " " + this);
+ if (mPingEnabled && !mPingHandler.hasMessages(PING_MESSAGE_WHAT)) {
+ ping();
+
+ if (ENABLE_PING_AUTO_REPEAT) {
+ mPingHandler.sendEmptyMessageDelayed(PING_MESSAGE_WHAT, PING_REPEAT_DELAY_MS);
+ }
+ }
+ }
+
+ @Override
+ public void onGrabbed(View v, int handle) {
+ Log.d(this, "onGrabbed()");
+ stopPing();
+ }
+
+ @Override
+ public void onReleased(View v, int handle) {
+ Log.d(this, "onReleased()");
+ if (mTargetTriggered) {
+ mTargetTriggered = false;
+ } else {
+ startPing();
+ }
+ }
+
+ @Override
+ public void onTrigger(View v, int target) {
+ Log.d(this, "onTrigger() view=" + v + " target=" + target);
+ final int resId = getResourceIdForTarget(target);
+ switch (resId) {
+ case R.drawable.ic_lockscreen_answer:
+ mAnswerFragment.onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext());
+ mTargetTriggered = true;
+ break;
+ case R.drawable.ic_lockscreen_decline:
+ mAnswerFragment.onDecline(getContext());
+ mTargetTriggered = true;
+ break;
+ case R.drawable.ic_lockscreen_text:
+ mAnswerFragment.onText();
+ mTargetTriggered = true;
+ break;
+ case R.drawable.ic_videocam:
+ case R.drawable.ic_lockscreen_answer_video:
+ mAnswerFragment.onAnswer(mVideoState, getContext());
+ mTargetTriggered = true;
+ break;
+ case R.drawable.ic_lockscreen_decline_video:
+ mAnswerFragment.onDeclineUpgradeRequest(getContext());
+ mTargetTriggered = true;
+ break;
+ default:
+ // Code should never reach here.
+ Log.e(this, "Trigger detected on unhandled resource. Skipping.");
+ }
+ }
+
+ @Override
+ public void onGrabbedStateChange(View v, int handle) {
+
+ }
+
+ @Override
+ public void onFinishFinalAnimation() {
+
+ }
+
+ public void setAnswerFragment(AnswerFragment fragment) {
+ mAnswerFragment = fragment;
+ }
+
+ /**
+ * Sets the video state represented by the "video" icon on the glow pad.
+ *
+ * @param videoState The new video state.
+ */
+ public void setVideoState(int videoState) {
+ mVideoState = videoState;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
new file mode 100644
index 0000000..dff2747
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -0,0 +1,935 @@
+/*
+ * Copyright (C) 2006 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.incallui;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.graphics.Point;
+import android.hardware.SensorManager;
+import android.os.Bundle;
+import android.os.Trace;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.OrientationEventListener;
+import android.view.Surface;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+
+import com.android.contacts.common.activity.TransactionSafeActivity;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
+import com.android.incallui.Call.State;
+import com.android.incallui.compat.telecom.DetailsCompat;
+import com.android.incallui.util.AccessibilityUtil;
+import com.android.phone.common.animation.AnimUtils;
+import com.android.phone.common.animation.AnimationListenerAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Main activity that the user interacts with while in a live call.
+ */
+public class InCallActivity extends TransactionSafeActivity implements FragmentDisplayManager {
+
+ public static final String TAG = InCallActivity.class.getSimpleName();
+
+ public static final String SHOW_DIALPAD_EXTRA = "InCallActivity.show_dialpad";
+ public static final String DIALPAD_TEXT_EXTRA = "InCallActivity.dialpad_text";
+ public static final String NEW_OUTGOING_CALL_EXTRA = "InCallActivity.new_outgoing_call";
+
+ private static final String TAG_DIALPAD_FRAGMENT = "tag_dialpad_fragment";
+ private static final String TAG_CONFERENCE_FRAGMENT = "tag_conference_manager_fragment";
+ private static final String TAG_CALLCARD_FRAGMENT = "tag_callcard_fragment";
+ private static final String TAG_ANSWER_FRAGMENT = "tag_answer_fragment";
+ private static final String TAG_SELECT_ACCT_FRAGMENT = "tag_select_acct_fragment";
+
+ private static final int DIALPAD_REQUEST_NONE = 1;
+ private static final int DIALPAD_REQUEST_SHOW = 2;
+ private static final int DIALPAD_REQUEST_HIDE = 3;
+
+ private CallButtonFragment mCallButtonFragment;
+ private CallCardFragment mCallCardFragment;
+ private AnswerFragment mAnswerFragment;
+ private DialpadFragment mDialpadFragment;
+ private ConferenceManagerFragment mConferenceManagerFragment;
+ private FragmentManager mChildFragmentManager;
+
+ private AlertDialog mDialog;
+ private InCallOrientationEventListener mInCallOrientationEventListener;
+
+ /**
+ * Used to indicate whether the dialpad should be hidden or shown {@link #onResume}.
+ * {@code #DIALPAD_REQUEST_SHOW} indicates that the dialpad should be shown.
+ * {@code #DIALPAD_REQUEST_HIDE} indicates that the dialpad should be hidden.
+ * {@code #DIALPAD_REQUEST_NONE} indicates no change should be made to dialpad visibility.
+ */
+ private int mShowDialpadRequest = DIALPAD_REQUEST_NONE;
+
+ /**
+ * Use to determine if the dialpad should be animated on show.
+ */
+ private boolean mAnimateDialpadOnShow;
+
+ /**
+ * Use to determine the DTMF Text which should be pre-populated in the dialpad.
+ */
+ private String mDtmfText;
+
+ /**
+ * Use to pass parameters for showing the PostCharDialog to {@link #onResume}
+ */
+ private boolean mShowPostCharWaitDialogOnResume;
+ private String mShowPostCharWaitDialogCallId;
+ private String mShowPostCharWaitDialogChars;
+
+ private boolean mIsLandscape;
+ private Animation mSlideIn;
+ private Animation mSlideOut;
+ private boolean mDismissKeyguard = false;
+
+ AnimationListenerAdapter mSlideOutListener = new AnimationListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ showFragment(TAG_DIALPAD_FRAGMENT, false, true);
+ }
+ };
+
+ private OnTouchListener mDispatchTouchEventListener;
+
+ private SelectPhoneAccountListener mSelectAcctListener = new SelectPhoneAccountListener() {
+ @Override
+ public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
+ boolean setDefault) {
+ InCallPresenter.getInstance().handleAccountSelection(selectedAccountHandle,
+ setDefault);
+ }
+
+ @Override
+ public void onDialogDismissed() {
+ InCallPresenter.getInstance().cancelAccountSelection();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ Log.d(this, "onCreate()... this = " + this);
+
+ super.onCreate(icicle);
+
+ // set this flag so this activity will stay in front of the keyguard
+ // Have the WindowManager filter out touch events that are "too fat".
+ int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
+
+ getWindow().addFlags(flags);
+
+ // Setup action bar for the conference call manager.
+ requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.hide();
+ }
+
+ // TODO(klp): Do we need to add this back when prox sensor is not available?
+ // lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
+
+ setContentView(R.layout.incall_screen);
+
+ internalResolveIntent(getIntent());
+
+ mIsLandscape = getResources().getConfiguration().orientation ==
+ Configuration.ORIENTATION_LANDSCAPE;
+
+ final boolean isRtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ==
+ View.LAYOUT_DIRECTION_RTL;
+
+ if (mIsLandscape) {
+ mSlideIn = AnimationUtils.loadAnimation(this,
+ isRtl ? R.anim.dialpad_slide_in_left : R.anim.dialpad_slide_in_right);
+ mSlideOut = AnimationUtils.loadAnimation(this,
+ isRtl ? R.anim.dialpad_slide_out_left : R.anim.dialpad_slide_out_right);
+ } else {
+ mSlideIn = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_in_bottom);
+ mSlideOut = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_out_bottom);
+ }
+
+ mSlideIn.setInterpolator(AnimUtils.EASE_IN);
+ mSlideOut.setInterpolator(AnimUtils.EASE_OUT);
+
+ mSlideOut.setAnimationListener(mSlideOutListener);
+
+ // If the dialpad fragment already exists, retrieve it. This is important when rotating as
+ // we will not be able to hide or show the dialpad after the rotation otherwise.
+ Fragment existingFragment =
+ getFragmentManager().findFragmentByTag(DialpadFragment.class.getName());
+ if (existingFragment != null) {
+ mDialpadFragment = (DialpadFragment) existingFragment;
+ }
+
+ if (icicle != null) {
+ // If the dialpad was shown before, set variables indicating it should be shown and
+ // populated with the previous DTMF text. The dialpad is actually shown and populated
+ // in onResume() to ensure the hosting CallCardFragment has been inflated and is ready
+ // to receive it.
+ if (icicle.containsKey(SHOW_DIALPAD_EXTRA)) {
+ boolean showDialpad = icicle.getBoolean(SHOW_DIALPAD_EXTRA);
+ mShowDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_HIDE;
+ mAnimateDialpadOnShow = false;
+ }
+ mDtmfText = icicle.getString(DIALPAD_TEXT_EXTRA);
+
+ SelectPhoneAccountDialogFragment dialogFragment = (SelectPhoneAccountDialogFragment)
+ getFragmentManager().findFragmentByTag(TAG_SELECT_ACCT_FRAGMENT);
+ if (dialogFragment != null) {
+ dialogFragment.setListener(mSelectAcctListener);
+ }
+ }
+ mInCallOrientationEventListener = new InCallOrientationEventListener(this);
+
+ Log.d(this, "onCreate(): exit");
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle out) {
+ // TODO: The dialpad fragment should handle this as part of its own state
+ out.putBoolean(SHOW_DIALPAD_EXTRA,
+ mCallButtonFragment != null && mCallButtonFragment.isDialpadVisible());
+ if (mDialpadFragment != null) {
+ out.putString(DIALPAD_TEXT_EXTRA, mDialpadFragment.getDtmfText());
+ }
+ super.onSaveInstanceState(out);
+ }
+
+ @Override
+ protected void onStart() {
+ Log.d(this, "onStart()...");
+ super.onStart();
+
+ // setting activity should be last thing in setup process
+ InCallPresenter.getInstance().setActivity(this);
+ enableInCallOrientationEventListener(getRequestedOrientation() ==
+ InCallOrientationEventListener.FULL_SENSOR_SCREEN_ORIENTATION);
+
+ InCallPresenter.getInstance().onActivityStarted();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(this, "onResume()...");
+ super.onResume();
+
+ InCallPresenter.getInstance().setThemeColors();
+ InCallPresenter.getInstance().onUiShowing(true);
+
+ // Clear fullscreen state onResume; the stored value may not match reality.
+ InCallPresenter.getInstance().clearFullscreen();
+
+ // If there is a pending request to show or hide the dialpad, handle that now.
+ if (mShowDialpadRequest != DIALPAD_REQUEST_NONE) {
+ if (mShowDialpadRequest == DIALPAD_REQUEST_SHOW) {
+ // Exit fullscreen so that the user has access to the dialpad hide/show button and
+ // can hide the dialpad. Important when showing the dialpad from within dialer.
+ InCallPresenter.getInstance().setFullScreen(false, true /* force */);
+
+ mCallButtonFragment.displayDialpad(true /* show */,
+ mAnimateDialpadOnShow /* animate */);
+ mAnimateDialpadOnShow = false;
+
+ if (mDialpadFragment != null) {
+ mDialpadFragment.setDtmfText(mDtmfText);
+ mDtmfText = null;
+ }
+ } else {
+ Log.v(this, "onResume : force hide dialpad");
+ if (mDialpadFragment != null) {
+ mCallButtonFragment.displayDialpad(false /* show */, false /* animate */);
+ }
+ }
+ mShowDialpadRequest = DIALPAD_REQUEST_NONE;
+ }
+
+ if (mShowPostCharWaitDialogOnResume) {
+ showPostCharWaitDialog(mShowPostCharWaitDialogCallId, mShowPostCharWaitDialogChars);
+ }
+ }
+
+ // onPause is guaranteed to be called when the InCallActivity goes
+ // in the background.
+ @Override
+ protected void onPause() {
+ Log.d(this, "onPause()...");
+ if (mDialpadFragment != null) {
+ mDialpadFragment.onDialerKeyUp(null);
+ }
+
+ InCallPresenter.getInstance().onUiShowing(false);
+ if (isFinishing()) {
+ InCallPresenter.getInstance().unsetActivity(this);
+ }
+ super.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ Log.d(this, "onStop()...");
+ enableInCallOrientationEventListener(false);
+ InCallPresenter.getInstance().updateIsChangingConfigurations();
+ InCallPresenter.getInstance().onActivityStopped();
+ super.onStop();
+ }
+
+ @Override
+ protected void onDestroy() {
+ Log.d(this, "onDestroy()... this = " + this);
+ InCallPresenter.getInstance().unsetActivity(this);
+ InCallPresenter.getInstance().updateIsChangingConfigurations();
+ super.onDestroy();
+ }
+
+ /**
+ * When fragments have a parent fragment, onAttachFragment is not called on the parent
+ * activity. To fix this, register our own callback instead that is always called for
+ * all fragments.
+ *
+ * @see {@link BaseFragment#onAttach(Activity)}
+ */
+ @Override
+ public void onFragmentAttached(Fragment fragment) {
+ if (fragment instanceof DialpadFragment) {
+ mDialpadFragment = (DialpadFragment) fragment;
+ } else if (fragment instanceof AnswerFragment) {
+ mAnswerFragment = (AnswerFragment) fragment;
+ } else if (fragment instanceof CallCardFragment) {
+ mCallCardFragment = (CallCardFragment) fragment;
+ mChildFragmentManager = mCallCardFragment.getChildFragmentManager();
+ } else if (fragment instanceof ConferenceManagerFragment) {
+ mConferenceManagerFragment = (ConferenceManagerFragment) fragment;
+ } else if (fragment instanceof CallButtonFragment) {
+ mCallButtonFragment = (CallButtonFragment) fragment;
+ }
+ }
+
+ /**
+ * Returns true when the Activity is currently visible.
+ */
+ /* package */ boolean isVisible() {
+ return isSafeToCommitTransactions();
+ }
+
+ private boolean hasPendingDialogs() {
+ return mDialog != null || (mAnswerFragment != null && mAnswerFragment.hasPendingDialogs());
+ }
+
+ @Override
+ public void finish() {
+ Log.i(this, "finish(). Dialog showing: " + (mDialog != null));
+
+ // skip finish if we are still showing a dialog.
+ if (!hasPendingDialogs()) {
+ super.finish();
+ }
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ Log.d(this, "onNewIntent: intent = " + intent);
+
+ // We're being re-launched with a new Intent. Since it's possible for a
+ // single InCallActivity instance to persist indefinitely (even if we
+ // finish() ourselves), this sequence can potentially happen any time
+ // the InCallActivity needs to be displayed.
+
+ // Stash away the new intent so that we can get it in the future
+ // by calling getIntent(). (Otherwise getIntent() will return the
+ // original Intent from when we first got created!)
+ setIntent(intent);
+
+ // Activities are always paused before receiving a new intent, so
+ // we can count on our onResume() method being called next.
+
+ // Just like in onCreate(), handle the intent.
+ internalResolveIntent(intent);
+ }
+
+ @Override
+ public void onBackPressed() {
+ Log.i(this, "onBackPressed");
+
+ // BACK is also used to exit out of any "special modes" of the
+ // in-call UI:
+ if (!isVisible()) {
+ return;
+ }
+
+ if ((mConferenceManagerFragment == null || !mConferenceManagerFragment.isVisible())
+ && (mCallCardFragment == null || !mCallCardFragment.isVisible())) {
+ return;
+ }
+
+ if (mDialpadFragment != null && mDialpadFragment.isVisible()) {
+ mCallButtonFragment.displayDialpad(false /* show */, true /* animate */);
+ return;
+ } else if (mConferenceManagerFragment != null && mConferenceManagerFragment.isVisible()) {
+ showConferenceFragment(false);
+ return;
+ }
+
+ // Always disable the Back key while an incoming call is ringing
+ final Call call = CallList.getInstance().getIncomingCall();
+ if (call != null) {
+ Log.i(this, "Consume Back press for an incoming call");
+ return;
+ }
+
+ // Nothing special to do. Fall back to the default behavior.
+ super.onBackPressed();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ final int itemId = item.getItemId();
+ if (itemId == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ // push input to the dialer.
+ if (mDialpadFragment != null && (mDialpadFragment.isVisible()) &&
+ (mDialpadFragment.onDialerKeyUp(event))) {
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_CALL) {
+ // Always consume CALL to be sure the PhoneWindow won't do anything with it
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (mDispatchTouchEventListener != null) {
+ boolean handled = mDispatchTouchEventListener.onTouch(null, ev);
+ if (handled) {
+ return true;
+ }
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_CALL:
+ boolean handled = InCallPresenter.getInstance().handleCallKey();
+ if (!handled) {
+ Log.w(this, "InCallActivity should always handle KEYCODE_CALL in onKeyDown");
+ }
+ // Always consume CALL to be sure the PhoneWindow won't do anything with it
+ return true;
+
+ // Note there's no KeyEvent.KEYCODE_ENDCALL case here.
+ // The standard system-wide handling of the ENDCALL key
+ // (see PhoneWindowManager's handling of KEYCODE_ENDCALL)
+ // already implements exactly what the UI spec wants,
+ // namely (1) "hang up" if there's a current active call,
+ // or (2) "don't answer" if there's a current ringing call.
+
+ case KeyEvent.KEYCODE_CAMERA:
+ // Disable the CAMERA button while in-call since it's too
+ // easy to press accidentally.
+ return true;
+
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ // Ringer silencing handled by PhoneWindowManager.
+ break;
+
+ case KeyEvent.KEYCODE_MUTE:
+ // toggle mute
+ TelecomAdapter.getInstance().mute(!AudioModeProvider.getInstance().getMute());
+ return true;
+
+ // Various testing/debugging features, enabled ONLY when VERBOSE == true.
+ case KeyEvent.KEYCODE_SLASH:
+ if (Log.VERBOSE) {
+ Log.v(this, "----------- InCallActivity View dump --------------");
+ // Dump starting from the top-level view of the entire activity:
+ Window w = this.getWindow();
+ View decorView = w.getDecorView();
+ Log.d(this, "View dump:" + decorView);
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_EQUALS:
+ // TODO: Dump phone state?
+ break;
+ }
+
+ if (event.getRepeatCount() == 0 && handleDialerKeyDown(keyCode, event)) {
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ private boolean handleDialerKeyDown(int keyCode, KeyEvent event) {
+ Log.v(this, "handleDialerKeyDown: keyCode " + keyCode + ", event " + event + "...");
+
+ // As soon as the user starts typing valid dialable keys on the
+ // keyboard (presumably to type DTMF tones) we start passing the
+ // key events to the DTMFDialer's onDialerKeyDown.
+ if (mDialpadFragment != null && mDialpadFragment.isVisible()) {
+ return mDialpadFragment.onDialerKeyDown(event);
+ }
+
+ return false;
+ }
+
+ public CallButtonFragment getCallButtonFragment() {
+ return mCallButtonFragment;
+ }
+
+ public CallCardFragment getCallCardFragment() {
+ return mCallCardFragment;
+ }
+
+ public AnswerFragment getAnswerFragment() {
+ return mAnswerFragment;
+ }
+
+ private void internalResolveIntent(Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(Intent.ACTION_MAIN)) {
+ // This action is the normal way to bring up the in-call UI.
+ //
+ // But we do check here for one extra that can come along with the
+ // ACTION_MAIN intent:
+
+ if (intent.hasExtra(SHOW_DIALPAD_EXTRA)) {
+ // SHOW_DIALPAD_EXTRA can be used here to specify whether the DTMF
+ // dialpad should be initially visible. If the extra isn't
+ // present at all, we just leave the dialpad in its previous state.
+
+ final boolean showDialpad = intent.getBooleanExtra(SHOW_DIALPAD_EXTRA, false);
+ Log.d(this, "- internalResolveIntent: SHOW_DIALPAD_EXTRA: " + showDialpad);
+
+ relaunchedFromDialer(showDialpad);
+ }
+
+ boolean newOutgoingCall = false;
+ if (intent.getBooleanExtra(NEW_OUTGOING_CALL_EXTRA, false)) {
+ intent.removeExtra(NEW_OUTGOING_CALL_EXTRA);
+ Call call = CallList.getInstance().getOutgoingCall();
+ if (call == null) {
+ call = CallList.getInstance().getPendingOutgoingCall();
+ }
+
+ Bundle extras = null;
+ if (call != null) {
+ extras = DetailsCompat.getIntentExtras(call.getTelecomCall().getDetails());
+ }
+ if (extras == null) {
+ // Initialize the extras bundle to avoid NPE
+ extras = new Bundle();
+ }
+
+ Point touchPoint = null;
+ if (TouchPointManager.getInstance().hasValidPoint()) {
+ // Use the most immediate touch point in the InCallUi if available
+ touchPoint = TouchPointManager.getInstance().getPoint();
+ } else {
+ // Otherwise retrieve the touch point from the call intent
+ if (call != null) {
+ touchPoint = (Point) extras.getParcelable(TouchPointManager.TOUCH_POINT);
+ }
+ }
+
+ // Start animation for new outgoing call
+ CircularRevealFragment.startCircularReveal(getFragmentManager(), touchPoint,
+ InCallPresenter.getInstance());
+
+ // InCallActivity is responsible for disconnecting a new outgoing call if there
+ // is no way of making it (i.e. no valid call capable accounts).
+ // If the version is not MSIM compatible, then ignore this code.
+ if (CompatUtils.isMSIMCompatible()
+ && InCallPresenter.isCallWithNoValidAccounts(call)) {
+ TelecomAdapter.getInstance().disconnectCall(call.getId());
+ }
+
+ dismissKeyguard(true);
+ newOutgoingCall = true;
+ }
+
+ Call pendingAccountSelectionCall = CallList.getInstance().getWaitingForAccountCall();
+ if (pendingAccountSelectionCall != null) {
+ showCallCardFragment(false);
+ Bundle extras = DetailsCompat.getIntentExtras(pendingAccountSelectionCall
+ .getTelecomCall().getDetails());
+
+ final List<PhoneAccountHandle> phoneAccountHandles;
+ if (extras != null) {
+ phoneAccountHandles = extras.getParcelableArrayList(
+ android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+ } else {
+ phoneAccountHandles = new ArrayList<>();
+ }
+
+ DialogFragment dialogFragment = SelectPhoneAccountDialogFragment.newInstance(
+ R.string.select_phone_account_for_calls, true, phoneAccountHandles,
+ mSelectAcctListener);
+ dialogFragment.show(getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT);
+ } else if (!newOutgoingCall) {
+ showCallCardFragment(true);
+ }
+ return;
+ }
+ }
+
+ /**
+ * When relaunching from the dialer app, {@code showDialpad} indicates whether the dialpad
+ * should be shown on launch.
+ *
+ * @param showDialpad {@code true} to indicate the dialpad should be shown on launch, and
+ * {@code false} to indicate no change should be made to the
+ * dialpad visibility.
+ */
+ private void relaunchedFromDialer(boolean showDialpad) {
+ mShowDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_NONE;
+ mAnimateDialpadOnShow = true;
+
+ if (mShowDialpadRequest == DIALPAD_REQUEST_SHOW) {
+ // If there's only one line in use, AND it's on hold, then we're sure the user
+ // wants to use the dialpad toward the exact line, so un-hold the holding line.
+ final Call call = CallList.getInstance().getActiveOrBackgroundCall();
+ if (call != null && call.getState() == State.ONHOLD) {
+ TelecomAdapter.getInstance().unholdCall(call.getId());
+ }
+ }
+ }
+
+ public void dismissKeyguard(boolean dismiss) {
+ if (mDismissKeyguard == dismiss) {
+ return;
+ }
+ mDismissKeyguard = dismiss;
+ if (dismiss) {
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+ } else {
+ getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+ }
+ }
+
+ private void showFragment(String tag, boolean show, boolean executeImmediately) {
+ Trace.beginSection("showFragment - " + tag);
+ final FragmentManager fm = getFragmentManagerForTag(tag);
+
+ if (fm == null) {
+ Log.w(TAG, "Fragment manager is null for : " + tag);
+ return;
+ }
+
+ Fragment fragment = fm.findFragmentByTag(tag);
+ if (!show && fragment == null) {
+ // Nothing to show, so bail early.
+ return;
+ }
+
+ final FragmentTransaction transaction = fm.beginTransaction();
+ if (show) {
+ if (fragment == null) {
+ fragment = createNewFragmentForTag(tag);
+ transaction.add(getContainerIdForFragment(tag), fragment, tag);
+ } else {
+ transaction.show(fragment);
+ }
+ Logger.logScreenView(getScreenTypeForTag(tag), this);
+ } else {
+ transaction.hide(fragment);
+ }
+
+ transaction.commitAllowingStateLoss();
+ if (executeImmediately) {
+ fm.executePendingTransactions();
+ }
+ Trace.endSection();
+ }
+
+ private Fragment createNewFragmentForTag(String tag) {
+ if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
+ mDialpadFragment = new DialpadFragment();
+ return mDialpadFragment;
+ } else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
+ if (AccessibilityUtil.isTalkBackEnabled(this)) {
+ mAnswerFragment = new AccessibleAnswerFragment();
+ } else {
+ mAnswerFragment = new GlowPadAnswerFragment();
+ }
+ return mAnswerFragment;
+ } else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
+ mConferenceManagerFragment = new ConferenceManagerFragment();
+ return mConferenceManagerFragment;
+ } else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
+ mCallCardFragment = new CallCardFragment();
+ return mCallCardFragment;
+ }
+ throw new IllegalStateException("Unexpected fragment: " + tag);
+ }
+
+ private FragmentManager getFragmentManagerForTag(String tag) {
+ if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
+ return mChildFragmentManager;
+ } else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
+ return mChildFragmentManager;
+ } else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
+ return getFragmentManager();
+ } else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
+ return getFragmentManager();
+ }
+ throw new IllegalStateException("Unexpected fragment: " + tag);
+ }
+
+ private int getScreenTypeForTag(String tag) {
+ switch (tag) {
+ case TAG_DIALPAD_FRAGMENT:
+ return ScreenEvent.INCALL_DIALPAD;
+ case TAG_CALLCARD_FRAGMENT:
+ return ScreenEvent.INCALL;
+ case TAG_CONFERENCE_FRAGMENT:
+ return ScreenEvent.CONFERENCE_MANAGEMENT;
+ case TAG_ANSWER_FRAGMENT:
+ return ScreenEvent.INCOMING_CALL;
+ default:
+ return ScreenEvent.UNKNOWN;
+ }
+ }
+
+ private int getContainerIdForFragment(String tag) {
+ if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
+ return R.id.answer_and_dialpad_container;
+ } else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
+ return R.id.answer_and_dialpad_container;
+ } else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
+ return R.id.main;
+ } else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
+ return R.id.main;
+ }
+ throw new IllegalStateException("Unexpected fragment: " + tag);
+ }
+
+ /**
+ * @return {@code true} while the visibility of the dialpad has actually changed.
+ */
+ public boolean showDialpadFragment(boolean show, boolean animate) {
+ // If the dialpad is already visible, don't animate in. If it's gone, don't animate out.
+ if ((show && isDialpadVisible()) || (!show && !isDialpadVisible())) {
+ return false;
+ }
+ // We don't do a FragmentTransaction on the hide case because it will be dealt with when
+ // the listener is fired after an animation finishes.
+ if (!animate) {
+ showFragment(TAG_DIALPAD_FRAGMENT, show, true);
+ } else {
+ if (show) {
+ showFragment(TAG_DIALPAD_FRAGMENT, true, true);
+ mDialpadFragment.animateShowDialpad();
+ }
+ mCallCardFragment.onDialpadVisibilityChange(show);
+ mDialpadFragment.getView().startAnimation(show ? mSlideIn : mSlideOut);
+ }
+
+ final ProximitySensor sensor = InCallPresenter.getInstance().getProximitySensor();
+ if (sensor != null) {
+ sensor.onDialpadVisible(show);
+ }
+ return true;
+ }
+
+ public boolean isDialpadVisible() {
+ return mDialpadFragment != null && mDialpadFragment.isVisible();
+ }
+
+ public void showCallCardFragment(boolean show) {
+ showFragment(TAG_CALLCARD_FRAGMENT, show, true);
+ }
+
+ /**
+ * Hides or shows the conference manager fragment.
+ *
+ * @param show {@code true} if the conference manager should be shown, {@code false} if it
+ * should be hidden.
+ */
+ public void showConferenceFragment(boolean show) {
+ showFragment(TAG_CONFERENCE_FRAGMENT, show, true);
+ mConferenceManagerFragment.onVisibilityChanged(show);
+
+ // Need to hide the call card fragment to ensure that accessibility service does not try to
+ // give focus to the call card when the conference manager is visible.
+ mCallCardFragment.getView().setVisibility(show ? View.GONE : View.VISIBLE);
+ }
+
+ public void showAnswerFragment(boolean show) {
+ showFragment(TAG_ANSWER_FRAGMENT, show, true);
+ }
+
+ public void showPostCharWaitDialog(String callId, String chars) {
+ if (isVisible()) {
+ final PostCharDialogFragment fragment = new PostCharDialogFragment(callId, chars);
+ fragment.show(getFragmentManager(), "postCharWait");
+
+ mShowPostCharWaitDialogOnResume = false;
+ mShowPostCharWaitDialogCallId = null;
+ mShowPostCharWaitDialogChars = null;
+ } else {
+ mShowPostCharWaitDialogOnResume = true;
+ mShowPostCharWaitDialogCallId = callId;
+ mShowPostCharWaitDialogChars = chars;
+ }
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (mCallCardFragment != null) {
+ mCallCardFragment.dispatchPopulateAccessibilityEvent(event);
+ }
+ return super.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ public void maybeShowErrorDialogOnDisconnect(DisconnectCause disconnectCause) {
+ Log.d(this, "maybeShowErrorDialogOnDisconnect");
+
+ if (!isFinishing() && !TextUtils.isEmpty(disconnectCause.getDescription())
+ && (disconnectCause.getCode() == DisconnectCause.ERROR ||
+ disconnectCause.getCode() == DisconnectCause.RESTRICTED)) {
+ showErrorDialog(disconnectCause.getDescription());
+ }
+ }
+
+ public void dismissPendingDialogs() {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ mDialog = null;
+ }
+ if (mAnswerFragment != null) {
+ mAnswerFragment.dismissPendingDialogs();
+ }
+ }
+
+ /**
+ * Utility function to bring up a generic "error" dialog.
+ */
+ private void showErrorDialog(CharSequence msg) {
+ Log.i(this, "Show Dialog: " + msg);
+
+ dismissPendingDialogs();
+
+ mDialog = new AlertDialog.Builder(this)
+ .setMessage(msg)
+ .setPositiveButton(android.R.string.ok, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ onDialogDismissed();
+ }
+ })
+ .setOnCancelListener(new OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ onDialogDismissed();
+ }
+ })
+ .create();
+
+ mDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+ mDialog.show();
+ }
+
+ private void onDialogDismissed() {
+ mDialog = null;
+ CallList.getInstance().onErrorDialogDismissed();
+ InCallPresenter.getInstance().onDismissDialog();
+ }
+
+ public void setExcludeFromRecents(boolean exclude) {
+ ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ List<ActivityManager.AppTask> tasks = am.getAppTasks();
+ int taskId = getTaskId();
+ for (int i = 0; i < tasks.size(); i++) {
+ ActivityManager.AppTask task = tasks.get(i);
+ if (task.getTaskInfo().id == taskId) {
+ try {
+ task.setExcludeFromRecents(exclude);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "RuntimeException when excluding task from recents.", e);
+ }
+ }
+ }
+ }
+
+
+ public OnTouchListener getDispatchTouchEventListener() {
+ return mDispatchTouchEventListener;
+ }
+
+ public void setDispatchTouchEventListener(OnTouchListener mDispatchTouchEventListener) {
+ this.mDispatchTouchEventListener = mDispatchTouchEventListener;
+ }
+
+ /**
+ * Enables the OrientationEventListener if enable flag is true. Disables it if enable is
+ * false
+ * @param enable true or false.
+ */
+ public void enableInCallOrientationEventListener(boolean enable) {
+ if (enable) {
+ mInCallOrientationEventListener.enable(enable);
+ } else {
+ mInCallOrientationEventListener.disable();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallAnimationUtils.java b/InCallUI/src/com/android/incallui/InCallAnimationUtils.java
new file mode 100644
index 0000000..44bb369
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallAnimationUtils.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2012 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.incallui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.view.ViewPropertyAnimator;
+import android.widget.ImageView;
+
+/**
+ * Utilities for Animation.
+ */
+public class InCallAnimationUtils {
+ private static final String LOG_TAG = InCallAnimationUtils.class.getSimpleName();
+ /**
+ * Turn on when you're interested in fading animation. Intentionally untied from other debug
+ * settings.
+ */
+ private static final boolean FADE_DBG = false;
+
+ /**
+ * Duration for animations in msec, which can be used with
+ * {@link ViewPropertyAnimator#setDuration(long)} for example.
+ */
+ public static final int ANIMATION_DURATION = 250;
+
+ private InCallAnimationUtils() {
+ }
+
+ /**
+ * Drawable achieving cross-fade, just like TransitionDrawable. We can have
+ * call-backs via animator object (see also {@link CrossFadeDrawable#getAnimator()}).
+ */
+ private static class CrossFadeDrawable extends LayerDrawable {
+ private final ObjectAnimator mAnimator;
+
+ public CrossFadeDrawable(Drawable[] layers) {
+ super(layers);
+ mAnimator = ObjectAnimator.ofInt(this, "crossFadeAlpha", 0xff, 0);
+ }
+
+ private int mCrossFadeAlpha;
+
+ /**
+ * This will be used from ObjectAnimator.
+ * Note: this method is protected by proguard.flags so that it won't be removed
+ * automatically.
+ */
+ @SuppressWarnings("unused")
+ public void setCrossFadeAlpha(int alpha) {
+ mCrossFadeAlpha = alpha;
+ invalidateSelf();
+ }
+
+ public ObjectAnimator getAnimator() {
+ return mAnimator;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ Drawable first = getDrawable(0);
+ Drawable second = getDrawable(1);
+
+ if (mCrossFadeAlpha > 0) {
+ first.setAlpha(mCrossFadeAlpha);
+ first.draw(canvas);
+ first.setAlpha(255);
+ }
+
+ if (mCrossFadeAlpha < 0xff) {
+ second.setAlpha(0xff - mCrossFadeAlpha);
+ second.draw(canvas);
+ second.setAlpha(0xff);
+ }
+ }
+ }
+
+ private static CrossFadeDrawable newCrossFadeDrawable(Drawable first, Drawable second) {
+ Drawable[] layers = new Drawable[2];
+ layers[0] = first;
+ layers[1] = second;
+ return new CrossFadeDrawable(layers);
+ }
+
+ /**
+ * Starts cross-fade animation using TransitionDrawable. Nothing will happen if "from" and "to"
+ * are the same.
+ */
+ public static void startCrossFade(
+ final ImageView imageView, final Drawable from, final Drawable to) {
+ // We skip the cross-fade when those two Drawables are equal, or they are BitmapDrawables
+ // pointing to the same Bitmap.
+ final boolean drawableIsEqual = (from != null && to != null && from.equals(to));
+ final boolean hasFromImage = ((from instanceof BitmapDrawable) &&
+ ((BitmapDrawable) from).getBitmap() != null);
+ final boolean hasToImage = ((to instanceof BitmapDrawable) &&
+ ((BitmapDrawable) to).getBitmap() != null);
+ final boolean areSameImage = drawableIsEqual || (hasFromImage && hasToImage &&
+ ((BitmapDrawable) from).getBitmap().equals(((BitmapDrawable) to).getBitmap()));
+
+ if (!areSameImage) {
+ if (FADE_DBG) {
+ log("Start cross-fade animation for " + imageView
+ + "(" + Integer.toHexString(from.hashCode()) + " -> "
+ + Integer.toHexString(to.hashCode()) + ")");
+ }
+
+ CrossFadeDrawable crossFadeDrawable = newCrossFadeDrawable(from, to);
+ ObjectAnimator animator = crossFadeDrawable.getAnimator();
+ imageView.setImageDrawable(crossFadeDrawable);
+ animator.setDuration(ANIMATION_DURATION);
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ if (FADE_DBG) {
+ log("cross-fade animation start ("
+ + Integer.toHexString(from.hashCode()) + " -> "
+ + Integer.toHexString(to.hashCode()) + ")");
+ }
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (FADE_DBG) {
+ log("cross-fade animation ended ("
+ + Integer.toHexString(from.hashCode()) + " -> "
+ + Integer.toHexString(to.hashCode()) + ")");
+ }
+ animation.removeAllListeners();
+ // Workaround for issue 6300562; this will force the drawable to the
+ // resultant one regardless of animation glitch.
+ imageView.setImageDrawable(to);
+ }
+ });
+ animator.start();
+
+ /* We could use TransitionDrawable here, but it may cause some weird animation in
+ * some corner cases. See issue 6300562
+ * TODO: decide which to be used in the long run. TransitionDrawable is old but system
+ * one. Ours uses new animation framework and thus have callback (great for testing),
+ * while no framework support for the exact class.
+
+ Drawable[] layers = new Drawable[2];
+ layers[0] = from;
+ layers[1] = to;
+ TransitionDrawable transitionDrawable = new TransitionDrawable(layers);
+ imageView.setImageDrawable(transitionDrawable);
+ transitionDrawable.startTransition(ANIMATION_DURATION); */
+ imageView.setTag(to);
+ } else if (!hasFromImage && hasToImage) {
+ imageView.setImageDrawable(to);
+ imageView.setTag(to);
+ } else {
+ if (FADE_DBG) {
+ log("*Not* start cross-fade. " + imageView);
+ }
+ }
+ }
+
+ // Debugging / testing code
+
+ private static void log(String msg) {
+ Log.d(LOG_TAG, msg);
+ }
+}
\ No newline at end of file
diff --git a/InCallUI/src/com/android/incallui/InCallCameraManager.java b/InCallUI/src/com/android/incallui/InCallCameraManager.java
new file mode 100644
index 0000000..53000f1
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallCameraManager.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.util.Size;
+
+import java.lang.String;
+import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Set;
+
+/**
+ * Used to track which camera is used for outgoing video.
+ */
+public class InCallCameraManager {
+
+ public interface Listener {
+ void onActiveCameraSelectionChanged(boolean isUsingFrontFacingCamera);
+ }
+
+ private final Set<Listener> mCameraSelectionListeners = Collections.
+ newSetFromMap(new ConcurrentHashMap<Listener, Boolean>(8,0.9f,1));
+
+ /**
+ * The camera ID for the front facing camera.
+ */
+ private String mFrontFacingCameraId;
+
+ /**
+ * The camera ID for the rear facing camera.
+ */
+ private String mRearFacingCameraId;
+
+ /**
+ * The currently active camera.
+ */
+ private boolean mUseFrontFacingCamera;
+
+ /**
+ * Indicates whether the list of cameras has been initialized yet. Initialization is delayed
+ * until a video call is present.
+ */
+ private boolean mIsInitialized = false;
+
+ /**
+ * The context.
+ */
+ private Context mContext;
+
+ /**
+ * Initializes the InCall CameraManager.
+ *
+ * @param context The current context.
+ */
+ public InCallCameraManager(Context context) {
+ mUseFrontFacingCamera = true;
+ mContext = context;
+ }
+
+ /**
+ * Sets whether the front facing camera should be used or not.
+ *
+ * @param useFrontFacingCamera {@code True} if the front facing camera is to be used.
+ */
+ public void setUseFrontFacingCamera(boolean useFrontFacingCamera) {
+ mUseFrontFacingCamera = useFrontFacingCamera;
+ for (Listener listener : mCameraSelectionListeners) {
+ listener.onActiveCameraSelectionChanged(mUseFrontFacingCamera);
+ }
+ }
+
+ /**
+ * Determines whether the front facing camera is currently in use.
+ *
+ * @return {@code True} if the front facing camera is in use.
+ */
+ public boolean isUsingFrontFacingCamera() {
+ return mUseFrontFacingCamera;
+ }
+
+ /**
+ * Determines the active camera ID.
+ *
+ * @return The active camera ID.
+ */
+ public String getActiveCameraId() {
+ maybeInitializeCameraList(mContext);
+
+ if (mUseFrontFacingCamera) {
+ return mFrontFacingCameraId;
+ } else {
+ return mRearFacingCameraId;
+ }
+ }
+
+ /**
+ * Get the list of cameras available for use.
+ *
+ * @param context The context.
+ */
+ private void maybeInitializeCameraList(Context context) {
+ if (mIsInitialized || context == null) {
+ return;
+ }
+
+ Log.v(this, "initializeCameraList");
+
+ CameraManager cameraManager = null;
+ try {
+ cameraManager = (CameraManager) context.getSystemService(
+ Context.CAMERA_SERVICE);
+ } catch (Exception e) {
+ Log.e(this, "Could not get camera service.");
+ return;
+ }
+
+ if (cameraManager == null) {
+ return;
+ }
+
+ String[] cameraIds = {};
+ try {
+ cameraIds = cameraManager.getCameraIdList();
+ } catch (CameraAccessException e) {
+ Log.d(this, "Could not access camera: "+e);
+ // Camera disabled by device policy.
+ return;
+ }
+
+ for (int i = 0; i < cameraIds.length; i++) {
+ CameraCharacteristics c = null;
+ try {
+ c = cameraManager.getCameraCharacteristics(cameraIds[i]);
+ } catch (IllegalArgumentException e) {
+ // Device Id is unknown.
+ } catch (CameraAccessException e) {
+ // Camera disabled by device policy.
+ }
+ if (c != null) {
+ int facingCharacteristic = c.get(CameraCharacteristics.LENS_FACING);
+ if (facingCharacteristic == CameraCharacteristics.LENS_FACING_FRONT) {
+ mFrontFacingCameraId = cameraIds[i];
+ } else if (facingCharacteristic == CameraCharacteristics.LENS_FACING_BACK) {
+ mRearFacingCameraId = cameraIds[i];
+ }
+ }
+ }
+
+ mIsInitialized = true;
+ Log.v(this, "initializeCameraList : done");
+ }
+
+ public void addCameraSelectionListener(Listener listener) {
+ if (listener != null) {
+ mCameraSelectionListeners.add(listener);
+ }
+ }
+
+ public void removeCameraSelectionListener(Listener listener) {
+ if (listener != null) {
+ mCameraSelectionListeners.remove(listener);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallContactInteractions.java b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
new file mode 100644
index 0000000..e627668
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
@@ -0,0 +1,397 @@
+/*
+ * 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.incallui;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import android.content.Context;
+import android.location.Address;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.util.Pair;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.RelativeLayout;
+import android.widget.RelativeLayout.LayoutParams;
+import android.widget.TextView;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Wrapper class for objects that are used in generating the context about the contact in the InCall
+ * screen.
+ *
+ * This handles generating the appropriate resource for the ListAdapter based on whether the contact
+ * is a business contact or not and logic for the manipulation of data for the call context.
+ */
+public class InCallContactInteractions {
+ private static final String TAG = InCallContactInteractions.class.getSimpleName();
+
+ private Context mContext;
+ private InCallContactInteractionsListAdapter mListAdapter;
+ private boolean mIsBusiness;
+ private View mBusinessHeaderView;
+ private LayoutInflater mInflater;
+
+ public InCallContactInteractions(Context context, boolean isBusiness) {
+ mContext = context;
+ mInflater = (LayoutInflater)
+ context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ switchContactType(isBusiness);
+ }
+
+ public InCallContactInteractionsListAdapter getListAdapter() {
+ return mListAdapter;
+ }
+
+ /**
+ * Switches the "isBusiness" value, if applicable. Recreates the list adapter with the resource
+ * corresponding to the new isBusiness value if the "isBusiness" value is switched.
+ *
+ * @param isBusiness Whether or not the contact is a business.
+ *
+ * @return {@code true} if a new list adapter was created, {@code} otherwise.
+ */
+ public boolean switchContactType(boolean isBusiness) {
+ if (mIsBusiness != isBusiness || mListAdapter == null) {
+ mIsBusiness = isBusiness;
+ mListAdapter = new InCallContactInteractionsListAdapter(mContext,
+ mIsBusiness ? R.layout.business_context_info_list_item
+ : R.layout.person_context_info_list_item);
+ return true;
+ }
+ return false;
+ }
+
+ public View getBusinessListHeaderView() {
+ if (mBusinessHeaderView == null) {
+ mBusinessHeaderView = mInflater.inflate(
+ R.layout.business_contact_context_list_header, null);
+ }
+ return mBusinessHeaderView;
+ }
+
+ public void setBusinessInfo(Address address, float distance,
+ List<Pair<Calendar, Calendar>> openingHours) {
+ mListAdapter.clear();
+ List<ContactContextInfo> info = new ArrayList<ContactContextInfo>();
+
+ // Hours of operation
+ if (openingHours != null) {
+ BusinessContextInfo hoursInfo = constructHoursInfo(openingHours);
+ if (hoursInfo != null) {
+ info.add(hoursInfo);
+ }
+ }
+
+ // Location information
+ if (address != null) {
+ BusinessContextInfo locationInfo = constructLocationInfo(address, distance);
+ info.add(locationInfo);
+ }
+
+ mListAdapter.addAll(info);
+ }
+
+ /**
+ * Construct a BusinessContextInfo object containing hours of operation information.
+ * The format is:
+ * [Open now/Closed now]
+ * [Hours]
+ *
+ * @param openingHours
+ * @return BusinessContextInfo object with the schedule icon, the heading set to whether the
+ * business is open or not and the details set to the hours of operation.
+ */
+ private BusinessContextInfo constructHoursInfo(List<Pair<Calendar, Calendar>> openingHours) {
+ try {
+ return constructHoursInfo(Calendar.getInstance(), openingHours);
+ } catch (Exception e) {
+ // Catch all exceptions here because we don't want any crashes if something goes wrong.
+ Log.e(TAG, "Error constructing hours info: ", e);
+ }
+ return null;
+ }
+
+ /**
+ * Pass in arbitrary current calendar time.
+ */
+ @VisibleForTesting
+ BusinessContextInfo constructHoursInfo(Calendar currentTime,
+ List<Pair<Calendar, Calendar>> openingHours) {
+ if (currentTime == null || openingHours == null || openingHours.size() == 0) {
+ return null;
+ }
+
+ BusinessContextInfo hoursInfo = new BusinessContextInfo();
+ hoursInfo.iconId = R.drawable.ic_schedule_white_24dp;
+
+ boolean isOpenNow = false;
+ // This variable records which interval the current time is after. 0 denotes none of the
+ // intervals, 1 after the first interval, etc. It is also the index of the interval the
+ // current time is in (if open) or the next interval (if closed).
+ int afterInterval = 0;
+ // This variable counts the number of time intervals in today's opening hours.
+ int todaysIntervalCount = 0;
+
+ for (Pair<Calendar, Calendar> hours : openingHours) {
+ if (hours.first.compareTo(currentTime) <= 0
+ && currentTime.compareTo(hours.second) < 0) {
+ // If the current time is on or after the opening time and strictly before the
+ // closing time, then this business is open.
+ isOpenNow = true;
+ }
+
+ if (currentTime.get(Calendar.DAY_OF_YEAR) == hours.first.get(Calendar.DAY_OF_YEAR)) {
+ todaysIntervalCount += 1;
+ }
+
+ if (currentTime.compareTo(hours.second) > 0) {
+ // This assumes that the list of intervals is sorted by time.
+ afterInterval += 1;
+ }
+ }
+
+ hoursInfo.heading = isOpenNow ? mContext.getString(R.string.open_now)
+ : mContext.getString(R.string.closed_now);
+
+ /*
+ * The following logic determines what to display in various cases for hours of operation.
+ *
+ * - Display all intervals if open now and number of intervals is <=2.
+ * - Display next closing time if open now and number of intervals is >2.
+ * - Display next opening time if currently closed but opens later today.
+ * - Display last time it closed today if closed now and tomorrow's hours are unknown.
+ * - Display tomorrow's first open time if closed today and tomorrow's hours are known.
+ *
+ * NOTE: The logic below assumes that the intervals are sorted by ascending time. Possible
+ * TODO to modify the logic above and ensure this is true.
+ */
+ if (isOpenNow) {
+ if (todaysIntervalCount == 1) {
+ hoursInfo.detail = getTimeSpanStringForHours(openingHours.get(0));
+ } else if (todaysIntervalCount == 2) {
+ hoursInfo.detail = mContext.getString(
+ R.string.opening_hours,
+ getTimeSpanStringForHours(openingHours.get(0)),
+ getTimeSpanStringForHours(openingHours.get(1)));
+ } else if (afterInterval < openingHours.size()) {
+ // This check should not be necessary since if it is currently open, we should not
+ // be after the last interval, but just in case, we don't want to crash.
+ hoursInfo.detail = mContext.getString(
+ R.string.closes_today_at,
+ getFormattedTimeForCalendar(openingHours.get(afterInterval).second));
+ }
+ } else { // Currently closed
+ final int lastIntervalToday = todaysIntervalCount - 1;
+ if (todaysIntervalCount == 0) { // closed today
+ hoursInfo.detail = mContext.getString(
+ R.string.opens_tomorrow_at,
+ getFormattedTimeForCalendar(openingHours.get(0).first));
+ } else if (currentTime.after(openingHours.get(lastIntervalToday).second)) {
+ // Passed hours for today
+ if (todaysIntervalCount < openingHours.size()) {
+ // If all of today's intervals are exhausted, assume the next are tomorrow's.
+ hoursInfo.detail = mContext.getString(
+ R.string.opens_tomorrow_at,
+ getFormattedTimeForCalendar(
+ openingHours.get(todaysIntervalCount).first));
+ } else {
+ // Grab the last time it was open today.
+ hoursInfo.detail = mContext.getString(
+ R.string.closed_today_at,
+ getFormattedTimeForCalendar(
+ openingHours.get(lastIntervalToday).second));
+ }
+ } else if (afterInterval < openingHours.size()) {
+ // This check should not be necessary since if it is currently before the last
+ // interval, afterInterval should be less than the count of intervals, but just in
+ // case, we don't want to crash.
+ hoursInfo.detail = mContext.getString(
+ R.string.opens_today_at,
+ getFormattedTimeForCalendar(openingHours.get(afterInterval).first));
+ }
+ }
+
+ return hoursInfo;
+ }
+
+ String getFormattedTimeForCalendar(Calendar calendar) {
+ return DateFormat.getTimeFormat(mContext).format(calendar.getTime());
+ }
+
+ String getTimeSpanStringForHours(Pair<Calendar, Calendar> hours) {
+ return mContext.getString(R.string.open_time_span,
+ getFormattedTimeForCalendar(hours.first),
+ getFormattedTimeForCalendar(hours.second));
+ }
+
+ /**
+ * Construct a BusinessContextInfo object with the location information of the business.
+ * The format is:
+ * [Straight line distance in miles or kilometers]
+ * [Address without state/country/etc.]
+ *
+ * @param address An Address object containing address details of the business
+ * @param distance The distance to the location in meters
+ * @return A BusinessContextInfo object with the location icon, the heading as the distance to
+ * the business and the details containing the address.
+ */
+ private BusinessContextInfo constructLocationInfo(Address address, float distance) {
+ return constructLocationInfo(Locale.getDefault(), address, distance);
+ }
+
+ @VisibleForTesting
+ BusinessContextInfo constructLocationInfo(Locale locale, Address address,
+ float distance) {
+ if (address == null) {
+ return null;
+ }
+
+ BusinessContextInfo locationInfo = new BusinessContextInfo();
+ locationInfo.iconId = R.drawable.ic_location_on_white_24dp;
+ if (distance != DistanceHelper.DISTANCE_NOT_FOUND) {
+ //TODO: add a setting to allow the user to select "KM" or "MI" as their distance units.
+ if (Locale.US.equals(locale)) {
+ locationInfo.heading = mContext.getString(R.string.distance_imperial_away,
+ distance * DistanceHelper.MILES_PER_METER);
+ } else {
+ locationInfo.heading = mContext.getString(R.string.distance_metric_away,
+ distance * DistanceHelper.KILOMETERS_PER_METER);
+ }
+ }
+ if (address.getLocality() != null) {
+ locationInfo.detail = mContext.getString(
+ R.string.display_address,
+ address.getAddressLine(0),
+ address.getLocality());
+ } else {
+ locationInfo.detail = address.getAddressLine(0);
+ }
+ return locationInfo;
+ }
+
+ /**
+ * Get the appropriate title for the context.
+ * @return The "Business info" title for a business contact and the "Recent messages" title for
+ * personal contacts.
+ */
+ public String getContactContextTitle() {
+ return mIsBusiness
+ ? mContext.getResources().getString(R.string.business_contact_context_title)
+ : mContext.getResources().getString(R.string.person_contact_context_title);
+ }
+
+ public static abstract class ContactContextInfo {
+ public abstract void bindView(View listItem);
+ }
+
+ public static class BusinessContextInfo extends ContactContextInfo {
+ int iconId;
+ String heading;
+ String detail;
+
+ @Override
+ public void bindView(View listItem) {
+ ImageView imageView = (ImageView) listItem.findViewById(R.id.icon);
+ TextView headingTextView = (TextView) listItem.findViewById(R.id.heading);
+ TextView detailTextView = (TextView) listItem.findViewById(R.id.detail);
+
+ if (this.iconId == 0 || (this.heading == null && this.detail == null)) {
+ return;
+ }
+
+ imageView.setImageDrawable(listItem.getContext().getDrawable(this.iconId));
+
+ headingTextView.setText(this.heading);
+ headingTextView.setVisibility(TextUtils.isEmpty(this.heading)
+ ? View.GONE : View.VISIBLE);
+
+ detailTextView.setText(this.detail);
+ detailTextView.setVisibility(TextUtils.isEmpty(this.detail)
+ ? View.GONE : View.VISIBLE);
+
+ }
+ }
+
+ public static class PersonContextInfo extends ContactContextInfo {
+ boolean isIncoming;
+ String message;
+ String detail;
+
+ @Override
+ public void bindView(View listItem) {
+ TextView messageTextView = (TextView) listItem.findViewById(R.id.message);
+ TextView detailTextView = (TextView) listItem.findViewById(R.id.detail);
+
+ if (this.message == null || this.detail == null) {
+ return;
+ }
+
+ messageTextView.setBackgroundResource(this.isIncoming ?
+ R.drawable.incoming_sms_background : R.drawable.outgoing_sms_background);
+ messageTextView.setText(this.message);
+ LayoutParams messageLayoutParams = (LayoutParams) messageTextView.getLayoutParams();
+ messageLayoutParams.addRule(this.isIncoming?
+ RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END);
+ messageTextView.setLayoutParams(messageLayoutParams);
+
+ LayoutParams detailLayoutParams = (LayoutParams) detailTextView.getLayoutParams();
+ detailLayoutParams.addRule(this.isIncoming ?
+ RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END);
+ detailTextView.setLayoutParams(detailLayoutParams);
+ detailTextView.setText(this.detail);
+ }
+ }
+
+ /**
+ * A list adapter for call context information. We use the same adapter for both business and
+ * contact context.
+ */
+ private class InCallContactInteractionsListAdapter extends ArrayAdapter<ContactContextInfo> {
+ // The resource id of the list item layout.
+ int mResId;
+
+ public InCallContactInteractionsListAdapter(Context context, int resource) {
+ super(context, resource);
+ mResId = resource;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View listItem = mInflater.inflate(mResId, null);
+ ContactContextInfo item = getItem(position);
+
+ if (item == null) {
+ return listItem;
+ }
+
+ item.bindView(listItem);
+ return listItem;
+ }
+ }
+}
\ No newline at end of file
diff --git a/InCallUI/src/com/android/incallui/InCallDateUtils.java b/InCallUI/src/com/android/incallui/InCallDateUtils.java
new file mode 100644
index 0000000..da3bb6b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallDateUtils.java
@@ -0,0 +1,54 @@
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+/**
+ * Methods to parse time and date information in the InCallUi
+ */
+public class InCallDateUtils {
+
+ /**
+ * Return given duration in a human-friendly format. For example, "4 minutes 3 seconds" or
+ * "3 hours 1 second". Returns the hours, minutes and seconds in that order if they exist.
+ */
+ public static String formatDuration(Context context, long millis) {
+ int hours = 0;
+ int minutes = 0;
+ int seconds = 0;
+ int elapsedSeconds = (int) (millis / 1000);
+ if (elapsedSeconds >= 3600) {
+ hours = elapsedSeconds / 3600;
+ elapsedSeconds -= hours * 3600;
+ }
+ if (elapsedSeconds >= 60) {
+ minutes = elapsedSeconds / 60;
+ elapsedSeconds -= minutes * 60;
+ }
+ seconds = elapsedSeconds;
+
+ final Resources res = context.getResources();
+ StringBuilder duration = new StringBuilder();
+ try {
+ if (hours > 0) {
+ duration.append(res.getQuantityString(R.plurals.duration_hours, hours, hours));
+ }
+ if (minutes > 0) {
+ if (hours > 0) {
+ duration.append(' ');
+ }
+ duration.append(res.getQuantityString(R.plurals.duration_minutes, minutes, minutes));
+ }
+ if (seconds > 0) {
+ if (hours > 0 || minutes > 0) {
+ duration.append(' ');
+ }
+ duration.append(res.getQuantityString(R.plurals.duration_seconds, seconds, seconds));
+ }
+ } catch (Resources.NotFoundException e) {
+ // Ignore; plurals throws an exception for an untranslated quantity for a given locale.
+ return null;
+ }
+ return duration.toString();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallOrientationEventListener.java b/InCallUI/src/com/android/incallui/InCallOrientationEventListener.java
new file mode 100644
index 0000000..d3334a3
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallOrientationEventListener.java
@@ -0,0 +1,151 @@
+/*
+ * 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.incallui;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.view.OrientationEventListener;
+import android.hardware.SensorManager;
+import android.view.Surface;
+import android.content.pm.ActivityInfo;
+
+/**
+ * This class listens to Orientation events and overrides onOrientationChanged which gets
+ * invoked when an orientation change occurs. When that happens, we notify InCallUI registrants
+ * of the change.
+ */
+public class InCallOrientationEventListener extends OrientationEventListener {
+
+ /**
+ * Screen orientation angles one of 0, 90, 180, 270, 360 in degrees.
+ */
+ public static int SCREEN_ORIENTATION_0 = 0;
+ public static int SCREEN_ORIENTATION_90 = 90;
+ public static int SCREEN_ORIENTATION_180 = 180;
+ public static int SCREEN_ORIENTATION_270 = 270;
+ public static int SCREEN_ORIENTATION_360 = 360;
+
+ public static int FULL_SENSOR_SCREEN_ORIENTATION =
+ ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR;
+
+ public static int NO_SENSOR_SCREEN_ORIENTATION =
+ ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
+
+ /**
+ * This is to identify dead zones where we won't notify others of orientation changed.
+ * Say for e.g our threshold is x degrees. We will only notify UI when our current rotation is
+ * within x degrees right or left of the screen orientation angles. If it's not within those
+ * ranges, we return SCREEN_ORIENTATION_UNKNOWN and ignore it.
+ */
+ private static int SCREEN_ORIENTATION_UNKNOWN = -1;
+
+ // Rotation threshold is 10 degrees. So if the rotation angle is within 10 degrees of any of
+ // the above angles, we will notify orientation changed.
+ private static int ROTATION_THRESHOLD = 10;
+
+
+ /**
+ * Cache the current rotation of the device.
+ */
+ private static int sCurrentOrientation = SCREEN_ORIENTATION_0;
+
+ public InCallOrientationEventListener(Context context) {
+ super(context);
+ }
+
+ /**
+ * Handles changes in device orientation. Notifies InCallPresenter of orientation changes.
+ *
+ * Note that this API receives sensor rotation in degrees as a param and we convert that to
+ * one of our screen orientation constants - (one of: {@link SCREEN_ORIENTATION_0},
+ * {@link SCREEN_ORIENTATION_90}, {@link SCREEN_ORIENTATION_180},
+ * {@link SCREEN_ORIENTATION_270}).
+ *
+ * @param rotation The new device sensor rotation in degrees
+ */
+ @Override
+ public void onOrientationChanged(int rotation) {
+ if (rotation == OrientationEventListener.ORIENTATION_UNKNOWN) {
+ return;
+ }
+
+ final int orientation = toScreenOrientation(rotation);
+
+ if (orientation != SCREEN_ORIENTATION_UNKNOWN && sCurrentOrientation != orientation) {
+ sCurrentOrientation = orientation;
+ InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
+ }
+ }
+
+ /**
+ * Enables the OrientationEventListener and notifies listeners of current orientation if
+ * notify flag is true
+ * @param notify true or false. Notify device orientation changed if true.
+ */
+ public void enable(boolean notify) {
+ super.enable();
+ if (notify) {
+ InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
+ }
+ }
+
+ /**
+ * Enables the OrientationEventListener with notify flag defaulting to false.
+ */
+ public void enable() {
+ enable(false);
+ }
+
+ /**
+ * Converts sensor rotation in degrees to screen orientation constants.
+ * @param rotation sensor rotation angle in degrees
+ * @return Screen orientation angle in degrees (0, 90, 180, 270). Returns -1 for degrees not
+ * within threshold to identify zones where orientation change should not be trigerred.
+ */
+ private int toScreenOrientation(int rotation) {
+ // Sensor orientation 90 is equivalent to screen orientation 270 and vice versa. This
+ // function returns the screen orientation. So we convert sensor rotation 90 to 270 and
+ // vice versa here.
+ if (isInLeftRange(rotation, SCREEN_ORIENTATION_360, ROTATION_THRESHOLD) ||
+ isInRightRange(rotation, SCREEN_ORIENTATION_0, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_0;
+ } else if (isWithinThreshold(rotation, SCREEN_ORIENTATION_90, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_270;
+ } else if (isWithinThreshold(rotation, SCREEN_ORIENTATION_180, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_180;
+ } else if (isWithinThreshold(rotation, SCREEN_ORIENTATION_270, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_90;
+ }
+ return SCREEN_ORIENTATION_UNKNOWN;
+ }
+
+ private static boolean isWithinRange(int value, int begin, int end) {
+ return value >= begin && value < end;
+ }
+
+ private static boolean isWithinThreshold(int value, int center, int threshold) {
+ return isWithinRange(value, center - threshold, center + threshold);
+ }
+
+ private static boolean isInLeftRange(int value, int center, int threshold) {
+ return isWithinRange(value, center - threshold, center);
+ }
+
+ private static boolean isInRightRange(int value, int center, int threshold) {
+ return isWithinRange(value, center, center + threshold);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
new file mode 100644
index 0000000..f50da8d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -0,0 +1,1910 @@
+/*
+ * 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.
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.app.ActivityManager.TaskDescription;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.graphics.Point;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.CallLog;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil.OnCallLogQueryFinishedListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.filterednumber.FilteredNumbersUtil;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.util.TelecomUtil;
+import com.android.incallui.compat.telecom.DetailsCompat;
+import com.android.incallui.util.TelecomCallUtil;
+import com.android.incalluibind.ObjectFactory;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Takes updates from the CallList and notifies the InCallActivity (UI)
+ * of the changes.
+ * Responsible for starting the activity for a new call and finishing the activity when all calls
+ * are disconnected.
+ * Creates and manages the in-call state and provides a listener pattern for the presenters
+ * that want to listen in on the in-call state changes.
+ * TODO: This class has become more of a state machine at this point. Consider renaming.
+ */
+public class InCallPresenter implements CallList.Listener,
+ CircularRevealFragment.OnCircularRevealCompleteListener {
+
+ private static final String EXTRA_FIRST_TIME_SHOWN =
+ "com.android.incallui.intent.extra.FIRST_TIME_SHOWN";
+
+ private static final long BLOCK_QUERY_TIMEOUT_MS = 1000;
+
+ private static final Bundle EMPTY_EXTRAS = new Bundle();
+
+ private static InCallPresenter sInCallPresenter;
+
+ /**
+ * 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<InCallStateListener> mListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallStateListener, Boolean>(8, 0.9f, 1));
+ private final List<IncomingCallListener> mIncomingCallListeners = new CopyOnWriteArrayList<>();
+ private final Set<InCallDetailsListener> mDetailsListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallDetailsListener, Boolean>(8, 0.9f, 1));
+ private final Set<CanAddCallListener> mCanAddCallListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<CanAddCallListener, Boolean>(8, 0.9f, 1));
+ private final Set<InCallUiListener> mInCallUiListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallUiListener, Boolean>(8, 0.9f, 1));
+ private final Set<InCallOrientationListener> mOrientationListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallOrientationListener, Boolean>(8, 0.9f, 1));
+ private final Set<InCallEventListener> mInCallEventListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallEventListener, Boolean>(8, 0.9f, 1));
+
+ private AudioModeProvider mAudioModeProvider;
+ private StatusBarNotifier mStatusBarNotifier;
+ private ContactInfoCache mContactInfoCache;
+ private Context mContext;
+ private CallList mCallList;
+ private InCallActivity mInCallActivity;
+ private InCallState mInCallState = InCallState.NO_CALLS;
+ private ProximitySensor mProximitySensor;
+ private boolean mServiceConnected = false;
+ private boolean mAccountSelectionCancelled = false;
+ private InCallCameraManager mInCallCameraManager = null;
+ private AnswerPresenter mAnswerPresenter = new AnswerPresenter();
+ private FilteredNumberAsyncQueryHandler mFilteredQueryHandler;
+
+ /**
+ * Whether or not we are currently bound and waiting for Telecom to send us a new call.
+ */
+ private boolean mBoundAndWaitingForOutgoingCall;
+
+ /**
+ * If there is no actual call currently in the call list, this will be used as a fallback
+ * to determine the theme color for InCallUI.
+ */
+ private PhoneAccountHandle mPendingPhoneAccountHandle;
+
+ /**
+ * Determines if the InCall UI is in fullscreen mode or not.
+ */
+ private boolean mIsFullScreen = false;
+
+ private final Object mCallCallback = newTelecomCallCallback();
+
+ private Object newTelecomCallCallback() {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ return newMarshmallowTelecomCallCallback();
+ }
+ return newLollipopTelecomCallCallback();
+ }
+
+ private Object newMarshmallowTelecomCallCallback() {
+ Log.i(this, "Using android.telecom.Call.Callback");
+ return new android.telecom.Call.Callback() {
+ @Override
+ public void onPostDialWait(android.telecom.Call telecomCall,
+ String remainingPostDialSequence) {
+ final Call call = mCallList.getCallByTelecomCall(telecomCall);
+ if (call == null) {
+ Log.w(this, "Call not found in call list: " + telecomCall);
+ return;
+ }
+ onPostDialCharWait(call.getId(), remainingPostDialSequence);
+ }
+
+ @Override
+ public void onDetailsChanged(android.telecom.Call telecomCall,
+ android.telecom.Call.Details details) {
+ final Call call = mCallList.getCallByTelecomCall(telecomCall);
+ if (call == null) {
+ Log.w(this, "Call not found in call list: " + telecomCall);
+ return;
+ }
+ for (InCallDetailsListener listener : mDetailsListeners) {
+ listener.onDetailsChanged(call, details);
+ }
+ }
+
+ @Override
+ public void onConferenceableCallsChanged(android.telecom.Call telecomCall,
+ List<android.telecom.Call> conferenceableCalls) {
+ Log.i(this, "onConferenceableCallsChanged: " + telecomCall);
+ onDetailsChanged(telecomCall, telecomCall.getDetails());
+ }
+ };
+ }
+
+ private Object newLollipopTelecomCallCallback() {
+ // This code only runs for Google Experience phones on the pre-M sdk since only the system
+ // dialer can invoke the InCallUI code. This allows us to safely use the
+ // android.telecom.Call.Listener interface
+ Log.i(this, "Using android.telecom.Call.Listener");
+ return new android.telecom.Call.Listener() {
+ @Override
+ public void onPostDialWait(android.telecom.Call telecomCall,
+ String remainingPostDialSequence) {
+ final Call call = mCallList.getCallByTelecomCall(telecomCall);
+ if (call == null) {
+ Log.w(this, "Call not found in call list: " + telecomCall);
+ return;
+ }
+ onPostDialCharWait(call.getId(), remainingPostDialSequence);
+ }
+
+ @Override
+ public void onDetailsChanged(android.telecom.Call telecomCall,
+ android.telecom.Call.Details details) {
+ final Call call = mCallList.getCallByTelecomCall(telecomCall);
+ if (call == null) {
+ Log.w(this, "Call not found in call list: " + telecomCall);
+ return;
+ }
+ for (InCallDetailsListener listener : mDetailsListeners) {
+ listener.onDetailsChanged(call, details);
+ }
+ }
+
+ @Override
+ public void onConferenceableCallsChanged(android.telecom.Call telecomCall,
+ List<android.telecom.Call> conferenceableCalls) {
+ Log.i(this, "onConferenceableCallsChanged: " + telecomCall);
+ onDetailsChanged(telecomCall, telecomCall.getDetails());
+ }
+ };
+ }
+
+ private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+ public void onCallStateChanged(int state, String incomingNumber) {
+ if (state == TelephonyManager.CALL_STATE_RINGING) {
+ // Check if the number is blocked, to silence the ringer.
+ String countryIso = GeoUtil.getCurrentCountryIso(mContext);
+ mFilteredQueryHandler.isBlockedNumber(
+ mOnCheckBlockedListener, incomingNumber, countryIso);
+ }
+ }
+ };
+
+ private final OnCheckBlockedListener mOnCheckBlockedListener = new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(final Integer id) {
+ if (id != null) {
+ // Silence the ringer now to prevent ringing and vibration before the call is
+ // terminated when Telecom attempts to add it.
+ TelecomUtil.silenceRinger(mContext);
+ }
+ }
+ };
+
+ /**
+ * Observes the CallLog to delete the call log entry for the blocked call after it is added.
+ * Times out if too much time has passed.
+ */
+ private class BlockedNumberContentObserver extends ContentObserver {
+ private static final int TIMEOUT_MS = 5000;
+
+ private Handler mHandler;
+ private String mNumber;
+ private long mTimeAddedMs;
+
+ private Runnable mTimeoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ unregister();
+ }
+ };
+
+ public BlockedNumberContentObserver(Handler handler, String number, long timeAddedMs) {
+ super(handler);
+
+ mHandler = handler;
+ mNumber = number;
+ mTimeAddedMs = timeAddedMs;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ CallLogAsyncTaskUtil.deleteBlockedCall(mContext, mNumber, mTimeAddedMs,
+ new OnCallLogQueryFinishedListener() {
+ @Override
+ public void onQueryFinished(boolean hasEntry) {
+ if (mContext != null && hasEntry) {
+ unregister();
+ }
+ }
+ });
+ }
+
+ public void register() {
+ if (mContext != null) {
+ mContext.getContentResolver().registerContentObserver(
+ CallLog.CONTENT_URI, true, this);
+ mHandler.postDelayed(mTimeoutRunnable, TIMEOUT_MS);
+ }
+ }
+
+ private void unregister() {
+ if (mContext != null) {
+ mHandler.removeCallbacks(mTimeoutRunnable);
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+ }
+ };
+
+ /**
+ * Is true when the activity has been previously started. Some code needs to know not just if
+ * the activity is currently up, but if it had been previously shown in foreground for this
+ * in-call session (e.g., StatusBarNotifier). This gets reset when the session ends in the
+ * tear-down method.
+ */
+ private boolean mIsActivityPreviouslyStarted = false;
+
+ /**
+ * Whether or not InCallService is bound to Telecom.
+ */
+ private boolean mServiceBound = false;
+
+ /**
+ * When configuration changes Android kills the current activity and starts a new one.
+ * The flag is used to check if full clean up is necessary (activity is stopped and new
+ * activity won't be started), or if a new activity will be started right after the current one
+ * is destroyed, and therefore no need in release all resources.
+ */
+ private boolean mIsChangingConfigurations = false;
+
+ /** Display colors for the UI. Consists of a primary color and secondary (darker) color */
+ private MaterialPalette mThemeColors;
+
+ private TelecomManager mTelecomManager;
+ private TelephonyManager mTelephonyManager;
+
+ public static synchronized InCallPresenter getInstance() {
+ if (sInCallPresenter == null) {
+ sInCallPresenter = new InCallPresenter();
+ }
+ return sInCallPresenter;
+ }
+
+ @NeededForTesting
+ static synchronized void setInstance(InCallPresenter inCallPresenter) {
+ sInCallPresenter = inCallPresenter;
+ }
+
+ public InCallState getInCallState() {
+ return mInCallState;
+ }
+
+ public CallList getCallList() {
+ return mCallList;
+ }
+
+ public void setUp(Context context,
+ CallList callList,
+ AudioModeProvider audioModeProvider,
+ StatusBarNotifier statusBarNotifier,
+ ContactInfoCache contactInfoCache,
+ ProximitySensor proximitySensor) {
+ if (mServiceConnected) {
+ Log.i(this, "New service connection replacing existing one.");
+ // retain the current resources, no need to create new ones.
+ Preconditions.checkState(context == mContext);
+ Preconditions.checkState(callList == mCallList);
+ Preconditions.checkState(audioModeProvider == mAudioModeProvider);
+ return;
+ }
+
+ Preconditions.checkNotNull(context);
+ mContext = context;
+
+ mContactInfoCache = contactInfoCache;
+
+ mStatusBarNotifier = statusBarNotifier;
+ addListener(mStatusBarNotifier);
+
+ mAudioModeProvider = audioModeProvider;
+
+ mProximitySensor = proximitySensor;
+ addListener(mProximitySensor);
+
+ addIncomingCallListener(mAnswerPresenter);
+ addInCallUiListener(mAnswerPresenter);
+
+ mCallList = callList;
+
+ // This only gets called by the service so this is okay.
+ mServiceConnected = true;
+
+ // The final thing we do in this set up is add ourselves as a listener to CallList. This
+ // will kick off an update and the whole process can start.
+ mCallList.addListener(this);
+
+ VideoPauseController.getInstance().setUp(this);
+
+ mFilteredQueryHandler = new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+ mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+ mCallList.setFilteredNumberQueryHandler(mFilteredQueryHandler);
+
+ Log.d(this, "Finished InCallPresenter.setUp");
+ }
+
+ /**
+ * Called when the telephony service has disconnected from us. This will happen when there are
+ * no more active calls. However, we may still want to continue showing the UI for
+ * certain cases like showing "Call Ended".
+ * What we really want is to wait for the activity and the service to both disconnect before we
+ * tear things down. This method sets a serviceConnected boolean and calls a secondary method
+ * that performs the aforementioned logic.
+ */
+ public void tearDown() {
+ Log.d(this, "tearDown");
+ mCallList.clearOnDisconnect();
+
+ mServiceConnected = false;
+ attemptCleanup();
+
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ VideoPauseController.getInstance().tearDown();
+ }
+
+ private void attemptFinishActivity() {
+ final boolean doFinish = (mInCallActivity != null && isActivityStarted());
+ Log.i(this, "Hide in call UI: " + doFinish);
+ if (doFinish) {
+ mInCallActivity.setExcludeFromRecents(true);
+ mInCallActivity.finish();
+
+ if (mAccountSelectionCancelled) {
+ // This finish is a result of account selection cancellation
+ // do not include activity ending transition
+ mInCallActivity.overridePendingTransition(0, 0);
+ }
+ }
+ }
+
+ /**
+ * Called when the UI begins, and starts the callstate callbacks if necessary.
+ */
+ public void setActivity(InCallActivity inCallActivity) {
+ if (inCallActivity == null) {
+ throw new IllegalArgumentException("registerActivity cannot be called with null");
+ }
+ if (mInCallActivity != null && mInCallActivity != inCallActivity) {
+ Log.w(this, "Setting a second activity before destroying the first.");
+ }
+ updateActivity(inCallActivity);
+ }
+
+ /**
+ * Called when the UI ends. Attempts to tear down everything if necessary. See
+ * {@link #tearDown()} for more insight on the tear-down process.
+ */
+ public void unsetActivity(InCallActivity inCallActivity) {
+ if (inCallActivity == null) {
+ throw new IllegalArgumentException("unregisterActivity cannot be called with null");
+ }
+ if (mInCallActivity == null) {
+ Log.i(this, "No InCallActivity currently set, no need to unset.");
+ return;
+ }
+ if (mInCallActivity != inCallActivity) {
+ Log.w(this, "Second instance of InCallActivity is trying to unregister when another"
+ + " instance is active. Ignoring.");
+ return;
+ }
+ updateActivity(null);
+ }
+
+ /**
+ * Updates the current instance of {@link InCallActivity} with the provided one. If a
+ * {@code null} activity is provided, it means that the activity was finished and we should
+ * attempt to cleanup.
+ */
+ private void updateActivity(InCallActivity inCallActivity) {
+ boolean updateListeners = false;
+ boolean doAttemptCleanup = false;
+
+ if (inCallActivity != null) {
+ if (mInCallActivity == null) {
+ updateListeners = true;
+ Log.i(this, "UI Initialized");
+ } else {
+ // since setActivity is called onStart(), it can be called multiple times.
+ // This is fine and ignorable, but we do not want to update the world every time
+ // this happens (like going to/from background) so we do not set updateListeners.
+ }
+
+ mInCallActivity = inCallActivity;
+ mInCallActivity.setExcludeFromRecents(false);
+
+ // By the time the UI finally comes up, the call may already be disconnected.
+ // If that's the case, we may need to show an error dialog.
+ if (mCallList != null && mCallList.getDisconnectedCall() != null) {
+ maybeShowErrorDialogOnDisconnect(mCallList.getDisconnectedCall());
+ }
+
+ // When the UI comes up, we need to first check the in-call state.
+ // If we are showing NO_CALLS, that means that a call probably connected and
+ // then immediately disconnected before the UI was able to come up.
+ // If we dont have any calls, start tearing down the UI instead.
+ // NOTE: This code relies on {@link #mInCallActivity} being set so we run it after
+ // it has been set.
+ if (mInCallState == InCallState.NO_CALLS) {
+ Log.i(this, "UI Initialized, but no calls left. shut down.");
+ attemptFinishActivity();
+ return;
+ }
+ } else {
+ Log.i(this, "UI Destroyed");
+ updateListeners = true;
+ mInCallActivity = null;
+
+ // We attempt cleanup for the destroy case but only after we recalculate the state
+ // to see if we need to come back up or stay shut down. This is why we do the
+ // cleanup after the call to onCallListChange() instead of directly here.
+ doAttemptCleanup = true;
+ }
+
+ // Messages can come from the telephony layer while the activity is coming up
+ // and while the activity is going down. So in both cases we need to recalculate what
+ // state we should be in after they complete.
+ // Examples: (1) A new incoming call could come in and then get disconnected before
+ // the activity is created.
+ // (2) All calls could disconnect and then get a new incoming call before the
+ // activity is destroyed.
+ //
+ // b/1122139 - We previously had a check for mServiceConnected here as well, but there are
+ // cases where we need to recalculate the current state even if the service in not
+ // connected. In particular the case where startOrFinish() is called while the app is
+ // already finish()ing. In that case, we skip updating the state with the knowledge that
+ // we will check again once the activity has finished. That means we have to recalculate the
+ // state here even if the service is disconnected since we may not have finished a state
+ // transition while finish()ing.
+ if (updateListeners) {
+ onCallListChange(mCallList);
+ }
+
+ if (doAttemptCleanup) {
+ attemptCleanup();
+ }
+ }
+
+ private boolean mAwaitingCallListUpdate = false;
+
+ public void onBringToForeground(boolean showDialpad) {
+ Log.i(this, "Bringing UI to foreground.");
+ bringToForeground(showDialpad);
+ }
+
+ public void onCallAdded(final android.telecom.Call call) {
+ // Check if call should be blocked.
+ if (!TelecomCallUtil.isEmergencyCall(call)
+ && !FilteredNumbersUtil.hasRecentEmergencyCall(mContext)
+ && call.getState() == android.telecom.Call.STATE_RINGING) {
+ maybeBlockCall(call);
+ } else {
+ mCallList.onCallAdded(call);
+ }
+
+ // Since a call has been added we are no longer waiting for Telecom to send us a call.
+ setBoundAndWaitingForOutgoingCall(false, null);
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ call.registerCallback((android.telecom.Call.Callback) mCallCallback);
+ } else {
+ call.addListener((android.telecom.Call.Listener) mCallCallback);
+ }
+ }
+
+ /**
+ * Checks whether a call should be blocked, and blocks it if so. Otherwise, it adds the call
+ * to the CallList so it can proceed as normal. There is a timeout, so if the function for
+ * checking whether a function is blocked does not return in a reasonable time, we proceed
+ * with adding the call anyways.
+ */
+ private void maybeBlockCall(final android.telecom.Call call) {
+ final String countryIso = GeoUtil.getCurrentCountryIso(mContext);
+ final String number = TelecomCallUtil.getNumber(call);
+ final long timeAdded = System.currentTimeMillis();
+
+ // Though AtomicBoolean's can be scary, don't fear, as in this case it is only used on the
+ // main UI thread. It is needed so we can change its value within different scopes, since
+ // that cannot be done with a final boolean.
+ final AtomicBoolean hasTimedOut = new AtomicBoolean(false);
+
+ final Handler handler = new Handler();
+
+ // Proceed if the query is slow; the call may still be blocked after the query returns.
+ final Runnable runnable = new Runnable() {
+ public void run() {
+ hasTimedOut.set(true);
+ mCallList.onCallAdded(call);
+ }
+ };
+ handler.postDelayed(runnable, BLOCK_QUERY_TIMEOUT_MS);
+
+ OnCheckBlockedListener onCheckBlockedListener = new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(final Integer id) {
+ if (!hasTimedOut.get()) {
+ handler.removeCallbacks(runnable);
+ }
+ if (id == null) {
+ if (!hasTimedOut.get()) {
+ mCallList.onCallAdded(call);
+ }
+ } else {
+ call.reject(false, null);
+ Log.d(this, "checkForBlockedCall: " + Log.pii(number) + " blocked.");
+ Logger.logInteraction(InteractionEvent.CALL_BLOCKED);
+
+ mFilteredQueryHandler.incrementFilteredCount(id);
+
+ // Register observer to update the call log.
+ // BlockedNumberContentObserver will unregister after successful log or timeout.
+ BlockedNumberContentObserver contentObserver =
+ new BlockedNumberContentObserver(new Handler(), number, timeAdded);
+ contentObserver.register();
+ }
+ }
+ };
+
+ final boolean success = mFilteredQueryHandler.isBlockedNumber(
+ onCheckBlockedListener, number, countryIso);
+ if (!success) {
+ Log.d(this, "checkForBlockedCall: invalid number, skipping block checking");
+ if (!hasTimedOut.get()) {
+ handler.removeCallbacks(runnable);
+ mCallList.onCallAdded(call);
+ }
+ }
+ }
+
+ public void onCallRemoved(android.telecom.Call call) {
+ mCallList.onCallRemoved(call);
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ call.unregisterCallback((android.telecom.Call.Callback) mCallCallback);
+ } else {
+ call.removeListener((android.telecom.Call.Listener) mCallCallback);
+ }
+ }
+
+ public void onCanAddCallChanged(boolean canAddCall) {
+ for (CanAddCallListener listener : mCanAddCallListeners) {
+ listener.onCanAddCallChanged(canAddCall);
+ }
+ }
+
+ /**
+ * Called when there is a change to the call list.
+ * Sets the In-Call state for the entire in-call app based on the information it gets from
+ * CallList. Dispatches the in-call state to all listeners. Can trigger the creation or
+ * destruction of the UI based on the states that is calculates.
+ */
+ @Override
+ public void onCallListChange(CallList callList) {
+ if (mInCallActivity != null && mInCallActivity.getCallCardFragment() != null &&
+ mInCallActivity.getCallCardFragment().isAnimating()) {
+ mAwaitingCallListUpdate = true;
+ return;
+ }
+ if (callList == null) {
+ return;
+ }
+
+ mAwaitingCallListUpdate = false;
+
+ InCallState newState = getPotentialStateFromCallList(callList);
+ InCallState oldState = mInCallState;
+ Log.d(this, "onCallListChange oldState= " + oldState + " newState=" + newState);
+ newState = startOrFinishUi(newState);
+ Log.d(this, "onCallListChange newState changed to " + newState);
+
+ // Set the new state before announcing it to the world
+ Log.i(this, "Phone switching state: " + oldState + " -> " + newState);
+ mInCallState = newState;
+
+ // notify listeners of new state
+ for (InCallStateListener listener : mListeners) {
+ Log.d(this, "Notify " + listener + " of state " + mInCallState.toString());
+ listener.onStateChange(oldState, mInCallState, callList);
+ }
+
+ if (isActivityStarted()) {
+ final boolean hasCall = callList.getActiveOrBackgroundCall() != null ||
+ callList.getOutgoingCall() != null;
+ mInCallActivity.dismissKeyguard(hasCall);
+ }
+ }
+
+ /**
+ * Called when there is a new incoming call.
+ *
+ * @param call
+ */
+ @Override
+ public void onIncomingCall(Call call) {
+ InCallState newState = startOrFinishUi(InCallState.INCOMING);
+ InCallState oldState = mInCallState;
+
+ Log.i(this, "Phone switching state: " + oldState + " -> " + newState);
+ mInCallState = newState;
+
+ for (IncomingCallListener listener : mIncomingCallListeners) {
+ listener.onIncomingCall(oldState, mInCallState, call);
+ }
+ }
+
+ @Override
+ public void onUpgradeToVideo(Call call) {
+ //NO-OP
+ }
+ /**
+ * Called when a call becomes disconnected. Called everytime an existing call
+ * changes from being connected (incoming/outgoing/active) to disconnected.
+ */
+ @Override
+ public void onDisconnect(Call call) {
+ maybeShowErrorDialogOnDisconnect(call);
+
+ // We need to do the run the same code as onCallListChange.
+ onCallListChange(mCallList);
+
+ if (isActivityStarted()) {
+ mInCallActivity.dismissKeyguard(false);
+ }
+
+ if (call.isEmergencyCall()) {
+ FilteredNumbersUtil.recordLastEmergencyCallTime(mContext);
+ }
+ }
+
+ /**
+ * Given the call list, return the state in which the in-call screen should be.
+ */
+ public InCallState getPotentialStateFromCallList(CallList callList) {
+
+ InCallState newState = InCallState.NO_CALLS;
+
+ if (callList == null) {
+ return newState;
+ }
+ if (callList.getIncomingCall() != null) {
+ newState = InCallState.INCOMING;
+ } else if (callList.getWaitingForAccountCall() != null) {
+ newState = InCallState.WAITING_FOR_ACCOUNT;
+ } else if (callList.getPendingOutgoingCall() != null) {
+ newState = InCallState.PENDING_OUTGOING;
+ } else if (callList.getOutgoingCall() != null) {
+ newState = InCallState.OUTGOING;
+ } else if (callList.getActiveCall() != null ||
+ callList.getBackgroundCall() != null ||
+ callList.getDisconnectedCall() != null ||
+ callList.getDisconnectingCall() != null) {
+ newState = InCallState.INCALL;
+ }
+
+ if (newState == InCallState.NO_CALLS) {
+ if (mBoundAndWaitingForOutgoingCall) {
+ return InCallState.OUTGOING;
+ }
+ }
+
+ return newState;
+ }
+
+ public boolean isBoundAndWaitingForOutgoingCall() {
+ return mBoundAndWaitingForOutgoingCall;
+ }
+
+ public void setBoundAndWaitingForOutgoingCall(boolean isBound, PhoneAccountHandle handle) {
+ // NOTE: It is possible for there to be a race and have handle become null before
+ // the circular reveal starts. This should not cause any problems because CallCardFragment
+ // should fallback to the actual call in the CallList at that point in time to determine
+ // the theme color.
+ Log.i(this, "setBoundAndWaitingForOutgoingCall: " + isBound);
+ mBoundAndWaitingForOutgoingCall = isBound;
+ mPendingPhoneAccountHandle = handle;
+ if (isBound && mInCallState == InCallState.NO_CALLS) {
+ mInCallState = InCallState.OUTGOING;
+ }
+ }
+
+ @Override
+ public void onCircularRevealComplete(FragmentManager fm) {
+ if (mInCallActivity != null) {
+ mInCallActivity.showCallCardFragment(true);
+ mInCallActivity.getCallCardFragment().animateForNewOutgoingCall();
+ CircularRevealFragment.endCircularReveal(mInCallActivity.getFragmentManager());
+ }
+ }
+
+ public void onShrinkAnimationComplete() {
+ if (mAwaitingCallListUpdate) {
+ onCallListChange(mCallList);
+ }
+ }
+
+ public void addIncomingCallListener(IncomingCallListener listener) {
+ Preconditions.checkNotNull(listener);
+ mIncomingCallListeners.add(listener);
+ }
+
+ public void removeIncomingCallListener(IncomingCallListener listener) {
+ if (listener != null) {
+ mIncomingCallListeners.remove(listener);
+ }
+ }
+
+ public void addListener(InCallStateListener listener) {
+ Preconditions.checkNotNull(listener);
+ mListeners.add(listener);
+ }
+
+ public void removeListener(InCallStateListener listener) {
+ if (listener != null) {
+ mListeners.remove(listener);
+ }
+ }
+
+ public void addDetailsListener(InCallDetailsListener listener) {
+ Preconditions.checkNotNull(listener);
+ mDetailsListeners.add(listener);
+ }
+
+ public void removeDetailsListener(InCallDetailsListener listener) {
+ if (listener != null) {
+ mDetailsListeners.remove(listener);
+ }
+ }
+
+ public void addCanAddCallListener(CanAddCallListener listener) {
+ Preconditions.checkNotNull(listener);
+ mCanAddCallListeners.add(listener);
+ }
+
+ public void removeCanAddCallListener(CanAddCallListener listener) {
+ if (listener != null) {
+ mCanAddCallListeners.remove(listener);
+ }
+ }
+
+ public void addOrientationListener(InCallOrientationListener listener) {
+ Preconditions.checkNotNull(listener);
+ mOrientationListeners.add(listener);
+ }
+
+ public void removeOrientationListener(InCallOrientationListener listener) {
+ if (listener != null) {
+ mOrientationListeners.remove(listener);
+ }
+ }
+
+ public void addInCallEventListener(InCallEventListener listener) {
+ Preconditions.checkNotNull(listener);
+ mInCallEventListeners.add(listener);
+ }
+
+ public void removeInCallEventListener(InCallEventListener listener) {
+ if (listener != null) {
+ mInCallEventListeners.remove(listener);
+ }
+ }
+
+ public ProximitySensor getProximitySensor() {
+ return mProximitySensor;
+ }
+
+ public void handleAccountSelection(PhoneAccountHandle accountHandle, boolean setDefault) {
+ if (mCallList != null) {
+ Call call = mCallList.getWaitingForAccountCall();
+ if (call != null) {
+ String callId = call.getId();
+ TelecomAdapter.getInstance().phoneAccountSelected(callId, accountHandle, setDefault);
+ }
+ }
+ }
+
+ public void cancelAccountSelection() {
+ mAccountSelectionCancelled = true;
+ if (mCallList != null) {
+ Call call = mCallList.getWaitingForAccountCall();
+ if (call != null) {
+ String callId = call.getId();
+ TelecomAdapter.getInstance().disconnectCall(callId);
+ }
+ }
+ }
+
+ /**
+ * Hangs up any active or outgoing calls.
+ */
+ public void hangUpOngoingCall(Context context) {
+ // By the time we receive this intent, we could be shut down and call list
+ // could be null. Bail in those cases.
+ if (mCallList == null) {
+ if (mStatusBarNotifier == null) {
+ // The In Call UI has crashed but the notification still stayed up. We should not
+ // come to this stage.
+ StatusBarNotifier.clearAllCallNotifications(context);
+ }
+ return;
+ }
+
+ Call call = mCallList.getOutgoingCall();
+ if (call == null) {
+ call = mCallList.getActiveOrBackgroundCall();
+ }
+
+ if (call != null) {
+ TelecomAdapter.getInstance().disconnectCall(call.getId());
+ call.setState(Call.State.DISCONNECTING);
+ mCallList.onUpdate(call);
+ }
+ }
+
+ /**
+ * Answers any incoming call.
+ */
+ public void answerIncomingCall(Context context, int videoState) {
+ // By the time we receive this intent, we could be shut down and call list
+ // could be null. Bail in those cases.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ return;
+ }
+
+ Call call = mCallList.getIncomingCall();
+ if (call != null) {
+ TelecomAdapter.getInstance().answerCall(call.getId(), videoState);
+ showInCall(false, false/* newOutgoingCall */);
+ }
+ }
+
+ /**
+ * Declines any incoming call.
+ */
+ public void declineIncomingCall(Context context) {
+ // By the time we receive this intent, we could be shut down and call list
+ // could be null. Bail in those cases.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ return;
+ }
+
+ Call call = mCallList.getIncomingCall();
+ if (call != null) {
+ TelecomAdapter.getInstance().rejectCall(call.getId(), false, null);
+ }
+ }
+
+ public void acceptUpgradeRequest(int videoState, Context context) {
+ Log.d(this, " acceptUpgradeRequest videoState " + videoState);
+ // Bail if we have been shut down and the call list is null.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ Log.e(this, " acceptUpgradeRequest mCallList is empty so returning");
+ return;
+ }
+
+ Call call = mCallList.getVideoUpgradeRequestCall();
+ if (call != null) {
+ VideoProfile videoProfile = new VideoProfile(videoState);
+ call.getVideoCall().sendSessionModifyResponse(videoProfile);
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+ }
+
+ public void declineUpgradeRequest(Context context) {
+ Log.d(this, " declineUpgradeRequest");
+ // Bail if we have been shut down and the call list is null.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ Log.e(this, " declineUpgradeRequest mCallList is empty so returning");
+ return;
+ }
+
+ Call call = mCallList.getVideoUpgradeRequestCall();
+ if (call != null) {
+ VideoProfile videoProfile =
+ new VideoProfile(call.getVideoState());
+ call.getVideoCall().sendSessionModifyResponse(videoProfile);
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+ }
+
+ /**
+ * Returns true if the incall app is the foreground application.
+ */
+ public boolean isShowingInCallUi() {
+ return (isActivityStarted() && mInCallActivity.isVisible());
+ }
+
+ /**
+ * Returns true if the activity has been created and is running.
+ * Returns true as long as activity is not destroyed or finishing. This ensures that we return
+ * true even if the activity is paused (not in foreground).
+ */
+ public boolean isActivityStarted() {
+ return (mInCallActivity != null &&
+ !mInCallActivity.isDestroyed() &&
+ !mInCallActivity.isFinishing());
+ }
+
+ public boolean isActivityPreviouslyStarted() {
+ return mIsActivityPreviouslyStarted;
+ }
+
+ /**
+ * Determines if the In-Call app is currently changing configuration.
+ *
+ * @return {@code true} if the In-Call app is changing configuration.
+ */
+ public boolean isChangingConfigurations() {
+ return mIsChangingConfigurations;
+ }
+
+ /**
+ * Tracks whether the In-Call app is currently in the process of changing configuration (i.e.
+ * screen orientation).
+ */
+ /*package*/
+ void updateIsChangingConfigurations() {
+ mIsChangingConfigurations = false;
+ if (mInCallActivity != null) {
+ mIsChangingConfigurations = mInCallActivity.isChangingConfigurations();
+ }
+ Log.v(this, "updateIsChangingConfigurations = " + mIsChangingConfigurations);
+ }
+
+
+ /**
+ * Called when the activity goes in/out of the foreground.
+ */
+ public void onUiShowing(boolean showing) {
+ // We need to update the notification bar when we leave the UI because that
+ // could trigger it to show again.
+ if (mStatusBarNotifier != null) {
+ mStatusBarNotifier.updateNotification(mInCallState, mCallList);
+ }
+
+ if (mProximitySensor != null) {
+ mProximitySensor.onInCallShowing(showing);
+ }
+
+ Intent broadcastIntent = ObjectFactory.getUiReadyBroadcastIntent(mContext);
+ if (broadcastIntent != null) {
+ broadcastIntent.putExtra(EXTRA_FIRST_TIME_SHOWN, !mIsActivityPreviouslyStarted);
+
+ if (showing) {
+ Log.d(this, "Sending sticky broadcast: ", broadcastIntent);
+ mContext.sendStickyBroadcast(broadcastIntent);
+ } else {
+ Log.d(this, "Removing sticky broadcast: ", broadcastIntent);
+ mContext.removeStickyBroadcast(broadcastIntent);
+ }
+ }
+
+ if (showing) {
+ mIsActivityPreviouslyStarted = true;
+ } else {
+ updateIsChangingConfigurations();
+ }
+
+ for (InCallUiListener listener : mInCallUiListeners) {
+ listener.onUiShowing(showing);
+ }
+ }
+
+ public void addInCallUiListener(InCallUiListener listener) {
+ mInCallUiListeners.add(listener);
+ }
+
+ public boolean removeInCallUiListener(InCallUiListener listener) {
+ return mInCallUiListeners.remove(listener);
+ }
+
+ /*package*/
+ void onActivityStarted() {
+ Log.d(this, "onActivityStarted");
+ notifyVideoPauseController(true);
+ }
+
+ /*package*/
+ void onActivityStopped() {
+ Log.d(this, "onActivityStopped");
+ notifyVideoPauseController(false);
+ }
+
+ private void notifyVideoPauseController(boolean showing) {
+ Log.d(this, "notifyVideoPauseController: mIsChangingConfigurations=" +
+ mIsChangingConfigurations);
+ if (!mIsChangingConfigurations) {
+ VideoPauseController.getInstance().onUiShowing(showing);
+ }
+ }
+
+ /**
+ * Brings the app into the foreground if possible.
+ */
+ public void bringToForeground(boolean showDialpad) {
+ // Before we bring the incall UI to the foreground, we check to see if:
+ // 1. It is not currently in the foreground
+ // 2. We are in a state where we want to show the incall ui (i.e. there are calls to
+ // be displayed)
+ // If the activity hadn't actually been started previously, yet there are still calls
+ // present (e.g. a call was accepted by a bluetooth or wired headset), we want to
+ // bring it up the UI regardless.
+ if (!isShowingInCallUi() && mInCallState != InCallState.NO_CALLS) {
+ showInCall(showDialpad, false /* newOutgoingCall */);
+ }
+ }
+
+ public void onPostDialCharWait(String callId, String chars) {
+ if (isActivityStarted()) {
+ mInCallActivity.showPostCharWaitDialog(callId, chars);
+ }
+ }
+
+ /**
+ * Handles the green CALL key while in-call.
+ * @return true if we consumed the event.
+ */
+ public boolean handleCallKey() {
+ Log.v(this, "handleCallKey");
+
+ // The green CALL button means either "Answer", "Unhold", or
+ // "Swap calls", or can be a no-op, depending on the current state
+ // of the Phone.
+
+ /**
+ * INCOMING CALL
+ */
+ final CallList calls = mCallList;
+ final Call incomingCall = calls.getIncomingCall();
+ Log.v(this, "incomingCall: " + incomingCall);
+
+ // (1) Attempt to answer a call
+ if (incomingCall != null) {
+ TelecomAdapter.getInstance().answerCall(
+ incomingCall.getId(), VideoProfile.STATE_AUDIO_ONLY);
+ return true;
+ }
+
+ /**
+ * STATE_ACTIVE CALL
+ */
+ final Call activeCall = calls.getActiveCall();
+ if (activeCall != null) {
+ // TODO: This logic is repeated from CallButtonPresenter.java. We should
+ // consolidate this logic.
+ final boolean canMerge = activeCall.can(
+ android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE);
+ final boolean canSwap = activeCall.can(
+ android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE);
+
+ Log.v(this, "activeCall: " + activeCall + ", canMerge: " + canMerge +
+ ", canSwap: " + canSwap);
+
+ // (2) Attempt actions on conference calls
+ if (canMerge) {
+ TelecomAdapter.getInstance().merge(activeCall.getId());
+ return true;
+ } else if (canSwap) {
+ TelecomAdapter.getInstance().swap(activeCall.getId());
+ return true;
+ }
+ }
+
+ /**
+ * BACKGROUND CALL
+ */
+ final Call heldCall = calls.getBackgroundCall();
+ if (heldCall != null) {
+ // We have a hold call so presumeable it will always support HOLD...but
+ // there is no harm in double checking.
+ final boolean canHold = heldCall.can(android.telecom.Call.Details.CAPABILITY_HOLD);
+
+ Log.v(this, "heldCall: " + heldCall + ", canHold: " + canHold);
+
+ // (4) unhold call
+ if (heldCall.getState() == Call.State.ONHOLD && canHold) {
+ TelecomAdapter.getInstance().unholdCall(heldCall.getId());
+ return true;
+ }
+ }
+
+ // Always consume hard keys
+ return true;
+ }
+
+ /**
+ * A dialog could have prevented in-call screen from being previously finished.
+ * This function checks to see if there should be any UI left and if not attempts
+ * to tear down the UI.
+ */
+ public void onDismissDialog() {
+ Log.i(this, "Dialog dismissed");
+ if (mInCallState == InCallState.NO_CALLS) {
+ attemptFinishActivity();
+ attemptCleanup();
+ }
+ }
+
+ /**
+ * Toggles whether the application is in fullscreen mode or not.
+ *
+ * @return {@code true} if in-call is now in fullscreen mode.
+ */
+ public boolean toggleFullscreenMode() {
+ boolean isFullScreen = !mIsFullScreen;
+ Log.v(this, "toggleFullscreenMode = " + isFullScreen);
+ setFullScreen(isFullScreen);
+ return mIsFullScreen;
+ }
+
+ /**
+ * Clears the previous fullscreen state.
+ */
+ public void clearFullscreen() {
+ mIsFullScreen = false;
+ }
+
+ /**
+ * Changes the fullscreen mode of the in-call UI.
+ *
+ * @param isFullScreen {@code true} if in-call should be in fullscreen mode, {@code false}
+ * otherwise.
+ */
+ public void setFullScreen(boolean isFullScreen) {
+ setFullScreen(isFullScreen, false /* force */);
+ }
+
+ /**
+ * Changes the fullscreen mode of the in-call UI.
+ *
+ * @param isFullScreen {@code true} if in-call should be in fullscreen mode, {@code false}
+ * otherwise.
+ * @param force {@code true} if fullscreen mode should be set regardless of its current state.
+ */
+ public void setFullScreen(boolean isFullScreen, boolean force) {
+ Log.v(this, "setFullScreen = " + isFullScreen);
+
+ // As a safeguard, ensure we cannot enter fullscreen if the dialpad is shown.
+ if (isDialpadVisible()) {
+ isFullScreen = false;
+ Log.v(this, "setFullScreen overridden as dialpad is shown = " + isFullScreen);
+ }
+
+ if (mIsFullScreen == isFullScreen && !force) {
+ Log.v(this, "setFullScreen ignored as already in that state.");
+ return;
+ }
+ mIsFullScreen = isFullScreen;
+ notifyFullscreenModeChange(mIsFullScreen);
+ }
+
+ /**
+ * @return {@code true} if the in-call ui is currently in fullscreen mode, {@code false}
+ * otherwise.
+ */
+ public boolean isFullscreen() {
+ return mIsFullScreen;
+ }
+
+
+ /**
+ * Called by the {@link VideoCallPresenter} to inform of a change in full screen video status.
+ *
+ * @param isFullscreenMode {@code True} if entering full screen mode.
+ */
+ public void notifyFullscreenModeChange(boolean isFullscreenMode) {
+ for (InCallEventListener listener : mInCallEventListeners) {
+ listener.onFullscreenModeChanged(isFullscreenMode);
+ }
+ }
+
+ /**
+ * Called by the {@link CallCardPresenter} to inform of a change in visibility of the secondary
+ * caller info bar.
+ *
+ * @param isVisible {@code true} if the secondary caller info is visible, {@code false}
+ * otherwise.
+ * @param height the height of the secondary caller info bar.
+ */
+ public void notifySecondaryCallerInfoVisibilityChanged(boolean isVisible, int height) {
+ for (InCallEventListener listener : mInCallEventListeners) {
+ listener.onSecondaryCallerInfoVisibilityChanged(isVisible, height);
+ }
+ }
+
+
+ /**
+ * For some disconnected causes, we show a dialog. This calls into the activity to show
+ * the dialog if appropriate for the call.
+ */
+ private void maybeShowErrorDialogOnDisconnect(Call call) {
+ // For newly disconnected calls, we may want to show a dialog on specific error conditions
+ if (isActivityStarted() && call.getState() == Call.State.DISCONNECTED) {
+ if (call.getAccountHandle() == null && !call.isConferenceCall()) {
+ setDisconnectCauseForMissingAccounts(call);
+ }
+ mInCallActivity.maybeShowErrorDialogOnDisconnect(call.getDisconnectCause());
+ }
+ }
+
+ /**
+ * When the state of in-call changes, this is the first method to get called. It determines if
+ * the UI needs to be started or finished depending on the new state and does it.
+ */
+ private InCallState startOrFinishUi(InCallState newState) {
+ Log.d(this, "startOrFinishUi: " + mInCallState + " -> " + newState);
+
+ // TODO: Consider a proper state machine implementation
+
+ // If the state isn't changing we have already done any starting/stopping of activities in
+ // a previous pass...so lets cut out early
+ if (newState == mInCallState) {
+ return newState;
+ }
+
+ // A new Incoming call means that the user needs to be notified of the the call (since
+ // it wasn't them who initiated it). We do this through full screen notifications and
+ // happens indirectly through {@link StatusBarNotifier}.
+ //
+ // The process for incoming calls is as follows:
+ //
+ // 1) CallList - Announces existence of new INCOMING call
+ // 2) InCallPresenter - Gets announcement and calculates that the new InCallState
+ // - should be set to INCOMING.
+ // 3) InCallPresenter - This method is called to see if we need to start or finish
+ // the app given the new state.
+ // 4) StatusBarNotifier - Listens to InCallState changes. InCallPresenter calls
+ // StatusBarNotifier explicitly to issue a FullScreen Notification
+ // that will either start the InCallActivity or show the user a
+ // top-level notification dialog if the user is in an immersive app.
+ // That notification can also start the InCallActivity.
+ // 5) InCallActivity - Main activity starts up and at the end of its onCreate will
+ // call InCallPresenter::setActivity() to let the presenter
+ // know that start-up is complete.
+ //
+ // [ AND NOW YOU'RE IN THE CALL. voila! ]
+ //
+ // Our app is started using a fullScreen notification. We need to do this whenever
+ // we get an incoming call. Depending on the current context of the device, either a
+ // incoming call HUN or the actual InCallActivity will be shown.
+ final boolean startIncomingCallSequence = (InCallState.INCOMING == newState);
+
+ // A dialog to show on top of the InCallUI to select a PhoneAccount
+ final boolean showAccountPicker = (InCallState.WAITING_FOR_ACCOUNT == newState);
+
+ // A new outgoing call indicates that the user just now dialed a number and when that
+ // happens we need to display the screen immediately or show an account picker dialog if
+ // no default is set. However, if the main InCallUI is already visible, we do not want to
+ // re-initiate the start-up animation, so we do not need to do anything here.
+ //
+ // It is also possible to go into an intermediate state where the call has been initiated
+ // but Telecom has not yet returned with the details of the call (handle, gateway, etc.).
+ // This pending outgoing state can also launch the call screen.
+ //
+ // This is different from the incoming call sequence because we do not need to shock the
+ // user with a top-level notification. Just show the call UI normally.
+ final boolean mainUiNotVisible = !isShowingInCallUi() || !getCallCardFragmentVisible();
+ boolean showCallUi = InCallState.OUTGOING == newState && mainUiNotVisible;
+
+ // Direct transition from PENDING_OUTGOING -> INCALL means that there was an error in the
+ // outgoing call process, so the UI should be brought up to show an error dialog.
+ showCallUi |= (InCallState.PENDING_OUTGOING == mInCallState
+ && InCallState.INCALL == newState && !isShowingInCallUi());
+
+ // Another exception - InCallActivity is in charge of disconnecting a call with no
+ // valid accounts set. Bring the UI up if this is true for the current pending outgoing
+ // call so that:
+ // 1) The call can be disconnected correctly
+ // 2) The UI comes up and correctly displays the error dialog.
+ // TODO: Remove these special case conditions by making InCallPresenter a true state
+ // machine. Telecom should also be the component responsible for disconnecting a call
+ // with no valid accounts.
+ showCallUi |= InCallState.PENDING_OUTGOING == newState && mainUiNotVisible
+ && isCallWithNoValidAccounts(mCallList.getPendingOutgoingCall());
+
+ // The only time that we have an instance of mInCallActivity and it isn't started is
+ // when it is being destroyed. In that case, lets avoid bringing up another instance of
+ // the activity. When it is finally destroyed, we double check if we should bring it back
+ // up so we aren't going to lose anything by avoiding a second startup here.
+ boolean activityIsFinishing = mInCallActivity != null && !isActivityStarted();
+ if (activityIsFinishing) {
+ Log.i(this, "Undo the state change: " + newState + " -> " + mInCallState);
+ return mInCallState;
+ }
+
+ if (showCallUi || showAccountPicker) {
+ Log.i(this, "Start in call UI");
+ showInCall(false /* showDialpad */, !showAccountPicker /* newOutgoingCall */);
+ } else if (startIncomingCallSequence) {
+ Log.i(this, "Start Full Screen in call UI");
+
+ // We're about the bring up the in-call UI for an incoming call. If we still have
+ // dialogs up, we need to clear them out before showing incoming screen.
+ if (isActivityStarted()) {
+ mInCallActivity.dismissPendingDialogs();
+ }
+ if (!startUi(newState)) {
+ // startUI refused to start the UI. This indicates that it needed to restart the
+ // activity. When it finally restarts, it will call us back, so we do not actually
+ // change the state yet (we return mInCallState instead of newState).
+ return mInCallState;
+ }
+ } else if (newState == InCallState.NO_CALLS) {
+ // The new state is the no calls state. Tear everything down.
+ attemptFinishActivity();
+ attemptCleanup();
+ }
+
+ return newState;
+ }
+
+ /**
+ * Determines whether or not a call has no valid phone accounts that can be used to make the
+ * call with. Emergency calls do not require a phone account.
+ *
+ * @param call to check accounts for.
+ * @return {@code true} if the call has no call capable phone accounts set, {@code false} if
+ * the call contains a phone account that could be used to initiate it with, or is an emergency
+ * call.
+ */
+ public static boolean isCallWithNoValidAccounts(Call call) {
+ if (call != null && !call.isEmergencyCall()) {
+ Bundle extras = call.getIntentExtras();
+
+ if (extras == null) {
+ extras = EMPTY_EXTRAS;
+ }
+
+ final List<PhoneAccountHandle> phoneAccountHandles = extras
+ .getParcelableArrayList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+
+ if ((call.getAccountHandle() == null &&
+ (phoneAccountHandles == null || phoneAccountHandles.isEmpty()))) {
+ Log.i(InCallPresenter.getInstance(), "No valid accounts for call " + call);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets the DisconnectCause for a call that was disconnected because it was missing a
+ * PhoneAccount or PhoneAccounts to select from.
+ * @param call
+ */
+ private void setDisconnectCauseForMissingAccounts(Call call) {
+ android.telecom.Call telecomCall = call.getTelecomCall();
+
+ Bundle extras = DetailsCompat.getIntentExtras(telecomCall.getDetails());
+ // Initialize the extras bundle to avoid NPE
+ if (extras == null) {
+ extras = new Bundle();
+ }
+
+ final List<PhoneAccountHandle> phoneAccountHandles = extras.getParcelableArrayList(
+ android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+
+ if (phoneAccountHandles == null || phoneAccountHandles.isEmpty()) {
+ String scheme = telecomCall.getDetails().getHandle().getScheme();
+ final String errorMsg = PhoneAccount.SCHEME_TEL.equals(scheme) ?
+ mContext.getString(R.string.callFailed_simError) :
+ mContext.getString(R.string.incall_error_supp_service_unknown);
+ DisconnectCause disconnectCause =
+ new DisconnectCause(DisconnectCause.ERROR, null, errorMsg, errorMsg);
+ call.setDisconnectCause(disconnectCause);
+ }
+ }
+
+ private boolean startUi(InCallState inCallState) {
+ boolean isCallWaiting = mCallList.getActiveCall() != null &&
+ mCallList.getIncomingCall() != null;
+
+ // If the screen is off, we need to make sure it gets turned on for incoming calls.
+ // This normally works just fine thanks to FLAG_TURN_SCREEN_ON but that only works
+ // when the activity is first created. Therefore, to ensure the screen is turned on
+ // for the call waiting case, we finish() the current activity and start a new one.
+ // There should be no jank from this since the screen is already off and will remain so
+ // until our new activity is up.
+
+ if (isCallWaiting) {
+ if (mProximitySensor.isScreenReallyOff() && isActivityStarted()) {
+ Log.i(this, "Restarting InCallActivity to turn screen on for call waiting");
+ mInCallActivity.finish();
+ // When the activity actually finishes, we will start it again if there are
+ // any active calls, so we do not need to start it explicitly here. Note, we
+ // actually get called back on this function to restart it.
+
+ // We return false to indicate that we did not actually start the UI.
+ return false;
+ } else {
+ showInCall(false, false);
+ }
+ } else {
+ mStatusBarNotifier.updateNotification(inCallState, mCallList);
+ }
+ return true;
+ }
+
+ /**
+ * Checks to see if both the UI is gone and the service is disconnected. If so, tear it all
+ * down.
+ */
+ private void attemptCleanup() {
+ boolean shouldCleanup = (mInCallActivity == null && !mServiceConnected &&
+ mInCallState == InCallState.NO_CALLS);
+ Log.i(this, "attemptCleanup? " + shouldCleanup);
+
+ if (shouldCleanup) {
+ mIsActivityPreviouslyStarted = false;
+ mIsChangingConfigurations = false;
+
+ // blow away stale contact info so that we get fresh data on
+ // the next set of calls
+ if (mContactInfoCache != null) {
+ mContactInfoCache.clearCache();
+ }
+ mContactInfoCache = null;
+
+ if (mProximitySensor != null) {
+ removeListener(mProximitySensor);
+ mProximitySensor.tearDown();
+ }
+ mProximitySensor = null;
+
+ mAudioModeProvider = null;
+
+ if (mStatusBarNotifier != null) {
+ removeListener(mStatusBarNotifier);
+ }
+ mStatusBarNotifier = null;
+
+ if (mCallList != null) {
+ mCallList.removeListener(this);
+ }
+ mCallList = null;
+
+ mContext = null;
+ mInCallActivity = null;
+
+ mListeners.clear();
+ mIncomingCallListeners.clear();
+ mDetailsListeners.clear();
+ mCanAddCallListeners.clear();
+ mOrientationListeners.clear();
+ mInCallEventListeners.clear();
+
+ Log.d(this, "Finished InCallPresenter.CleanUp");
+ }
+ }
+
+ public void showInCall(final boolean showDialpad, final boolean newOutgoingCall) {
+ Log.i(this, "Showing InCallActivity");
+ mContext.startActivity(getInCallIntent(showDialpad, newOutgoingCall));
+ }
+
+ public void onServiceBind() {
+ mServiceBound = true;
+ }
+
+ public void onServiceUnbind() {
+ InCallPresenter.getInstance().setBoundAndWaitingForOutgoingCall(false, null);
+ mServiceBound = false;
+ }
+
+ public boolean isServiceBound() {
+ return mServiceBound;
+ }
+
+ public void maybeStartRevealAnimation(Intent intent) {
+ if (intent == null || mInCallActivity != null) {
+ return;
+ }
+ final Bundle extras = intent.getBundleExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
+ if (extras == null) {
+ // Incoming call, just show the in-call UI directly.
+ return;
+ }
+
+ if (extras.containsKey(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS)) {
+ // Account selection dialog will show up so don't show the animation.
+ return;
+ }
+
+ final PhoneAccountHandle accountHandle =
+ intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+ final Point touchPoint = extras.getParcelable(TouchPointManager.TOUCH_POINT);
+
+ InCallPresenter.getInstance().setBoundAndWaitingForOutgoingCall(true, accountHandle);
+
+ final Intent incallIntent = getInCallIntent(false, true);
+ incallIntent.putExtra(TouchPointManager.TOUCH_POINT, touchPoint);
+ mContext.startActivity(incallIntent);
+ }
+
+ public Intent getInCallIntent(boolean showDialpad, boolean newOutgoingCall) {
+ final Intent intent = new Intent(Intent.ACTION_MAIN, null);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ intent.setClass(mContext, InCallActivity.class);
+ if (showDialpad) {
+ intent.putExtra(InCallActivity.SHOW_DIALPAD_EXTRA, true);
+ }
+ intent.putExtra(InCallActivity.NEW_OUTGOING_CALL_EXTRA, newOutgoingCall);
+ return intent;
+ }
+
+ /**
+ * Retrieves the current in-call camera manager instance, creating if necessary.
+ *
+ * @return The {@link InCallCameraManager}.
+ */
+ public InCallCameraManager getInCallCameraManager() {
+ synchronized(this) {
+ if (mInCallCameraManager == null) {
+ mInCallCameraManager = new InCallCameraManager(mContext);
+ }
+
+ return mInCallCameraManager;
+ }
+ }
+
+ /**
+ * Notifies listeners of changes in orientation and notify calls of rotation angle change.
+ *
+ * @param orientation The screen orientation of the device (one of:
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ */
+ public void onDeviceOrientationChange(int orientation) {
+ Log.d(this, "onDeviceOrientationChange: orientation= " + orientation);
+
+ if (mCallList != null) {
+ mCallList.notifyCallsOfDeviceRotation(orientation);
+ } else {
+ Log.w(this, "onDeviceOrientationChange: CallList is null.");
+ }
+
+ // Notify listeners of device orientation changed.
+ for (InCallOrientationListener listener : mOrientationListeners) {
+ listener.onDeviceOrientationChanged(orientation);
+ }
+ }
+
+ /**
+ * Configures the in-call UI activity so it can change orientations or not. Enables the
+ * orientation event listener if allowOrientationChange is true, disables it if false.
+ *
+ * @param allowOrientationChange {@code True} if the in-call UI can change between portrait
+ * and landscape. {@Code False} if the in-call UI should be locked in portrait.
+ */
+ public void setInCallAllowsOrientationChange(boolean allowOrientationChange) {
+ if (mInCallActivity == null) {
+ Log.e(this, "InCallActivity is null. Can't set requested orientation.");
+ return;
+ }
+
+ if (!allowOrientationChange) {
+ mInCallActivity.setRequestedOrientation(
+ InCallOrientationEventListener.NO_SENSOR_SCREEN_ORIENTATION);
+ } else {
+ // Using SCREEN_ORIENTATION_FULL_SENSOR allows for reverse-portrait orientation, where
+ // SCREEN_ORIENTATION_SENSOR does not.
+ mInCallActivity.setRequestedOrientation(
+ InCallOrientationEventListener.FULL_SENSOR_SCREEN_ORIENTATION);
+ }
+ mInCallActivity.enableInCallOrientationEventListener(allowOrientationChange);
+ }
+
+ public void enableScreenTimeout(boolean enable) {
+ Log.v(this, "enableScreenTimeout: value=" + enable);
+ if (mInCallActivity == null) {
+ Log.e(this, "enableScreenTimeout: InCallActivity is null.");
+ return;
+ }
+
+ final Window window = mInCallActivity.getWindow();
+ if (enable) {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ } else {
+ window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+ }
+
+ /**
+ * Returns the space available beside the call card.
+ *
+ * @return The space beside the call card.
+ */
+ public float getSpaceBesideCallCard() {
+ if (mInCallActivity != null && mInCallActivity.getCallCardFragment() != null) {
+ return mInCallActivity.getCallCardFragment().getSpaceBesideCallCard();
+ }
+ return 0;
+ }
+
+ /**
+ * Returns whether the call card fragment is currently visible.
+ *
+ * @return True if the call card fragment is visible.
+ */
+ public boolean getCallCardFragmentVisible() {
+ if (mInCallActivity != null && mInCallActivity.getCallCardFragment() != null) {
+ return mInCallActivity.getCallCardFragment().isVisible();
+ }
+ return false;
+ }
+
+ /**
+ * Hides or shows the conference manager fragment.
+ *
+ * @param show {@code true} if the conference manager should be shown, {@code false} if it
+ * should be hidden.
+ */
+ public void showConferenceCallManager(boolean show) {
+ if (mInCallActivity == null) {
+ return;
+ }
+
+ mInCallActivity.showConferenceFragment(show);
+ }
+
+ /**
+ * Determines if the dialpad is visible.
+ *
+ * @return {@code true} if the dialpad is visible, {@code false} otherwise.
+ */
+ public boolean isDialpadVisible() {
+ if (mInCallActivity == null) {
+ return false;
+ }
+ return mInCallActivity.isDialpadVisible();
+ }
+
+ /**
+ * @return True if the application is currently running in a right-to-left locale.
+ */
+ public static boolean isRtl() {
+ return TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ==
+ View.LAYOUT_DIRECTION_RTL;
+ }
+
+ /**
+ * Extract background color from call object. The theme colors will include a primary color
+ * and a secondary color.
+ */
+ public void setThemeColors() {
+ // This method will set the background to default if the color is PhoneAccount.NO_COLOR.
+ mThemeColors = getColorsFromCall(mCallList.getFirstCall());
+
+ if (mInCallActivity == null) {
+ return;
+ }
+
+ final Resources resources = mInCallActivity.getResources();
+ final int color;
+ if (resources.getBoolean(R.bool.is_layout_landscape)) {
+ // TODO use ResourcesCompat.getColor(Resources, int, Resources.Theme) when available
+ // {@link Resources#getColor(int)} used for compatibility
+ color = resources.getColor(R.color.statusbar_background_color);
+ } else {
+ color = mThemeColors.mSecondaryColor;
+ }
+
+ mInCallActivity.getWindow().setStatusBarColor(color);
+ final TaskDescription td = new TaskDescription(
+ resources.getString(R.string.notification_ongoing_call), null, color);
+ mInCallActivity.setTaskDescription(td);
+ }
+
+ /**
+ * @return A palette for colors to display in the UI.
+ */
+ public MaterialPalette getThemeColors() {
+ return mThemeColors;
+ }
+
+ private MaterialPalette getColorsFromCall(Call call) {
+ if (call == null) {
+ return getColorsFromPhoneAccountHandle(mPendingPhoneAccountHandle);
+ } else {
+ return getColorsFromPhoneAccountHandle(call.getAccountHandle());
+ }
+ }
+
+ private MaterialPalette getColorsFromPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) {
+ int highlightColor = PhoneAccount.NO_HIGHLIGHT_COLOR;
+ if (phoneAccountHandle != null) {
+ final TelecomManager tm = getTelecomManager();
+
+ if (tm != null) {
+ final PhoneAccount account =
+ TelecomManagerCompat.getPhoneAccount(tm, phoneAccountHandle);
+ // For single-sim devices, there will be no selected highlight color, so the phone
+ // account will default to NO_HIGHLIGHT_COLOR.
+ if (account != null && CompatUtils.isLollipopMr1Compatible()) {
+ highlightColor = account.getHighlightColor();
+ }
+ }
+ }
+ return new InCallUIMaterialColorMapUtils(
+ mContext.getResources()).calculatePrimaryAndSecondaryColor(highlightColor);
+ }
+
+ /**
+ * @return An instance of TelecomManager.
+ */
+ public TelecomManager getTelecomManager() {
+ if (mTelecomManager == null) {
+ mTelecomManager = (TelecomManager)
+ mContext.getSystemService(Context.TELECOM_SERVICE);
+ }
+ return mTelecomManager;
+ }
+
+ /**
+ * @return An instance of TelephonyManager
+ */
+ public TelephonyManager getTelephonyManager() {
+ return mTelephonyManager;
+ }
+
+ InCallActivity getActivity() {
+ return mInCallActivity;
+ }
+
+ AnswerPresenter getAnswerPresenter() {
+ return mAnswerPresenter;
+ }
+
+ /**
+ * Private constructor. Must use getInstance() to get this singleton.
+ */
+ private InCallPresenter() {
+ }
+
+ /**
+ * All the main states of InCallActivity.
+ */
+ public enum InCallState {
+ // InCall Screen is off and there are no calls
+ NO_CALLS,
+
+ // Incoming-call screen is up
+ INCOMING,
+
+ // In-call experience is showing
+ INCALL,
+
+ // Waiting for user input before placing outgoing call
+ WAITING_FOR_ACCOUNT,
+
+ // UI is starting up but no call has been initiated yet.
+ // The UI is waiting for Telecom to respond.
+ PENDING_OUTGOING,
+
+ // User is dialing out
+ OUTGOING;
+
+ public boolean isIncoming() {
+ return (this == INCOMING);
+ }
+
+ public boolean isConnectingOrConnected() {
+ return (this == INCOMING ||
+ this == OUTGOING ||
+ this == INCALL);
+ }
+ }
+
+ /**
+ * Interface implemented by classes that need to know about the InCall State.
+ */
+ public interface InCallStateListener {
+ // TODO: Enhance state to contain the call objects instead of passing CallList
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList);
+ }
+
+ public interface IncomingCallListener {
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call);
+ }
+
+ public interface CanAddCallListener {
+ public void onCanAddCallChanged(boolean canAddCall);
+ }
+
+ public interface InCallDetailsListener {
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details);
+ }
+
+ public interface InCallOrientationListener {
+ public void onDeviceOrientationChanged(int orientation);
+ }
+
+ /**
+ * Interface implemented by classes that need to know about events which occur within the
+ * In-Call UI. Used as a means of communicating between fragments that make up the UI.
+ */
+ public interface InCallEventListener {
+ public void onFullscreenModeChanged(boolean isFullscreenMode);
+ public void onSecondaryCallerInfoVisibilityChanged(boolean isVisible, int height);
+ }
+
+ public interface InCallUiListener {
+ void onUiShowing(boolean showing);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallServiceImpl.java b/InCallUI/src/com/android/incallui/InCallServiceImpl.java
new file mode 100644
index 0000000..31d6efb
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallServiceImpl.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.IBinder;
+import android.telecom.AudioState;
+import android.telecom.Call;
+import android.telecom.CallAudioState;
+import android.telecom.InCallService;
+import android.telecom.Phone;
+
+import com.android.contacts.common.compat.SdkVersionOverride;
+
+/**
+ * Used to receive updates about calls from the Telecom component. This service is bound to
+ * Telecom while there exist calls which potentially require UI. This includes ringing (incoming),
+ * dialing (outgoing), and active calls. When the last call is disconnected, Telecom will unbind to
+ * the service triggering InCallActivity (via CallList) to finish soon after.
+ */
+public class InCallServiceImpl extends InCallService {
+
+ @Override
+ public void onCallAudioStateChanged(CallAudioState audioState) {
+ AudioModeProvider.getInstance().onAudioStateChanged(audioState.isMuted(),
+ audioState.getRoute(), audioState.getSupportedRouteMask());
+ }
+
+ @Override
+ public void onBringToForeground(boolean showDialpad) {
+ InCallPresenter.getInstance().onBringToForeground(showDialpad);
+ }
+
+ @Override
+ public void onCallAdded(Call call) {
+ InCallPresenter.getInstance().onCallAdded(call);
+ }
+
+ @Override
+ public void onCallRemoved(Call call) {
+ InCallPresenter.getInstance().onCallRemoved(call);
+ }
+
+ @Override
+ public void onCanAddCallChanged(boolean canAddCall) {
+ InCallPresenter.getInstance().onCanAddCallChanged(canAddCall);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ final Context context = getApplicationContext();
+ final ContactInfoCache contactInfoCache = ContactInfoCache.getInstance(context);
+ InCallPresenter.getInstance().setUp(
+ getApplicationContext(),
+ CallList.getInstance(),
+ AudioModeProvider.getInstance(),
+ new StatusBarNotifier(context, contactInfoCache),
+ contactInfoCache,
+ new ProximitySensor(
+ context,
+ AudioModeProvider.getInstance(),
+ new AccelerometerListener(context))
+ );
+ InCallPresenter.getInstance().onServiceBind();
+ InCallPresenter.getInstance().maybeStartRevealAnimation(intent);
+ TelecomAdapter.getInstance().setInCallService(this);
+
+ return super.onBind(intent);
+ }
+
+ @Override
+ public boolean onUnbind(Intent intent) {
+ super.onUnbind(intent);
+
+ InCallPresenter.getInstance().onServiceUnbind();
+ tearDown();
+
+ return false;
+ }
+
+ private void tearDown() {
+ Log.v(this, "tearDown");
+ // Tear down the InCall system
+ TelecomAdapter.getInstance().clearInCallService();
+ InCallPresenter.getInstance().tearDown();
+ }
+
+ /*
+ * Compatibility code for devices running the L sdk. In that version of the sdk, InCallService
+ * callbacks were registered via a android.telecom.Phone$Listener. These callbacks typically
+ * correspond 1:1 to callbacks now found in android.telecom.InCallService so the compatibility
+ * code forwards to those methods.
+ */
+ private Phone.Listener mPhoneListener = new Phone.Listener() {
+ @Override
+ public void onAudioStateChanged(Phone phone, AudioState audioState) {
+ /*
+ * Need to use reflection here; in M these are private fields retrieved through getters,
+ * but in L they are public fields without getters.
+ */
+ try {
+ boolean isMuted = AudioState.class.getField("isMuted").getBoolean(audioState);
+ int route = AudioState.class.getField("route").getInt(audioState);
+ int supportedRouteMask = AudioState.class.getField("supportedRouteMask")
+ .getInt(audioState);
+ AudioModeProvider.getInstance()
+ .onAudioStateChanged(isMuted, route, supportedRouteMask);
+ } catch (ReflectiveOperationException e) {
+ Log.e(this, "Unable to use reflection to retrieve AudioState fields", e);
+ }
+ }
+
+ @Override
+ public void onBringToForeground(Phone phone, boolean showDialpad) {
+ InCallServiceImpl.this.onBringToForeground(showDialpad);
+ }
+
+ @Override
+ public void onCallAdded(Phone phone, Call call) {
+ InCallServiceImpl.this.onCallAdded(call);
+ }
+
+ @Override
+ public void onCallRemoved(Phone phone, Call call) {
+ InCallServiceImpl.this.onCallRemoved(call);
+ }
+ };
+
+ private Phone mPhone;
+
+ @Override
+ public void onPhoneCreated(Phone phone) {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ return;
+ }
+ mPhone = phone;
+ mPhone.addListener(mPhoneListener);
+ }
+
+ @Override
+ public void onPhoneDestroyed(Phone phone) {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ return;
+ }
+ mPhone.removeListener(mPhoneListener);
+ mPhone = null;
+ }
+
+ /*
+ * setMuted and setAudioRoute are final in InCallService so compat methods are
+ * used to perform the needed branching logic based on sdk version
+ */
+ public void setMutedCompat(boolean state) {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ super.setMuted(state);
+ return;
+ }
+ mPhone.setMuted(state);
+ }
+
+ public void setAudioRouteCompat(int route) {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ super.setAudioRoute(route);
+ return;
+ }
+ mPhone.setAudioRoute(route);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallServiceListener.java b/InCallUI/src/com/android/incallui/InCallServiceListener.java
new file mode 100644
index 0000000..11a5b08
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallServiceListener.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.telecom.InCallService;
+
+/**
+ * Interface implemented by In-Call components that maintain a reference to the Telecom API
+ * {@code InCallService} object. Clarifies the expectations associated with the relevant method
+ * calls.
+ */
+public interface InCallServiceListener {
+
+ /**
+ * Called once at {@code InCallService} startup time with a valid instance. At
+ * that time, there will be no existing {@code Call}s.
+ *
+ * @param inCallService The {@code InCallService} object.
+ */
+ void setInCallService(InCallService inCallService);
+
+ /**
+ * Called once at {@code InCallService} shutdown time. At that time, any {@code Call}s
+ * will have transitioned through the disconnected state and will no longer exist.
+ */
+ void clearInCallService();
+}
diff --git a/InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java b/InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java
new file mode 100644
index 0000000..44b035f
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java
@@ -0,0 +1,56 @@
+package com.android.incallui;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.telecom.PhoneAccount;
+
+import com.android.contacts.common.util.MaterialColorMapUtils;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+
+public class InCallUIMaterialColorMapUtils extends MaterialColorMapUtils {
+ private final TypedArray sPrimaryColors;
+ private final TypedArray sSecondaryColors;
+ private final Resources mResources;
+
+ public InCallUIMaterialColorMapUtils(Resources resources) {
+ super(resources);
+ sPrimaryColors = resources.obtainTypedArray(
+ com.android.incallui.R.array.background_colors);
+ sSecondaryColors = resources.obtainTypedArray(
+ com.android.incallui.R.array.background_colors_dark);
+ mResources = resources;
+ }
+
+ /**
+ * Currently the InCallUI color will only vary by SIM color which is a list of colors
+ * defined in the background_colors array, so first search the list for the matching color and
+ * fall back to the closest matching color if an exact match does not exist.
+ */
+ @Override
+ public MaterialPalette calculatePrimaryAndSecondaryColor(int color) {
+ if (color == PhoneAccount.NO_HIGHLIGHT_COLOR) {
+ return getDefaultPrimaryAndSecondaryColors(mResources);
+ }
+
+ for (int i = 0; i < sPrimaryColors.length(); i++) {
+ if (sPrimaryColors.getColor(i, 0) == color) {
+ return new MaterialPalette(
+ sPrimaryColors.getColor(i, 0),
+ sSecondaryColors.getColor(i, 0));
+ }
+ }
+
+ // The color isn't in the list, so use the superclass to find an approximate color.
+ return super.calculatePrimaryAndSecondaryColor(color);
+ }
+
+ /**
+ * {@link Resources#getColor(int) used for compatibility
+ */
+ @SuppressWarnings("deprecation")
+ public static MaterialPalette getDefaultPrimaryAndSecondaryColors(Resources resources) {
+ final int primaryColor = resources.getColor(R.color.dialer_theme_color);
+ final int secondaryColor = resources.getColor(R.color.dialer_theme_color_dark);
+ return new MaterialPalette(primaryColor, secondaryColor);
+ }
+}
\ No newline at end of file
diff --git a/InCallUI/src/com/android/incallui/InCallVideoCallCallback.java b/InCallUI/src/com/android/incallui/InCallVideoCallCallback.java
new file mode 100644
index 0000000..76f8c09
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallVideoCallCallback.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.telecom.Connection;
+import android.telecom.Connection.VideoProvider;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.VideoProfile;
+import android.telecom.VideoProfile.CameraCapabilities;
+
+/**
+ * Implements the InCallUI VideoCall Callback.
+ */
+public class InCallVideoCallCallback extends VideoCall.Callback {
+
+ /**
+ * The call associated with this {@link InCallVideoCallCallback}.
+ */
+ private Call mCall;
+
+ /**
+ * Creates an instance of the call video client, specifying the call it is related to.
+ *
+ * @param call The call.
+ */
+ public InCallVideoCallCallback(Call call) {
+ mCall = call;
+ }
+
+ /**
+ * Handles an incoming session modification request.
+ *
+ * @param videoProfile The requested video call profile.
+ */
+ @Override
+ public void onSessionModifyRequestReceived(VideoProfile videoProfile) {
+ Log.d(this, " onSessionModifyRequestReceived videoProfile=" + videoProfile);
+ int previousVideoState = VideoUtils.getUnPausedVideoState(mCall.getVideoState());
+ int newVideoState = VideoUtils.getUnPausedVideoState(videoProfile.getVideoState());
+
+ boolean wasVideoCall = VideoUtils.isVideoCall(previousVideoState);
+ boolean isVideoCall = VideoUtils.isVideoCall(newVideoState);
+
+ // Check for upgrades to video and downgrades to audio.
+ if (wasVideoCall && !isVideoCall) {
+ InCallVideoCallCallbackNotifier.getInstance().downgradeToAudio(mCall);
+ } else if (previousVideoState != newVideoState) {
+ InCallVideoCallCallbackNotifier.getInstance().upgradeToVideoRequest(mCall,
+ newVideoState);
+ }
+ }
+
+ /**
+ * Handles a session modification response.
+ *
+ * @param status Status of the session modify request. Valid values are
+ * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
+ * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_FAIL},
+ * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_INVALID}
+ * @param requestedProfile
+ * @param responseProfile The actual profile changes made by the peer device.
+ */
+ @Override
+ public void onSessionModifyResponseReceived(int status, VideoProfile requestedProfile,
+ VideoProfile responseProfile) {
+ Log.d(this, "onSessionModifyResponseReceived status=" + status + " requestedProfile="
+ + requestedProfile + " responseProfile=" + responseProfile);
+ if (status != VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
+ // Report the reason the upgrade failed as the new session modification state.
+ if (status == VideoProvider.SESSION_MODIFY_REQUEST_TIMED_OUT) {
+ mCall.setSessionModificationState(
+ Call.SessionModificationState.UPGRADE_TO_VIDEO_REQUEST_TIMED_OUT);
+ } else {
+ if (status == VideoProvider.SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE) {
+ mCall.setSessionModificationState(
+ Call.SessionModificationState.REQUEST_REJECTED);
+ } else {
+ mCall.setSessionModificationState(
+ Call.SessionModificationState.REQUEST_FAILED);
+ }
+ }
+ InCallVideoCallCallbackNotifier.getInstance().upgradeToVideoFail(status, mCall);
+ } else if (requestedProfile != null && responseProfile != null) {
+ boolean modifySucceeded = requestedProfile.getVideoState() ==
+ responseProfile.getVideoState();
+ boolean isVideoCall = VideoUtils.isVideoCall(responseProfile.getVideoState());
+ if (modifySucceeded && isVideoCall) {
+ InCallVideoCallCallbackNotifier.getInstance().upgradeToVideoSuccess(mCall);
+ } else if (!modifySucceeded && isVideoCall) {
+ InCallVideoCallCallbackNotifier.getInstance().upgradeToVideoFail(status, mCall);
+ } else if (modifySucceeded && !isVideoCall) {
+ InCallVideoCallCallbackNotifier.getInstance().downgradeToAudio(mCall);
+ }
+ } else {
+ Log.d(this, "onSessionModifyResponseReceived request and response Profiles are null");
+ }
+ // Finally clear the outstanding request.
+ mCall.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+
+ /**
+ * Handles a call session event.
+ *
+ * @param event The event.
+ */
+ @Override
+ public void onCallSessionEvent(int event) {
+ InCallVideoCallCallbackNotifier.getInstance().callSessionEvent(event);
+ }
+
+ /**
+ * Handles a change to the peer video dimensions.
+ *
+ * @param width The updated peer video width.
+ * @param height The updated peer video height.
+ */
+ @Override
+ public void onPeerDimensionsChanged(int width, int height) {
+ InCallVideoCallCallbackNotifier.getInstance().peerDimensionsChanged(mCall, width, height);
+ }
+
+ /**
+ * Handles a change to the video quality of the call.
+ *
+ * @param videoQuality The updated video call quality.
+ */
+ @Override
+ public void onVideoQualityChanged(int videoQuality) {
+ InCallVideoCallCallbackNotifier.getInstance().videoQualityChanged(mCall, videoQuality);
+ }
+
+ /**
+ * Handles a change to the call data usage. No implementation as the in-call UI does not
+ * display data usage.
+ *
+ * @param dataUsage The updated data usage.
+ */
+ @Override
+ public void onCallDataUsageChanged(long dataUsage) {
+ Log.d(this, "onCallDataUsageChanged: dataUsage = " + dataUsage);
+ InCallVideoCallCallbackNotifier.getInstance().callDataUsageChanged(dataUsage);
+ }
+
+ /**
+ * Handles changes to the camera capabilities. No implementation as the in-call UI does not
+ * make use of camera capabilities.
+ *
+ * @param cameraCapabilities The changed camera capabilities.
+ */
+ @Override
+ public void onCameraCapabilitiesChanged(CameraCapabilities cameraCapabilities) {
+ if (cameraCapabilities != null) {
+ InCallVideoCallCallbackNotifier.getInstance().cameraDimensionsChanged(
+ mCall, cameraCapabilities.getWidth(), cameraCapabilities.getHeight());
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java b/InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java
new file mode 100644
index 0000000..dfb645b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Class used by {@link InCallService.VideoCallCallback} to notify interested parties of incoming
+ * events.
+ */
+public class InCallVideoCallCallbackNotifier {
+ /**
+ * Singleton instance of this class.
+ */
+ private static InCallVideoCallCallbackNotifier sInstance =
+ new InCallVideoCallCallbackNotifier();
+
+ /**
+ * 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<SessionModificationListener> mSessionModificationListeners =
+ Collections.newSetFromMap(new ConcurrentHashMap<SessionModificationListener, Boolean>
+ (8, 0.9f, 1));
+ private final Set<VideoEventListener> mVideoEventListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<VideoEventListener, Boolean>(8, 0.9f, 1));
+ private final Set<SurfaceChangeListener> mSurfaceChangeListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<SurfaceChangeListener, Boolean>(8, 0.9f, 1));
+
+ /**
+ * Static singleton accessor method.
+ */
+ public static InCallVideoCallCallbackNotifier getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * Private constructor. Instance should only be acquired through getInstance().
+ */
+ private InCallVideoCallCallbackNotifier() {
+ }
+
+ /**
+ * Adds a new {@link SessionModificationListener}.
+ *
+ * @param listener The listener.
+ */
+ public void addSessionModificationListener(SessionModificationListener listener) {
+ Preconditions.checkNotNull(listener);
+ mSessionModificationListeners.add(listener);
+ }
+
+ /**
+ * Remove a {@link SessionModificationListener}.
+ *
+ * @param listener The listener.
+ */
+ public void removeSessionModificationListener(SessionModificationListener listener) {
+ if (listener != null) {
+ mSessionModificationListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Adds a new {@link VideoEventListener}.
+ *
+ * @param listener The listener.
+ */
+ public void addVideoEventListener(VideoEventListener listener) {
+ Preconditions.checkNotNull(listener);
+ mVideoEventListeners.add(listener);
+ }
+
+ /**
+ * Remove a {@link VideoEventListener}.
+ *
+ * @param listener The listener.
+ */
+ public void removeVideoEventListener(VideoEventListener listener) {
+ if (listener != null) {
+ mVideoEventListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Adds a new {@link SurfaceChangeListener}.
+ *
+ * @param listener The listener.
+ */
+ public void addSurfaceChangeListener(SurfaceChangeListener listener) {
+ Preconditions.checkNotNull(listener);
+ mSurfaceChangeListeners.add(listener);
+ }
+
+ /**
+ * Remove a {@link SurfaceChangeListener}.
+ *
+ * @param listener The listener.
+ */
+ public void removeSurfaceChangeListener(SurfaceChangeListener listener) {
+ if (listener != null) {
+ mSurfaceChangeListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Inform listeners of an upgrade to video request for a call.
+ * @param call The call.
+ * @param videoState The video state we want to upgrade to.
+ */
+ public void upgradeToVideoRequest(Call call, int videoState) {
+ Log.d(this, "upgradeToVideoRequest call = " + call + " new video state = " + videoState);
+ for (SessionModificationListener listener : mSessionModificationListeners) {
+ listener.onUpgradeToVideoRequest(call, videoState);
+ }
+ }
+
+ /**
+ * Inform listeners of a successful response to a video request for a call.
+ *
+ * @param call The call.
+ */
+ public void upgradeToVideoSuccess(Call call) {
+ for (SessionModificationListener listener : mSessionModificationListeners) {
+ listener.onUpgradeToVideoSuccess(call);
+ }
+ }
+
+ /**
+ * Inform listeners of an unsuccessful response to a video request for a call.
+ *
+ * @param call The call.
+ */
+ public void upgradeToVideoFail(int status, Call call) {
+ for (SessionModificationListener listener : mSessionModificationListeners) {
+ listener.onUpgradeToVideoFail(status, call);
+ }
+ }
+
+ /**
+ * Inform listeners of a downgrade to audio.
+ *
+ * @param call The call.
+ */
+ public void downgradeToAudio(Call call) {
+ for (SessionModificationListener listener : mSessionModificationListeners) {
+ listener.onDowngradeToAudio(call);
+ }
+ }
+
+ /**
+ * Inform listeners of a call session event.
+ *
+ * @param event The call session event.
+ */
+ public void callSessionEvent(int event) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onCallSessionEvent(event);
+ }
+ }
+
+ /**
+ * Inform listeners of a downgrade to audio.
+ *
+ * @param call The call.
+ * @param paused The paused state.
+ */
+ public void peerPausedStateChanged(Call call, boolean paused) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onPeerPauseStateChanged(call, paused);
+ }
+ }
+
+ /**
+ * Inform listeners of any change in the video quality of the call
+ *
+ * @param call The call.
+ * @param videoQuality The updated video quality of the call.
+ */
+ public void videoQualityChanged(Call call, int videoQuality) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onVideoQualityChanged(call, videoQuality);
+ }
+ }
+
+ /**
+ * Inform listeners of a change to peer dimensions.
+ *
+ * @param call The call.
+ * @param width New peer width.
+ * @param height New peer height.
+ */
+ public void peerDimensionsChanged(Call call, int width, int height) {
+ for (SurfaceChangeListener listener : mSurfaceChangeListeners) {
+ listener.onUpdatePeerDimensions(call, width, height);
+ }
+ }
+
+ /**
+ * Inform listeners of a change to camera dimensions.
+ *
+ * @param call The call.
+ * @param width The new camera video width.
+ * @param height The new camera video height.
+ */
+ public void cameraDimensionsChanged(Call call, int width, int height) {
+ for (SurfaceChangeListener listener : mSurfaceChangeListeners) {
+ listener.onCameraDimensionsChange(call, width, height);
+ }
+ }
+
+ /**
+ * Inform listeners of a change to call data usage.
+ *
+ * @param dataUsage data usage value
+ */
+ public void callDataUsageChanged(long dataUsage) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onCallDataUsageChange(dataUsage);
+ }
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of upgrade to video and downgrade
+ * to audio session modification requests.
+ */
+ public interface SessionModificationListener {
+ /**
+ * Called when a peer request is received to upgrade an audio-only call to a video call.
+ *
+ * @param call The call the request was received for.
+ * @param videoState The video state that the request wants to upgrade to.
+ */
+ public void onUpgradeToVideoRequest(Call call, int videoState);
+
+ /**
+ * Called when a request to a peer to upgrade an audio-only call to a video call is
+ * successful.
+ *
+ * @param call The call the request was successful for.
+ */
+ public void onUpgradeToVideoSuccess(Call call);
+
+ /**
+ * Called when a request to a peer to upgrade an audio-only call to a video call is
+ * NOT successful. This can be if the peer chooses rejects the the video call, or if the
+ * peer does not support video calling, or if there is some error in sending the request.
+ *
+ * @param call The call the request was successful for.
+ */
+ public void onUpgradeToVideoFail(int status, Call call);
+
+ /**
+ * Called when a call has been downgraded to audio-only.
+ *
+ * @param call The call which was downgraded to audio-only.
+ */
+ public void onDowngradeToAudio(Call call);
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of video events, including pause
+ * and un-pause of peer video, video quality changes.
+ */
+ public interface VideoEventListener {
+ /**
+ * Called when the peer pauses or un-pauses video transmission.
+ *
+ * @param call The call which paused or un-paused video transmission.
+ * @param paused {@code True} when the video transmission is paused, {@code false}
+ * otherwise.
+ */
+ public void onPeerPauseStateChanged(Call call, boolean paused);
+
+ /**
+ * Called when the video quality changes.
+ *
+ * @param call The call whose video quality changes.
+ * @param videoCallQuality - values are QUALITY_HIGH, MEDIUM, LOW and UNKNOWN.
+ */
+ public void onVideoQualityChanged(Call call, int videoCallQuality);
+
+ /*
+ * Called when call data usage value is requested or when call data usage value is updated
+ * because of a call state change
+ *
+ * @param dataUsage call data usage value
+ */
+ public void onCallDataUsageChange(long dataUsage);
+
+ /**
+ * Called when call session event is raised.
+ *
+ * @param event The call session event.
+ */
+ public void onCallSessionEvent(int event);
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of changes to the video surfaces.
+ */
+ public interface SurfaceChangeListener {
+ /**
+ * Called when the peer video feed changes dimensions. This can occur when the peer rotates
+ * their device, changing the aspect ratio of the video signal.
+ *
+ * @param call The call which experienced a peer video
+ * @param width
+ * @param height
+ */
+ public void onUpdatePeerDimensions(Call call, int width, int height);
+
+ /**
+ * Called when the local camera changes dimensions. This occurs when a change in camera
+ * occurs.
+ *
+ * @param call The call which experienced the camera dimension change.
+ * @param width The new camera video width.
+ * @param height The new camera video height.
+ */
+ public void onCameraDimensionsChange(Call call, int width, int height);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Log.java b/InCallUI/src/com/android/incallui/Log.java
new file mode 100644
index 0000000..07a0e61
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Log.java
@@ -0,0 +1,176 @@
+/*
+ * 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.
+ */
+
+package com.android.incallui;
+
+import android.net.Uri;
+import android.telecom.PhoneAccount;
+import android.telephony.PhoneNumberUtils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Manages logging for the entire class.
+ */
+public class Log {
+
+ // Generic tag for all In Call logging
+ public static final String TAG = "InCall";
+
+ public static final boolean FORCE_DEBUG = false; /* STOPSHIP if true */
+ public static final boolean DEBUG = FORCE_DEBUG ||
+ android.util.Log.isLoggable(TAG, android.util.Log.DEBUG);
+ public static final boolean VERBOSE = FORCE_DEBUG ||
+ android.util.Log.isLoggable(TAG, android.util.Log.VERBOSE);
+ public static final String TAG_DELIMETER = " - ";
+
+ public static void d(String tag, String msg) {
+ if (DEBUG) {
+ android.util.Log.d(TAG, delimit(tag) + msg);
+ }
+ }
+
+ public static void d(Object obj, String msg) {
+ if (DEBUG) {
+ android.util.Log.d(TAG, getPrefix(obj) + msg);
+ }
+ }
+
+ public static void d(Object obj, String str1, Object str2) {
+ if (DEBUG) {
+ android.util.Log.d(TAG, getPrefix(obj) + str1 + str2);
+ }
+ }
+
+ public static void v(Object obj, String msg) {
+ if (VERBOSE) {
+ android.util.Log.v(TAG, getPrefix(obj) + msg);
+ }
+ }
+
+ public static void v(Object obj, String str1, Object str2) {
+ if (VERBOSE) {
+ android.util.Log.d(TAG, getPrefix(obj) + str1 + str2);
+ }
+ }
+
+ public static void e(String tag, String msg, Exception e) {
+ android.util.Log.e(TAG, delimit(tag) + msg, e);
+ }
+
+ public static void e(String tag, String msg) {
+ android.util.Log.e(TAG, delimit(tag) + msg);
+ }
+
+ public static void e(Object obj, String msg, Exception e) {
+ android.util.Log.e(TAG, getPrefix(obj) + msg, e);
+ }
+
+ public static void e(Object obj, String msg) {
+ android.util.Log.e(TAG, getPrefix(obj) + msg);
+ }
+
+ public static void i(String tag, String msg) {
+ android.util.Log.i(TAG, delimit(tag) + msg);
+ }
+
+ public static void i(Object obj, String msg) {
+ android.util.Log.i(TAG, getPrefix(obj) + msg);
+ }
+
+ public static void w(Object obj, String msg) {
+ android.util.Log.w(TAG, getPrefix(obj) + msg);
+ }
+
+ public static void wtf(Object obj, String msg) {
+ android.util.Log.wtf(TAG, getPrefix(obj) + msg);
+ }
+
+ public static String piiHandle(Object pii) {
+ if (pii == null || VERBOSE) {
+ return String.valueOf(pii);
+ }
+
+ if (pii instanceof Uri) {
+ Uri uri = (Uri) pii;
+
+ // All Uri's which are not "tel" go through normal pii() method.
+ if (!PhoneAccount.SCHEME_TEL.equals(uri.getScheme())) {
+ return pii(pii);
+ } else {
+ pii = uri.getSchemeSpecificPart();
+ }
+ }
+
+ String originalString = String.valueOf(pii);
+ StringBuilder stringBuilder = new StringBuilder(originalString.length());
+ for (char c : originalString.toCharArray()) {
+ if (PhoneNumberUtils.isDialable(c)) {
+ stringBuilder.append('*');
+ } else {
+ stringBuilder.append(c);
+ }
+ }
+ return stringBuilder.toString();
+ }
+
+ /**
+ * Redact personally identifiable information for production users.
+ * If we are running in verbose mode, return the original string, otherwise
+ * return a SHA-1 hash of the input string.
+ */
+ public static String pii(Object pii) {
+ if (pii == null || VERBOSE) {
+ return String.valueOf(pii);
+ }
+ return "[" + secureHash(String.valueOf(pii).getBytes()) + "]";
+ }
+
+ private static String secureHash(byte[] input) {
+ MessageDigest messageDigest;
+ try {
+ messageDigest = MessageDigest.getInstance("SHA-1");
+ } catch (NoSuchAlgorithmException e) {
+ return null;
+ }
+ messageDigest.update(input);
+ byte[] result = messageDigest.digest();
+ return encodeHex(result);
+ }
+
+ private static String encodeHex(byte[] bytes) {
+ StringBuffer hex = new StringBuffer(bytes.length * 2);
+
+ for (int i = 0; i < bytes.length; i++) {
+ int byteIntValue = bytes[i] & 0xff;
+ if (byteIntValue < 0x10) {
+ hex.append("0");
+ }
+ hex.append(Integer.toString(byteIntValue, 16));
+ }
+
+ return hex.toString();
+ }
+
+ private static String getPrefix(Object obj) {
+ return (obj == null ? "" : (obj.getClass().getSimpleName() + TAG_DELIMETER));
+ }
+
+ private static String delimit(String tag) {
+ return tag + TAG_DELIMETER;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/NeededForReflection.java b/InCallUI/src/com/android/incallui/NeededForReflection.java
new file mode 100644
index 0000000..363a0a5
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/NeededForReflection.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that the class, constructor, method or field is used for reflection and therefore cannot
+ * be removed by tools like ProGuard.
+ */
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD})
+public @interface NeededForReflection {}
diff --git a/InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java b/InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java
new file mode 100644
index 0000000..2543b78
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java
@@ -0,0 +1,74 @@
+/*
+ * 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.incallui;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.VideoProfile;
+
+/**
+ * Accepts broadcast Intents which will be prepared by {@link StatusBarNotifier} and thus
+ * sent from the notification manager.
+ * This should be visible from outside, but shouldn't be exported.
+ */
+public class NotificationBroadcastReceiver extends BroadcastReceiver {
+
+ /**
+ * Intent Action used for hanging up the current call from Notification bar. This will
+ * choose first ringing call, first active call, or first background call (typically in
+ * STATE_HOLDING state).
+ */
+ public static final String ACTION_DECLINE_INCOMING_CALL =
+ "com.android.incallui.ACTION_DECLINE_INCOMING_CALL";
+ public static final String ACTION_HANG_UP_ONGOING_CALL =
+ "com.android.incallui.ACTION_HANG_UP_ONGOING_CALL";
+ public static final String ACTION_ANSWER_VIDEO_INCOMING_CALL =
+ "com.android.incallui.ACTION_ANSWER_VIDEO_INCOMING_CALL";
+ public static final String ACTION_ANSWER_VOICE_INCOMING_CALL =
+ "com.android.incallui.ACTION_ANSWER_VOICE_INCOMING_CALL";
+ public static final String ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST =
+ "com.android.incallui.ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST";
+ public static final String ACTION_DECLINE_VIDEO_UPGRADE_REQUEST =
+ "com.android.incallui.ACTION_DECLINE_VIDEO_UPGRADE_REQUEST";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ Log.i(this, "Broadcast from Notification: " + action);
+
+ // TODO: Commands of this nature should exist in the CallList.
+ if (action.equals(ACTION_ANSWER_VIDEO_INCOMING_CALL)) {
+ InCallPresenter.getInstance().answerIncomingCall(
+ context, VideoProfile.STATE_BIDIRECTIONAL);
+ } else if (action.equals(ACTION_ANSWER_VOICE_INCOMING_CALL)) {
+ InCallPresenter.getInstance().answerIncomingCall(
+ context, VideoProfile.STATE_AUDIO_ONLY);
+ } else if (action.equals(ACTION_DECLINE_INCOMING_CALL)) {
+ InCallPresenter.getInstance().declineIncomingCall(context);
+ } else if (action.equals(ACTION_HANG_UP_ONGOING_CALL)) {
+ InCallPresenter.getInstance().hangUpOngoingCall(context);
+ } else if (action.equals(ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST)) {
+ //TODO: Change calltype after adding support for TX and RX
+ InCallPresenter.getInstance().acceptUpgradeRequest(
+ VideoProfile.STATE_BIDIRECTIONAL, context);
+ } else if (action.equals(ACTION_DECLINE_VIDEO_UPGRADE_REQUEST)) {
+ InCallPresenter.getInstance().declineUpgradeRequest(context);
+ }
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/PostCharDialogFragment.java b/InCallUI/src/com/android/incallui/PostCharDialogFragment.java
new file mode 100644
index 0000000..400e8d7
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/PostCharDialogFragment.java
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+package com.android.incallui;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+/**
+ * Pop up an alert dialog with OK and Cancel buttons to allow user to Accept or Reject the WAIT
+ * inserted as part of the Dial string.
+ */
+public class PostCharDialogFragment extends DialogFragment {
+
+ private static final String STATE_CALL_ID = "CALL_ID";
+ private static final String STATE_POST_CHARS = "POST_CHARS";
+
+ private String mCallId;
+ private String mPostDialStr;
+
+ public PostCharDialogFragment() {
+ }
+
+ public PostCharDialogFragment(String callId, String postDialStr) {
+ mCallId = callId;
+ mPostDialStr = postDialStr;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ super.onCreateDialog(savedInstanceState);
+
+ if (mPostDialStr == null && savedInstanceState != null) {
+ mCallId = savedInstanceState.getString(STATE_CALL_ID);
+ mPostDialStr = savedInstanceState.getString(STATE_POST_CHARS);
+ }
+
+ final StringBuilder buf = new StringBuilder();
+ buf.append(getResources().getText(R.string.wait_prompt_str));
+ buf.append(mPostDialStr);
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(buf.toString());
+
+ builder.setPositiveButton(R.string.pause_prompt_yes, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ TelecomAdapter.getInstance().postDialContinue(mCallId, true);
+ }
+ });
+ builder.setNegativeButton(R.string.pause_prompt_no, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dialog.cancel();
+ }
+ });
+
+ final AlertDialog dialog = builder.create();
+ return dialog;
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+
+ TelecomAdapter.getInstance().postDialContinue(mCallId, false);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putString(STATE_CALL_ID, mCallId);
+ outState.putString(STATE_POST_CHARS, mPostDialStr);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Presenter.java b/InCallUI/src/com/android/incallui/Presenter.java
new file mode 100644
index 0000000..4e1fa97
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Presenter.java
@@ -0,0 +1,59 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+
+/**
+ * Base class for Presenters.
+ */
+public abstract class Presenter<U extends Ui> {
+
+ private U mUi;
+
+ /**
+ * Called after the UI view has been created. That is when fragment.onViewCreated() is called.
+ *
+ * @param ui The Ui implementation that is now ready to be used.
+ */
+ public void onUiReady(U ui) {
+ mUi = ui;
+ }
+
+ /**
+ * Called when the UI view is destroyed in Fragment.onDestroyView().
+ */
+ public final void onUiDestroy(U ui) {
+ onUiUnready(ui);
+ mUi = null;
+ }
+
+ /**
+ * To be overriden by Presenter implementations. Called when the fragment is being
+ * destroyed but before ui is set to null.
+ */
+ public void onUiUnready(U ui) {
+ }
+
+ public void onSaveInstanceState(Bundle outState) {}
+
+ public void onRestoreInstanceState(Bundle savedInstanceState) {}
+
+ public U getUi() {
+ return mUi;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ProximitySensor.java b/InCallUI/src/com/android/incallui/ProximitySensor.java
new file mode 100644
index 0000000..733a67d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ProximitySensor.java
@@ -0,0 +1,317 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Objects;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.PowerManager;
+import android.view.Display;
+
+import com.android.dialer.compat.CallAudioStateCompat;
+import com.android.incallui.AudioModeProvider.AudioModeListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+
+/**
+ * Class manages the proximity sensor for the in-call UI.
+ * We enable the proximity sensor while the user in a phone call. The Proximity sensor turns off
+ * the touchscreen and display when the user is close to the screen to prevent user's cheek from
+ * causing touch events.
+ * The class requires special knowledge of the activity and device state to know when the proximity
+ * sensor should be enabled and disabled. Most of that state is fed into this class through
+ * public methods.
+ */
+public class ProximitySensor implements AccelerometerListener.OrientationListener,
+ InCallStateListener, AudioModeListener {
+ private static final String TAG = ProximitySensor.class.getSimpleName();
+
+ private final PowerManager mPowerManager;
+ private final PowerManager.WakeLock mProximityWakeLock;
+ private final AudioModeProvider mAudioModeProvider;
+ private final AccelerometerListener mAccelerometerListener;
+ private final ProximityDisplayListener mDisplayListener;
+ private int mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
+ private boolean mUiShowing = false;
+ private boolean mIsPhoneOffhook = false;
+ private boolean mDialpadVisible;
+
+ // True if the keyboard is currently *not* hidden
+ // Gets updated whenever there is a Configuration change
+ private boolean mIsHardKeyboardOpen;
+
+ public ProximitySensor(Context context, AudioModeProvider audioModeProvider,
+ AccelerometerListener accelerometerListener) {
+ mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ if (mPowerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
+ mProximityWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
+ } else {
+ Log.w(TAG, "Device does not support proximity wake lock.");
+ mProximityWakeLock = null;
+ }
+ mAccelerometerListener = accelerometerListener;
+ mAccelerometerListener.setListener(this);
+
+ mDisplayListener = new ProximityDisplayListener(
+ (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE));
+ mDisplayListener.register();
+
+ mAudioModeProvider = audioModeProvider;
+ mAudioModeProvider.addListener(this);
+ }
+
+ public void tearDown() {
+ mAudioModeProvider.removeListener(this);
+
+ mAccelerometerListener.enable(false);
+ mDisplayListener.unregister();
+
+ turnOffProximitySensor(true);
+ }
+
+ /**
+ * Called to identify when the device is laid down flat.
+ */
+ @Override
+ public void orientationChanged(int orientation) {
+ mOrientation = orientation;
+ updateProximitySensorMode();
+ }
+
+ /**
+ * Called to keep track of the overall UI state.
+ */
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ // We ignore incoming state because we do not want to enable proximity
+ // sensor during incoming call screen. We check hasLiveCall() because a disconnected call
+ // can also put the in-call screen in the INCALL state.
+ boolean hasOngoingCall = InCallState.INCALL == newState && callList.hasLiveCall();
+ boolean isOffhook = (InCallState.OUTGOING == newState) || hasOngoingCall;
+
+ if (isOffhook != mIsPhoneOffhook) {
+ mIsPhoneOffhook = isOffhook;
+
+ mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
+ mAccelerometerListener.enable(mIsPhoneOffhook);
+
+ updateProximitySensorMode();
+ }
+ }
+
+ @Override
+ public void onSupportedAudioMode(int modeMask) {
+ }
+
+ @Override
+ public void onMute(boolean muted) {
+ }
+
+ /**
+ * Called when the audio mode changes during a call.
+ */
+ @Override
+ public void onAudioMode(int mode) {
+ updateProximitySensorMode();
+ }
+
+ public void onDialpadVisible(boolean visible) {
+ mDialpadVisible = visible;
+ updateProximitySensorMode();
+ }
+
+ /**
+ * Called by InCallActivity to listen for hard keyboard events.
+ */
+ public void onConfigurationChanged(Configuration newConfig) {
+ mIsHardKeyboardOpen = newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO;
+
+ // Update the Proximity sensor based on keyboard state
+ updateProximitySensorMode();
+ }
+
+ /**
+ * Used to save when the UI goes in and out of the foreground.
+ */
+ public void onInCallShowing(boolean showing) {
+ if (showing) {
+ mUiShowing = true;
+
+ // We only consider the UI not showing for instances where another app took the foreground.
+ // If we stopped showing because the screen is off, we still consider that showing.
+ } else if (mPowerManager.isScreenOn()) {
+ mUiShowing = false;
+ }
+ updateProximitySensorMode();
+ }
+
+ void onDisplayStateChanged(boolean isDisplayOn) {
+ Log.i(this, "isDisplayOn: " + isDisplayOn);
+ mAccelerometerListener.enable(isDisplayOn);
+ }
+
+ /**
+ * TODO: There is no way to determine if a screen is off due to proximity or if it is
+ * legitimately off, but if ever we can do that in the future, it would be useful here.
+ * Until then, this function will simply return true of the screen is off.
+ * TODO: Investigate whether this can be replaced with the ProximityDisplayListener.
+ */
+ public boolean isScreenReallyOff() {
+ return !mPowerManager.isScreenOn();
+ }
+
+ private void turnOnProximitySensor() {
+ if (mProximityWakeLock != null) {
+ if (!mProximityWakeLock.isHeld()) {
+ Log.i(this, "Acquiring proximity wake lock");
+ mProximityWakeLock.acquire();
+ } else {
+ Log.i(this, "Proximity wake lock already acquired");
+ }
+ }
+ }
+
+ private void turnOffProximitySensor(boolean screenOnImmediately) {
+ if (mProximityWakeLock != null) {
+ if (mProximityWakeLock.isHeld()) {
+ Log.i(this, "Releasing proximity wake lock");
+ int flags =
+ (screenOnImmediately ? 0 : PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
+ mProximityWakeLock.release(flags);
+ } else {
+ Log.i(this, "Proximity wake lock already released");
+ }
+ }
+ }
+
+ /**
+ * Updates the wake lock used to control proximity sensor behavior,
+ * based on the current state of the phone.
+ *
+ * On devices that have a proximity sensor, to avoid false touches
+ * during a call, we hold a PROXIMITY_SCREEN_OFF_WAKE_LOCK wake lock
+ * whenever the phone is off hook. (When held, that wake lock causes
+ * the screen to turn off automatically when the sensor detects an
+ * object close to the screen.)
+ *
+ * This method is a no-op for devices that don't have a proximity
+ * sensor.
+ *
+ * Proximity wake lock will *not* be held if any one of the
+ * conditions is true while on a call:
+ * 1) If the audio is routed via Bluetooth
+ * 2) If a wired headset is connected
+ * 3) if the speaker is ON
+ * 4) If the slider is open(i.e. the hardkeyboard is *not* hidden)
+ */
+ private synchronized void updateProximitySensorMode() {
+ final int audioMode = mAudioModeProvider.getAudioMode();
+
+ // turn proximity sensor off and turn screen on immediately if
+ // we are using a headset, the keyboard is open, or the device
+ // is being held in a horizontal position.
+ boolean screenOnImmediately = (CallAudioStateCompat.ROUTE_WIRED_HEADSET == audioMode
+ || CallAudioStateCompat.ROUTE_SPEAKER == audioMode
+ || CallAudioStateCompat.ROUTE_BLUETOOTH == audioMode
+ || mIsHardKeyboardOpen);
+
+ // We do not keep the screen off when the user is outside in-call screen and we are
+ // horizontal, but we do not force it on when we become horizontal until the
+ // proximity sensor goes negative.
+ final boolean horizontal =
+ (mOrientation == AccelerometerListener.ORIENTATION_HORIZONTAL);
+ screenOnImmediately |= !mUiShowing && horizontal;
+
+ // We do not keep the screen off when dialpad is visible, we are horizontal, and
+ // the in-call screen is being shown.
+ // At that moment we're pretty sure users want to use it, instead of letting the
+ // proximity sensor turn off the screen by their hands.
+ screenOnImmediately |= mDialpadVisible && horizontal;
+
+ Log.v(this, "screenonImmediately: ", screenOnImmediately);
+
+ Log.i(this, Objects.toStringHelper(this)
+ .add("keybrd", mIsHardKeyboardOpen ? 1 : 0)
+ .add("dpad", mDialpadVisible ? 1 : 0)
+ .add("offhook", mIsPhoneOffhook ? 1 : 0)
+ .add("hor", horizontal ? 1 : 0)
+ .add("ui", mUiShowing ? 1 : 0)
+ .add("aud", CallAudioStateCompat.audioRouteToString(audioMode))
+ .toString());
+
+ if (mIsPhoneOffhook && !screenOnImmediately) {
+ Log.d(this, "Turning on proximity sensor");
+ // Phone is in use! Arrange for the screen to turn off
+ // automatically when the sensor detects a close object.
+ turnOnProximitySensor();
+ } else {
+ Log.d(this, "Turning off proximity sensor");
+ // Phone is either idle, or ringing. We don't want any special proximity sensor
+ // behavior in either case.
+ turnOffProximitySensor(screenOnImmediately);
+ }
+ }
+
+ /**
+ * Implementation of a {@link DisplayListener} that maintains a binary state:
+ * Screen on vs screen off. Used by the proximity sensor manager to decide whether or not
+ * it needs to listen to accelerometer events.
+ */
+ public class ProximityDisplayListener implements DisplayListener {
+ private DisplayManager mDisplayManager;
+ private boolean mIsDisplayOn = true;
+
+ ProximityDisplayListener(DisplayManager displayManager) {
+ mDisplayManager = displayManager;
+ }
+
+ void register() {
+ mDisplayManager.registerDisplayListener(this, null);
+ }
+
+ void unregister() {
+ mDisplayManager.unregisterDisplayListener(this);
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ if (displayId == Display.DEFAULT_DISPLAY) {
+ final Display display = mDisplayManager.getDisplay(displayId);
+
+ final boolean isDisplayOn = display.getState() != Display.STATE_OFF;
+ // For call purposes, we assume that as long as the screen is not truly off, it is
+ // considered on, even if it is in an unknown or low power idle state.
+ if (isDisplayOn != mIsDisplayOn) {
+ mIsDisplayOn = isDisplayOn;
+ onDisplayStateChanged(mIsDisplayOn);
+ }
+ }
+ }
+
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
new file mode 100644
index 0000000..623cbb6
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -0,0 +1,731 @@
+/*
+ * 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.
+ */
+
+package com.android.incallui;
+
+import static com.android.contacts.common.compat.CallSdkCompat.Details.PROPERTY_WORK_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ANSWER_VIDEO_INCOMING_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ANSWER_VOICE_INCOMING_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_DECLINE_INCOMING_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_DECLINE_VIDEO_UPGRADE_REQUEST;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_HANG_UP_ONGOING_CALL;
+
+import com.google.common.base.Preconditions;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.media.AudioAttributes;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.telecom.Call.Details;
+import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.common.util.BitmapUtil;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.ringtone.DialerRingtoneManager;
+
+import java.util.Objects;
+
+/**
+ * This class adds Notifications to the status bar for the in-call experience.
+ */
+public class StatusBarNotifier implements InCallPresenter.InCallStateListener,
+ CallList.CallUpdateListener {
+
+ // Notification types
+ // Indicates that no notification is currently showing.
+ private static final int NOTIFICATION_NONE = 0;
+ // Notification for an active call. This is non-interruptive, but cannot be dismissed.
+ private static final int NOTIFICATION_IN_CALL = 1;
+ // Notification for incoming calls. This is interruptive and will show up as a HUN.
+ private static final int NOTIFICATION_INCOMING_CALL = 2;
+
+ private static final long[] VIBRATE_PATTERN = new long[] {0, 1000, 1000};
+
+ private final Context mContext;
+ @Nullable private ContactsPreferences mContactsPreferences;
+ private final ContactInfoCache mContactInfoCache;
+ private final NotificationManager mNotificationManager;
+ private final DialerRingtoneManager mDialerRingtoneManager;
+ private int mCurrentNotification = NOTIFICATION_NONE;
+ private int mCallState = Call.State.INVALID;
+ private int mSavedIcon = 0;
+ private String mSavedContent = null;
+ private Bitmap mSavedLargeIcon;
+ private String mSavedContentTitle;
+ private String mCallId = null;
+ private InCallState mInCallState;
+ private Uri mRingtone;
+
+ public StatusBarNotifier(Context context, ContactInfoCache contactInfoCache) {
+ Preconditions.checkNotNull(context);
+ mContext = context;
+ mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+ mContactInfoCache = contactInfoCache;
+ mNotificationManager =
+ (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ mDialerRingtoneManager = new DialerRingtoneManager();
+ mCurrentNotification = NOTIFICATION_NONE;
+ }
+
+ /**
+ * Creates notifications according to the state we receive from {@link InCallPresenter}.
+ */
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ Log.d(this, "onStateChange");
+ mInCallState = newState;
+ updateNotification(newState, callList);
+ }
+
+ /**
+ * Updates the phone app's status bar notification *and* launches the
+ * incoming call UI in response to a new incoming call.
+ *
+ * If an incoming call is ringing (or call-waiting), the notification
+ * will also include a "fullScreenIntent" that will cause the
+ * InCallScreen to be launched, unless the current foreground activity
+ * is marked as "immersive".
+ *
+ * (This is the mechanism that actually brings up the incoming call UI
+ * when we receive a "new ringing connection" event from the telephony
+ * layer.)
+ *
+ * Also note that this method is safe to call even if the phone isn't
+ * actually ringing (or, more likely, if an incoming call *was*
+ * ringing briefly but then disconnected). In that case, we'll simply
+ * update or cancel the in-call notification based on the current
+ * phone state.
+ *
+ * @see #updateInCallNotification(InCallState,CallList)
+ */
+ public void updateNotification(InCallState state, CallList callList) {
+ updateInCallNotification(state, callList);
+ }
+
+ /**
+ * Take down the in-call notification.
+ * @see #updateInCallNotification(InCallState,CallList)
+ */
+ private void cancelNotification() {
+ if (!TextUtils.isEmpty(mCallId)) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ mCallId = null;
+ }
+ if (mCurrentNotification != NOTIFICATION_NONE) {
+ Log.d(this, "cancelInCall()...");
+ mNotificationManager.cancel(mCurrentNotification);
+ }
+ mCurrentNotification = NOTIFICATION_NONE;
+ }
+
+ /**
+ * Should only be called from a irrecoverable state where it is necessary to dismiss all
+ * notifications.
+ */
+ static void clearAllCallNotifications(Context backupContext) {
+ Log.i(StatusBarNotifier.class.getSimpleName(),
+ "Something terrible happened. Clear all InCall notifications");
+
+ NotificationManager notificationManager =
+ (NotificationManager) backupContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(NOTIFICATION_IN_CALL);
+ notificationManager.cancel(NOTIFICATION_INCOMING_CALL);
+ }
+
+ /**
+ * Helper method for updateInCallNotification() and
+ * updateNotification(): Update the phone app's
+ * status bar notification based on the current telephony state, or
+ * cancels the notification if the phone is totally idle.
+ */
+ private void updateInCallNotification(final InCallState state, CallList callList) {
+ Log.d(this, "updateInCallNotification...");
+
+ final Call call = getCallToShow(callList);
+
+ if (call != null) {
+ showNotification(call);
+ } else {
+ cancelNotification();
+ }
+ }
+
+ private void showNotification(final Call call) {
+ final boolean isIncoming = (call.getState() == Call.State.INCOMING ||
+ call.getState() == Call.State.CALL_WAITING);
+ if (!TextUtils.isEmpty(mCallId)) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+ mCallId = call.getId();
+ CallList.getInstance().addCallUpdateListener(call.getId(), this);
+
+ // we make a call to the contact info cache to query for supplemental data to what the
+ // call provides. This includes the contact name and photo.
+ // This callback will always get called immediately and synchronously with whatever data
+ // it has available, and may make a subsequent call later (same thread) if it had to
+ // call into the contacts provider for more data.
+ mContactInfoCache.findInfo(call, isIncoming, new ContactInfoCacheCallback() {
+ @Override
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
+ Call call = CallList.getInstance().getCallById(callId);
+ if (call != null) {
+ call.getLogState().contactLookupResult = entry.contactLookupResult;
+ buildAndSendNotification(call, entry);
+ }
+ }
+
+ @Override
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ Call call = CallList.getInstance().getCallById(callId);
+ if (call != null) {
+ buildAndSendNotification(call, entry);
+ }
+ }
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {}
+ });
+ }
+
+ /**
+ * Sets up the main Ui for the notification
+ */
+ private void buildAndSendNotification(Call originalCall, ContactCacheEntry contactInfo) {
+
+ // This can get called to update an existing notification after contact information has come
+ // back. However, it can happen much later. Before we continue, we need to make sure that
+ // the call being passed in is still the one we want to show in the notification.
+ final Call call = getCallToShow(CallList.getInstance());
+ if (call == null || !call.getId().equals(originalCall.getId())) {
+ return;
+ }
+
+ final int callState = call.getState();
+
+ // Check if data has changed; if nothing is different, don't issue another notification.
+ final int iconResId = getIconToDisplay(call);
+ Bitmap largeIcon = getLargeIconToDisplay(contactInfo, call);
+ final String content =
+ getContentString(call, contactInfo.userType);
+ final String contentTitle = getContentTitle(contactInfo, call);
+
+ final int notificationType;
+ if (callState == Call.State.INCOMING || callState == Call.State.CALL_WAITING) {
+ notificationType = NOTIFICATION_INCOMING_CALL;
+ } else {
+ notificationType = NOTIFICATION_IN_CALL;
+ }
+
+ if (!checkForChangeAndSaveData(iconResId, content, largeIcon, contentTitle, callState,
+ notificationType, contactInfo.contactRingtoneUri)) {
+ return;
+ }
+
+ if (largeIcon != null) {
+ largeIcon = getRoundedIcon(largeIcon);
+ }
+
+ /*
+ * Nothing more to check...build and send it.
+ */
+ final Notification.Builder builder = getNotificationBuilder();
+
+ // Set up the main intent to send the user to the in-call screen
+ final PendingIntent inCallPendingIntent = createLaunchPendingIntent();
+ builder.setContentIntent(inCallPendingIntent);
+
+ // Set the intent as a full screen intent as well if a call is incoming
+ if (notificationType == NOTIFICATION_INCOMING_CALL
+ && !InCallPresenter.getInstance().isShowingInCallUi()) {
+ configureFullScreenIntent(builder, inCallPendingIntent, call);
+ // Set the notification category for incoming calls
+ builder.setCategory(Notification.CATEGORY_CALL);
+ }
+
+ // Set the content
+ builder.setContentText(content);
+ builder.setSmallIcon(iconResId);
+ builder.setContentTitle(contentTitle);
+ builder.setLargeIcon(largeIcon);
+ builder.setColor(mContext.getResources().getColor(R.color.dialer_theme_color));
+
+ final boolean isVideoUpgradeRequest = call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+ if (isVideoUpgradeRequest) {
+ builder.setUsesChronometer(false);
+ addDismissUpgradeRequestAction(builder);
+ addAcceptUpgradeRequestAction(builder);
+ } else {
+ createIncomingCallNotification(call, callState, builder);
+ }
+
+ addPersonReference(builder, contactInfo, call);
+
+ /*
+ * Fire off the notification
+ */
+ Notification notification = builder.build();
+
+ if (mDialerRingtoneManager.shouldPlayRingtone(callState, contactInfo.contactRingtoneUri)) {
+ notification.flags |= Notification.FLAG_INSISTENT;
+ notification.sound = contactInfo.contactRingtoneUri;
+ AudioAttributes.Builder audioAttributes = new AudioAttributes.Builder();
+ audioAttributes.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
+ audioAttributes.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
+ notification.audioAttributes = audioAttributes.build();
+ notification.vibrate = VIBRATE_PATTERN;
+ }
+ if (mDialerRingtoneManager.shouldPlayCallWaitingTone(callState)) {
+ // TODO (maxwelb) play call waiting
+ }
+ if (mCurrentNotification != notificationType && mCurrentNotification != NOTIFICATION_NONE) {
+ Log.i(this, "Previous notification already showing - cancelling "
+ + mCurrentNotification);
+ mNotificationManager.cancel(mCurrentNotification);
+ }
+ Log.i(this, "Displaying notification for " + notificationType);
+ mNotificationManager.notify(notificationType, notification);
+ mCurrentNotification = notificationType;
+ }
+
+ private void createIncomingCallNotification(
+ Call call, int state, Notification.Builder builder) {
+ if (state == Call.State.ACTIVE) {
+ builder.setUsesChronometer(true);
+ builder.setWhen(call.getConnectTimeMillis());
+ } else {
+ builder.setUsesChronometer(false);
+ }
+
+ // Add hang up option for any active calls (active | onhold), outgoing calls (dialing).
+ if (state == Call.State.ACTIVE ||
+ state == Call.State.ONHOLD ||
+ Call.State.isDialing(state)) {
+ addHangupAction(builder);
+ } else if (state == Call.State.INCOMING || state == Call.State.CALL_WAITING) {
+ addDismissAction(builder);
+ if (call.isVideoCall(mContext)) {
+ addVoiceAction(builder);
+ addVideoCallAction(builder);
+ } else {
+ addAnswerAction(builder);
+ }
+ }
+ }
+
+ /**
+ * Checks the new notification data and compares it against any notification that we
+ * are already displaying. If the data is exactly the same, we return false so that
+ * we do not issue a new notification for the exact same data.
+ */
+ private boolean checkForChangeAndSaveData(int icon, String content, Bitmap largeIcon,
+ String contentTitle, int state, int notificationType, Uri ringtone) {
+
+ // The two are different:
+ // if new title is not null, it should be different from saved version OR
+ // if new title is null, the saved version should not be null
+ final boolean contentTitleChanged =
+ (contentTitle != null && !contentTitle.equals(mSavedContentTitle)) ||
+ (contentTitle == null && mSavedContentTitle != null);
+
+ // any change means we are definitely updating
+ boolean retval = (mSavedIcon != icon) || !Objects.equals(mSavedContent, content)
+ || (mCallState != state) || (mSavedLargeIcon != largeIcon)
+ || contentTitleChanged || !Objects.equals(mRingtone, ringtone);
+
+ // If we aren't showing a notification right now or the notification type is changing,
+ // definitely do an update.
+ if (mCurrentNotification != notificationType) {
+ if (mCurrentNotification == NOTIFICATION_NONE) {
+ Log.d(this, "Showing notification for first time.");
+ }
+ retval = true;
+ }
+
+ mSavedIcon = icon;
+ mSavedContent = content;
+ mCallState = state;
+ mSavedLargeIcon = largeIcon;
+ mSavedContentTitle = contentTitle;
+ mRingtone = ringtone;
+
+ if (retval) {
+ Log.d(this, "Data changed. Showing notification");
+ }
+
+ return retval;
+ }
+
+ /**
+ * Returns the main string to use in the notification.
+ */
+ @NeededForTesting
+ String getContentTitle(ContactCacheEntry contactInfo, Call call) {
+ if (call.isConferenceCall() && !call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)) {
+ return mContext.getResources().getString(R.string.card_title_conf_call);
+ }
+
+ String preferredName = ContactDisplayUtils.getPreferredDisplayName(contactInfo.namePrimary,
+ contactInfo.nameAlternative, mContactsPreferences);
+ if (TextUtils.isEmpty(preferredName)) {
+ return TextUtils.isEmpty(contactInfo.number) ? null : BidiFormatter.getInstance()
+ .unicodeWrap(contactInfo.number, TextDirectionHeuristics.LTR);
+ }
+ return preferredName;
+ }
+
+ private void addPersonReference(Notification.Builder builder, ContactCacheEntry contactInfo,
+ Call call) {
+ if (contactInfo.lookupUri != null) {
+ builder.addPerson(contactInfo.lookupUri.toString());
+ } else if (!TextUtils.isEmpty(call.getNumber())) {
+ builder.addPerson(Uri.fromParts(PhoneAccount.SCHEME_TEL,
+ call.getNumber(), null).toString());
+ }
+ }
+
+ /**
+ * Gets a large icon from the contact info object to display in the notification.
+ */
+ private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo, Call call) {
+ Bitmap largeIcon = null;
+ if (call.isConferenceCall() && !call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)) {
+ largeIcon = BitmapFactory.decodeResource(mContext.getResources(),
+ R.drawable.img_conference);
+ }
+ if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) {
+ largeIcon = ((BitmapDrawable) contactInfo.photo).getBitmap();
+ }
+ return largeIcon;
+ }
+
+ private Bitmap getRoundedIcon(Bitmap bitmap) {
+ if (bitmap == null) {
+ return null;
+ }
+ final int height = (int) mContext.getResources().getDimension(
+ android.R.dimen.notification_large_icon_height);
+ final int width = (int) mContext.getResources().getDimension(
+ android.R.dimen.notification_large_icon_width);
+ return BitmapUtil.getRoundedBitmap(bitmap, width, height);
+ }
+
+ /**
+ * Returns the appropriate icon res Id to display based on the call for which
+ * we want to display information.
+ */
+ private int getIconToDisplay(Call call) {
+ // Even if both lines are in use, we only show a single item in
+ // the expanded Notifications UI. It's labeled "Ongoing call"
+ // (or "On hold" if there's only one call, and it's on hold.)
+ // Also, we don't have room to display caller-id info from two
+ // different calls. So if both lines are in use, display info
+ // from the foreground call. And if there's a ringing call,
+ // display that regardless of the state of the other calls.
+ if (call.getState() == Call.State.ONHOLD) {
+ return R.drawable.ic_phone_paused_white_24dp;
+ } else if (call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ return R.drawable.ic_videocam;
+ }
+ return R.drawable.ic_call_white_24dp;
+ }
+
+ /**
+ * Returns the message to use with the notification.
+ */
+ private String getContentString(Call call, @UserType long userType) {
+ boolean isIncomingOrWaiting = call.getState() == Call.State.INCOMING ||
+ call.getState() == Call.State.CALL_WAITING;
+
+ if (isIncomingOrWaiting &&
+ call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED) {
+
+ if (!TextUtils.isEmpty(call.getChildNumber())) {
+ return mContext.getString(R.string.child_number, call.getChildNumber());
+ } else if (!TextUtils.isEmpty(call.getCallSubject()) && call.isCallSubjectSupported()) {
+ return call.getCallSubject();
+ }
+ }
+
+ int resId = R.string.notification_ongoing_call;
+ if (call.hasProperty(Details.PROPERTY_WIFI)) {
+ resId = R.string.notification_ongoing_call_wifi;
+ }
+
+ if (isIncomingOrWaiting) {
+ if (call.hasProperty(Details.PROPERTY_WIFI)) {
+ resId = R.string.notification_incoming_call_wifi;
+ } else {
+ resId = R.string.notification_incoming_call;
+ }
+ } else if (call.getState() == Call.State.ONHOLD) {
+ resId = R.string.notification_on_hold;
+ } else if (Call.State.isDialing(call.getState())) {
+ resId = R.string.notification_dialing;
+ } else if (call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ resId = R.string.notification_requesting_video_call;
+ }
+
+ // Is the call placed through work connection service.
+ boolean isWorkCall = call.hasProperty(PROPERTY_WORK_CALL);
+ if(userType == ContactsUtils.USER_TYPE_WORK || isWorkCall) {
+ resId = getWorkStringFromPersonalString(resId);
+ }
+
+ return mContext.getString(resId);
+ }
+
+ private static int getWorkStringFromPersonalString(int resId) {
+ switch(resId) {
+ case R.string.notification_ongoing_call:
+ return R.string.notification_ongoing_work_call;
+ case R.string.notification_ongoing_call_wifi:
+ return R.string.notification_ongoing_work_call_wifi;
+ case R.string.notification_incoming_call_wifi:
+ return R.string.notification_incoming_work_call_wifi;
+ case R.string.notification_incoming_call:
+ return R.string.notification_incoming_work_call;
+ default:
+ return resId;
+ }
+ }
+
+ /**
+ * Gets the most relevant call to display in the notification.
+ */
+ private Call getCallToShow(CallList callList) {
+ if (callList == null) {
+ return null;
+ }
+ Call call = callList.getIncomingCall();
+ if (call == null) {
+ call = callList.getOutgoingCall();
+ }
+ if (call == null) {
+ call = callList.getVideoUpgradeRequestCall();
+ }
+ if (call == null) {
+ call = callList.getActiveOrBackgroundCall();
+ }
+ return call;
+ }
+
+ private void addAnswerAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"answer\" action in the incoming call Notification");
+
+ PendingIntent answerVoicePendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ANSWER_VOICE_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_call_white_24dp,
+ mContext.getText(R.string.notification_action_answer),
+ answerVoicePendingIntent);
+ }
+
+ private void addDismissAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"dismiss\" action in the incoming call Notification");
+
+ PendingIntent declinePendingIntent =
+ createNotificationPendingIntent(mContext, ACTION_DECLINE_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_close_dk,
+ mContext.getText(R.string.notification_action_dismiss),
+ declinePendingIntent);
+ }
+
+ private void addHangupAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"hang-up\" action in the ongoing active call Notification");
+
+ PendingIntent hangupPendingIntent =
+ createNotificationPendingIntent(mContext, ACTION_HANG_UP_ONGOING_CALL);
+ builder.addAction(R.drawable.ic_call_end_white_24dp,
+ mContext.getText(R.string.notification_action_end_call),
+ hangupPendingIntent);
+ }
+
+ private void addVideoCallAction(Notification.Builder builder) {
+ Log.i(this, "Will show \"video\" action in the incoming call Notification");
+
+ PendingIntent answerVideoPendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ANSWER_VIDEO_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_videocam,
+ mContext.getText(R.string.notification_action_answer_video),
+ answerVideoPendingIntent);
+ }
+
+ private void addVoiceAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"voice\" action in the incoming call Notification");
+
+ PendingIntent answerVoicePendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ANSWER_VOICE_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_call_white_24dp,
+ mContext.getText(R.string.notification_action_answer_voice),
+ answerVoicePendingIntent);
+ }
+
+ private void addAcceptUpgradeRequestAction(Notification.Builder builder) {
+ Log.i(this, "Will show \"accept upgrade\" action in the incoming call Notification");
+
+ PendingIntent acceptVideoPendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST);
+ builder.addAction(0, mContext.getText(R.string.notification_action_accept),
+ acceptVideoPendingIntent);
+ }
+
+ private void addDismissUpgradeRequestAction(Notification.Builder builder) {
+ Log.i(this, "Will show \"dismiss upgrade\" action in the incoming call Notification");
+
+ PendingIntent declineVideoPendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_DECLINE_VIDEO_UPGRADE_REQUEST);
+ builder.addAction(0, mContext.getText(R.string.notification_action_dismiss),
+ declineVideoPendingIntent);
+ }
+
+ /**
+ * Adds fullscreen intent to the builder.
+ */
+ private void configureFullScreenIntent(Notification.Builder builder, PendingIntent intent,
+ Call call) {
+ // Ok, we actually want to launch the incoming call
+ // UI at this point (in addition to simply posting a notification
+ // to the status bar). Setting fullScreenIntent will cause
+ // the InCallScreen to be launched immediately *unless* the
+ // current foreground activity is marked as "immersive".
+ Log.d(this, "- Setting fullScreenIntent: " + intent);
+ builder.setFullScreenIntent(intent, true);
+
+ // Ugly hack alert:
+ //
+ // The NotificationManager has the (undocumented) behavior
+ // that it will *ignore* the fullScreenIntent field if you
+ // post a new Notification that matches the ID of one that's
+ // already active. Unfortunately this is exactly what happens
+ // when you get an incoming call-waiting call: the
+ // "ongoing call" notification is already visible, so the
+ // InCallScreen won't get launched in this case!
+ // (The result: if you bail out of the in-call UI while on a
+ // call and then get a call-waiting call, the incoming call UI
+ // won't come up automatically.)
+ //
+ // The workaround is to just notice this exact case (this is a
+ // call-waiting call *and* the InCallScreen is not in the
+ // foreground) and manually cancel the in-call notification
+ // before (re)posting it.
+ //
+ // TODO: there should be a cleaner way of avoiding this
+ // problem (see discussion in bug 3184149.)
+
+ // If a call is onhold during an incoming call, the call actually comes in as
+ // INCOMING. For that case *and* traditional call-waiting, we want to
+ // cancel the notification.
+ boolean isCallWaiting = (call.getState() == Call.State.CALL_WAITING ||
+ (call.getState() == Call.State.INCOMING &&
+ CallList.getInstance().getBackgroundCall() != null));
+
+ if (isCallWaiting) {
+ Log.i(this, "updateInCallNotification: call-waiting! force relaunch...");
+ // Cancel the IN_CALL_NOTIFICATION immediately before
+ // (re)posting it; this seems to force the
+ // NotificationManager to launch the fullScreenIntent.
+ mNotificationManager.cancel(NOTIFICATION_IN_CALL);
+ }
+ }
+
+ private Notification.Builder getNotificationBuilder() {
+ final Notification.Builder builder = new Notification.Builder(mContext);
+ builder.setOngoing(true);
+
+ // Make the notification prioritized over the other normal notifications.
+ builder.setPriority(Notification.PRIORITY_HIGH);
+
+ return builder;
+ }
+
+ private PendingIntent createLaunchPendingIntent() {
+
+ final Intent intent = InCallPresenter.getInstance().getInCallIntent(
+ false /* showDialpad */, false /* newOutgoingCall */);
+
+ // PendingIntent that can be used to launch the InCallActivity. The
+ // system fires off this intent if the user pulls down the windowshade
+ // and clicks the notification's expanded view. It's also used to
+ // launch the InCallActivity immediately when when there's an incoming
+ // call (see the "fullScreenIntent" field below).
+ PendingIntent inCallPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
+
+ return inCallPendingIntent;
+ }
+
+ /**
+ * Returns PendingIntent for answering a phone call. This will typically be used from
+ * Notification context.
+ */
+ private static PendingIntent createNotificationPendingIntent(Context context, String action) {
+ final Intent intent = new Intent(action, null,
+ context, NotificationBroadcastReceiver.class);
+ return PendingIntent.getBroadcast(context, 0, intent, 0);
+ }
+
+ @Override
+ public void onCallChanged(Call call) {
+ // no-op
+ }
+
+ /**
+ * Responds to changes in the session modification state for the call by dismissing the
+ * status bar notification as required.
+ *
+ * @param sessionModificationState The new session modification state.
+ */
+ @Override
+ public void onSessionModificationStateChange(int sessionModificationState) {
+ if (sessionModificationState == Call.SessionModificationState.NO_REQUEST) {
+ if (mCallId != null) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+
+ updateNotification(mInCallState, CallList.getInstance());
+ }
+ }
+
+ @Override
+ public void onLastForwardedNumberChange() {
+ // no-op
+ }
+
+ @Override
+ public void onChildNumberChange() {
+ // no-op
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/TelecomAdapter.java b/InCallUI/src/com/android/incallui/TelecomAdapter.java
new file mode 100644
index 0000000..0fc2e28
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/TelecomAdapter.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.os.Looper;
+import android.telecom.InCallService;
+import android.telecom.PhoneAccountHandle;
+
+import com.android.incallui.compat.telecom.DetailsCompat;
+import com.android.incallui.compat.telecom.InCallServiceCompat;
+
+import java.util.List;
+
+final class TelecomAdapter implements InCallServiceListener {
+ private static final String ADD_CALL_MODE_KEY = "add_call_mode";
+
+ private static TelecomAdapter sInstance;
+ private InCallService mInCallService;
+
+ static TelecomAdapter getInstance() {
+ Preconditions.checkState(Looper.getMainLooper().getThread() == Thread.currentThread());
+ if (sInstance == null) {
+ sInstance = new TelecomAdapter();
+ }
+ return sInstance;
+ }
+
+ private TelecomAdapter() {
+ }
+
+ @Override
+ public void setInCallService(InCallService inCallService) {
+ mInCallService = inCallService;
+ }
+
+ @Override
+ public void clearInCallService() {
+ mInCallService = null;
+ }
+
+ private android.telecom.Call getTelecomCallById(String callId) {
+ Call call = CallList.getInstance().getCallById(callId);
+ return call == null ? null : call.getTelecomCall();
+ }
+
+ void answerCall(String callId, int videoState) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.answer(videoState);
+ } else {
+ Log.e(this, "error answerCall, call not in call list: " + callId);
+ }
+ }
+
+ void rejectCall(String callId, boolean rejectWithMessage, String message) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.reject(rejectWithMessage, message);
+ } else {
+ Log.e(this, "error rejectCall, call not in call list: " + callId);
+ }
+ }
+
+ void disconnectCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.disconnect();
+ } else {
+ Log.e(this, "error disconnectCall, call not in call list " + callId);
+ }
+ }
+
+ void holdCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.hold();
+ } else {
+ Log.e(this, "error holdCall, call not in call list " + callId);
+ }
+ }
+
+ void unholdCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.unhold();
+ } else {
+ Log.e(this, "error unholdCall, call not in call list " + callId);
+ }
+ }
+
+ void mute(boolean shouldMute) {
+ if (mInCallService != null) {
+ InCallServiceCompat.setMuted(mInCallService, shouldMute);
+ } else {
+ Log.e(this, "error mute, mInCallService is null");
+ }
+ }
+
+ void setAudioRoute(int route) {
+ if (mInCallService != null) {
+ InCallServiceCompat.setAudioRoute(mInCallService, route);
+ } else {
+ Log.e(this, "error setAudioRoute, mInCallService is null");
+ }
+ }
+
+ void separateCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.splitFromConference();
+ } else {
+ Log.e(this, "error separateCall, call not in call list " + callId);
+ }
+ }
+
+ void merge(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ List<android.telecom.Call> conferenceable = call.getConferenceableCalls();
+ if (!conferenceable.isEmpty()) {
+ call.conference(conferenceable.get(0));
+ } else {
+ if (DetailsCompat.can(call.getDetails(),
+ android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE)) {
+ call.mergeConference();
+ }
+ }
+ } else {
+ Log.e(this, "error merge, call not in call list " + callId);
+ }
+ }
+
+ void swap(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ if (DetailsCompat.can(call.getDetails(),
+ android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE)) {
+ call.swapConference();
+ }
+ } else {
+ Log.e(this, "error swap, call not in call list " + callId);
+ }
+ }
+
+ void addCall() {
+ if (mInCallService != null) {
+ Intent intent = new Intent(Intent.ACTION_DIAL);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ // when we request the dialer come up, we also want to inform
+ // it that we're going through the "add call" option from the
+ // InCallScreen / PhoneUtils.
+ intent.putExtra(ADD_CALL_MODE_KEY, true);
+ try {
+ Log.d(this, "Sending the add Call intent");
+ mInCallService.startActivity(intent);
+ } catch (ActivityNotFoundException e) {
+ // This is rather rare but possible.
+ // Note: this method is used even when the phone is encrypted. At that moment
+ // the system may not find any Activity which can accept this Intent.
+ Log.e(this, "Activity for adding calls isn't found.", e);
+ }
+ }
+ }
+
+ void playDtmfTone(String callId, char digit) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.playDtmfTone(digit);
+ } else {
+ Log.e(this, "error playDtmfTone, call not in call list " + callId);
+ }
+ }
+
+ void stopDtmfTone(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.stopDtmfTone();
+ } else {
+ Log.e(this, "error stopDtmfTone, call not in call list " + callId);
+ }
+ }
+
+ void postDialContinue(String callId, boolean proceed) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.postDialContinue(proceed);
+ } else {
+ Log.e(this, "error postDialContinue, call not in call list " + callId);
+ }
+ }
+
+ void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault) {
+ if (accountHandle == null) {
+ Log.e(this, "error phoneAccountSelected, accountHandle is null");
+ // TODO: Do we really want to send null accountHandle?
+ }
+
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.phoneAccountSelected(accountHandle, setDefault);
+ } else {
+ Log.e(this, "error phoneAccountSelected, call not in call list " + callId);
+ }
+ }
+
+ boolean canAddCall(Call call) {
+ return InCallServiceCompat.canAddCall(mInCallService, call);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Ui.java b/InCallUI/src/com/android/incallui/Ui.java
new file mode 100644
index 0000000..e453ccb
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Ui.java
@@ -0,0 +1,24 @@
+/*
+ * 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
+ */
+
+package com.android.incallui;
+
+/**
+ * Base class for all presenter ui.
+ */
+public interface Ui {
+
+}
diff --git a/InCallUI/src/com/android/incallui/VideoCallFragment.java b/InCallUI/src/com/android/incallui/VideoCallFragment.java
new file mode 100644
index 0000000..2c06303
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoCallFragment.java
@@ -0,0 +1,897 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.graphics.Matrix;
+import android.graphics.Point;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.Surface;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewStub;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+import com.android.phone.common.animation.AnimUtils;
+import com.google.common.base.Objects;
+
+/**
+ * Fragment containing video calling surfaces.
+ */
+public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
+ VideoCallPresenter.VideoCallUi> implements VideoCallPresenter.VideoCallUi {
+ private static final String TAG = VideoCallFragment.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
+ /**
+ * Used to indicate that the surface dimensions are not set.
+ */
+ private static final int DIMENSIONS_NOT_SET = -1;
+
+ /**
+ * Surface ID for the display surface.
+ */
+ public static final int SURFACE_DISPLAY = 1;
+
+ /**
+ * Surface ID for the preview surface.
+ */
+ public static final int SURFACE_PREVIEW = 2;
+
+ /**
+ * Used to indicate that the UI rotation is unknown.
+ */
+ public static final int ORIENTATION_UNKNOWN = -1;
+
+ // Static storage used to retain the video surfaces across Activity restart.
+ // TextureViews are not parcelable, so it is not possible to store them in the saved state.
+ private static boolean sVideoSurfacesInUse = false;
+ private static VideoCallSurface sPreviewSurface = null;
+ private static VideoCallSurface sDisplaySurface = null;
+ private static Point sDisplaySize = null;
+
+ /**
+ * {@link ViewStub} holding the video call surfaces. This is the parent for the
+ * {@link VideoCallFragment}. Used to ensure that the video surfaces are only inflated when
+ * required.
+ */
+ private ViewStub mVideoViewsStub;
+
+ /**
+ * Inflated view containing the video call surfaces represented by the {@link ViewStub}.
+ */
+ private View mVideoViews;
+
+ /**
+ * The {@link FrameLayout} containing the preview surface.
+ */
+ private View mPreviewVideoContainer;
+
+ /**
+ * Icon shown to indicate that the outgoing camera has been turned off.
+ */
+ private View mCameraOff;
+
+ /**
+ * {@link ImageView} containing the user's profile photo.
+ */
+ private ImageView mPreviewPhoto;
+
+ /**
+ * {@code True} when the layout of the activity has been completed.
+ */
+ private boolean mIsLayoutComplete = false;
+
+ /**
+ * {@code True} if in landscape mode.
+ */
+ private boolean mIsLandscape;
+
+ private int mAnimationDuration;
+
+ /**
+ * Inner-class representing a {@link TextureView} and its associated {@link SurfaceTexture} and
+ * {@link Surface}. Used to manage the lifecycle of these objects across device orientation
+ * changes.
+ */
+ private static class VideoCallSurface implements TextureView.SurfaceTextureListener,
+ View.OnClickListener, View.OnAttachStateChangeListener {
+ private int mSurfaceId;
+ private VideoCallPresenter mPresenter;
+ private TextureView mTextureView;
+ private SurfaceTexture mSavedSurfaceTexture;
+ private Surface mSavedSurface;
+ private boolean mIsDoneWithSurface;
+ private int mWidth = DIMENSIONS_NOT_SET;
+ private int mHeight = DIMENSIONS_NOT_SET;
+
+ /**
+ * Creates an instance of a {@link VideoCallSurface}.
+ *
+ * @param surfaceId The surface ID of the surface.
+ * @param textureView The {@link TextureView} for the surface.
+ */
+ public VideoCallSurface(VideoCallPresenter presenter, int surfaceId,
+ TextureView textureView) {
+ this(presenter, surfaceId, textureView, DIMENSIONS_NOT_SET, DIMENSIONS_NOT_SET);
+ }
+
+ /**
+ * Creates an instance of a {@link VideoCallSurface}.
+ *
+ * @param surfaceId The surface ID of the surface.
+ * @param textureView The {@link TextureView} for the surface.
+ * @param width The width of the surface.
+ * @param height The height of the surface.
+ */
+ public VideoCallSurface(VideoCallPresenter presenter,int surfaceId, TextureView textureView,
+ int width, int height) {
+ Log.d(this, "VideoCallSurface: surfaceId=" + surfaceId +
+ " width=" + width + " height=" + height);
+ mPresenter = presenter;
+ mWidth = width;
+ mHeight = height;
+ mSurfaceId = surfaceId;
+
+ recreateView(textureView);
+ }
+
+ /**
+ * Recreates a {@link VideoCallSurface} after a device orientation change. Re-applies the
+ * saved {@link SurfaceTexture} to the
+ *
+ * @param view The {@link TextureView}.
+ */
+ public void recreateView(TextureView view) {
+ if (DEBUG) {
+ Log.i(TAG, "recreateView: " + view);
+ }
+
+ if (mTextureView == view) {
+ return;
+ }
+
+ mTextureView = view;
+ mTextureView.setSurfaceTextureListener(this);
+ mTextureView.setOnClickListener(this);
+
+ final boolean areSameSurfaces =
+ Objects.equal(mSavedSurfaceTexture, mTextureView.getSurfaceTexture());
+ Log.d(this, "recreateView: SavedSurfaceTexture=" + mSavedSurfaceTexture
+ + " areSameSurfaces=" + areSameSurfaces);
+ if (mSavedSurfaceTexture != null && !areSameSurfaces) {
+ mTextureView.setSurfaceTexture(mSavedSurfaceTexture);
+ if (createSurface(mWidth, mHeight)) {
+ onSurfaceCreated();
+ }
+ }
+ mIsDoneWithSurface = false;
+ }
+
+ public void resetPresenter(VideoCallPresenter presenter) {
+ Log.d(this, "resetPresenter: CurrentPresenter=" + mPresenter + " NewPresenter="
+ + presenter);
+ mPresenter = presenter;
+ }
+
+ /**
+ * Handles {@link SurfaceTexture} callback to indicate that a {@link SurfaceTexture} has
+ * been successfully created.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture} which has been created.
+ * @param width The width of the {@link SurfaceTexture}.
+ * @param height The height of the {@link SurfaceTexture}.
+ */
+ @Override
+ public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
+ int height) {
+ boolean surfaceCreated;
+ if (DEBUG) {
+ Log.i(TAG, "onSurfaceTextureAvailable: " + surfaceTexture);
+ }
+ // Where there is no saved {@link SurfaceTexture} available, use the newly created one.
+ // If a saved {@link SurfaceTexture} is available, we are re-creating after an
+ // orientation change.
+ Log.d(this, " onSurfaceTextureAvailable mSurfaceId=" + mSurfaceId + " surfaceTexture="
+ + surfaceTexture + " width=" + width
+ + " height=" + height + " mSavedSurfaceTexture=" + mSavedSurfaceTexture);
+ Log.d(this, " onSurfaceTextureAvailable VideoCallPresenter=" + mPresenter);
+ if (mSavedSurfaceTexture == null) {
+ mSavedSurfaceTexture = surfaceTexture;
+ surfaceCreated = createSurface(width, height);
+ } else {
+ // A saved SurfaceTexture was found.
+ Log.d(this, " onSurfaceTextureAvailable: Replacing with cached surface...");
+ mTextureView.setSurfaceTexture(mSavedSurfaceTexture);
+ surfaceCreated = true;
+ }
+
+ // Inform presenter that the surface is available.
+ if (surfaceCreated) {
+ onSurfaceCreated();
+ }
+ }
+
+ private void onSurfaceCreated() {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceCreated(mSurfaceId);
+ } else {
+ Log.e(this, "onSurfaceTextureAvailable: Presenter is null");
+ }
+ }
+
+ /**
+ * Handles a change in the {@link SurfaceTexture}'s size.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture}.
+ * @param width The new width.
+ * @param height The new height.
+ */
+ @Override
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
+ int height) {
+ // Not handled
+ }
+
+ /**
+ * Handles {@link SurfaceTexture} destruct callback, indicating that it has been destroyed.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture}.
+ * @return {@code True} if the {@link TextureView} can release the {@link SurfaceTexture}.
+ */
+ @Override
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
+ /**
+ * Destroying the surface texture; inform the presenter so it can null the surfaces.
+ */
+ Log.d(this, " onSurfaceTextureDestroyed mSurfaceId=" + mSurfaceId + " surfaceTexture="
+ + surfaceTexture + " SavedSurfaceTexture=" + mSavedSurfaceTexture
+ + " SavedSurface=" + mSavedSurface);
+ Log.d(this, " onSurfaceTextureDestroyed VideoCallPresenter=" + mPresenter);
+
+ // Notify presenter if it is not null.
+ onSurfaceDestroyed();
+
+ if (mIsDoneWithSurface) {
+ onSurfaceReleased();
+ if (mSavedSurface != null) {
+ mSavedSurface.release();
+ mSavedSurface = null;
+ }
+ }
+ return mIsDoneWithSurface;
+ }
+
+ private void onSurfaceDestroyed() {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceDestroyed(mSurfaceId);
+ } else {
+ Log.e(this, "onSurfaceTextureDestroyed: Presenter is null.");
+ }
+ }
+
+ /**
+ * Handles {@link SurfaceTexture} update callback.
+ * @param surface
+ */
+ @Override
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+ // Not Handled
+ }
+
+ @Override
+ public void onViewAttachedToWindow(View v) {
+ if (DEBUG) {
+ Log.i(TAG, "OnViewAttachedToWindow");
+ }
+ if (mSavedSurfaceTexture != null) {
+ mTextureView.setSurfaceTexture(mSavedSurfaceTexture);
+ }
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View v) {}
+
+ /**
+ * Retrieves the current {@link TextureView}.
+ *
+ * @return The {@link TextureView}.
+ */
+ public TextureView getTextureView() {
+ return mTextureView;
+ }
+
+ /**
+ * Called by the user presenter to indicate that the surface is no longer required due to a
+ * change in video state. Releases and clears out the saved surface and surface textures.
+ */
+ public void setDoneWithSurface() {
+ Log.d(this, "setDoneWithSurface: SavedSurface=" + mSavedSurface
+ + " SavedSurfaceTexture=" + mSavedSurfaceTexture);
+ mIsDoneWithSurface = true;
+ if (mTextureView != null && mTextureView.isAvailable()) {
+ return;
+ }
+
+ if (mSavedSurface != null) {
+ onSurfaceReleased();
+ mSavedSurface.release();
+ mSavedSurface = null;
+ }
+ if (mSavedSurfaceTexture != null) {
+ mSavedSurfaceTexture.release();
+ mSavedSurfaceTexture = null;
+ }
+ }
+
+ private void onSurfaceReleased() {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceReleased(mSurfaceId);
+ } else {
+ Log.d(this, "setDoneWithSurface: Presenter is null.");
+ }
+ }
+
+ /**
+ * Retrieves the saved surface instance.
+ *
+ * @return The surface.
+ */
+ public Surface getSurface() {
+ return mSavedSurface;
+ }
+
+ /**
+ * Sets the dimensions of the surface.
+ *
+ * @param width The width of the surface, in pixels.
+ * @param height The height of the surface, in pixels.
+ */
+ public void setSurfaceDimensions(int width, int height) {
+ Log.d(this, "setSurfaceDimensions, width=" + width + " height=" + height);
+ mWidth = width;
+ mHeight = height;
+
+ if (mSavedSurfaceTexture != null) {
+ Log.d(this, "setSurfaceDimensions, mSavedSurfaceTexture is NOT equal to null.");
+ createSurface(width, height);
+ }
+ }
+
+ /**
+ * Creates the {@link Surface}, adjusting the {@link SurfaceTexture} buffer size.
+ * @param width The width of the surface to create.
+ * @param height The height of the surface to create.
+ */
+ private boolean createSurface(int width, int height) {
+ Log.d(this, "createSurface mSavedSurfaceTexture=" + mSavedSurfaceTexture
+ + " mSurfaceId =" + mSurfaceId + " mWidth " + width + " mHeight=" + height);
+ if (width != DIMENSIONS_NOT_SET && height != DIMENSIONS_NOT_SET
+ && mSavedSurfaceTexture != null) {
+ mSavedSurfaceTexture.setDefaultBufferSize(width, height);
+ mSavedSurface = new Surface(mSavedSurfaceTexture);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Handles a user clicking the surface, which is the trigger to toggle the full screen
+ * Video UI.
+ *
+ * @param view The view receiving the click.
+ */
+ @Override
+ public void onClick(View view) {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceClick(mSurfaceId);
+ } else {
+ Log.e(this, "onClick: Presenter is null.");
+ }
+ }
+
+ /**
+ * Returns the dimensions of the surface.
+ *
+ * @return The dimensions of the surface.
+ */
+ public Point getSurfaceDimensions() {
+ return new Point(mWidth, mHeight);
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mAnimationDuration = getResources().getInteger(R.integer.video_animation_duration);
+ }
+
+ /**
+ * Handles creation of the activity and initialization of the presenter.
+ *
+ * @param savedInstanceState The saved instance state.
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mIsLandscape = getResources().getBoolean(R.bool.is_layout_landscape);
+
+ Log.d(this, "onActivityCreated: IsLandscape=" + mIsLandscape);
+ getPresenter().init(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+
+ final View view = inflater.inflate(R.layout.video_call_fragment, container, false);
+
+ return view;
+ }
+
+ /**
+ * Centers the display view vertically for portrait orientations. The view is centered within
+ * the available space not occupied by the call card. This is a no-op for landscape mode.
+ *
+ * @param displayVideo The video view to center.
+ */
+ private void centerDisplayView(View displayVideo) {
+ if (!mIsLandscape) {
+ ViewGroup.LayoutParams p = displayVideo.getLayoutParams();
+ int height = p.height;
+
+ float spaceBesideCallCard = InCallPresenter.getInstance().getSpaceBesideCallCard();
+ // If space beside call card is zeo, layout hasn't happened yet so there is no point
+ // in attempting to center the view.
+ if (Math.abs(spaceBesideCallCard - 0.0f) < 0.0001) {
+ return;
+ }
+ float videoViewTranslation = height / 2 - spaceBesideCallCard / 2;
+ displayVideo.setTranslationY(videoViewTranslation);
+ }
+ }
+
+ /**
+ * After creation of the fragment view, retrieves the required views.
+ *
+ * @param view The fragment view.
+ * @param savedInstanceState The saved instance state.
+ */
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ Log.d(this, "onViewCreated: VideoSurfacesInUse=" + sVideoSurfacesInUse);
+
+ mVideoViewsStub = (ViewStub) view.findViewById(R.id.videoCallViewsStub);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ Log.d(this, "onStop:");
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ Log.d(this, "onPause:");
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ Log.d(this, "onDestroyView:");
+ }
+
+ /**
+ * Creates the presenter for the {@link VideoCallFragment}.
+ * @return The presenter instance.
+ */
+ @Override
+ public VideoCallPresenter createPresenter() {
+ Log.d(this, "createPresenter");
+ VideoCallPresenter presenter = new VideoCallPresenter();
+ onPresenterChanged(presenter);
+ return presenter;
+ }
+
+ /**
+ * @return The user interface for the presenter, which is this fragment.
+ */
+ @Override
+ public VideoCallPresenter.VideoCallUi getUi() {
+ return this;
+ }
+
+ /**
+ * Inflate video surfaces.
+ *
+ * @param show {@code True} if the video surfaces should be shown.
+ */
+ private void inflateVideoUi(boolean show) {
+ int visibility = show ? View.VISIBLE : View.GONE;
+ getView().setVisibility(visibility);
+
+ if (show) {
+ inflateVideoCallViews();
+ }
+
+ if (mVideoViews != null) {
+ mVideoViews.setVisibility(visibility);
+ }
+ }
+
+ /**
+ * Hides and shows the incoming video view and changes the outgoing video view's state based on
+ * whether outgoing view is enabled or not.
+ */
+ public void showVideoViews(boolean previewPaused, boolean showIncoming) {
+ inflateVideoUi(true);
+
+ View incomingVideoView = mVideoViews.findViewById(R.id.incomingVideo);
+ if (incomingVideoView != null) {
+ incomingVideoView.setVisibility(showIncoming ? View.VISIBLE : View.INVISIBLE);
+ }
+ if (mCameraOff != null) {
+ mCameraOff.setVisibility(!previewPaused ? View.VISIBLE : View.INVISIBLE);
+ }
+ if (mPreviewPhoto != null) {
+ mPreviewPhoto.setVisibility(!previewPaused ? View.VISIBLE : View.INVISIBLE);
+ }
+ }
+
+ /**
+ * Hide all video views.
+ */
+ public void hideVideoUi() {
+ inflateVideoUi(false);
+ }
+
+ /**
+ * Cleans up the video telephony surfaces. Used when the presenter indicates a change to an
+ * audio-only state. Since the surfaces are static, it is important to ensure they are cleaned
+ * up promptly.
+ */
+ @Override
+ public void cleanupSurfaces() {
+ Log.d(this, "cleanupSurfaces");
+ if (sDisplaySurface != null) {
+ sDisplaySurface.setDoneWithSurface();
+ sDisplaySurface = null;
+ }
+ if (sPreviewSurface != null) {
+ sPreviewSurface.setDoneWithSurface();
+ sPreviewSurface = null;
+ }
+ sVideoSurfacesInUse = false;
+ }
+
+ @Override
+ public ImageView getPreviewPhotoView() {
+ return mPreviewPhoto;
+ }
+
+ /**
+ * Adjusts the location of the video preview view by the specified offset.
+ *
+ * @param shiftUp {@code true} if the preview should shift up, {@code false} if it should shift
+ * down.
+ * @param offset The offset.
+ */
+ @Override
+ public void adjustPreviewLocation(boolean shiftUp, int offset) {
+ if (sPreviewSurface == null || mPreviewVideoContainer == null) {
+ return;
+ }
+
+ // Set the position of the secondary call info card to its starting location.
+ mPreviewVideoContainer.setTranslationY(shiftUp ? 0 : -offset);
+
+ // Animate the secondary card info slide up/down as it appears and disappears.
+ mPreviewVideoContainer.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mAnimationDuration)
+ .translationY(shiftUp ? -offset : 0)
+ .start();
+ }
+
+ private void onPresenterChanged(VideoCallPresenter presenter) {
+ Log.d(this, "onPresenterChanged: Presenter=" + presenter);
+ if (sDisplaySurface != null) {
+ sDisplaySurface.resetPresenter(presenter);;
+ }
+ if (sPreviewSurface != null) {
+ sPreviewSurface.resetPresenter(presenter);
+ }
+ }
+
+ /**
+ * @return {@code True} if the display video surface has been created.
+ */
+ @Override
+ public boolean isDisplayVideoSurfaceCreated() {
+ boolean ret = sDisplaySurface != null && sDisplaySurface.getSurface() != null;
+ Log.d(this, " isDisplayVideoSurfaceCreated returns " + ret);
+ return ret;
+ }
+
+ /**
+ * @return {@code True} if the preview video surface has been created.
+ */
+ @Override
+ public boolean isPreviewVideoSurfaceCreated() {
+ boolean ret = sPreviewSurface != null && sPreviewSurface.getSurface() != null;
+ Log.d(this, " isPreviewVideoSurfaceCreated returns " + ret);
+ return ret;
+ }
+
+ /**
+ * {@link android.view.Surface} on which incoming video for a video call is displayed.
+ * {@code Null} until the video views {@link android.view.ViewStub} is inflated.
+ */
+ @Override
+ public Surface getDisplayVideoSurface() {
+ return sDisplaySurface == null ? null : sDisplaySurface.getSurface();
+ }
+
+ /**
+ * {@link android.view.Surface} on which a preview of the outgoing video for a video call is
+ * displayed. {@code Null} until the video views {@link android.view.ViewStub} is inflated.
+ */
+ @Override
+ public Surface getPreviewVideoSurface() {
+ return sPreviewSurface == null ? null : sPreviewSurface.getSurface();
+ }
+
+ /**
+ * Changes the dimensions of the preview surface. Called when the dimensions change due to a
+ * device orientation change.
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ @Override
+ public void setPreviewSize(int width, int height) {
+ Log.d(this, "setPreviewSize: width=" + width + " height=" + height);
+ if (sPreviewSurface != null) {
+ TextureView preview = sPreviewSurface.getTextureView();
+
+ if (preview == null ) {
+ return;
+ }
+
+ // Set the dimensions of both the video surface and the FrameLayout containing it.
+ ViewGroup.LayoutParams params = preview.getLayoutParams();
+ params.width = width;
+ params.height = height;
+ preview.setLayoutParams(params);
+
+ if (mPreviewVideoContainer != null) {
+ ViewGroup.LayoutParams containerParams = mPreviewVideoContainer.getLayoutParams();
+ containerParams.width = width;
+ containerParams.height = height;
+ mPreviewVideoContainer.setLayoutParams(containerParams);
+ }
+
+ // The width and height are interchanged outside of this method based on the current
+ // orientation, so we can transform using "width", which will be either the width or
+ // the height.
+ Matrix transform = new Matrix();
+ transform.setScale(-1, 1, width/2, 0);
+ preview.setTransform(transform);
+ }
+ }
+
+ /**
+ * Sets the rotation of the preview surface. Called when the dimensions change due to a
+ * device orientation change.
+ *
+ * Please note that the screen orientation passed in is subtracted from 360 to get the actual
+ * preview rotation values.
+ *
+ * @param rotation The screen orientation. One of -
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ */
+ @Override
+ public void setPreviewRotation(int orientation) {
+ Log.d(this, "setPreviewRotation: orientation=" + orientation);
+ if (sPreviewSurface != null) {
+ TextureView preview = sPreviewSurface.getTextureView();
+
+ if (preview == null ) {
+ return;
+ }
+
+ preview.setRotation(orientation);
+ }
+ }
+
+ @Override
+ public void setPreviewSurfaceSize(int width, int height) {
+ final boolean isPreviewSurfaceAvailable = sPreviewSurface != null;
+ Log.d(this, "setPreviewSurfaceSize: width=" + width + " height=" + height +
+ " isPreviewSurfaceAvailable=" + isPreviewSurfaceAvailable);
+ if (isPreviewSurfaceAvailable) {
+ sPreviewSurface.setSurfaceDimensions(width, height);
+ }
+ }
+
+ /**
+ * returns UI's current orientation.
+ */
+ @Override
+ public int getCurrentRotation() {
+ try {
+ return getActivity().getWindowManager().getDefaultDisplay().getRotation();
+ } catch (Exception e) {
+ Log.e(this, "getCurrentRotation: Retrieving current rotation failed. Ex=" + e);
+ }
+ return ORIENTATION_UNKNOWN;
+ }
+
+ /**
+ * Changes the dimensions of the display video surface. Called when the dimensions change due to
+ * a peer resolution update
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ @Override
+ public void setDisplayVideoSize(int width, int height) {
+ Log.v(this, "setDisplayVideoSize: width=" + width + " height=" + height);
+ if (sDisplaySurface != null) {
+ TextureView displayVideo = sDisplaySurface.getTextureView();
+ if (displayVideo == null) {
+ Log.e(this, "Display Video texture view is null. Bail out");
+ return;
+ }
+ sDisplaySize = new Point(width, height);
+ setSurfaceSizeAndTranslation(displayVideo, sDisplaySize);
+ } else {
+ Log.e(this, "Display Video Surface is null. Bail out");
+ }
+ }
+
+ /**
+ * Determines the size of the device screen.
+ *
+ * @return {@link Point} specifying the width and height of the screen.
+ */
+ @Override
+ public Point getScreenSize() {
+ // Get current screen size.
+ Display display = getActivity().getWindowManager().getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+
+ return size;
+ }
+
+ /**
+ * Determines the size of the preview surface.
+ *
+ * @return {@link Point} specifying the width and height of the preview surface.
+ */
+ @Override
+ public Point getPreviewSize() {
+ if (sPreviewSurface == null) {
+ return null;
+ }
+ return sPreviewSurface.getSurfaceDimensions();
+ }
+
+ /**
+ * Inflates the {@link ViewStub} containing the incoming and outgoing surfaces, if necessary,
+ * and creates {@link VideoCallSurface} instances to track the surfaces.
+ */
+ private void inflateVideoCallViews() {
+ Log.d(this, "inflateVideoCallViews");
+ if (mVideoViews == null ) {
+ mVideoViews = mVideoViewsStub.inflate();
+ }
+
+ if (mVideoViews != null) {
+ mPreviewVideoContainer = mVideoViews.findViewById(R.id.previewVideoContainer);
+ mCameraOff = mVideoViews.findViewById(R.id.previewCameraOff);
+ mPreviewPhoto = (ImageView) mVideoViews.findViewById(R.id.previewProfilePhoto);
+
+ TextureView displaySurface = (TextureView) mVideoViews.findViewById(R.id.incomingVideo);
+
+ Log.d(this, "inflateVideoCallViews: sVideoSurfacesInUse=" + sVideoSurfacesInUse);
+ //If peer adjusted screen size is not available, set screen size to default display size
+ Point screenSize = sDisplaySize == null ? getScreenSize() : sDisplaySize;
+ setSurfaceSizeAndTranslation(displaySurface, screenSize);
+
+ if (!sVideoSurfacesInUse) {
+ // Where the video surfaces are not already in use (first time creating them),
+ // setup new VideoCallSurface instances to track them.
+ Log.d(this, " inflateVideoCallViews screenSize" + screenSize);
+
+ sDisplaySurface = new VideoCallSurface(getPresenter(), SURFACE_DISPLAY,
+ (TextureView) mVideoViews.findViewById(R.id.incomingVideo), screenSize.x,
+ screenSize.y);
+ sPreviewSurface = new VideoCallSurface(getPresenter(), SURFACE_PREVIEW,
+ (TextureView) mVideoViews.findViewById(R.id.previewVideo));
+ sVideoSurfacesInUse = true;
+ } else {
+ // In this case, the video surfaces are already in use (we are recreating the
+ // Fragment after a destroy/create cycle resulting from a rotation.
+ sDisplaySurface.recreateView((TextureView) mVideoViews.findViewById(
+ R.id.incomingVideo));
+ sPreviewSurface.recreateView((TextureView) mVideoViews.findViewById(
+ R.id.previewVideo));
+ }
+
+ // Attempt to center the incoming video view, if it is in the layout.
+ final ViewTreeObserver observer = mVideoViews.getViewTreeObserver();
+ observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ // Check if the layout includes the incoming video surface -- this will only be the
+ // case for a video call.
+ View displayVideo = mVideoViews.findViewById(R.id.incomingVideo);
+ if (displayVideo != null) {
+ centerDisplayView(displayVideo);
+ }
+ mIsLayoutComplete = true;
+
+ // Remove the listener so we don't continually re-layout.
+ ViewTreeObserver observer = mVideoViews.getViewTreeObserver();
+ if (observer.isAlive()) {
+ observer.removeOnGlobalLayoutListener(this);
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * Resizes a surface so that it has the same size as the full screen and so that it is
+ * centered vertically below the call card.
+ *
+ * @param textureView The {@link TextureView} to resize and position.
+ * @param size The size of the screen.
+ */
+ private void setSurfaceSizeAndTranslation(TextureView textureView, Point size) {
+ // Set the surface to have that size.
+ ViewGroup.LayoutParams params = textureView.getLayoutParams();
+ params.width = size.x;
+ params.height = size.y;
+ textureView.setLayoutParams(params);
+ Log.d(this, "setSurfaceSizeAndTranslation: Size=" + size + "IsLayoutComplete=" +
+ mIsLayoutComplete + "IsLandscape=" + mIsLandscape);
+
+ // It is only possible to center the display view if layout of the views has completed.
+ // It is only after layout is complete that the dimensions of the Call Card has been
+ // established, which is a prerequisite to centering the view.
+ // Incoming video calls will center the view
+ if (mIsLayoutComplete) {
+ centerDisplayView(textureView);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/VideoCallPresenter.java b/InCallUI/src/com/android/incallui/VideoCallPresenter.java
new file mode 100644
index 0000000..ebdf820
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoCallPresenter.java
@@ -0,0 +1,1351 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Point;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.ContactsContract;
+import android.telecom.Connection;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.VideoProfile;
+import android.telecom.VideoProfile.CameraCapabilities;
+import android.view.Surface;
+import android.widget.ImageView;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallOrientationListener;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+import com.android.incallui.InCallVideoCallCallbackNotifier.SurfaceChangeListener;
+import com.android.incallui.InCallVideoCallCallbackNotifier.VideoEventListener;
+import com.android.incallui.compat.telecom.VideoProfileCompat;
+
+import java.util.Objects;
+
+/**
+ * Logic related to the {@link VideoCallFragment} and for managing changes to the video calling
+ * surfaces based on other user interface events and incoming events from the
+ * {@class VideoCallListener}.
+ * <p>
+ * When a call's video state changes to bi-directional video, the
+ * {@link com.android.incallui.VideoCallPresenter} performs the following negotiation with the
+ * telephony layer:
+ * <ul>
+ * <li>{@code VideoCallPresenter} creates and informs telephony of the display surface.</li>
+ * <li>{@code VideoCallPresenter} creates the preview surface.</li>
+ * <li>{@code VideoCallPresenter} informs telephony of the currently selected camera.</li>
+ * <li>Telephony layer sends {@link CameraCapabilities}, including the
+ * dimensions of the video for the current camera.</li>
+ * <li>{@code VideoCallPresenter} adjusts size of the preview surface to match the aspect
+ * ratio of the camera.</li>
+ * <li>{@code VideoCallPresenter} informs telephony of the new preview surface.</li>
+ * </ul>
+ * <p>
+ * When downgrading to an audio-only video state, the {@code VideoCallPresenter} nulls both
+ * surfaces.
+ */
+public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi> implements
+ IncomingCallListener, InCallOrientationListener, InCallStateListener,
+ InCallDetailsListener, SurfaceChangeListener, VideoEventListener,
+ InCallVideoCallCallbackNotifier.SessionModificationListener,
+ InCallPresenter.InCallEventListener {
+ public static final String TAG = "VideoCallPresenter";
+
+ public static final boolean DEBUG = false;
+
+ /**
+ * Runnable which is posted to schedule automatically entering fullscreen mode. Will not auto
+ * enter fullscreen mode if the dialpad is visible (doing so would make it impossible to exit
+ * the dialpad).
+ */
+ private Runnable mAutoFullscreenRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mAutoFullScreenPending && !InCallPresenter.getInstance().isDialpadVisible()) {
+ Log.v(this, "Automatically entering fullscreen mode.");
+ InCallPresenter.getInstance().setFullScreen(true);
+ mAutoFullScreenPending = false;
+ } else {
+ Log.v(this, "Skipping scheduled fullscreen mode.");
+ }
+ }
+ };
+
+ /**
+ * Defines the state of the preview surface negotiation with the telephony layer.
+ */
+ private class PreviewSurfaceState {
+ /**
+ * The camera has not yet been set on the {@link VideoCall}; negotiation has not yet
+ * started.
+ */
+ private static final int NONE = 0;
+
+ /**
+ * The camera has been set on the {@link VideoCall}, but camera capabilities have not yet
+ * been received.
+ */
+ private static final int CAMERA_SET = 1;
+
+ /**
+ * The camera capabilties have been received from telephony, but the surface has not yet
+ * been set on the {@link VideoCall}.
+ */
+ private static final int CAPABILITIES_RECEIVED = 2;
+
+ /**
+ * The surface has been set on the {@link VideoCall}.
+ */
+ private static final int SURFACE_SET = 3;
+ }
+
+ /**
+ * The minimum width or height of the preview surface. Used when re-sizing the preview surface
+ * to match the aspect ratio of the currently selected camera.
+ */
+ private float mMinimumVideoDimension;
+
+ /**
+ * The current context.
+ */
+ private Context mContext;
+
+ /**
+ * The call the video surfaces are currently related to
+ */
+ private Call mPrimaryCall;
+
+ /**
+ * The {@link VideoCall} used to inform the video telephony layer of changes to the video
+ * surfaces.
+ */
+ private VideoCall mVideoCall;
+
+ /**
+ * Determines if the current UI state represents a video call.
+ */
+ private int mCurrentVideoState;
+
+ /**
+ * Call's current state
+ */
+ private int mCurrentCallState = Call.State.INVALID;
+
+ /**
+ * Determines the device orientation (portrait/lanscape).
+ */
+ private int mDeviceOrientation = InCallOrientationEventListener.SCREEN_ORIENTATION_0;
+
+ /**
+ * Tracks the state of the preview surface negotiation with the telephony layer.
+ */
+ private int mPreviewSurfaceState = PreviewSurfaceState.NONE;
+
+ private static boolean mIsVideoMode = false;
+
+ /**
+ * Contact photo manager to retrieve cached contact photo information.
+ */
+ private ContactPhotoManager mContactPhotoManager = null;
+
+ /**
+ * The URI for the user's profile photo, or {@code null} if not specified.
+ */
+ private ContactInfoCache.ContactCacheEntry mProfileInfo = null;
+
+ /**
+ * UI thread handler used for delayed task execution.
+ */
+ private Handler mHandler;
+
+ /**
+ * Determines whether video calls should automatically enter full screen mode after
+ * {@link #mAutoFullscreenTimeoutMillis} milliseconds.
+ */
+ private boolean mIsAutoFullscreenEnabled = false;
+
+ /**
+ * Determines the number of milliseconds after which a video call will automatically enter
+ * fullscreen mode. Requires {@link #mIsAutoFullscreenEnabled} to be {@code true}.
+ */
+ private int mAutoFullscreenTimeoutMillis = 0;
+
+ /**
+ * Determines if the countdown is currently running to automatically enter full screen video
+ * mode.
+ */
+ private boolean mAutoFullScreenPending = false;
+
+ /**
+ * Initializes the presenter.
+ *
+ * @param context The current context.
+ */
+ public void init(Context context) {
+ mContext = context;
+ mMinimumVideoDimension = mContext.getResources().getDimension(
+ R.dimen.video_preview_small_dimension);
+ mHandler = new Handler(Looper.getMainLooper());
+ mIsAutoFullscreenEnabled = mContext.getResources()
+ .getBoolean(R.bool.video_call_auto_fullscreen);
+ mAutoFullscreenTimeoutMillis = mContext.getResources().getInteger(
+ R.integer.video_call_auto_fullscreen_timeout);
+ }
+
+ /**
+ * Called when the user interface is ready to be used.
+ *
+ * @param ui The Ui implementation that is now ready to be used.
+ */
+ @Override
+ public void onUiReady(VideoCallUi ui) {
+ super.onUiReady(ui);
+ Log.d(this, "onUiReady:");
+
+ // Do not register any listeners if video calling is not compatible to safeguard against
+ // any accidental calls of video calling code.
+ if (!CompatUtils.isVideoCompatible()) {
+ return;
+ }
+
+ // Register for call state changes last
+ InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addDetailsListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
+ InCallPresenter.getInstance().addOrientationListener(this);
+ // To get updates of video call details changes
+ InCallPresenter.getInstance().addDetailsListener(this);
+ InCallPresenter.getInstance().addInCallEventListener(this);
+
+ // Register for surface and video events from {@link InCallVideoCallListener}s.
+ InCallVideoCallCallbackNotifier.getInstance().addSurfaceChangeListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().addVideoEventListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().addSessionModificationListener(this);
+ mCurrentVideoState = VideoProfile.STATE_AUDIO_ONLY;
+ mCurrentCallState = Call.State.INVALID;
+ }
+
+ /**
+ * Called when the user interface is no longer ready to be used.
+ *
+ * @param ui The Ui implementation that is no longer ready to be used.
+ */
+ @Override
+ public void onUiUnready(VideoCallUi ui) {
+ super.onUiUnready(ui);
+ Log.d(this, "onUiUnready:");
+
+ if (!CompatUtils.isVideoCompatible()) {
+ return;
+ }
+
+ InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeDetailsListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ InCallPresenter.getInstance().removeOrientationListener(this);
+ InCallPresenter.getInstance().removeInCallEventListener(this);
+
+ InCallVideoCallCallbackNotifier.getInstance().removeSurfaceChangeListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().removeVideoEventListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().removeSessionModificationListener(this);
+ }
+
+ /**
+ * Handles the creation of a surface in the {@link VideoCallFragment}.
+ *
+ * @param surface The surface which was created.
+ */
+ public void onSurfaceCreated(int surface) {
+ Log.d(this, "onSurfaceCreated surface=" + surface + " mVideoCall=" + mVideoCall);
+ Log.d(this, "onSurfaceCreated PreviewSurfaceState=" + mPreviewSurfaceState);
+ Log.d(this, "onSurfaceCreated presenter=" + this);
+
+ final VideoCallUi ui = getUi();
+ if (ui == null || mVideoCall == null) {
+ Log.w(this, "onSurfaceCreated: Error bad state VideoCallUi=" + ui + " mVideoCall="
+ + mVideoCall);
+ return;
+ }
+
+ // If the preview surface has just been created and we have already received camera
+ // capabilities, but not yet set the surface, we will set the surface now.
+ if (surface == VideoCallFragment.SURFACE_PREVIEW ) {
+ if (mPreviewSurfaceState == PreviewSurfaceState.CAPABILITIES_RECEIVED) {
+ mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+ mVideoCall.setPreviewSurface(ui.getPreviewVideoSurface());
+ } else if (mPreviewSurfaceState == PreviewSurfaceState.NONE && isCameraRequired()){
+ enableCamera(mVideoCall, true);
+ }
+ } else if (surface == VideoCallFragment.SURFACE_DISPLAY) {
+ mVideoCall.setDisplaySurface(ui.getDisplayVideoSurface());
+ }
+ }
+
+ /**
+ * Handles structural changes (format or size) to a surface.
+ *
+ * @param surface The surface which changed.
+ * @param format The new PixelFormat of the surface.
+ * @param width The new width of the surface.
+ * @param height The new height of the surface.
+ */
+ public void onSurfaceChanged(int surface, int format, int width, int height) {
+ //Do stuff
+ }
+
+ /**
+ * Handles the destruction of a surface in the {@link VideoCallFragment}.
+ * Note: The surface is being released, that is, it is no longer valid.
+ *
+ * @param surface The surface which was destroyed.
+ */
+ public void onSurfaceReleased(int surface) {
+ Log.d(this, "onSurfaceReleased: mSurfaceId=" + surface);
+ if ( mVideoCall == null) {
+ Log.w(this, "onSurfaceReleased: VideoCall is null. mSurfaceId=" +
+ surface);
+ return;
+ }
+
+ if (surface == VideoCallFragment.SURFACE_DISPLAY) {
+ mVideoCall.setDisplaySurface(null);
+ } else if (surface == VideoCallFragment.SURFACE_PREVIEW) {
+ mVideoCall.setPreviewSurface(null);
+ enableCamera(mVideoCall, false);
+ }
+ }
+
+ /**
+ * Called by {@link VideoCallFragment} when the surface is detached from UI (TextureView).
+ * Note: The surface will be cached by {@link VideoCallFragment}, so we don't immediately
+ * null out incoming video surface.
+ * @see VideoCallPresenter#onSurfaceReleased(int)
+ *
+ * @param surface The surface which was detached.
+ */
+ public void onSurfaceDestroyed(int surface) {
+ Log.d(this, "onSurfaceDestroyed: mSurfaceId=" + surface);
+ if (mVideoCall == null) {
+ return;
+ }
+
+ final boolean isChangingConfigurations =
+ InCallPresenter.getInstance().isChangingConfigurations();
+ Log.d(this, "onSurfaceDestroyed: isChangingConfigurations=" + isChangingConfigurations);
+
+ if (surface == VideoCallFragment.SURFACE_PREVIEW) {
+ if (!isChangingConfigurations) {
+ enableCamera(mVideoCall, false);
+ } else {
+ Log.w(this, "onSurfaceDestroyed: Activity is being destroyed due "
+ + "to configuration changes. Not closing the camera.");
+ }
+ }
+ }
+
+ /**
+ * Handles clicks on the video surfaces by toggling full screen state.
+ * Informs the {@link InCallPresenter} of the change so that it can inform the
+ * {@link CallCardPresenter} of the change.
+ *
+ * @param surfaceId The video surface receiving the click.
+ */
+ public void onSurfaceClick(int surfaceId) {
+ boolean isFullscreen = InCallPresenter.getInstance().toggleFullscreenMode();
+ Log.v(this, "toggleFullScreen = " + isFullscreen);
+ }
+
+ /**
+ * Handles incoming calls.
+ *
+ * @param oldState The old in call state.
+ * @param newState The new in call state.
+ * @param call The call.
+ */
+ @Override
+ public void onIncomingCall(InCallPresenter.InCallState oldState,
+ InCallPresenter.InCallState newState, Call call) {
+ // same logic should happen as with onStateChange()
+ onStateChange(oldState, newState, CallList.getInstance());
+ }
+
+ /**
+ * Handles state changes (including incoming calls)
+ *
+ * @param newState The in call state.
+ * @param callList The call list.
+ */
+ @Override
+ public void onStateChange(InCallPresenter.InCallState oldState,
+ InCallPresenter.InCallState newState, CallList callList) {
+ Log.d(this, "onStateChange oldState" + oldState + " newState=" + newState +
+ " isVideoMode=" + isVideoMode());
+
+ if (newState == InCallPresenter.InCallState.NO_CALLS) {
+ if (isVideoMode()) {
+ exitVideoMode();
+ }
+
+ cleanupSurfaces();
+ }
+
+ // Determine the primary active call).
+ Call primary = null;
+
+ // Determine the call which is the focus of the user's attention. In the case of an
+ // incoming call waiting call, the primary call is still the active video call, however
+ // the determination of whether we should be in fullscreen mode is based on the type of the
+ // incoming call, not the active video call.
+ Call currentCall = null;
+
+ if (newState == InCallPresenter.InCallState.INCOMING) {
+ // We don't want to replace active video call (primary call)
+ // with a waiting call, since user may choose to ignore/decline the waiting call and
+ // this should have no impact on current active video call, that is, we should not
+ // change the camera or UI unless the waiting VT call becomes active.
+ primary = callList.getActiveCall();
+ currentCall = callList.getIncomingCall();
+ if (!VideoUtils.isActiveVideoCall(primary)) {
+ primary = callList.getIncomingCall();
+ }
+ } else if (newState == InCallPresenter.InCallState.OUTGOING) {
+ currentCall = primary = callList.getOutgoingCall();
+ } else if (newState == InCallPresenter.InCallState.PENDING_OUTGOING) {
+ currentCall = primary = callList.getPendingOutgoingCall();
+ } else if (newState == InCallPresenter.InCallState.INCALL) {
+ currentCall = primary = callList.getActiveCall();
+ }
+
+ final boolean primaryChanged = !Objects.equals(mPrimaryCall, primary);
+ Log.d(this, "onStateChange primaryChanged=" + primaryChanged);
+ Log.d(this, "onStateChange primary= " + primary);
+ Log.d(this, "onStateChange mPrimaryCall = " + mPrimaryCall);
+ if (primaryChanged) {
+ onPrimaryCallChanged(primary);
+ } else if (mPrimaryCall != null) {
+ updateVideoCall(primary);
+ }
+ updateCallCache(primary);
+
+ // If the call context changed, potentially exit fullscreen or schedule auto enter of
+ // fullscreen mode.
+ // If the current call context is no longer a video call, exit fullscreen mode.
+ maybeExitFullscreen(currentCall);
+ // Schedule auto-enter of fullscreen mode if the current call context is a video call
+ maybeAutoEnterFullscreen(currentCall);
+ }
+
+ /**
+ * Handles a change to the fullscreen mode of the app.
+ *
+ * @param isFullscreenMode {@code true} if the app is now fullscreen, {@code false} otherwise.
+ */
+ @Override
+ public void onFullscreenModeChanged(boolean isFullscreenMode) {
+ cancelAutoFullScreen();
+ }
+
+ /**
+ * Handles changes to the visibility of the secondary caller info bar.
+ *
+ * @param isVisible {@code true} if the secondary caller info is showing, {@code false}
+ * otherwise.
+ * @param height the height of the secondary caller info bar.
+ */
+ @Override
+ public void onSecondaryCallerInfoVisibilityChanged(boolean isVisible, int height) {
+ Log.d(this,
+ "onSecondaryCallerInfoVisibilityChanged : isVisible = " + isVisible + " height = "
+ + height);
+ getUi().adjustPreviewLocation(isVisible /* shiftUp */, height);
+ }
+
+ private void checkForVideoStateChange(Call call) {
+ final boolean isVideoCall = VideoUtils.isVideoCall(call);
+ final boolean hasVideoStateChanged = mCurrentVideoState != call.getVideoState();
+
+ Log.d(this, "checkForVideoStateChange: isVideoCall= " + isVideoCall
+ + " hasVideoStateChanged=" + hasVideoStateChanged + " isVideoMode="
+ + isVideoMode() + " previousVideoState: " +
+ VideoProfileCompat.videoStateToString(mCurrentVideoState) + " newVideoState: "
+ + VideoProfileCompat.videoStateToString(call.getVideoState()));
+
+ if (!hasVideoStateChanged) {
+ return;
+ }
+
+ updateCameraSelection(call);
+
+ if (isVideoCall) {
+ enterVideoMode(call);
+ } else if (isVideoMode()) {
+ exitVideoMode();
+ }
+ }
+
+ private void checkForCallStateChange(Call call) {
+ final boolean isVideoCall = VideoUtils.isVideoCall(call);
+ final boolean hasCallStateChanged = mCurrentCallState != call.getState();
+
+ Log.d(this, "checkForCallStateChange: isVideoCall= " + isVideoCall
+ + " hasCallStateChanged=" +
+ hasCallStateChanged + " isVideoMode=" + isVideoMode());
+
+ if (!hasCallStateChanged) {
+ return;
+ }
+
+ if (isVideoCall) {
+ final InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+
+ String prevCameraId = cameraManager.getActiveCameraId();
+ updateCameraSelection(call);
+ String newCameraId = cameraManager.getActiveCameraId();
+
+ if (!Objects.equals(prevCameraId, newCameraId) && VideoUtils.isActiveVideoCall(call)) {
+ enableCamera(call.getVideoCall(), true);
+ }
+ }
+
+ // Make sure we hide or show the video UI if needed.
+ showVideoUi(call.getVideoState(), call.getState());
+ }
+
+ private void cleanupSurfaces() {
+ final VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.w(this, "cleanupSurfaces");
+ return;
+ }
+ ui.cleanupSurfaces();
+ }
+
+ private void onPrimaryCallChanged(Call newPrimaryCall) {
+ final boolean isVideoCall = VideoUtils.isVideoCall(newPrimaryCall);
+ final boolean isVideoMode = isVideoMode();
+
+ Log.d(this, "onPrimaryCallChanged: isVideoCall=" + isVideoCall + " isVideoMode="
+ + isVideoMode);
+
+ if (!isVideoCall && isVideoMode) {
+ // Terminate video mode if new primary call is not a video call
+ // and we are currently in video mode.
+ Log.d(this, "onPrimaryCallChanged: Exiting video mode...");
+ exitVideoMode();
+ } else if (isVideoCall) {
+ Log.d(this, "onPrimaryCallChanged: Entering video mode...");
+
+ updateCameraSelection(newPrimaryCall);
+ enterVideoMode(newPrimaryCall);
+ }
+ }
+
+ private boolean isVideoMode() {
+ return mIsVideoMode;
+ }
+
+ private void updateCallCache(Call call) {
+ if (call == null) {
+ mCurrentVideoState = VideoProfile.STATE_AUDIO_ONLY;
+ mCurrentCallState = Call.State.INVALID;
+ mVideoCall = null;
+ mPrimaryCall = null;
+ } else {
+ mCurrentVideoState = call.getVideoState();
+ mVideoCall = call.getVideoCall();
+ mCurrentCallState = call.getState();
+ mPrimaryCall = call;
+ }
+ }
+
+ /**
+ * Handles changes to the details of the call. The {@link VideoCallPresenter} is interested in
+ * changes to the video state.
+ *
+ * @param call The call for which the details changed.
+ * @param details The new call details.
+ */
+ @Override
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details) {
+ Log.d(this, " onDetailsChanged call=" + call + " details=" + details + " mPrimaryCall="
+ + mPrimaryCall);
+ if (call == null) {
+ return;
+ }
+ // If the details change is not for the currently active call no update is required.
+ if (!call.equals(mPrimaryCall)) {
+ Log.d(this, " onDetailsChanged: Details not for current active call so returning. ");
+ return;
+ }
+
+ updateVideoCall(call);
+
+ updateCallCache(call);
+ }
+
+ private void updateVideoCall(Call call) {
+ checkForVideoCallChange(call);
+ checkForVideoStateChange(call);
+ checkForCallStateChange(call);
+ checkForOrientationAllowedChange(call);
+ }
+
+ private void checkForOrientationAllowedChange(Call call) {
+ InCallPresenter.getInstance().setInCallAllowsOrientationChange(
+ VideoUtils.isVideoCall(call));
+ }
+
+ /**
+ * Checks for a change to the video call and changes it if required.
+ */
+ private void checkForVideoCallChange(Call call) {
+ final VideoCall videoCall = call.getTelecomCall().getVideoCall();
+ Log.d(this, "checkForVideoCallChange: videoCall=" + videoCall + " mVideoCall="
+ + mVideoCall);
+ if (!Objects.equals(videoCall, mVideoCall)) {
+ changeVideoCall(call);
+ }
+ }
+
+ /**
+ * Handles a change to the video call. Sets the surfaces on the previous call to null and sets
+ * the surfaces on the new video call accordingly.
+ *
+ * @param videoCall The new video call.
+ */
+ private void changeVideoCall(Call call) {
+ final VideoCall videoCall = call.getTelecomCall().getVideoCall();
+ Log.d(this, "changeVideoCall to videoCall=" + videoCall + " mVideoCall=" + mVideoCall);
+ // Null out the surfaces on the previous video call.
+ if (mVideoCall != null) {
+ // Log.d(this, "Null out the surfaces on the previous video call.");
+ // mVideoCall.setDisplaySurface(null);
+ // mVideoCall.setPreviewSurface(null);
+ }
+
+ final boolean hasChanged = mVideoCall == null && videoCall != null;
+
+ mVideoCall = videoCall;
+ if (mVideoCall == null || call == null) {
+ Log.d(this, "Video call or primary call is null. Return");
+ return;
+ }
+
+ if (VideoUtils.isVideoCall(call) && hasChanged) {
+ enterVideoMode(call);
+ }
+ }
+
+ private static boolean isCameraRequired(int videoState) {
+ return VideoProfileCompat.isBidirectional(videoState) ||
+ VideoProfileCompat.isTransmissionEnabled(videoState);
+ }
+
+ private boolean isCameraRequired() {
+ return mPrimaryCall != null && isCameraRequired(mPrimaryCall.getVideoState());
+ }
+
+ /**
+ * Enters video mode by showing the video surfaces and making other adjustments (eg. audio).
+ * TODO(vt): Need to adjust size and orientation of preview surface here.
+ */
+ private void enterVideoMode(Call call) {
+ VideoCall videoCall = call.getVideoCall();
+ int newVideoState = call.getVideoState();
+
+ Log.d(this, "enterVideoMode videoCall= " + videoCall + " videoState: " + newVideoState);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "Error VideoCallUi is null so returning");
+ return;
+ }
+
+ showVideoUi(newVideoState, call.getState());
+
+ // Communicate the current camera to telephony and make a request for the camera
+ // capabilities.
+ if (videoCall != null) {
+ if (ui.isDisplayVideoSurfaceCreated()) {
+ Log.d(this, "Calling setDisplaySurface with " + ui.getDisplayVideoSurface());
+ videoCall.setDisplaySurface(ui.getDisplayVideoSurface());
+ }
+
+ videoCall.setDeviceOrientation(mDeviceOrientation);
+ enableCamera(videoCall, isCameraRequired(newVideoState));
+ }
+ mCurrentVideoState = newVideoState;
+
+ mIsVideoMode = true;
+
+ maybeAutoEnterFullscreen(call);
+ }
+
+ private static boolean isSpeakerEnabledForVideoCalls() {
+ // TODO: Make this a carrier configurable setting. For now this is always true. b/20090407
+ return true;
+ }
+
+ private void enableCamera(VideoCall videoCall, boolean isCameraRequired) {
+ Log.d(this, "enableCamera: VideoCall=" + videoCall + " enabling=" + isCameraRequired);
+ if (videoCall == null) {
+ Log.w(this, "enableCamera: VideoCall is null.");
+ return;
+ }
+
+ if (isCameraRequired) {
+ InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+ videoCall.setCamera(cameraManager.getActiveCameraId());
+ mPreviewSurfaceState = PreviewSurfaceState.CAMERA_SET;
+
+ videoCall.requestCameraCapabilities();
+ } else {
+ mPreviewSurfaceState = PreviewSurfaceState.NONE;
+ videoCall.setCamera(null);
+ }
+ }
+
+ /**
+ * Exits video mode by hiding the video surfaces and making other adjustments (eg. audio).
+ */
+ private void exitVideoMode() {
+ Log.d(this, "exitVideoMode");
+
+ showVideoUi(VideoProfile.STATE_AUDIO_ONLY, Call.State.ACTIVE);
+ enableCamera(mVideoCall, false);
+ InCallPresenter.getInstance().setFullScreen(false);
+
+ mIsVideoMode = false;
+ }
+
+ /**
+ * Based on the current video state and call state, show or hide the incoming and
+ * outgoing video surfaces. The outgoing video surface is shown any time video is transmitting.
+ * The incoming video surface is shown whenever the video is un-paused and active.
+ *
+ * @param videoState The video state.
+ * @param callState The call state.
+ */
+ private void showVideoUi(int videoState, int callState) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "showVideoUi, VideoCallUi is null returning");
+ return;
+ }
+ boolean showIncomingVideo = showIncomingVideo(videoState, callState);
+ boolean showOutgoingVideo = showOutgoingVideo(videoState);
+ Log.v(this, "showVideoUi : showIncoming = " + showIncomingVideo + " showOutgoing = "
+ + showOutgoingVideo);
+ if (showIncomingVideo || showOutgoingVideo) {
+ ui.showVideoViews(showOutgoingVideo, showIncomingVideo);
+
+ if (VideoProfileCompat.isReceptionEnabled(videoState)) {
+ loadProfilePhotoAsync();
+ }
+ } else {
+ ui.hideVideoUi();
+ }
+
+ InCallPresenter.getInstance().enableScreenTimeout(
+ VideoProfileCompat.isAudioOnly(videoState));
+ }
+
+ /**
+ * Determines if the incoming video surface should be shown based on the current videoState and
+ * callState. The video surface is shown when incoming video is not paused, the call is active,
+ * and video reception is enabled.
+ *
+ * @param videoState The current video state.
+ * @param callState The current call state.
+ * @return {@code true} if the incoming video surface should be shown, {@code false} otherwise.
+ */
+ public static boolean showIncomingVideo(int videoState, int callState) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ boolean isPaused = VideoProfileCompat.isPaused(videoState);
+ boolean isCallActive = callState == Call.State.ACTIVE;
+
+ return !isPaused && isCallActive && VideoProfileCompat.isReceptionEnabled(videoState);
+ }
+
+ /**
+ * Determines if the outgoing video surface should be shown based on the current videoState.
+ * The video surface is shown if video transmission is enabled.
+ *
+ * @param videoState The current video state.
+ * @return {@code true} if the the outgoing video surface should be shown, {@code false}
+ * otherwise.
+ */
+ public static boolean showOutgoingVideo(int videoState) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ return VideoProfileCompat.isTransmissionEnabled(videoState);
+ }
+
+ /**
+ * Handles peer video pause state changes.
+ *
+ * @param call The call which paused or un-pausedvideo transmission.
+ * @param paused {@code True} when the video transmission is paused, {@code false} when video
+ * transmission resumes.
+ */
+ @Override
+ public void onPeerPauseStateChanged(Call call, boolean paused) {
+ if (!call.equals(mPrimaryCall)) {
+ return;
+ }
+
+ // TODO(vt): Show/hide the peer contact photo.
+ }
+
+ /**
+ * Handles peer video dimension changes.
+ *
+ * @param call The call which experienced a peer video dimension change.
+ * @param width The new peer video width .
+ * @param height The new peer video height.
+ */
+ @Override
+ public void onUpdatePeerDimensions(Call call, int width, int height) {
+ Log.d(this, "onUpdatePeerDimensions: width= " + width + " height= " + height);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "VideoCallUi is null. Bail out");
+ return;
+ }
+ if (!call.equals(mPrimaryCall)) {
+ Log.e(this, "Current call is not equal to primary call. Bail out");
+ return;
+ }
+
+ // Change size of display surface to match the peer aspect ratio
+ if (width > 0 && height > 0) {
+ setDisplayVideoSize(width, height);
+ }
+ }
+
+ /**
+ * Handles any video quality changes in the call.
+ *
+ * @param call The call which experienced a video quality change.
+ * @param videoQuality The new video call quality.
+ */
+ @Override
+ public void onVideoQualityChanged(Call call, int videoQuality) {
+ // No-op
+ }
+
+ /**
+ * Handles a change to the dimensions of the local camera. Receiving the camera capabilities
+ * triggers the creation of the video
+ *
+ * @param call The call which experienced the camera dimension change.
+ * @param width The new camera video width.
+ * @param height The new camera video height.
+ */
+ @Override
+ public void onCameraDimensionsChange(Call call, int width, int height) {
+ Log.d(this, "onCameraDimensionsChange call=" + call + " width=" + width + " height="
+ + height);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "onCameraDimensionsChange ui is null");
+ return;
+ }
+
+ if (!call.equals(mPrimaryCall)) {
+ Log.e(this, "Call is not primary call");
+ return;
+ }
+
+ mPreviewSurfaceState = PreviewSurfaceState.CAPABILITIES_RECEIVED;
+ changePreviewDimensions(width, height);
+
+ // Check if the preview surface is ready yet; if it is, set it on the {@code VideoCall}.
+ // If it not yet ready, it will be set when when creation completes.
+ if (ui.isPreviewVideoSurfaceCreated()) {
+ mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+ mVideoCall.setPreviewSurface(ui.getPreviewVideoSurface());
+ }
+ }
+
+ /**
+ * Changes the dimensions of the preview surface.
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ private void changePreviewDimensions(int width, int height) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ // Resize the surface used to display the preview video
+ ui.setPreviewSurfaceSize(width, height);
+
+ // Configure the preview surface to the correct aspect ratio.
+ float aspectRatio = 1.0f;
+ if (width > 0 && height > 0) {
+ aspectRatio = (float) width / (float) height;
+ }
+
+ // Resize the textureview housing the preview video and rotate it appropriately based on
+ // the device orientation
+ setPreviewSize(mDeviceOrientation, aspectRatio);
+ }
+
+ /**
+ * Called when call session event is raised.
+ *
+ * @param event The call session event.
+ */
+ @Override
+ public void onCallSessionEvent(int event) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("onCallSessionEvent = ");
+
+ switch (event) {
+ case Connection.VideoProvider.SESSION_EVENT_RX_PAUSE:
+ sb.append("rx_pause");
+ break;
+ case Connection.VideoProvider.SESSION_EVENT_RX_RESUME:
+ sb.append("rx_resume");
+ break;
+ case Connection.VideoProvider.SESSION_EVENT_CAMERA_FAILURE:
+ sb.append("camera_failure");
+ break;
+ case Connection.VideoProvider.SESSION_EVENT_CAMERA_READY:
+ sb.append("camera_ready");
+ break;
+ default:
+ sb.append("unknown event = ");
+ sb.append(event);
+ break;
+ }
+ Log.d(this, sb.toString());
+ }
+
+ /**
+ * Handles a change to the call data usage
+ *
+ * @param dataUsage call data usage value
+ */
+ @Override
+ public void onCallDataUsageChange(long dataUsage) {
+ Log.d(this, "onCallDataUsageChange dataUsage=" + dataUsage);
+ }
+
+ /**
+ * Handles changes to the device orientation.
+ * @param orientation The screen orientation of the device (one of:
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ */
+ @Override
+ public void onDeviceOrientationChanged(int orientation) {
+ mDeviceOrientation = orientation;
+
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "onDeviceOrientationChanged: VideoCallUi is null");
+ return;
+ }
+
+ Point previewDimensions = ui.getPreviewSize();
+ if (previewDimensions == null) {
+ return;
+ }
+ Log.d(this, "onDeviceOrientationChanged: orientation=" + orientation + " size: "
+ + previewDimensions);
+ changePreviewDimensions(previewDimensions.x, previewDimensions.y);
+
+ ui.setPreviewRotation(mDeviceOrientation);
+ }
+
+ /**
+ * Handles an incoming upgrade to video request.
+ *
+ * @param call The call the request was received for.
+ * @param videoState The video state that the request wants to upgrade to.
+ */
+ @Override
+ public void onUpgradeToVideoRequest(Call call, int videoState) {
+ Log.d(this, "onUpgradeToVideoRequest call = " + call + " new video state = " + videoState);
+ if (mPrimaryCall == null || !Call.areSame(mPrimaryCall, call)) {
+ Log.w(this, "UpgradeToVideoRequest received for non-primary call");
+ }
+
+ if (call == null) {
+ return;
+ }
+
+ call.setRequestedVideoState(videoState);
+ }
+
+ @Override
+ public void onUpgradeToVideoSuccess(Call call) {
+ Log.d(this, "onUpgradeToVideoSuccess call=" + call);
+ if (mPrimaryCall == null || !Call.areSame(mPrimaryCall, call)) {
+ Log.w(this, "UpgradeToVideoSuccess received for non-primary call");
+ }
+
+ if (call == null) {
+ return;
+ }
+ }
+
+ @Override
+ public void onUpgradeToVideoFail(int status, Call call) {
+ Log.d(this, "onUpgradeToVideoFail call=" + call);
+ if (mPrimaryCall == null || !Call.areSame(mPrimaryCall, call)) {
+ Log.w(this, "UpgradeToVideoFail received for non-primary call");
+ }
+
+ if (call == null) {
+ return;
+ }
+ }
+
+ @Override
+ public void onDowngradeToAudio(Call call) {
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ // exit video mode
+ exitVideoMode();
+ }
+
+ /**
+ * Sets the preview surface size based on the current device orientation.
+ * See: {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ *
+ * @param orientation The device orientation
+ * @param aspectRatio The aspect ratio of the camera (width / height).
+ */
+ private void setPreviewSize(int orientation, float aspectRatio) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ int height;
+ int width;
+
+ if (orientation == InCallOrientationEventListener.SCREEN_ORIENTATION_90 ||
+ orientation == InCallOrientationEventListener.SCREEN_ORIENTATION_270) {
+ width = (int) (mMinimumVideoDimension * aspectRatio);
+ height = (int) mMinimumVideoDimension;
+ } else {
+ // Portrait or reverse portrait orientation.
+ width = (int) mMinimumVideoDimension;
+ height = (int) (mMinimumVideoDimension * aspectRatio);
+ }
+ ui.setPreviewSize(width, height);
+ }
+
+ /**
+ * Sets the display video surface size based on peer width and height
+ *
+ * @param width peer width
+ * @param height peer height
+ */
+ private void setDisplayVideoSize(int width, int height) {
+ Log.v(this, "setDisplayVideoSize: Received peer width=" + width + " height=" + height);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ // Get current display size
+ Point size = ui.getScreenSize();
+ Log.v(this, "setDisplayVideoSize: windowmgr width=" + size.x
+ + " windowmgr height=" + size.y);
+ if (size.y * width > size.x * height) {
+ // current display height is too much. Correct it
+ size.y = (int) (size.x * height / width);
+ } else if (size.y * width < size.x * height) {
+ // current display width is too much. Correct it
+ size.x = (int) (size.y * width / height);
+ }
+ ui.setDisplayVideoSize(size.x, size.y);
+ }
+
+ /**
+ * Exits fullscreen mode if the current call context has changed to a non-video call.
+ *
+ * @param call The call.
+ */
+ protected void maybeExitFullscreen(Call call) {
+ if (call == null) {
+ return;
+ }
+
+ if (!VideoUtils.isVideoCall(call) || call.getState() == Call.State.INCOMING) {
+ InCallPresenter.getInstance().setFullScreen(false);
+ }
+ }
+
+ /**
+ * Schedules auto-entering of fullscreen mode.
+ * Will not enter full screen mode if any of the following conditions are met:
+ * 1. No call
+ * 2. Call is not active
+ * 3. Call is not video call
+ * 4. Already in fullscreen mode
+ *
+ * @param call The current call.
+ */
+ protected void maybeAutoEnterFullscreen(Call call) {
+ if (!mIsAutoFullscreenEnabled) {
+ return;
+ }
+
+ if (call == null || (
+ call != null && (call.getState() != Call.State.ACTIVE ||
+ !VideoUtils.isVideoCall(call)) ||
+ InCallPresenter.getInstance().isFullscreen())) {
+ // Ensure any previously scheduled attempt to enter fullscreen is cancelled.
+ cancelAutoFullScreen();
+ return;
+ }
+
+ if (mAutoFullScreenPending) {
+ Log.v(this, "maybeAutoEnterFullscreen : already pending.");
+ return;
+ }
+ Log.v(this, "maybeAutoEnterFullscreen : scheduled");
+ mAutoFullScreenPending = true;
+ mHandler.postDelayed(mAutoFullscreenRunnable, mAutoFullscreenTimeoutMillis);
+ }
+
+ /**
+ * Cancels pending auto fullscreen mode.
+ */
+ public void cancelAutoFullScreen() {
+ if (!mAutoFullScreenPending) {
+ Log.v(this, "cancelAutoFullScreen : none pending.");
+ return;
+ }
+ Log.v(this, "cancelAutoFullScreen : cancelling pending");
+ mAutoFullScreenPending = false;
+ }
+
+ private static boolean isAudioRouteEnabled(int audioRoute, int audioRouteMask) {
+ return ((audioRoute & audioRouteMask) != 0);
+ }
+
+ private static void updateCameraSelection(Call call) {
+ Log.d(TAG, "updateCameraSelection: call=" + call);
+ Log.d(TAG, "updateCameraSelection: call=" + toSimpleString(call));
+
+ final Call activeCall = CallList.getInstance().getActiveCall();
+ int cameraDir = Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+
+ // this function should never be called with null call object, however if it happens we
+ // should handle it gracefully.
+ if (call == null) {
+ cameraDir = Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+ com.android.incallui.Log.e(TAG, "updateCameraSelection: Call object is null."
+ + " Setting camera direction to default value (CAMERA_DIRECTION_UNKNOWN)");
+ }
+
+ // Clear camera direction if this is not a video call.
+ else if (VideoUtils.isAudioCall(call)) {
+ cameraDir = Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+ call.getVideoSettings().setCameraDir(cameraDir);
+ }
+
+ // If this is a waiting video call, default to active call's camera,
+ // since we don't want to change the current camera for waiting call
+ // without user's permission.
+ else if (VideoUtils.isVideoCall(activeCall) && VideoUtils.isIncomingVideoCall(call)) {
+ cameraDir = activeCall.getVideoSettings().getCameraDir();
+ }
+
+ // Infer the camera direction from the video state and store it,
+ // if this is an outgoing video call.
+ else if (VideoUtils.isOutgoingVideoCall(call) && !isCameraDirectionSet(call) ) {
+ cameraDir = toCameraDirection(call.getVideoState());
+ call.getVideoSettings().setCameraDir(cameraDir);
+ }
+
+ // Use the stored camera dir if this is an outgoing video call for which camera direction
+ // is set.
+ else if (VideoUtils.isOutgoingVideoCall(call)) {
+ cameraDir = call.getVideoSettings().getCameraDir();
+ }
+
+ // Infer the camera direction from the video state and store it,
+ // if this is an active video call and camera direction is not set.
+ else if (VideoUtils.isActiveVideoCall(call) && !isCameraDirectionSet(call)) {
+ cameraDir = toCameraDirection(call.getVideoState());
+ call.getVideoSettings().setCameraDir(cameraDir);
+ }
+
+ // Use the stored camera dir if this is an active video call for which camera direction
+ // is set.
+ else if (VideoUtils.isActiveVideoCall(call)) {
+ cameraDir = call.getVideoSettings().getCameraDir();
+ }
+
+ // For all other cases infer the camera direction but don't store it in the call object.
+ else {
+ cameraDir = toCameraDirection(call.getVideoState());
+ }
+
+ com.android.incallui.Log.d(TAG, "updateCameraSelection: Setting camera direction to " +
+ cameraDir + " Call=" + call);
+ final InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+ cameraManager.setUseFrontFacingCamera(cameraDir ==
+ Call.VideoSettings.CAMERA_DIRECTION_FRONT_FACING);
+ }
+
+ private static int toCameraDirection(int videoState) {
+ return VideoProfileCompat.isTransmissionEnabled(videoState) &&
+ !VideoProfileCompat.isBidirectional(videoState)
+ ? Call.VideoSettings.CAMERA_DIRECTION_BACK_FACING
+ : Call.VideoSettings.CAMERA_DIRECTION_FRONT_FACING;
+ }
+
+ private static boolean isCameraDirectionSet(Call call) {
+ return VideoUtils.isVideoCall(call) && call.getVideoSettings().getCameraDir()
+ != Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+ }
+
+ private static String toSimpleString(Call call) {
+ return call == null ? null : call.toSimpleString();
+ }
+
+ /**
+ * Starts an asynchronous load of the user's profile photo.
+ */
+ public void loadProfilePhotoAsync() {
+ final VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
+ /**
+ * Performs asynchronous load of the user profile information.
+ *
+ * @param params The parameters of the task.
+ *
+ * @return {@code null}.
+ */
+ @Override
+ protected Void doInBackground(Void... params) {
+ if (mProfileInfo == null) {
+ // Try and read the photo URI from the local profile.
+ mProfileInfo = new ContactInfoCache.ContactCacheEntry();
+ final Cursor cursor = mContext.getContentResolver().query(
+ ContactsContract.Profile.CONTENT_URI, new String[]{
+ ContactsContract.CommonDataKinds.Phone._ID,
+ ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
+ ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
+ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
+ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_ALTERNATIVE
+ }, null, null, null);
+ if (cursor != null) {
+ try {
+ if (cursor.moveToFirst()) {
+ mProfileInfo.lookupKey = cursor.getString(cursor.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY));
+ String photoUri = cursor.getString(cursor.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
+ mProfileInfo.displayPhotoUri = photoUri == null ? null
+ : Uri.parse(photoUri);
+ mProfileInfo.namePrimary = cursor.getString(cursor.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
+ mProfileInfo.nameAlternative = cursor.getString(
+ cursor.getColumnIndex(ContactsContract.CommonDataKinds
+ .Phone.DISPLAY_NAME_ALTERNATIVE));
+ }
+ } finally {
+ cursor.close();
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ // If user profile information was found, issue an async request to load the user's
+ // profile photo.
+ if (mProfileInfo != null) {
+ if (mContactPhotoManager == null) {
+ mContactPhotoManager = ContactPhotoManager.getInstance(mContext);
+ }
+ ContactPhotoManager.DefaultImageRequest imageRequest = (mProfileInfo != null)
+ ? null :
+ new ContactPhotoManager.DefaultImageRequest(mProfileInfo.namePrimary,
+ mProfileInfo.lookupKey, false /* isCircularPhoto */);
+
+ ImageView photoView = ui.getPreviewPhotoView();
+ if (photoView == null) {
+ return;
+ }
+ mContactPhotoManager.loadDirectoryPhoto(photoView,
+ mProfileInfo.displayPhotoUri,
+ false /* darkTheme */, false /* isCircular */, imageRequest);
+ }
+ }
+ };
+
+ task.execute();
+ }
+
+ /**
+ * Defines the VideoCallUI interactions.
+ */
+ public interface VideoCallUi extends Ui {
+ void showVideoViews(boolean showPreview, boolean showIncoming);
+ void hideVideoUi();
+ boolean isDisplayVideoSurfaceCreated();
+ boolean isPreviewVideoSurfaceCreated();
+ Surface getDisplayVideoSurface();
+ Surface getPreviewVideoSurface();
+ int getCurrentRotation();
+ void setPreviewSize(int width, int height);
+ void setPreviewSurfaceSize(int width, int height);
+ void setDisplayVideoSize(int width, int height);
+ Point getScreenSize();
+ Point getPreviewSize();
+ void cleanupSurfaces();
+ ImageView getPreviewPhotoView();
+ void adjustPreviewLocation(boolean shiftUp, int offset);
+ void setPreviewRotation(int orientation);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/VideoPauseController.java b/InCallUI/src/com/android/incallui/VideoPauseController.java
new file mode 100644
index 0000000..070448e
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoPauseController.java
@@ -0,0 +1,458 @@
+/*
+ * 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.incallui;
+
+import com.android.incallui.Call.State;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+import com.android.incallui.InCallVideoCallCallbackNotifier.SessionModificationListener;
+import com.google.common.base.Preconditions;
+
+/**
+ * This class is responsible for generating video pause/resume requests when the InCall UI is sent
+ * to the background and subsequently brought back to the foreground.
+ */
+class VideoPauseController implements InCallStateListener, IncomingCallListener,
+ SessionModificationListener {
+ private static final String TAG = "VideoPauseController";
+
+ /**
+ * Keeps track of the current active/foreground call.
+ */
+ private class CallContext {
+ public CallContext(Call call) {
+ Preconditions.checkNotNull(call);
+ update(call);
+ }
+
+ public void update(Call call) {
+ mCall = Preconditions.checkNotNull(call);
+ mState = call.getState();
+ mVideoState = call.getVideoState();
+ }
+
+ public int getState() {
+ return mState;
+ }
+
+ public int getVideoState() {
+ return mVideoState;
+ }
+
+ public String toString() {
+ return String.format("CallContext {CallId=%s, State=%s, VideoState=%d}",
+ mCall.getId(), mState, mVideoState);
+ }
+
+ public Call getCall() {
+ return mCall;
+ }
+
+ private int mState = State.INVALID;
+ private int mVideoState;
+ private Call mCall;
+ }
+
+ private InCallPresenter mInCallPresenter;
+ private static VideoPauseController sVideoPauseController;
+
+ /**
+ * The current call context, if applicable.
+ */
+ private CallContext mPrimaryCallContext = null;
+
+ /**
+ * Tracks whether the application is in the background. {@code True} if the application is in
+ * the background, {@code false} otherwise.
+ */
+ private boolean mIsInBackground = false;
+
+ /**
+ * Singleton accessor for the {@link VideoPauseController}.
+ * @return Singleton instance of the {@link VideoPauseController}.
+ */
+ /*package*/
+ static synchronized VideoPauseController getInstance() {
+ if (sVideoPauseController == null) {
+ sVideoPauseController = new VideoPauseController();
+ }
+ return sVideoPauseController;
+ }
+
+ /**
+ * Configures the {@link VideoPauseController} to listen to call events. Configured via the
+ * {@link com.android.incallui.InCallPresenter}.
+ *
+ * @param inCallPresenter The {@link com.android.incallui.InCallPresenter}.
+ */
+ public void setUp(InCallPresenter inCallPresenter) {
+ log("setUp");
+ mInCallPresenter = Preconditions.checkNotNull(inCallPresenter);
+ mInCallPresenter.addListener(this);
+ mInCallPresenter.addIncomingCallListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().addSessionModificationListener(this);
+ }
+
+ /**
+ * Cleans up the {@link VideoPauseController} by removing all listeners and clearing its
+ * internal state. Called from {@link com.android.incallui.InCallPresenter}.
+ */
+ public void tearDown() {
+ log("tearDown...");
+ InCallVideoCallCallbackNotifier.getInstance().removeSessionModificationListener(this);
+ mInCallPresenter.removeListener(this);
+ mInCallPresenter.removeIncomingCallListener(this);
+ clear();
+ }
+
+ /**
+ * Clears the internal state for the {@link VideoPauseController}.
+ */
+ private void clear() {
+ mInCallPresenter = null;
+ mPrimaryCallContext = null;
+ mIsInBackground = false;
+ }
+
+ /**
+ * Handles changes in the {@link InCallState}. Triggers pause and resumption of video for the
+ * current foreground call.
+ *
+ * @param oldState The previous {@link InCallState}.
+ * @param newState The current {@link InCallState}.
+ * @param callList List of current call.
+ */
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ log("onStateChange, OldState=" + oldState + " NewState=" + newState);
+
+ Call call = null;
+ if (newState == InCallState.INCOMING) {
+ call = callList.getIncomingCall();
+ } else if (newState == InCallState.WAITING_FOR_ACCOUNT) {
+ call = callList.getWaitingForAccountCall();
+ } else if (newState == InCallState.PENDING_OUTGOING) {
+ call = callList.getPendingOutgoingCall();
+ } else if (newState == InCallState.OUTGOING) {
+ call = callList.getOutgoingCall();
+ } else {
+ call = callList.getActiveCall();
+ }
+
+ boolean hasPrimaryCallChanged = !areSame(call, mPrimaryCallContext);
+ boolean canVideoPause = VideoUtils.canVideoPause(call);
+ log("onStateChange, hasPrimaryCallChanged=" + hasPrimaryCallChanged);
+ log("onStateChange, canVideoPause=" + canVideoPause);
+ log("onStateChange, IsInBackground=" + mIsInBackground);
+
+ if (hasPrimaryCallChanged) {
+ onPrimaryCallChanged(call);
+ return;
+ }
+
+ if (isDialing(mPrimaryCallContext) && canVideoPause && mIsInBackground) {
+ // Bring UI to foreground if outgoing request becomes active while UI is in
+ // background.
+ bringToForeground();
+ } else if (!isVideoCall(mPrimaryCallContext) && canVideoPause && mIsInBackground) {
+ // Bring UI to foreground if VoLTE call becomes active while UI is in
+ // background.
+ bringToForeground();
+ }
+
+ updatePrimaryCallContext(call);
+ }
+
+ /**
+ * Handles a change to the primary call.
+ * <p>
+ * Reject incoming or hangup dialing call: Where the previous call was an incoming call or a
+ * call in dialing state, resume the new primary call.
+ * Call swap: Where the new primary call is incoming, pause video on the previous primary call.
+ *
+ * @param call The new primary call.
+ */
+ private void onPrimaryCallChanged(Call call) {
+ log("onPrimaryCallChanged: New call = " + call);
+ log("onPrimaryCallChanged: Old call = " + mPrimaryCallContext);
+ log("onPrimaryCallChanged, IsInBackground=" + mIsInBackground);
+
+ Preconditions.checkState(!areSame(call, mPrimaryCallContext));
+ final boolean canVideoPause = VideoUtils.canVideoPause(call);
+
+ if ((isIncomingCall(mPrimaryCallContext) || isDialing(mPrimaryCallContext))
+ && canVideoPause && !mIsInBackground) {
+ // Send resume request for the active call, if user rejects incoming call or ends
+ // dialing call and UI is in the foreground.
+ sendRequest(call, true);
+ } else if (isIncomingCall(call) && canVideoPause(mPrimaryCallContext)) {
+ // Send pause request if there is an active video call, and we just received a new
+ // incoming call.
+ sendRequest(mPrimaryCallContext.getCall(), false);
+ }
+
+ updatePrimaryCallContext(call);
+ }
+
+ /**
+ * Handles new incoming calls by triggering a change in the primary call.
+ *
+ * @param oldState the old {@link InCallState}.
+ * @param newState the new {@link InCallState}.
+ * @param call the incoming call.
+ */
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ log("onIncomingCall, OldState=" + oldState + " NewState=" + newState + " Call=" + call);
+
+ if (areSame(call, mPrimaryCallContext)) {
+ return;
+ }
+
+ onPrimaryCallChanged(call);
+ }
+
+ /**
+ * Caches a reference to the primary call and stores its previous state.
+ *
+ * @param call The new primary call.
+ */
+ private void updatePrimaryCallContext(Call call) {
+ if (call == null) {
+ mPrimaryCallContext = null;
+ } else if (mPrimaryCallContext != null) {
+ mPrimaryCallContext.update(call);
+ } else {
+ mPrimaryCallContext = new CallContext(call);
+ }
+ }
+
+ /**
+ * Called when UI goes in/out of the foreground.
+ * @param showing true if UI is in the foreground, false otherwise.
+ */
+ public void onUiShowing(boolean showing) {
+ // Only send pause/unpause requests if we are in the INCALL state.
+ if (mInCallPresenter == null || mInCallPresenter.getInCallState() != InCallState.INCALL) {
+ return;
+ }
+
+ if (showing) {
+ onResume();
+ } else {
+ onPause();
+ }
+ }
+
+ /**
+ * Handles requests to upgrade to video.
+ *
+ * @param call The call the request was received for.
+ * @param videoState The video state that the request wants to upgrade to.
+ */
+ @Override
+ public void onUpgradeToVideoRequest(Call call, int videoState) {
+ // Not used.
+ }
+
+ /**
+ * Handles successful upgrades to video.
+ * @param call The call the request was successful for.
+ */
+ @Override
+ public void onUpgradeToVideoSuccess(Call call) {
+ // Not used.
+ }
+
+ /**
+ * Handles a failure to upgrade a call to video.
+ *
+ * @param status The failure status.
+ * @param call The call the request was successful for.
+ */
+ @Override
+ public void onUpgradeToVideoFail(int status, Call call) {
+ // TODO (ims-vt) Automatically bring in call ui to foreground.
+ }
+
+ /**
+ * Handles a downgrade of a call to audio-only.
+ *
+ * @param call The call which was downgraded to audio-only.
+ */
+ @Override
+ public void onDowngradeToAudio(Call call) {
+ }
+
+ /**
+ * Called when UI is brought to the foreground. Sends a session modification request to resume
+ * the outgoing video.
+ */
+ private void onResume() {
+ log("onResume");
+
+ mIsInBackground = false;
+ if (canVideoPause(mPrimaryCallContext)) {
+ sendRequest(mPrimaryCallContext.getCall(), true);
+ } else {
+ log("onResume. Ignoring...");
+ }
+ }
+
+ /**
+ * Called when UI is sent to the background. Sends a session modification request to pause the
+ * outgoing video.
+ */
+ private void onPause() {
+ log("onPause");
+
+ mIsInBackground = true;
+ if (canVideoPause(mPrimaryCallContext)) {
+ sendRequest(mPrimaryCallContext.getCall(), false);
+ } else {
+ log("onPause, Ignoring...");
+ }
+ }
+
+ private void bringToForeground() {
+ if (mInCallPresenter != null) {
+ log("Bringing UI to foreground");
+ mInCallPresenter.bringToForeground(false);
+ } else {
+ loge("InCallPresenter is null. Cannot bring UI to foreground");
+ }
+ }
+
+ /**
+ * Sends Pause/Resume request.
+ *
+ * @param call Call to be paused/resumed.
+ * @param resume If true resume request will be sent, otherwise pause request.
+ */
+ private void sendRequest(Call call, boolean resume) {
+ // Check if this call supports pause/un-pause.
+ if (!call.can(android.telecom.Call.Details.CAPABILITY_CAN_PAUSE_VIDEO)) {
+ return;
+ }
+
+ if (resume) {
+ log("sending resume request, call=" + call);
+ call.getVideoCall()
+ .sendSessionModifyRequest(VideoUtils.makeVideoUnPauseProfile(call));
+ } else {
+ log("sending pause request, call=" + call);
+ call.getVideoCall().sendSessionModifyRequest(VideoUtils.makeVideoPauseProfile(call));
+ }
+ }
+
+ /**
+ * Determines if a given call is the same one stored in a {@link CallContext}.
+ *
+ * @param call The call.
+ * @param callContext The call context.
+ * @return {@code true} if the {@link Call} is the same as the one referenced in the
+ * {@link CallContext}.
+ */
+ private static boolean areSame(Call call, CallContext callContext) {
+ if (call == null && callContext == null) {
+ return true;
+ } else if (call == null || callContext == null) {
+ return false;
+ }
+ return call.equals(callContext.getCall());
+ }
+
+ /**
+ * Determines if a video call can be paused. Only a video call which is active can be paused.
+ *
+ * @param callContext The call context to check.
+ * @return {@code true} if the call is an active video call.
+ */
+ private static boolean canVideoPause(CallContext callContext) {
+ return isVideoCall(callContext) && callContext.getState() == Call.State.ACTIVE;
+ }
+
+ /**
+ * Determines if a call referenced by a {@link CallContext} is a video call.
+ *
+ * @param callContext The call context.
+ * @return {@code true} if the call is a video call, {@code false} otherwise.
+ */
+ private static boolean isVideoCall(CallContext callContext) {
+ return callContext != null && VideoUtils.isVideoCall(callContext.getVideoState());
+ }
+
+ /**
+ * Determines if call is in incoming/waiting state.
+ *
+ * @param call The call context.
+ * @return {@code true} if the call is in incoming or waiting state, {@code false} otherwise.
+ */
+ private static boolean isIncomingCall(CallContext call) {
+ return call != null && isIncomingCall(call.getCall());
+ }
+
+ /**
+ * Determines if a call is in incoming/waiting state.
+ *
+ * @param call The call.
+ * @return {@code true} if the call is in incoming or waiting state, {@code false} otherwise.
+ */
+ private static boolean isIncomingCall(Call call) {
+ return call != null && (call.getState() == Call.State.CALL_WAITING
+ || call.getState() == Call.State.INCOMING);
+ }
+
+ /**
+ * Determines if a call is dialing.
+ *
+ * @param call The call context.
+ * @return {@code true} if the call is dialing, {@code false} otherwise.
+ */
+ private static boolean isDialing(CallContext call) {
+ return call != null && Call.State.isDialing(call.getState());
+ }
+
+ /**
+ * Determines if a call is holding.
+ *
+ * @param call The call context.
+ * @return {@code true} if the call is holding, {@code false} otherwise.
+ */
+ private static boolean isHolding(CallContext call) {
+ return call != null && call.getState() == Call.State.ONHOLD;
+ }
+
+ /**
+ * Logs a debug message.
+ *
+ * @param msg The message.
+ */
+ private void log(String msg) {
+ Log.d(this, TAG + msg);
+ }
+
+ /**
+ * Logs an error message.
+ *
+ * @param msg The message.
+ */
+ private void loge(String msg) {
+ Log.e(this, TAG + msg);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/VideoUtils.java b/InCallUI/src/com/android/incallui/VideoUtils.java
new file mode 100644
index 0000000..7e0926b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoUtils.java
@@ -0,0 +1,102 @@
+/*
+ * 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.incallui;
+
+import android.telecom.VideoProfile;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.incallui.compat.telecom.VideoProfileCompat;
+
+import com.google.common.base.Preconditions;
+
+public class VideoUtils {
+
+ public static boolean isVideoCall(Call call) {
+ return call != null && isVideoCall(call.getVideoState());
+ }
+
+ public static boolean isVideoCall(int videoState) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ return VideoProfileCompat.isTransmissionEnabled(videoState)
+ || VideoProfileCompat.isReceptionEnabled(videoState);
+ }
+
+ public static boolean isBidirectionalVideoCall(Call call) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ return VideoProfileCompat.isBidirectional(call.getVideoState());
+ }
+
+ public static boolean isIncomingVideoCall(Call call) {
+ if (!VideoUtils.isVideoCall(call)) {
+ return false;
+ }
+ final int state = call.getState();
+ return (state == Call.State.INCOMING) || (state == Call.State.CALL_WAITING);
+ }
+
+ public static boolean isActiveVideoCall(Call call) {
+ return VideoUtils.isVideoCall(call) && call.getState() == Call.State.ACTIVE;
+ }
+
+ public static boolean isOutgoingVideoCall(Call call) {
+ if (!VideoUtils.isVideoCall(call)) {
+ return false;
+ }
+ final int state = call.getState();
+ return Call.State.isDialing(state) || state == Call.State.CONNECTING
+ || state == Call.State.SELECT_PHONE_ACCOUNT;
+ }
+
+ public static boolean isAudioCall(Call call) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return true;
+ }
+
+ return call != null && VideoProfileCompat.isAudioOnly(call.getVideoState());
+ }
+
+ // TODO (ims-vt) Check if special handling is needed for CONF calls.
+ public static boolean canVideoPause(Call call) {
+ return isVideoCall(call) && call.getState() == Call.State.ACTIVE;
+ }
+
+ public static VideoProfile makeVideoPauseProfile(Call call) {
+ Preconditions.checkNotNull(call);
+ Preconditions.checkState(!VideoProfileCompat.isAudioOnly(call.getVideoState()));
+ return new VideoProfile(getPausedVideoState(call.getVideoState()));
+ }
+
+ public static VideoProfile makeVideoUnPauseProfile(Call call) {
+ Preconditions.checkNotNull(call);
+ return new VideoProfile(getUnPausedVideoState(call.getVideoState()));
+ }
+
+ public static int getUnPausedVideoState(int videoState) {
+ return videoState & (~VideoProfile.STATE_PAUSED);
+ }
+
+ public static int getPausedVideoState(int videoState) {
+ return videoState | VideoProfile.STATE_PAUSED;
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/compat/telecom/DetailsCompat.java b/InCallUI/src/com/android/incallui/compat/telecom/DetailsCompat.java
new file mode 100644
index 0000000..b9f82a9
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/compat/telecom/DetailsCompat.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.incallui.compat.telecom;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.telecom.Call.Details;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.incallui.Log;
+
+/**
+ * Compatibility class for {@link Details}
+ */
+public class DetailsCompat {
+
+ /**
+ * Constant formerly in L as PhoneCapabilities#ADD_CALL. It was transferred to
+ * {@link Details#CAPABILITY_UNUSED_1} and hidden
+ */
+ public static final int CAPABILITY_UNUSED_1 = 0x00000010;
+
+ /**
+ * Returns the intent extras from the given {@link Details}
+ * For Sdk version L and earlier, this will return {@link Details#getExtras()}
+ *
+ * @param details The details whose intent extras should be returned
+ * @return The given details' intent extras
+ */
+ public static Bundle getIntentExtras(Details details) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return details.getIntentExtras();
+ }
+ return details.getExtras();
+ }
+
+ /**
+ * Compatibility method to check whether the supplied properties includes the
+ * specified property.
+ *
+ * @param details The details whose properties should be checked.
+ * @param property The property to check properties for.
+ * @return Whether the specified property is supported.
+ */
+ public static boolean hasProperty(Details details, int property) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return details.hasProperty(property);
+ }
+ return (details.getCallProperties() & property) != 0;
+ }
+
+ /**
+ * Compatibility method to check whether the capabilities of the given {@code Details}
+ * supports the specified capability.
+ *
+ * @param details The details whose capabilities should be checked.
+ * @param capability The capability to check capabilities for.
+ * @return Whether the specified capability is supported.
+ */
+ public static boolean can(Details details, int capability) {
+ if (CompatUtils.isLollipopMr1Compatible()) {
+ return details.can(capability);
+ }
+ return (details.getCallCapabilities() & capability) != 0;
+ }
+
+ /**
+ * Render a set of capability bits ({@code CAPABILITY_*}) as a human readable string.
+ *
+ * @param capabilities A capability bit field.
+ * @return A human readable string representation.
+ */
+ public static String capabilitiesToString(int capabilities) {
+ if (CompatUtils.isLollipopMr1Compatible()) {
+ return Details.capabilitiesToString(capabilities);
+ }
+ return capabilitiesToStringLollipop(capabilities);
+ }
+
+ /*
+ * Use reflection to call PhoneCapabilities.toString. InCallUI code is only run on Google
+ * Experience phones, so we will be the system Dialer and the method will exist
+ */
+ private static String capabilitiesToStringLollipop(int capabilities) {
+ try {
+ return (String) Class.forName("android.telecom.PhoneCapabilities")
+ .getMethod("toString", Integer.TYPE)
+ .invoke(null, capabilities);
+ } catch (ReflectiveOperationException e) {
+ Log.e(DetailsCompat.class, "Unable to use reflection to call "
+ + "android.telecom.PhoneCapabilities.toString(int)", e);
+ return String.valueOf(capabilities);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/compat/telecom/InCallServiceCompat.java b/InCallUI/src/com/android/incallui/compat/telecom/InCallServiceCompat.java
new file mode 100644
index 0000000..0a3cb26
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/compat/telecom/InCallServiceCompat.java
@@ -0,0 +1,97 @@
+/*
+ * 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.incallui.compat.telecom;
+
+import android.support.annotation.Nullable;
+import android.telecom.InCallService;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.incallui.Call;
+import com.android.incallui.InCallServiceImpl;
+
+/**
+ * Compatibility class for {@link android.telecom.InCallService}
+ */
+public class InCallServiceCompat {
+
+ /**
+ * Sets the microphone mute state. When this request is honored, there
+ * will be a change to the {@link android.telecom.CallAudioState}.
+ *
+ * Note: Noop for Sdk versions less than M where inCallService is not of type
+ * {@link InCallServiceImpl}
+ *
+ * @param inCallService the {@link InCallService} to act on
+ * @param shouldMute {@code true} if the microphone should be muted; {@code false} otherwise.
+ */
+ public static void setMuted(@Nullable InCallService inCallService, boolean shouldMute) {
+ if (inCallService == null) {
+ return;
+ }
+ if (CompatUtils.isMarshmallowCompatible()) {
+ inCallService.setMuted(shouldMute);
+ return;
+ }
+
+ if (inCallService instanceof InCallServiceImpl) {
+ ((InCallServiceImpl) inCallService).setMutedCompat(shouldMute);
+ }
+ }
+
+ /**
+ * Sets the audio route (speaker, bluetooth, etc...). When this request is honored, there will
+ * be change to the {@link android.telecom.CallAudioState}.
+ *
+ * Note: Noop for Sdk versions less than M where inCallService is not of type
+ * {@link InCallServiceImpl}
+ *
+ * @param inCallService the {@link InCallService} to act on
+ * @param route The audio route to use.
+ */
+ public static void setAudioRoute(@Nullable InCallService inCallService, int route) {
+ if (inCallService == null) {
+ return;
+ }
+ if (CompatUtils.isMarshmallowCompatible()) {
+ inCallService.setAudioRoute(route);
+ return;
+ }
+
+ if (inCallService instanceof InCallServiceImpl) {
+ ((InCallServiceImpl) inCallService).setAudioRouteCompat(route);
+ }
+ }
+
+ /**
+ * Returns if the device can support additional calls.
+ *
+ * @param inCallService the {@link InCallService} to act on
+ * @param call a {@link Call} to use if needed due to compatibility reasons
+ * @return Whether the phone supports adding more calls, defaulting to true if inCallService
+ * is null
+ */
+ public static boolean canAddCall(@Nullable InCallService inCallService, Call call) {
+ if (inCallService == null) {
+ return true;
+ }
+
+ if (CompatUtils.isMarshmallowCompatible()) {
+ // Default to true if we are not connected to telecom.
+ return inCallService.canAddCall();
+ }
+ return call.can(DetailsCompat.CAPABILITY_UNUSED_1);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/compat/telecom/VideoProfileCompat.java b/InCallUI/src/com/android/incallui/compat/telecom/VideoProfileCompat.java
new file mode 100644
index 0000000..6e81bd7
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/compat/telecom/VideoProfileCompat.java
@@ -0,0 +1,140 @@
+/*
+ * 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.incallui.compat.telecom;
+
+import android.telecom.VideoProfile;
+
+import com.android.contacts.common.compat.CompatUtils;
+
+/**
+ * Compatibility class for {@link android.telecom.VideoProfile}
+ */
+public class VideoProfileCompat {
+
+ /**
+ * Generates a string representation of a video state.
+ *
+ * @param videoState The video state.
+ * @return String representation of the video state.
+ */
+ public static String videoStateToString(int videoState) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return VideoProfile.videoStateToString(videoState);
+ }
+ return videoStateToStringLollipop(videoState);
+ }
+
+ /**
+ * Copied from {@link android.telecom.VideoProfile#videoStateToString}
+ */
+ private static String videoStateToStringLollipop(int videoState) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Audio");
+ if (isAudioOnly(videoState)) {
+ sb.append(" Only");
+ } else {
+ if (isTransmissionEnabled(videoState)) {
+ sb.append(" Tx");
+ }
+ if (isReceptionEnabled(videoState)) {
+ sb.append(" Rx");
+ }
+ if (isPaused(videoState)) {
+ sb.append(" Pause");
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Indicates whether the video state is audio only.
+ *
+ * @param videoState The video state.
+ * @return {@code true} if the video state is audio only, {@code false} otherwise.
+ */
+ public static boolean isAudioOnly(int videoState) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return VideoProfile.isAudioOnly(videoState);
+ }
+ return !hasState(videoState, VideoProfile.STATE_TX_ENABLED)
+ && !hasState(videoState, VideoProfile.STATE_RX_ENABLED);
+ }
+
+ /**
+ * Indicates whether the video state has video transmission enabled.
+ *
+ * @param videoState The video state.
+ * @return {@code true} if video transmission is enabled, {@code false} otherwise.
+ */
+ public static boolean isTransmissionEnabled(int videoState) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return VideoProfile.isTransmissionEnabled(videoState);
+ }
+ return hasState(videoState, VideoProfile.STATE_TX_ENABLED);
+ }
+
+ /**
+ * Indicates whether the video state has video reception enabled.
+ *
+ * @param videoState The video state.
+ * @return {@code true} if video reception is enabled, {@code false} otherwise.
+ */
+ public static boolean isReceptionEnabled(int videoState) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return VideoProfile.isReceptionEnabled(videoState);
+ }
+ return hasState(videoState, VideoProfile.STATE_RX_ENABLED);
+ }
+
+ /**
+ * Indicates whether the video state is paused.
+ *
+ * @param videoState The video state.
+ * @return {@code true} if the video is paused, {@code false} otherwise.
+ */
+ public static boolean isPaused(int videoState) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return VideoProfile.isPaused(videoState);
+ }
+ return hasState(videoState, VideoProfile.STATE_PAUSED);
+ }
+
+ /**
+ * Copied from {@link android.telecom.VideoProfile}
+ *
+ * Determines if a specified state is set in a videoState bit-mask.
+ *
+ * @param videoState The video state bit-mask.
+ * @param state The state to check.
+ * @return {@code true} if the state is set.
+ */
+ private static boolean hasState(int videoState, int state) {
+ return (videoState & state) == state;
+ }
+
+ /**
+ * Indicates whether the video state is bi-directional.
+ *
+ * @param videoState The video state.
+ * @return {@code True} if the video is bi-directional, {@code false} otherwise.
+ */
+ public static boolean isBidirectional(int videoState) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return VideoProfile.isBidirectional(videoState);
+ }
+ return hasState(videoState, VideoProfile.STATE_BIDIRECTIONAL);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java
new file mode 100644
index 0000000..8d4d068
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 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.incallui.ringtone;
+
+import android.net.Uri;
+import android.support.annotation.Nullable;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.incallui.Call.State;
+
+/**
+ * Class that determines when ringtones should be played and can play the call waiting tone when
+ * necessary.
+ */
+public class DialerRingtoneManager {
+
+ /*
+ * Flag used to determine if the Dialer is responsible for playing ringtones for incoming calls.
+ */
+ private static final boolean IS_DIALER_RINGING_ENABLED = false;
+ private boolean mForceDialerRingingEnabled = false;
+
+ /**
+ * Determines if a ringtone should be played for the given call state (see {@link State}) and
+ * {@link Uri}.
+ *
+ * @param callState the call state for the call being checked.
+ * @param ringtoneUri the ringtone to potentially play.
+ * @return {@code true} if the ringtone should be played, {@code false} otherwise.
+ */
+ public boolean shouldPlayRingtone(int callState, @Nullable Uri ringtoneUri) {
+ return CompatUtils.isNCompatible()
+ && isDialerRingingEnabled()
+ && callState == State.INCOMING
+ && ringtoneUri != null;
+ }
+
+ private boolean isDialerRingingEnabled() {
+ return mForceDialerRingingEnabled || IS_DIALER_RINGING_ENABLED;
+ }
+
+ /**
+ * Determines if a call waiting tone should be played for the the given call state
+ * (see {@link State}).
+ *
+ * @param callState the call state for the call being checked.
+ * @return {@code true} if the call waiting tone should be played, {@code false} otherwise.
+ */
+ public boolean shouldPlayCallWaitingTone(int callState) {
+ return CompatUtils.isNCompatible()
+ && isDialerRingingEnabled()
+ && callState == State.CALL_WAITING;
+ }
+
+ @NeededForTesting
+ void forceDialerRingingEnabled() {
+ mForceDialerRingingEnabled = true;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
new file mode 100644
index 0000000..70da4ef
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -0,0 +1,67 @@
+/*
+ * 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
+ */
+
+package com.android.incallui.service;
+
+import android.graphics.Bitmap;
+
+/**
+ * Provides phone number lookup services.
+ */
+public interface PhoneNumberService {
+
+ /**
+ * Get a phone number number asynchronously.
+ *
+ * @param phoneNumber The phone number to lookup.
+ * @param listener The listener to notify when the phone number lookup is complete.
+ * @param imageListener The listener to notify when the image lookup is complete.
+ */
+ public void getPhoneNumberInfo(String phoneNumber, NumberLookupListener listener,
+ ImageLookupListener imageListener, boolean isIncoming);
+
+ public interface NumberLookupListener {
+
+ /**
+ * Callback when a phone number has been looked up.
+ *
+ * @param info The looked up information. Or (@literal null} if there are no results.
+ */
+ public void onPhoneNumberInfoComplete(PhoneNumberInfo info);
+ }
+
+ public interface ImageLookupListener {
+
+ /**
+ * Callback when a image has been fetched.
+ *
+ * @param bitmap The fetched image.
+ */
+ public void onImageFetchComplete(Bitmap bitmap);
+ }
+
+ public interface PhoneNumberInfo {
+ public String getDisplayName();
+ public String getNumber();
+ public int getPhoneType();
+ public String getPhoneLabel();
+ public String getNormalizedNumber();
+ public String getImageUrl();
+ public String getLookupKey();
+ public boolean isBusiness();
+ public int getLookupSource();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/util/AccessibilityUtil.java b/InCallUI/src/com/android/incallui/util/AccessibilityUtil.java
new file mode 100644
index 0000000..1fdd2ba
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/util/AccessibilityUtil.java
@@ -0,0 +1,30 @@
+/*
+ * 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
+ */
+
+package com.android.incallui.util;
+
+import android.content.Context;
+import android.view.accessibility.AccessibilityManager;
+
+public class AccessibilityUtil {
+ public static boolean isTalkBackEnabled(Context context) {
+ AccessibilityManager accessibilityManager = (AccessibilityManager) context
+ .getSystemService(Context.ACCESSIBILITY_SERVICE);
+ return accessibilityManager != null
+ && accessibilityManager.isEnabled()
+ && accessibilityManager.isTouchExplorationEnabled();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/util/TelecomCallUtil.java b/InCallUI/src/com/android/incallui/util/TelecomCallUtil.java
new file mode 100644
index 0000000..53ecc29
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/util/TelecomCallUtil.java
@@ -0,0 +1,53 @@
+/*
+ * 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.incallui.util;
+
+import android.net.Uri;
+import android.telecom.Call;
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * Class to provide a standard interface for obtaining information from the underlying
+ * android.telecom.Call. Much of this should be obtained through the incall.Call, but
+ * on occasion we need to interact with the telecom.Call directly (eg. call blocking,
+ * before the incall.Call has been created).
+ */
+public class TelecomCallUtil {
+
+ // Whether the call handle is an emergency number.
+ public static boolean isEmergencyCall(Call call) {
+ Uri handle = call.getDetails().getHandle();
+ return PhoneNumberUtils.isEmergencyNumber(
+ handle == null ? "" : handle.getSchemeSpecificPart());
+ }
+
+ public static String getNumber(Call call) {
+ if (call == null) {
+ return null;
+ }
+ if (call.getDetails().getGatewayInfo() != null) {
+ return call.getDetails().getGatewayInfo()
+ .getOriginalAddress().getSchemeSpecificPart();
+ }
+ Uri handle = getHandle(call);
+ return handle == null ? null : handle.getSchemeSpecificPart();
+ }
+
+ public static Uri getHandle(Call call) {
+ return call == null ? null : call.getDetails().getHandle();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java
new file mode 100644
index 0000000..5ef6897
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2011 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.incallui.widget.multiwaveview;
+
+import android.animation.TimeInterpolator;
+
+class Ease {
+ private static final float DOMAIN = 1.0f;
+ private static final float DURATION = 1.0f;
+ private static final float START = 0.0f;
+
+ static class Linear {
+ public static final TimeInterpolator easeNone = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return input;
+ }
+ };
+ }
+
+ static class Cubic {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*(input/=DURATION)*input*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*((input=input/DURATION-1)*input*input + 1) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1.0f) ?
+ (DOMAIN/2*input*input*input + START)
+ : (DOMAIN/2*((input-=2)*input*input + 2) + START);
+ }
+ };
+ }
+
+ static class Quad {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation (float input) {
+ return DOMAIN*(input/=DURATION)*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN *(input/=DURATION)*(input-2) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1) ?
+ (DOMAIN/2*input*input + START)
+ : (-DOMAIN/2 * ((--input)*(input-2) - 1) + START);
+ }
+ };
+ }
+
+ static class Quart {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*(input/=DURATION)*input*input*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN * ((input=input/DURATION-1)*input*input*input - 1) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1) ?
+ (DOMAIN/2*input*input*input*input + START)
+ : (-DOMAIN/2 * ((input-=2)*input*input*input - 2) + START);
+ }
+ };
+ }
+
+ static class Quint {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*(input/=DURATION)*input*input*input*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*((input=input/DURATION-1)*input*input*input*input + 1) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1) ?
+ (DOMAIN/2*input*input*input*input*input + START)
+ : (DOMAIN/2*((input-=2)*input*input*input*input + 2) + START);
+ }
+ };
+ }
+
+ static class Sine {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN * (float) Math.cos(input/DURATION * (Math.PI/2)) + DOMAIN + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN * (float) Math.sin(input/DURATION * (Math.PI/2)) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN/2 * ((float)Math.cos(Math.PI*input/DURATION) - 1.0f) + START;
+ }
+ };
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
new file mode 100644
index 0000000..2320027
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
@@ -0,0 +1,1473 @@
+/*
+ * Copyright (C) 2012 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.incallui.widget.multiwaveview;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.widget.ExploreByTouchHelper;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import android.view.accessibility.AccessibilityNodeProvider;
+
+import com.android.incallui.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This is a copy of com.android.internal.widget.multiwaveview.GlowPadView with minor changes
+ * to remove dependencies on private api's.
+ *
+ * Incoporated the scaling functionality.
+ *
+ * A re-usable widget containing a center, outer ring and wave animation.
+ */
+public class GlowPadView extends View {
+ private static final String TAG = "GlowPadView";
+ private static final boolean DEBUG = false;
+
+ // Wave state machine
+ private static final int STATE_IDLE = 0;
+ private static final int STATE_START = 1;
+ private static final int STATE_FIRST_TOUCH = 2;
+ private static final int STATE_TRACKING = 3;
+ private static final int STATE_SNAP = 4;
+ private static final int STATE_FINISH = 5;
+
+ // Animation properties.
+ private static final float SNAP_MARGIN_DEFAULT = 20.0f; // distance to ring before we snap to it
+
+ public interface OnTriggerListener {
+ int NO_HANDLE = 0;
+ int CENTER_HANDLE = 1;
+ public void onGrabbed(View v, int handle);
+ public void onReleased(View v, int handle);
+ public void onTrigger(View v, int target);
+ public void onGrabbedStateChange(View v, int handle);
+ public void onFinishFinalAnimation();
+ }
+
+ // Tuneable parameters for animation
+ private static final int WAVE_ANIMATION_DURATION = 1350;
+ private static final int RETURN_TO_HOME_DELAY = 1200;
+ private static final int RETURN_TO_HOME_DURATION = 200;
+ private static final int HIDE_ANIMATION_DELAY = 200;
+ private static final int HIDE_ANIMATION_DURATION = 200;
+ private static final int SHOW_ANIMATION_DURATION = 200;
+ private static final int SHOW_ANIMATION_DELAY = 50;
+ private static final int INITIAL_SHOW_HANDLE_DURATION = 200;
+ private static final int REVEAL_GLOW_DELAY = 0;
+ private static final int REVEAL_GLOW_DURATION = 0;
+
+ private static final float TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED = 1.3f;
+ private static final float TARGET_SCALE_EXPANDED = 1.0f;
+ private static final float TARGET_SCALE_COLLAPSED = 0.8f;
+ private static final float RING_SCALE_EXPANDED = 1.0f;
+ private static final float RING_SCALE_COLLAPSED = 0.5f;
+
+ private ArrayList<TargetDrawable> mTargetDrawables = new ArrayList<TargetDrawable>();
+ private AnimationBundle mWaveAnimations = new AnimationBundle();
+ private AnimationBundle mTargetAnimations = new AnimationBundle();
+ private AnimationBundle mGlowAnimations = new AnimationBundle();
+ private ArrayList<String> mTargetDescriptions;
+ private ArrayList<String> mDirectionDescriptions;
+ private OnTriggerListener mOnTriggerListener;
+ private TargetDrawable mHandleDrawable;
+ private TargetDrawable mOuterRing;
+ private Vibrator mVibrator;
+
+ private int mFeedbackCount = 3;
+ private int mVibrationDuration = 0;
+ private int mGrabbedState;
+ private int mActiveTarget = -1;
+ private float mGlowRadius;
+ private float mWaveCenterX;
+ private float mWaveCenterY;
+ private int mMaxTargetHeight;
+ private int mMaxTargetWidth;
+ private float mRingScaleFactor = 1f;
+ private boolean mAllowScaling;
+
+ private float mOuterRadius = 0.0f;
+ private float mSnapMargin = 0.0f;
+ private boolean mDragging;
+ private int mNewTargetResources;
+
+ private AccessibilityNodeProvider mAccessibilityNodeProvider;
+ private GlowpadExploreByTouchHelper mExploreByTouchHelper;
+
+ private class AnimationBundle extends ArrayList<Tweener> {
+ private static final long serialVersionUID = 0xA84D78726F127468L;
+ private boolean mSuspended;
+
+ public void start() {
+ if (mSuspended) return; // ignore attempts to start animations
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.start();
+ }
+ }
+
+ public void cancel() {
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.cancel();
+ }
+ clear();
+ }
+
+ public void stop() {
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.end();
+ }
+ clear();
+ }
+
+ public void setSuspended(boolean suspend) {
+ mSuspended = suspend;
+ }
+ };
+
+ private AnimatorListener mResetListener = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
+ dispatchOnFinishFinalAnimation();
+ }
+ };
+
+ private AnimatorListener mResetListenerWithPing = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ ping();
+ switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
+ dispatchOnFinishFinalAnimation();
+ }
+ };
+
+ private AnimatorUpdateListener mUpdateListener = new AnimatorUpdateListener() {
+ public void onAnimationUpdate(ValueAnimator animation) {
+ invalidate();
+ }
+ };
+
+ private boolean mAnimatingTargets;
+ private AnimatorListener mTargetUpdateListener = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ if (mNewTargetResources != 0) {
+ internalSetTargetResources(mNewTargetResources);
+ mNewTargetResources = 0;
+ hideTargets(false, false);
+ }
+ mAnimatingTargets = false;
+ }
+ };
+ private int mTargetResourceId;
+ private int mTargetDescriptionsResourceId;
+ private int mDirectionDescriptionsResourceId;
+ private boolean mAlwaysTrackFinger;
+ private int mHorizontalInset;
+ private int mVerticalInset;
+ private int mGravity = Gravity.TOP;
+ private boolean mInitialLayout = true;
+ private Tweener mBackgroundAnimator;
+ private PointCloud mPointCloud;
+ private float mInnerRadius;
+ private int mPointerId;
+
+ public GlowPadView(Context context) {
+ this(context, null);
+ }
+
+ public GlowPadView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Resources res = context.getResources();
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GlowPadView);
+ mInnerRadius = a.getDimension(R.styleable.GlowPadView_innerRadius, mInnerRadius);
+ mOuterRadius = a.getDimension(R.styleable.GlowPadView_outerRadius, mOuterRadius);
+ mSnapMargin = a.getDimension(R.styleable.GlowPadView_snapMargin, mSnapMargin);
+ mVibrationDuration = a.getInt(R.styleable.GlowPadView_vibrationDuration,
+ mVibrationDuration);
+ mFeedbackCount = a.getInt(R.styleable.GlowPadView_feedbackCount,
+ mFeedbackCount);
+ mAllowScaling = a.getBoolean(R.styleable.GlowPadView_allowScaling, false);
+ TypedValue handle = a.peekValue(R.styleable.GlowPadView_handleDrawable);
+ setHandleDrawable(handle != null ? handle.resourceId : R.drawable.ic_incall_audio_handle);
+ mOuterRing = new TargetDrawable(res,
+ getResourceId(a, R.styleable.GlowPadView_outerRingDrawable), 1);
+
+ mAlwaysTrackFinger = a.getBoolean(R.styleable.GlowPadView_alwaysTrackFinger, false);
+
+ int pointId = getResourceId(a, R.styleable.GlowPadView_pointDrawable);
+ Drawable pointDrawable = pointId != 0 ? res.getDrawable(pointId) : null;
+ mGlowRadius = a.getDimension(R.styleable.GlowPadView_glowRadius, 0.0f);
+
+ TypedValue outValue = new TypedValue();
+
+ // Read array of target drawables
+ if (a.getValue(R.styleable.GlowPadView_targetDrawables, outValue)) {
+ internalSetTargetResources(outValue.resourceId);
+ }
+ if (mTargetDrawables == null || mTargetDrawables.size() == 0) {
+ throw new IllegalStateException("Must specify at least one target drawable");
+ }
+
+ // Read array of target descriptions
+ if (a.getValue(R.styleable.GlowPadView_targetDescriptions, outValue)) {
+ final int resourceId = outValue.resourceId;
+ if (resourceId == 0) {
+ throw new IllegalStateException("Must specify target descriptions");
+ }
+ setTargetDescriptionsResourceId(resourceId);
+ }
+
+ // Read array of direction descriptions
+ if (a.getValue(R.styleable.GlowPadView_directionDescriptions, outValue)) {
+ final int resourceId = outValue.resourceId;
+ if (resourceId == 0) {
+ throw new IllegalStateException("Must specify direction descriptions");
+ }
+ setDirectionDescriptionsResourceId(resourceId);
+ }
+
+ // Use gravity attribute from LinearLayout
+ //a = context.obtainStyledAttributes(attrs, R.styleable.LinearLayout);
+ mGravity = a.getInt(R.styleable.GlowPadView_android_gravity, Gravity.TOP);
+ a.recycle();
+
+
+ setVibrateEnabled(mVibrationDuration > 0);
+
+ assignDefaultsIfNeeded();
+
+ mPointCloud = new PointCloud(pointDrawable);
+ mPointCloud.makePointCloud(mInnerRadius, mOuterRadius);
+ mPointCloud.glowManager.setRadius(mGlowRadius);
+
+ mExploreByTouchHelper = new GlowpadExploreByTouchHelper(this);
+ ViewCompat.setAccessibilityDelegate(this, mExploreByTouchHelper);
+ }
+
+ private int getResourceId(TypedArray a, int id) {
+ TypedValue tv = a.peekValue(id);
+ return tv == null ? 0 : tv.resourceId;
+ }
+
+ private void dump() {
+ Log.v(TAG, "Outer Radius = " + mOuterRadius);
+ Log.v(TAG, "SnapMargin = " + mSnapMargin);
+ Log.v(TAG, "FeedbackCount = " + mFeedbackCount);
+ Log.v(TAG, "VibrationDuration = " + mVibrationDuration);
+ Log.v(TAG, "GlowRadius = " + mGlowRadius);
+ Log.v(TAG, "WaveCenterX = " + mWaveCenterX);
+ Log.v(TAG, "WaveCenterY = " + mWaveCenterY);
+ }
+
+ public void suspendAnimations() {
+ mWaveAnimations.setSuspended(true);
+ mTargetAnimations.setSuspended(true);
+ mGlowAnimations.setSuspended(true);
+ }
+
+ public void resumeAnimations() {
+ mWaveAnimations.setSuspended(false);
+ mTargetAnimations.setSuspended(false);
+ mGlowAnimations.setSuspended(false);
+ mWaveAnimations.start();
+ mTargetAnimations.start();
+ mGlowAnimations.start();
+ }
+
+ @Override
+ protected int getSuggestedMinimumWidth() {
+ // View should be large enough to contain the background + handle and
+ // target drawable on either edge.
+ return (int) (Math.max(mOuterRing.getWidth(), 2 * mOuterRadius) + mMaxTargetWidth);
+ }
+
+ @Override
+ protected int getSuggestedMinimumHeight() {
+ // View should be large enough to contain the unlock ring + target and
+ // target drawable on either edge
+ return (int) (Math.max(mOuterRing.getHeight(), 2 * mOuterRadius) + mMaxTargetHeight);
+ }
+
+ /**
+ * This gets the suggested width accounting for the ring's scale factor.
+ */
+ protected int getScaledSuggestedMinimumWidth() {
+ return (int) (mRingScaleFactor * Math.max(mOuterRing.getWidth(), 2 * mOuterRadius)
+ + mMaxTargetWidth);
+ }
+
+ /**
+ * This gets the suggested height accounting for the ring's scale factor.
+ */
+ protected int getScaledSuggestedMinimumHeight() {
+ return (int) (mRingScaleFactor * Math.max(mOuterRing.getHeight(), 2 * mOuterRadius)
+ + mMaxTargetHeight);
+ }
+
+ private int resolveMeasured(int measureSpec, int desired)
+ {
+ int result = 0;
+ int specSize = MeasureSpec.getSize(measureSpec);
+ switch (MeasureSpec.getMode(measureSpec)) {
+ case MeasureSpec.UNSPECIFIED:
+ result = desired;
+ break;
+ case MeasureSpec.AT_MOST:
+ result = Math.min(specSize, desired);
+ break;
+ case MeasureSpec.EXACTLY:
+ default:
+ result = specSize;
+ }
+ return result;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int minimumWidth = getSuggestedMinimumWidth();
+ final int minimumHeight = getSuggestedMinimumHeight();
+ int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
+ int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
+
+ mRingScaleFactor = computeScaleFactor(minimumWidth, minimumHeight,
+ computedWidth, computedHeight);
+
+ int scaledWidth = getScaledSuggestedMinimumWidth();
+ int scaledHeight = getScaledSuggestedMinimumHeight();
+
+ computeInsets(computedWidth - scaledWidth, computedHeight - scaledHeight);
+ setMeasuredDimension(computedWidth, computedHeight);
+ }
+
+ private void switchToState(int state, float x, float y) {
+ switch (state) {
+ case STATE_IDLE:
+ deactivateTargets();
+ hideGlow(0, 0, 0.0f, null);
+ startBackgroundAnimation(0, 0.0f);
+ mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE);
+ mHandleDrawable.setAlpha(1.0f);
+ break;
+
+ case STATE_START:
+ startBackgroundAnimation(0, 0.0f);
+ break;
+
+ case STATE_FIRST_TOUCH:
+ mHandleDrawable.setAlpha(0.0f);
+ deactivateTargets();
+ showTargets(true);
+ startBackgroundAnimation(INITIAL_SHOW_HANDLE_DURATION, 1.0f);
+ setGrabbedState(OnTriggerListener.CENTER_HANDLE);
+
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isEnabled()) {
+ announceTargets();
+ }
+ break;
+
+ case STATE_TRACKING:
+ mHandleDrawable.setAlpha(0.0f);
+ break;
+
+ case STATE_SNAP:
+ // TODO: Add transition states (see list_selector_background_transition.xml)
+ mHandleDrawable.setAlpha(0.0f);
+ showGlow(REVEAL_GLOW_DURATION , REVEAL_GLOW_DELAY, 0.0f, null);
+ break;
+
+ case STATE_FINISH:
+ doFinish();
+ break;
+ }
+ }
+
+ private void showGlow(int duration, int delay, float finalAlpha,
+ AnimatorListener finishListener) {
+ mGlowAnimations.cancel();
+ mGlowAnimations.add(Tweener.to(mPointCloud.glowManager, duration,
+ "ease", Ease.Cubic.easeIn,
+ "delay", delay,
+ "alpha", finalAlpha,
+ "onUpdate", mUpdateListener,
+ "onComplete", finishListener));
+ mGlowAnimations.start();
+ }
+
+ private void hideGlow(int duration, int delay, float finalAlpha,
+ AnimatorListener finishListener) {
+ mGlowAnimations.cancel();
+ mGlowAnimations.add(Tweener.to(mPointCloud.glowManager, duration,
+ "ease", Ease.Quart.easeOut,
+ "delay", delay,
+ "alpha", finalAlpha,
+ "x", 0.0f,
+ "y", 0.0f,
+ "onUpdate", mUpdateListener,
+ "onComplete", finishListener));
+ mGlowAnimations.start();
+ }
+
+ private void deactivateTargets() {
+ final int count = mTargetDrawables.size();
+ for (int i = 0; i < count; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ }
+ mActiveTarget = -1;
+ }
+
+ /**
+ * Dispatches a trigger event to listener. Ignored if a listener is not set.
+ * @param whichTarget the target that was triggered.
+ */
+ private void dispatchTriggerEvent(int whichTarget) {
+ vibrate();
+ if (mOnTriggerListener != null) {
+ mOnTriggerListener.onTrigger(this, whichTarget);
+ }
+ }
+
+ private void dispatchOnFinishFinalAnimation() {
+ if (mOnTriggerListener != null) {
+ mOnTriggerListener.onFinishFinalAnimation();
+ }
+ }
+
+ private void doFinish() {
+ final int activeTarget = mActiveTarget;
+ final boolean targetHit = activeTarget != -1;
+
+ if (targetHit) {
+ if (DEBUG) Log.v(TAG, "Finish with target hit = " + targetHit);
+
+ highlightSelected(activeTarget);
+
+ // Inform listener of any active targets. Typically only one will be active.
+ hideGlow(RETURN_TO_HOME_DURATION, RETURN_TO_HOME_DELAY, 0.0f, mResetListener);
+ dispatchTriggerEvent(activeTarget);
+ if (!mAlwaysTrackFinger) {
+ // Force ring and targets to finish animation to final expanded state
+ mTargetAnimations.stop();
+ }
+ } else {
+ // Animate handle back to the center based on current state.
+ hideGlow(HIDE_ANIMATION_DURATION, 0, 0.0f, mResetListenerWithPing);
+ hideTargets(true, false);
+ }
+
+ setGrabbedState(OnTriggerListener.NO_HANDLE);
+ }
+
+ private void highlightSelected(int activeTarget) {
+ // Highlight the given target and fade others
+ mTargetDrawables.get(activeTarget).setState(TargetDrawable.STATE_ACTIVE);
+ hideUnselected(activeTarget);
+ }
+
+ private void hideUnselected(int active) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ if (i != active) {
+ mTargetDrawables.get(i).setAlpha(0.0f);
+ }
+ }
+ }
+
+ private void hideTargets(boolean animate, boolean expanded) {
+ mTargetAnimations.cancel();
+ // Note: these animations should complete at the same time so that we can swap out
+ // the target assets asynchronously from the setTargetResources() call.
+ mAnimatingTargets = animate;
+ final int duration = animate ? HIDE_ANIMATION_DURATION : 0;
+ final int delay = animate ? HIDE_ANIMATION_DELAY : 0;
+
+ final float targetScale = expanded ?
+ TARGET_SCALE_EXPANDED : TARGET_SCALE_COLLAPSED;
+ final int length = mTargetDrawables.size();
+ final TimeInterpolator interpolator = Ease.Cubic.easeOut;
+ for (int i = 0; i < length; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, duration,
+ "ease", interpolator,
+ "alpha", 0.0f,
+ "scaleX", targetScale,
+ "scaleY", targetScale,
+ "delay", delay,
+ "onUpdate", mUpdateListener));
+ }
+
+ float ringScaleTarget = expanded ?
+ RING_SCALE_EXPANDED : RING_SCALE_COLLAPSED;
+ ringScaleTarget *= mRingScaleFactor;
+ mTargetAnimations.add(Tweener.to(mOuterRing, duration,
+ "ease", interpolator,
+ "alpha", 0.0f,
+ "scaleX", ringScaleTarget,
+ "scaleY", ringScaleTarget,
+ "delay", delay,
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
+
+ mTargetAnimations.start();
+ }
+
+ private void showTargets(boolean animate) {
+ mTargetAnimations.stop();
+ mAnimatingTargets = animate;
+ final int delay = animate ? SHOW_ANIMATION_DELAY : 0;
+ final int duration = animate ? SHOW_ANIMATION_DURATION : 0;
+ final int length = mTargetDrawables.size();
+ for (int i = 0; i < length; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, duration,
+ "ease", Ease.Cubic.easeOut,
+ "alpha", 1.0f,
+ "scaleX", 1.0f,
+ "scaleY", 1.0f,
+ "delay", delay,
+ "onUpdate", mUpdateListener));
+ }
+ float ringScale = mRingScaleFactor * RING_SCALE_EXPANDED;
+ mTargetAnimations.add(Tweener.to(mOuterRing, duration,
+ "ease", Ease.Cubic.easeOut,
+ "alpha", 1.0f,
+ "scaleX", ringScale,
+ "scaleY", ringScale,
+ "delay", delay,
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
+
+ mTargetAnimations.start();
+ }
+
+ private void vibrate() {
+ if (mVibrator != null) {
+ mVibrator.vibrate(mVibrationDuration);
+ }
+ }
+
+ private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) {
+ Resources res = getContext().getResources();
+ TypedArray array = res.obtainTypedArray(resourceId);
+ final int count = array.length();
+ ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count);
+ for (int i = 0; i < count; i++) {
+ TypedValue value = array.peekValue(i);
+ TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0, 3);
+ drawables.add(target);
+ }
+ array.recycle();
+ return drawables;
+ }
+
+ private void internalSetTargetResources(int resourceId) {
+ final ArrayList<TargetDrawable> targets = loadDrawableArray(resourceId);
+ mTargetDrawables = targets;
+ mTargetResourceId = resourceId;
+
+ int maxWidth = mHandleDrawable.getWidth();
+ int maxHeight = mHandleDrawable.getHeight();
+ final int count = targets.size();
+ for (int i = 0; i < count; i++) {
+ TargetDrawable target = targets.get(i);
+ maxWidth = Math.max(maxWidth, target.getWidth());
+ maxHeight = Math.max(maxHeight, target.getHeight());
+ }
+ if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) {
+ mMaxTargetWidth = maxWidth;
+ mMaxTargetHeight = maxHeight;
+ requestLayout(); // required to resize layout and call updateTargetPositions()
+ } else {
+ updateTargetPositions(mWaveCenterX, mWaveCenterY);
+ updatePointCloudPosition(mWaveCenterX, mWaveCenterY);
+ }
+ }
+ /**
+ * Loads an array of drawables from the given resourceId.
+ *
+ * @param resourceId
+ */
+ public void setTargetResources(int resourceId) {
+ if (mAnimatingTargets) {
+ // postpone this change until we return to the initial state
+ mNewTargetResources = resourceId;
+ } else {
+ internalSetTargetResources(resourceId);
+ }
+ }
+
+ public int getTargetResourceId() {
+ return mTargetResourceId;
+ }
+
+ /**
+ * Sets the handle drawable to the drawable specified by the resource ID.
+ * @param resourceId
+ */
+ public void setHandleDrawable(int resourceId) {
+ if (mHandleDrawable != null) {
+ mHandleDrawable.setDrawable(getResources(), resourceId);
+ } else {
+ mHandleDrawable = new TargetDrawable(getResources(), resourceId, 1);
+ }
+ mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE);
+ }
+
+ /**
+ * Sets the resource id specifying the target descriptions for accessibility.
+ *
+ * @param resourceId The resource id.
+ */
+ public void setTargetDescriptionsResourceId(int resourceId) {
+ mTargetDescriptionsResourceId = resourceId;
+ if (mTargetDescriptions != null) {
+ mTargetDescriptions.clear();
+ }
+ }
+
+ /**
+ * Gets the resource id specifying the target descriptions for accessibility.
+ *
+ * @return The resource id.
+ */
+ public int getTargetDescriptionsResourceId() {
+ return mTargetDescriptionsResourceId;
+ }
+
+ /**
+ * Sets the resource id specifying the target direction descriptions for accessibility.
+ *
+ * @param resourceId The resource id.
+ */
+ public void setDirectionDescriptionsResourceId(int resourceId) {
+ mDirectionDescriptionsResourceId = resourceId;
+ if (mDirectionDescriptions != null) {
+ mDirectionDescriptions.clear();
+ }
+ }
+
+ /**
+ * Gets the resource id specifying the target direction descriptions.
+ *
+ * @return The resource id.
+ */
+ public int getDirectionDescriptionsResourceId() {
+ return mDirectionDescriptionsResourceId;
+ }
+
+ /**
+ * Enable or disable vibrate on touch.
+ *
+ * @param enabled
+ */
+ public void setVibrateEnabled(boolean enabled) {
+ if (enabled && mVibrator == null) {
+ mVibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
+ } else {
+ mVibrator = null;
+ }
+ }
+
+ /**
+ * Starts wave animation.
+ *
+ */
+ public void ping() {
+ if (mFeedbackCount > 0) {
+ boolean doWaveAnimation = true;
+ final AnimationBundle waveAnimations = mWaveAnimations;
+
+ // Don't do a wave if there's already one in progress
+ if (waveAnimations.size() > 0 && waveAnimations.get(0).animator.isRunning()) {
+ long t = waveAnimations.get(0).animator.getCurrentPlayTime();
+ if (t < WAVE_ANIMATION_DURATION/2) {
+ doWaveAnimation = false;
+ }
+ }
+
+ if (doWaveAnimation) {
+ startWaveAnimation();
+ }
+ }
+ }
+
+ private void stopAndHideWaveAnimation() {
+ mWaveAnimations.cancel();
+ mPointCloud.waveManager.setAlpha(0.0f);
+ }
+
+ private void startWaveAnimation() {
+ mWaveAnimations.cancel();
+ mPointCloud.waveManager.setAlpha(1.0f);
+ mPointCloud.waveManager.setRadius(mHandleDrawable.getWidth()/2.0f);
+ mWaveAnimations.add(Tweener.to(mPointCloud.waveManager, WAVE_ANIMATION_DURATION,
+ "ease", Ease.Quad.easeOut,
+ "delay", 0,
+ "radius", 2.0f * mOuterRadius,
+ "onUpdate", mUpdateListener,
+ "onComplete",
+ new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ mPointCloud.waveManager.setRadius(0.0f);
+ mPointCloud.waveManager.setAlpha(0.0f);
+ }
+ }));
+ mWaveAnimations.start();
+ }
+
+ /**
+ * Resets the widget to default state and cancels all animation. If animate is 'true', will
+ * animate objects into place. Otherwise, objects will snap back to place.
+ *
+ * @param animate
+ */
+ public void reset(boolean animate) {
+ mGlowAnimations.stop();
+ mTargetAnimations.stop();
+ startBackgroundAnimation(0, 0.0f);
+ stopAndHideWaveAnimation();
+ hideTargets(animate, false);
+ hideGlow(0, 0, 0.0f, null);
+ Tweener.reset();
+ }
+
+ private void startBackgroundAnimation(int duration, float alpha) {
+ final Drawable background = getBackground();
+ if (mAlwaysTrackFinger && background != null) {
+ if (mBackgroundAnimator != null) {
+ mBackgroundAnimator.animator.cancel();
+ }
+ mBackgroundAnimator = Tweener.to(background, duration,
+ "ease", Ease.Cubic.easeIn,
+ "alpha", (int)(255.0f * alpha),
+ "delay", SHOW_ANIMATION_DELAY);
+ mBackgroundAnimator.animator.start();
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ final int action = event.getActionMasked();
+ boolean handled = false;
+ switch (action) {
+ case MotionEvent.ACTION_POINTER_DOWN:
+ case MotionEvent.ACTION_DOWN:
+ if (DEBUG) Log.v(TAG, "*** DOWN ***");
+ handleDown(event);
+ handleMove(event);
+ handled = true;
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+ if (DEBUG) Log.v(TAG, "*** MOVE ***");
+ handleMove(event);
+ handled = true;
+ break;
+
+ case MotionEvent.ACTION_POINTER_UP:
+ case MotionEvent.ACTION_UP:
+ if (DEBUG) Log.v(TAG, "*** UP ***");
+ handleMove(event);
+ handleUp(event);
+ handled = true;
+ break;
+
+ case MotionEvent.ACTION_CANCEL:
+ if (DEBUG) Log.v(TAG, "*** CANCEL ***");
+ handleMove(event);
+ handleCancel(event);
+ handled = true;
+ break;
+ }
+ invalidate();
+ return handled ? true : super.onTouchEvent(event);
+ }
+
+ private void updateGlowPosition(float x, float y) {
+ float dx = x - mOuterRing.getX();
+ float dy = y - mOuterRing.getY();
+ dx *= 1f / mRingScaleFactor;
+ dy *= 1f / mRingScaleFactor;
+ mPointCloud.glowManager.setX(mOuterRing.getX() + dx);
+ mPointCloud.glowManager.setY(mOuterRing.getY() + dy);
+ }
+
+ private void handleDown(MotionEvent event) {
+ int actionIndex = event.getActionIndex();
+ float eventX = event.getX(actionIndex);
+ float eventY = event.getY(actionIndex);
+ switchToState(STATE_START, eventX, eventY);
+ if (!trySwitchToFirstTouchState(eventX, eventY)) {
+ mDragging = false;
+ } else {
+ mPointerId = event.getPointerId(actionIndex);
+ updateGlowPosition(eventX, eventY);
+ }
+ }
+
+ private void handleUp(MotionEvent event) {
+ if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
+ int actionIndex = event.getActionIndex();
+ if (event.getPointerId(actionIndex) == mPointerId) {
+ switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
+ }
+ }
+
+ private void handleCancel(MotionEvent event) {
+ if (DEBUG && mDragging) Log.v(TAG, "** Handle CANCEL");
+
+ // We should drop the active target here but it interferes with
+ // moving off the screen in the direction of the navigation bar. At some point we may
+ // want to revisit how we handle this. For now we'll allow a canceled event to
+ // activate the current target.
+
+ // mActiveTarget = -1; // Drop the active target if canceled.
+
+ int actionIndex = event.findPointerIndex(mPointerId);
+ actionIndex = actionIndex == -1 ? 0 : actionIndex;
+ switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
+ }
+
+ private void handleMove(MotionEvent event) {
+ int activeTarget = -1;
+ final int historySize = event.getHistorySize();
+ ArrayList<TargetDrawable> targets = mTargetDrawables;
+ int ntargets = targets.size();
+ float x = 0.0f;
+ float y = 0.0f;
+ int actionIndex = event.findPointerIndex(mPointerId);
+
+ if (actionIndex == -1) {
+ return; // no data for this pointer
+ }
+
+ for (int k = 0; k < historySize + 1; k++) {
+ float eventX = k < historySize ? event.getHistoricalX(actionIndex, k)
+ : event.getX(actionIndex);
+ float eventY = k < historySize ? event.getHistoricalY(actionIndex, k)
+ :event.getY(actionIndex);
+ // tx and ty are relative to wave center
+ float tx = eventX - mWaveCenterX;
+ float ty = eventY - mWaveCenterY;
+ float touchRadius = (float) Math.hypot(tx, ty);
+ final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f;
+ float limitX = tx * scale;
+ float limitY = ty * scale;
+ double angleRad = Math.atan2(-ty, tx);
+
+ if (!mDragging) {
+ trySwitchToFirstTouchState(eventX, eventY);
+ }
+
+ if (mDragging) {
+ // For multiple targets, snap to the one that matches
+ final float snapRadius = mRingScaleFactor * mOuterRadius - mSnapMargin;
+ final float snapDistance2 = snapRadius * snapRadius;
+ // Find first target in range
+ for (int i = 0; i < ntargets; i++) {
+ TargetDrawable target = targets.get(i);
+
+ double targetMinRad = (i - 0.5) * 2 * Math.PI / ntargets;
+ double targetMaxRad = (i + 0.5) * 2 * Math.PI / ntargets;
+ if (target.isEnabled()) {
+ boolean angleMatches =
+ (angleRad > targetMinRad && angleRad <= targetMaxRad) ||
+ (angleRad + 2 * Math.PI > targetMinRad &&
+ angleRad + 2 * Math.PI <= targetMaxRad);
+ if (angleMatches && (dist2(tx, ty) > snapDistance2)) {
+ activeTarget = i;
+ }
+ }
+ }
+ }
+ x = limitX;
+ y = limitY;
+ }
+
+ if (!mDragging) {
+ return;
+ }
+
+ if (activeTarget != -1) {
+ switchToState(STATE_SNAP, x,y);
+ updateGlowPosition(x, y);
+ } else {
+ switchToState(STATE_TRACKING, x, y);
+ updateGlowPosition(x, y);
+ }
+
+ if (mActiveTarget != activeTarget) {
+ // Defocus the old target
+ if (mActiveTarget != -1) {
+ TargetDrawable target = targets.get(mActiveTarget);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ }
+ // Focus the new target
+ if (activeTarget != -1) {
+ TargetDrawable target = targets.get(activeTarget);
+ target.setState(TargetDrawable.STATE_FOCUSED);
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isEnabled()) {
+ String targetContentDescription = getTargetDescription(activeTarget);
+ announceForAccessibility(targetContentDescription);
+ }
+ }
+ }
+ mActiveTarget = activeTarget;
+ }
+
+ @Override
+ public boolean onHoverEvent(MotionEvent event) {
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isTouchExplorationEnabled()) {
+ final int action = event.getAction();
+ switch (action) {
+ case MotionEvent.ACTION_HOVER_ENTER:
+ event.setAction(MotionEvent.ACTION_DOWN);
+ break;
+ case MotionEvent.ACTION_HOVER_MOVE:
+ event.setAction(MotionEvent.ACTION_MOVE);
+ break;
+ case MotionEvent.ACTION_HOVER_EXIT:
+ event.setAction(MotionEvent.ACTION_UP);
+ break;
+ }
+ onTouchEvent(event);
+ event.setAction(action);
+ }
+ super.onHoverEvent(event);
+ return true;
+ }
+
+ /**
+ * Sets the current grabbed state, and dispatches a grabbed state change
+ * event to our listener.
+ */
+ private void setGrabbedState(int newState) {
+ if (newState != mGrabbedState) {
+ if (newState != OnTriggerListener.NO_HANDLE) {
+ vibrate();
+ }
+ mGrabbedState = newState;
+ if (mOnTriggerListener != null) {
+ if (newState == OnTriggerListener.NO_HANDLE) {
+ mOnTriggerListener.onReleased(this, OnTriggerListener.CENTER_HANDLE);
+ } else {
+ mOnTriggerListener.onGrabbed(this, OnTriggerListener.CENTER_HANDLE);
+ }
+ mOnTriggerListener.onGrabbedStateChange(this, newState);
+ }
+ }
+ }
+
+ private boolean trySwitchToFirstTouchState(float x, float y) {
+ final float tx = x - mWaveCenterX;
+ final float ty = y - mWaveCenterY;
+ if (mAlwaysTrackFinger || dist2(tx,ty) <= getScaledGlowRadiusSquared()) {
+ if (DEBUG) Log.v(TAG, "** Handle HIT");
+ switchToState(STATE_FIRST_TOUCH, x, y);
+ updateGlowPosition(tx, ty);
+ mDragging = true;
+ return true;
+ }
+ return false;
+ }
+
+ private void assignDefaultsIfNeeded() {
+ if (mOuterRadius == 0.0f) {
+ mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f;
+ }
+ if (mSnapMargin == 0.0f) {
+ mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics());
+ }
+ if (mInnerRadius == 0.0f) {
+ mInnerRadius = mHandleDrawable.getWidth() / 10.0f;
+ }
+ }
+
+ private void computeInsets(int dx, int dy) {
+ final int layoutDirection = getLayoutDirection();
+ final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection);
+
+ switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+ case Gravity.LEFT:
+ mHorizontalInset = 0;
+ break;
+ case Gravity.RIGHT:
+ mHorizontalInset = dx;
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ default:
+ mHorizontalInset = dx / 2;
+ break;
+ }
+ switch (absoluteGravity & Gravity.VERTICAL_GRAVITY_MASK) {
+ case Gravity.TOP:
+ mVerticalInset = 0;
+ break;
+ case Gravity.BOTTOM:
+ mVerticalInset = dy;
+ break;
+ case Gravity.CENTER_VERTICAL:
+ default:
+ mVerticalInset = dy / 2;
+ break;
+ }
+ }
+
+ /**
+ * Given the desired width and height of the ring and the allocated width and height, compute
+ * how much we need to scale the ring.
+ */
+ private float computeScaleFactor(int desiredWidth, int desiredHeight,
+ int actualWidth, int actualHeight) {
+
+ // Return unity if scaling is not allowed.
+ if (!mAllowScaling) return 1f;
+
+ final int layoutDirection = getLayoutDirection();
+ final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection);
+
+ float scaleX = 1f;
+ float scaleY = 1f;
+
+ // We use the gravity as a cue for whether we want to scale on a particular axis.
+ // We only scale to fit horizontally if we're not pinned to the left or right. Likewise,
+ // we only scale to fit vertically if we're not pinned to the top or bottom. In these
+ // cases, we want the ring to hang off the side or top/bottom, respectively.
+ switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+ case Gravity.LEFT:
+ case Gravity.RIGHT:
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ default:
+ if (desiredWidth > actualWidth) {
+ scaleX = (1f * actualWidth - mMaxTargetWidth) /
+ (desiredWidth - mMaxTargetWidth);
+ }
+ break;
+ }
+ switch (absoluteGravity & Gravity.VERTICAL_GRAVITY_MASK) {
+ case Gravity.TOP:
+ case Gravity.BOTTOM:
+ break;
+ case Gravity.CENTER_VERTICAL:
+ default:
+ if (desiredHeight > actualHeight) {
+ scaleY = (1f * actualHeight - mMaxTargetHeight) /
+ (desiredHeight - mMaxTargetHeight);
+ }
+ break;
+ }
+ return Math.min(scaleX, scaleY);
+ }
+
+ private float getRingWidth() {
+ return mRingScaleFactor * Math.max(mOuterRing.getWidth(), 2 * mOuterRadius);
+ }
+
+ private float getRingHeight() {
+ return mRingScaleFactor * Math.max(mOuterRing.getHeight(), 2 * mOuterRadius);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ final int width = right - left;
+ final int height = bottom - top;
+
+ // Target placement width/height. This puts the targets on the greater of the ring
+ // width or the specified outer radius.
+ final float placementWidth = getRingWidth();
+ final float placementHeight = getRingHeight();
+ float newWaveCenterX = mHorizontalInset
+ + (mMaxTargetWidth + placementWidth) / 2;
+ float newWaveCenterY = mVerticalInset
+ + (mMaxTargetHeight + placementHeight) / 2;
+
+ if (mInitialLayout) {
+ stopAndHideWaveAnimation();
+ hideTargets(false, false);
+ mInitialLayout = false;
+ }
+
+ mOuterRing.setPositionX(newWaveCenterX);
+ mOuterRing.setPositionY(newWaveCenterY);
+
+ mPointCloud.setScale(mRingScaleFactor);
+
+ mHandleDrawable.setPositionX(newWaveCenterX);
+ mHandleDrawable.setPositionY(newWaveCenterY);
+
+ updateTargetPositions(newWaveCenterX, newWaveCenterY);
+ updatePointCloudPosition(newWaveCenterX, newWaveCenterY);
+ updateGlowPosition(newWaveCenterX, newWaveCenterY);
+
+ mWaveCenterX = newWaveCenterX;
+ mWaveCenterY = newWaveCenterY;
+
+ if (DEBUG) dump();
+ }
+
+ private void updateTargetPositions(float centerX, float centerY) {
+ // Reposition the target drawables if the view changed.
+ ArrayList<TargetDrawable> targets = mTargetDrawables;
+ final int size = targets.size();
+ final float alpha = (float) (-2.0f * Math.PI / size);
+ for (int i = 0; i < size; i++) {
+ final TargetDrawable targetIcon = targets.get(i);
+ final float angle = alpha * i;
+ targetIcon.setPositionX(centerX);
+ targetIcon.setPositionY(centerY);
+ targetIcon.setX(getRingWidth() / 2 * (float) Math.cos(angle));
+ targetIcon.setY(getRingHeight() / 2 * (float) Math.sin(angle));
+ }
+ }
+
+ private void updatePointCloudPosition(float centerX, float centerY) {
+ mPointCloud.setCenter(centerX, centerY);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ mPointCloud.draw(canvas);
+ mOuterRing.draw(canvas);
+ final int ntargets = mTargetDrawables.size();
+ for (int i = 0; i < ntargets; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ if (target != null) {
+ target.draw(canvas);
+ }
+ }
+ mHandleDrawable.draw(canvas);
+ }
+
+ public void setOnTriggerListener(OnTriggerListener listener) {
+ mOnTriggerListener = listener;
+ }
+
+ private float square(float d) {
+ return d * d;
+ }
+
+ private float dist2(float dx, float dy) {
+ return dx*dx + dy*dy;
+ }
+
+ private float getScaledGlowRadiusSquared() {
+ final float scaledTapRadius;
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isEnabled()) {
+ scaledTapRadius = TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED * mGlowRadius;
+ } else {
+ scaledTapRadius = mGlowRadius;
+ }
+ return square(scaledTapRadius);
+ }
+
+ private void announceTargets() {
+ StringBuilder utterance = new StringBuilder();
+ final int targetCount = mTargetDrawables.size();
+ for (int i = 0; i < targetCount; i++) {
+ String targetDescription = getTargetDescription(i);
+ String directionDescription = getDirectionDescription(i);
+ if (!TextUtils.isEmpty(targetDescription)
+ && !TextUtils.isEmpty(directionDescription)) {
+ String text = String.format(directionDescription, targetDescription);
+ utterance.append(text);
+ }
+ }
+ if (utterance.length() > 0) {
+ announceForAccessibility(utterance.toString());
+ }
+ }
+
+ private String getTargetDescription(int index) {
+ if (mTargetDescriptions == null || mTargetDescriptions.isEmpty()) {
+ mTargetDescriptions = loadDescriptions(mTargetDescriptionsResourceId);
+ if (mTargetDrawables.size() != mTargetDescriptions.size()) {
+ Log.w(TAG, "The number of target drawables must be"
+ + " equal to the number of target descriptions.");
+ return null;
+ }
+ }
+ return mTargetDescriptions.get(index);
+ }
+
+ private String getDirectionDescription(int index) {
+ if (mDirectionDescriptions == null || mDirectionDescriptions.isEmpty()) {
+ mDirectionDescriptions = loadDescriptions(mDirectionDescriptionsResourceId);
+ if (mTargetDrawables.size() != mDirectionDescriptions.size()) {
+ Log.w(TAG, "The number of target drawables must be"
+ + " equal to the number of direction descriptions.");
+ return null;
+ }
+ }
+ return mDirectionDescriptions.get(index);
+ }
+
+ private ArrayList<String> loadDescriptions(int resourceId) {
+ TypedArray array = getContext().getResources().obtainTypedArray(resourceId);
+ final int count = array.length();
+ ArrayList<String> targetContentDescriptions = new ArrayList<String>(count);
+ for (int i = 0; i < count; i++) {
+ String contentDescription = array.getString(i);
+ targetContentDescriptions.add(contentDescription);
+ }
+ array.recycle();
+ return targetContentDescriptions;
+ }
+
+ public int getResourceIdForTarget(int index) {
+ final TargetDrawable drawable = mTargetDrawables.get(index);
+ return drawable == null ? 0 : drawable.getResourceId();
+ }
+
+ public void setEnableTarget(int resourceId, boolean enabled) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ final TargetDrawable target = mTargetDrawables.get(i);
+ if (target.getResourceId() == resourceId) {
+ target.setEnabled(enabled);
+ break; // should never be more than one match
+ }
+ }
+ }
+
+ /**
+ * Gets the position of a target in the array that matches the given resource.
+ * @param resourceId
+ * @return the index or -1 if not found
+ */
+ public int getTargetPosition(int resourceId) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ final TargetDrawable target = mTargetDrawables.get(i);
+ if (target.getResourceId() == resourceId) {
+ return i; // should never be more than one match
+ }
+ }
+ return -1;
+ }
+
+ private boolean replaceTargetDrawables(Resources res, int existingResourceId,
+ int newResourceId) {
+ if (existingResourceId == 0 || newResourceId == 0) {
+ return false;
+ }
+
+ boolean result = false;
+ final ArrayList<TargetDrawable> drawables = mTargetDrawables;
+ final int size = drawables.size();
+ for (int i = 0; i < size; i++) {
+ final TargetDrawable target = drawables.get(i);
+ if (target != null && target.getResourceId() == existingResourceId) {
+ target.setDrawable(res, newResourceId);
+ result = true;
+ }
+ }
+
+ if (result) {
+ requestLayout(); // in case any given drawable's size changes
+ }
+
+ return result;
+ }
+
+ /**
+ * Searches the given package for a resource to use to replace the Drawable on the
+ * target with the given resource id
+ * @param component of the .apk that contains the resource
+ * @param name of the metadata in the .apk
+ * @param existingResId the resource id of the target to search for
+ * @return true if found in the given package and replaced at least one target Drawables
+ */
+ public boolean replaceTargetDrawablesIfPresent(ComponentName component, String name,
+ int existingResId) {
+ if (existingResId == 0) return false;
+
+ boolean replaced = false;
+ if (component != null) {
+ try {
+ PackageManager packageManager = getContext().getPackageManager();
+ // Look for the search icon specified in the activity meta-data
+ Bundle metaData = packageManager.getActivityInfo(
+ component, PackageManager.GET_META_DATA).metaData;
+ if (metaData != null) {
+ int iconResId = metaData.getInt(name);
+ if (iconResId != 0) {
+ Resources res = packageManager.getResourcesForActivity(component);
+ replaced = replaceTargetDrawables(res, existingResId, iconResId);
+ }
+ }
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Failed to swap drawable; "
+ + component.flattenToShortString() + " not found", e);
+ } catch (Resources.NotFoundException nfe) {
+ Log.w(TAG, "Failed to swap drawable from "
+ + component.flattenToShortString(), nfe);
+ }
+ }
+ if (!replaced) {
+ // Restore the original drawable
+ replaceTargetDrawables(getContext().getResources(), existingResId, existingResId);
+ }
+ return replaced;
+ }
+
+ public class GlowpadExploreByTouchHelper extends ExploreByTouchHelper {
+
+ private Rect mBounds = new Rect();
+
+ public GlowpadExploreByTouchHelper(View forView) {
+ super(forView);
+ }
+
+ @Override
+ protected int getVirtualViewAt(float x, float y) {
+ if (mGrabbedState == OnTriggerListener.CENTER_HANDLE) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ final TargetDrawable target = mTargetDrawables.get(i);
+ if (target.isEnabled() && target.getBounds().contains((int) x, (int) y)) {
+ return i;
+ }
+ }
+ return INVALID_ID;
+ } else {
+ return HOST_ID;
+ }
+ }
+
+ @Override
+ protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
+ if (mGrabbedState == OnTriggerListener.CENTER_HANDLE) {
+ // Add virtual views backwards so that accessibility services like switch
+ // access traverse them in the correct order
+ for (int i = mTargetDrawables.size() - 1; i >= 0; i--) {
+ if (mTargetDrawables.get(i).isEnabled()) {
+ virtualViewIds.add(i);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
+ if (virtualViewId >= 0 && virtualViewId < mTargetDescriptions.size()) {
+ event.setContentDescription(mTargetDescriptions.get(virtualViewId));
+ }
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ if (host == GlowPadView.this && event.getEventType()
+ == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
+ event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
+ }
+ super.onInitializeAccessibilityEvent(host, event);
+ }
+
+ @Override
+ public void onPopulateNodeForHost(AccessibilityNodeInfoCompat node) {
+ if (mGrabbedState == OnTriggerListener.NO_HANDLE) {
+ node.setClickable(true);
+ node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+ }
+ mBounds.set(0, 0, GlowPadView.this.getWidth(), GlowPadView.this.getHeight());
+ node.setBoundsInParent(mBounds);
+ }
+
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (mGrabbedState == OnTriggerListener.NO_HANDLE) {
+ // Simulate handle being grabbed to expose targets.
+ trySwitchToFirstTouchState(mWaveCenterX, mWaveCenterY);
+ invalidateRoot();
+ return true;
+ }
+ return super.performAccessibilityAction(host, action, args);
+ }
+
+ @Override
+ protected void onPopulateNodeForVirtualView(int virtualViewId,
+ AccessibilityNodeInfoCompat node) {
+ if (virtualViewId < mTargetDrawables.size()) {
+ final TargetDrawable target = mTargetDrawables.get(virtualViewId);
+ node.setBoundsInParent(target.getBounds());
+ node.setClickable(true);
+ node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+ node.setContentDescription(getTargetDescription(virtualViewId));
+ }
+ }
+
+ @Override
+ protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
+ Bundle arguments) {
+ if (action == AccessibilityNodeInfo.ACTION_CLICK) {
+ if (virtualViewId >= 0 && virtualViewId < mTargetDrawables.size()) {
+ dispatchTriggerEvent(virtualViewId);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java
new file mode 100644
index 0000000..07a2cb9
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2012 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.incallui.widget.multiwaveview;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+public class PointCloud {
+ private static final float MIN_POINT_SIZE = 2.0f;
+ private static final float MAX_POINT_SIZE = 4.0f;
+ private static final int INNER_POINTS = 8;
+ private static final String TAG = "PointCloud";
+ private ArrayList<Point> mPointCloud = new ArrayList<Point>();
+ private Drawable mDrawable;
+ private float mCenterX;
+ private float mCenterY;
+ private Paint mPaint;
+ private float mScale = 1.0f;
+ private static final float PI = (float) Math.PI;
+
+ // These allow us to have multiple concurrent animations.
+ WaveManager waveManager = new WaveManager();
+ GlowManager glowManager = new GlowManager();
+ private float mOuterRadius;
+
+ public class WaveManager {
+ private float radius = 50;
+ private float width = 200.0f; // TODO: Make configurable
+ private float alpha = 0.0f;
+ public void setRadius(float r) {
+ radius = r;
+ }
+
+ public float getRadius() {
+ return radius;
+ }
+
+ public void setAlpha(float a) {
+ alpha = a;
+ }
+
+ public float getAlpha() {
+ return alpha;
+ }
+ };
+
+ public class GlowManager {
+ private float x;
+ private float y;
+ private float radius = 0.0f;
+ private float alpha = 0.0f;
+
+ public void setX(float x1) {
+ x = x1;
+ }
+
+ public float getX() {
+ return x;
+ }
+
+ public void setY(float y1) {
+ y = y1;
+ }
+
+ public float getY() {
+ return y;
+ }
+
+ public void setAlpha(float a) {
+ alpha = a;
+ }
+
+ public float getAlpha() {
+ return alpha;
+ }
+
+ public void setRadius(float r) {
+ radius = r;
+ }
+
+ public float getRadius() {
+ return radius;
+ }
+ }
+
+ class Point {
+ float x;
+ float y;
+ float radius;
+
+ public Point(float x2, float y2, float r) {
+ x = (float) x2;
+ y = (float) y2;
+ radius = r;
+ }
+ }
+
+ public PointCloud(Drawable drawable) {
+ mPaint = new Paint();
+ mPaint.setFilterBitmap(true);
+ mPaint.setColor(Color.rgb(255, 255, 255)); // TODO: make configurable
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+
+ mDrawable = drawable;
+ if (mDrawable != null) {
+ drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
+ }
+ }
+
+ public void setCenter(float x, float y) {
+ mCenterX = x;
+ mCenterY = y;
+ }
+
+ public void makePointCloud(float innerRadius, float outerRadius) {
+ if (innerRadius == 0) {
+ Log.w(TAG, "Must specify an inner radius");
+ return;
+ }
+ mOuterRadius = outerRadius;
+ mPointCloud.clear();
+ final float pointAreaRadius = (outerRadius - innerRadius);
+ final float ds = (2.0f * PI * innerRadius / INNER_POINTS);
+ final int bands = (int) Math.round(pointAreaRadius / ds);
+ final float dr = pointAreaRadius / bands;
+ float r = innerRadius;
+ for (int b = 0; b <= bands; b++, r += dr) {
+ float circumference = 2.0f * PI * r;
+ final int pointsInBand = (int) (circumference / ds);
+ float eta = PI/2.0f;
+ float dEta = 2.0f * PI / pointsInBand;
+ for (int i = 0; i < pointsInBand; i++) {
+ float x = r * (float) Math.cos(eta);
+ float y = r * (float) Math.sin(eta);
+ eta += dEta;
+ mPointCloud.add(new Point(x, y, r));
+ }
+ }
+ }
+
+ public void setScale(float scale) {
+ mScale = scale;
+ }
+
+ public float getScale() {
+ return mScale;
+ }
+
+ private static float hypot(float x, float y) {
+ return (float) Math.hypot(x, y);
+ }
+
+ private static float max(float a, float b) {
+ return a > b ? a : b;
+ }
+
+ public int getAlphaForPoint(Point point) {
+ // Contribution from positional glow
+ float glowDistance = hypot(glowManager.x - point.x, glowManager.y - point.y);
+ float glowAlpha = 0.0f;
+
+ if (glowDistance < glowManager.radius) {
+ double cos = Math.cos(Math.PI * 0.25d * glowDistance / glowManager.radius);
+ glowAlpha = glowManager.alpha * max(0.0f, (float) Math.pow(cos, 10.0d));
+ }
+
+ // Compute contribution from Wave
+ float radius = hypot(point.x, point.y);
+ float distanceToWaveRing = (radius - waveManager.radius);
+ float waveAlpha = 0.0f;
+ if (distanceToWaveRing < waveManager.width * 0.5f && distanceToWaveRing < 0.0f) {
+ double cos = Math.cos(Math.PI * 0.25d * distanceToWaveRing / waveManager.width);
+ waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cos, 20.0d));
+ }
+
+ return (int) (max(glowAlpha, waveAlpha) * 255);
+ }
+
+ private float interp(float min, float max, float f) {
+ return min + (max - min) * f;
+ }
+
+ public void draw(Canvas canvas) {
+ ArrayList<Point> points = mPointCloud;
+ canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ canvas.scale(mScale, mScale, mCenterX, mCenterY);
+ for (int i = 0; i < points.size(); i++) {
+ Point point = points.get(i);
+ final float pointSize = interp(MAX_POINT_SIZE, MIN_POINT_SIZE,
+ point.radius / mOuterRadius);
+ final float px = point.x + mCenterX;
+ final float py = point.y + mCenterY;
+ int alpha = getAlphaForPoint(point);
+
+ if (alpha == 0) continue;
+
+ if (mDrawable != null) {
+ canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ final float cx = mDrawable.getIntrinsicWidth() * 0.5f;
+ final float cy = mDrawable.getIntrinsicHeight() * 0.5f;
+ final float s = pointSize / MAX_POINT_SIZE;
+ canvas.scale(s, s, px, py);
+ canvas.translate(px - cx, py - cy);
+ mDrawable.setAlpha(alpha);
+ mDrawable.draw(canvas);
+ canvas.restore();
+ } else {
+ mPaint.setAlpha(alpha);
+ canvas.drawCircle(px, py, pointSize, mPaint);
+ }
+ }
+ canvas.restore();
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java
new file mode 100644
index 0000000..adc5324
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2011 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.incallui.widget.multiwaveview;
+
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.util.Log;
+
+public class TargetDrawable {
+ private static final String TAG = "TargetDrawable";
+ private static final boolean DEBUG = false;
+
+ public static final int[] STATE_ACTIVE =
+ { android.R.attr.state_enabled, android.R.attr.state_active };
+ public static final int[] STATE_INACTIVE =
+ { android.R.attr.state_enabled, -android.R.attr.state_active };
+ public static final int[] STATE_FOCUSED =
+ { android.R.attr.state_enabled, -android.R.attr.state_active,
+ android.R.attr.state_focused };
+
+ private float mTranslationX = 0.0f;
+ private float mTranslationY = 0.0f;
+ private float mPositionX = 0.0f;
+ private float mPositionY = 0.0f;
+ private float mScaleX = 1.0f;
+ private float mScaleY = 1.0f;
+ private float mAlpha = 1.0f;
+ private Drawable mDrawable;
+ private boolean mEnabled = true;
+ private final int mResourceId;
+ private int mNumDrawables = 1;
+ private Rect mBounds;
+
+ /**
+ * This is changed from the framework version to pass in the number of drawables in the
+ * container. The framework version relies on private api's to get the count from
+ * StateListDrawable.
+ *
+ * @param res
+ * @param resId
+ * @param count The number of drawables in the resource.
+ */
+ public TargetDrawable(Resources res, int resId, int count) {
+ mResourceId = resId;
+ setDrawable(res, resId);
+ mNumDrawables = count;
+ }
+
+ public void setDrawable(Resources res, int resId) {
+ // Note we explicitly don't set mResourceId to resId since we allow the drawable to be
+ // swapped at runtime and want to re-use the existing resource id for identification.
+ Drawable drawable = resId == 0 ? null : res.getDrawable(resId);
+ // Mutate the drawable so we can animate shared drawable properties.
+ mDrawable = drawable != null ? drawable.mutate() : null;
+ resizeDrawables();
+ setState(STATE_INACTIVE);
+ }
+
+ public TargetDrawable(TargetDrawable other) {
+ mResourceId = other.mResourceId;
+ // Mutate the drawable so we can animate shared drawable properties.
+ mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null;
+ resizeDrawables();
+ setState(STATE_INACTIVE);
+ }
+
+ public void setState(int [] state) {
+ if (mDrawable instanceof StateListDrawable) {
+ StateListDrawable d = (StateListDrawable) mDrawable;
+ d.setState(state);
+ }
+ }
+
+ /**
+ * Returns true if the drawable is a StateListDrawable and is in the focused state.
+ *
+ * @return
+ */
+ public boolean isActive() {
+ if (mDrawable instanceof StateListDrawable) {
+ StateListDrawable d = (StateListDrawable) mDrawable;
+ int[] states = d.getState();
+ for (int i = 0; i < states.length; i++) {
+ if (states[i] == android.R.attr.state_focused) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this target is enabled. Typically an enabled target contains a valid
+ * drawable in a valid state. Currently all targets with valid drawables are valid.
+ *
+ * @return
+ */
+ public boolean isEnabled() {
+ return mDrawable != null && mEnabled;
+ }
+
+ /**
+ * Makes drawables in a StateListDrawable all the same dimensions.
+ * If not a StateListDrawable, then justs sets the bounds to the intrinsic size of the
+ * drawable.
+ */
+ private void resizeDrawables() {
+ if (mDrawable instanceof StateListDrawable) {
+ StateListDrawable d = (StateListDrawable) mDrawable;
+ int maxWidth = 0;
+ int maxHeight = 0;
+
+ for (int i = 0; i < mNumDrawables; i++) {
+ d.selectDrawable(i);
+ Drawable childDrawable = d.getCurrent();
+ maxWidth = Math.max(maxWidth, childDrawable.getIntrinsicWidth());
+ maxHeight = Math.max(maxHeight, childDrawable.getIntrinsicHeight());
+ }
+
+ if (DEBUG) Log.v(TAG, "union of childDrawable rects " + d + " to: "
+ + maxWidth + "x" + maxHeight);
+ d.setBounds(0, 0, maxWidth, maxHeight);
+
+ for (int i = 0; i < mNumDrawables; i++) {
+ d.selectDrawable(i);
+ Drawable childDrawable = d.getCurrent();
+ if (DEBUG) Log.v(TAG, "sizing drawable " + childDrawable + " to: "
+ + maxWidth + "x" + maxHeight);
+ childDrawable.setBounds(0, 0, maxWidth, maxHeight);
+ }
+ } else if (mDrawable != null) {
+ mDrawable.setBounds(0, 0,
+ mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight());
+ }
+ }
+
+ public void setX(float x) {
+ mTranslationX = x;
+ }
+
+ public void setY(float y) {
+ mTranslationY = y;
+ }
+
+ public void setScaleX(float x) {
+ mScaleX = x;
+ }
+
+ public void setScaleY(float y) {
+ mScaleY = y;
+ }
+
+ public void setAlpha(float alpha) {
+ mAlpha = alpha;
+ }
+
+ public float getX() {
+ return mTranslationX;
+ }
+
+ public float getY() {
+ return mTranslationY;
+ }
+
+ public float getScaleX() {
+ return mScaleX;
+ }
+
+ public float getScaleY() {
+ return mScaleY;
+ }
+
+ public float getAlpha() {
+ return mAlpha;
+ }
+
+ public void setPositionX(float x) {
+ mPositionX = x;
+ }
+
+ public void setPositionY(float y) {
+ mPositionY = y;
+ }
+
+ public float getPositionX() {
+ return mPositionX;
+ }
+
+ public float getPositionY() {
+ return mPositionY;
+ }
+
+ public int getWidth() {
+ return mDrawable != null ? mDrawable.getIntrinsicWidth() : 0;
+ }
+
+ public int getHeight() {
+ return mDrawable != null ? mDrawable.getIntrinsicHeight() : 0;
+ }
+
+ public Rect getBounds() {
+ if (mBounds == null) {
+ mBounds = new Rect();
+ }
+ mBounds.set((int) (mTranslationX + mPositionX - getWidth() * 0.5),
+ (int) (mTranslationY + mPositionY - getHeight() * 0.5),
+ (int) (mTranslationX + mPositionX + getWidth() * 0.5),
+ (int) (mTranslationY + mPositionY + getHeight() * 0.5));
+ return mBounds;
+ }
+
+ public void draw(Canvas canvas) {
+ if (mDrawable == null || !mEnabled) {
+ return;
+ }
+ canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ canvas.scale(mScaleX, mScaleY, mPositionX, mPositionY);
+ canvas.translate(mTranslationX + mPositionX, mTranslationY + mPositionY);
+ canvas.translate(-0.5f * getWidth(), -0.5f * getHeight());
+ mDrawable.setAlpha((int) Math.round(mAlpha * 255f));
+ mDrawable.draw(canvas);
+ canvas.restore();
+ }
+
+ public void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
+
+ public int getResourceId() {
+ return mResourceId;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java
new file mode 100644
index 0000000..7222442
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2011 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.incallui.widget.multiwaveview;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+class Tweener {
+ private static final String TAG = "Tweener";
+ private static final boolean DEBUG = false;
+
+ ObjectAnimator animator;
+ private static HashMap<Object, Tweener> sTweens = new HashMap<Object, Tweener>();
+
+ public Tweener(ObjectAnimator anim) {
+ animator = anim;
+ }
+
+ private static void remove(Animator animator) {
+ Iterator<Entry<Object, Tweener>> iter = sTweens.entrySet().iterator();
+ while (iter.hasNext()) {
+ Entry<Object, Tweener> entry = iter.next();
+ if (entry.getValue().animator == animator) {
+ if (DEBUG) Log.v(TAG, "Removing tweener " + sTweens.get(entry.getKey())
+ + " sTweens.size() = " + sTweens.size());
+ iter.remove();
+ break; // an animator can only be attached to one object
+ }
+ }
+ }
+
+ public static Tweener to(Object object, long duration, Object... vars) {
+ long delay = 0;
+ AnimatorUpdateListener updateListener = null;
+ AnimatorListener listener = null;
+ TimeInterpolator interpolator = null;
+
+ // Iterate through arguments and discover properties to animate
+ ArrayList<PropertyValuesHolder> props = new ArrayList<PropertyValuesHolder>(vars.length/2);
+ for (int i = 0; i < vars.length; i+=2) {
+ if (!(vars[i] instanceof String)) {
+ throw new IllegalArgumentException("Key must be a string: " + vars[i]);
+ }
+ String key = (String) vars[i];
+ Object value = vars[i+1];
+
+ if ("simultaneousTween".equals(key)) {
+ // TODO
+ } else if ("ease".equals(key)) {
+ interpolator = (TimeInterpolator) value; // TODO: multiple interpolators?
+ } else if ("onUpdate".equals(key) || "onUpdateListener".equals(key)) {
+ updateListener = (AnimatorUpdateListener) value;
+ } else if ("onComplete".equals(key) || "onCompleteListener".equals(key)) {
+ listener = (AnimatorListener) value;
+ } else if ("delay".equals(key)) {
+ delay = ((Number) value).longValue();
+ } else if ("syncWith".equals(key)) {
+ // TODO
+ } else if (value instanceof float[]) {
+ props.add(PropertyValuesHolder.ofFloat(key,
+ ((float[])value)[0], ((float[])value)[1]));
+ } else if (value instanceof int[]) {
+ props.add(PropertyValuesHolder.ofInt(key,
+ ((int[])value)[0], ((int[])value)[1]));
+ } else if (value instanceof Number) {
+ float floatValue = ((Number)value).floatValue();
+ props.add(PropertyValuesHolder.ofFloat(key, floatValue));
+ } else {
+ throw new IllegalArgumentException(
+ "Bad argument for key \"" + key + "\" with value " + value.getClass());
+ }
+ }
+
+ // Re-use existing tween, if present
+ Tweener tween = sTweens.get(object);
+ ObjectAnimator anim = null;
+ if (tween == null) {
+ anim = ObjectAnimator.ofPropertyValuesHolder(object,
+ props.toArray(new PropertyValuesHolder[props.size()]));
+ tween = new Tweener(anim);
+ sTweens.put(object, tween);
+ if (DEBUG) Log.v(TAG, "Added new Tweener " + tween);
+ } else {
+ anim = sTweens.get(object).animator;
+ replace(props, object); // Cancel all animators for given object
+ }
+
+ if (interpolator != null) {
+ anim.setInterpolator(interpolator);
+ }
+
+ // Update animation with properties discovered in loop above
+ anim.setStartDelay(delay);
+ anim.setDuration(duration);
+ if (updateListener != null) {
+ anim.removeAllUpdateListeners(); // There should be only one
+ anim.addUpdateListener(updateListener);
+ }
+ if (listener != null) {
+ anim.removeAllListeners(); // There should be only one.
+ anim.addListener(listener);
+ }
+ anim.addListener(mCleanupListener);
+
+ return tween;
+ }
+
+ Tweener from(Object object, long duration, Object... vars) {
+ // TODO: for v of vars
+ // toVars[v] = object[v]
+ // object[v] = vars[v]
+ return Tweener.to(object, duration, vars);
+ }
+
+ // Listener to watch for completed animations and remove them.
+ private static AnimatorListener mCleanupListener = new AnimatorListenerAdapter() {
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ remove(animation);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ remove(animation);
+ }
+ };
+
+ public static void reset() {
+ if (DEBUG) {
+ Log.v(TAG, "Reset()");
+ if (sTweens.size() > 0) {
+ Log.v(TAG, "Cleaning up " + sTweens.size() + " animations");
+ }
+ }
+ sTweens.clear();
+ }
+
+ private static void replace(ArrayList<PropertyValuesHolder> props, Object... args) {
+ for (final Object killobject : args) {
+ Tweener tween = sTweens.get(killobject);
+ if (tween != null) {
+ tween.animator.cancel();
+ if (props != null) {
+ tween.animator.setValues(
+ props.toArray(new PropertyValuesHolder[props.size()]));
+ } else {
+ sTweens.remove(tween);
+ }
+ }
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incalluibind/ObjectFactory.java b/InCallUI/src/com/android/incalluibind/ObjectFactory.java
new file mode 100644
index 0000000..7e9423a
--- /dev/null
+++ b/InCallUI/src/com/android/incalluibind/ObjectFactory.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incalluibind;
+
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.incallui.CallCardPresenter.EmergencyCallListener;
+import com.android.incallui.ContactUtils;
+import com.android.incallui.DistanceHelper;
+import com.android.incallui.service.PhoneNumberService;
+
+public class ObjectFactory {
+
+ public static PhoneNumberService newPhoneNumberService(Context context) {
+ // no phone number service.
+ return null;
+ }
+
+ public static EmergencyCallListener newEmergencyCallListener() {
+ return null;
+ }
+
+ /** @return An {@link Intent} to be broadcast when the InCallUI is visible. */
+ public static Intent getUiReadyBroadcastIntent(Context context) {
+ return null;
+ }
+
+ /**
+ * @return An {@link Intent} to be broadcast when the call state button in the InCallUI is
+ * touched while in a call.
+ */
+ public static Intent getCallStateButtonBroadcastIntent(Context context) {
+ return null;
+ }
+
+ public static DistanceHelper newDistanceHelper(Context context,
+ DistanceHelper.Listener listener) {
+ return null;
+ }
+
+ public static ContactUtils getContactUtilsInstance(Context context) {
+ return null;
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java b/InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java
new file mode 100644
index 0000000..79545ce
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 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.incallui;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class CallCardPresenterTest extends AndroidTestCase {
+
+ private static final String NAME_PRIMARY = "Full Name";
+ private static final String NAME_ALTERNATIVE = "Name, Full";
+ private static final String LOCATION = "US";
+ private static final String NUMBER = "8006459001";
+
+ @Mock private ContactsPreferences mContactsPreferences;
+ private ContactCacheEntry mUnlockedContactInfo;
+ private ContactCacheEntry mLockedContactInfo;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+
+ Mockito.when(mContactsPreferences.getDisplayOrder())
+ .thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+ // Unlocked all contact info is available
+ mUnlockedContactInfo = new ContactCacheEntry();
+ mUnlockedContactInfo.namePrimary = NAME_PRIMARY;
+ mUnlockedContactInfo.nameAlternative = NAME_ALTERNATIVE;
+ mUnlockedContactInfo.location = LOCATION;
+ mUnlockedContactInfo.number = NUMBER;
+
+ // Locked only number and location are available
+ mLockedContactInfo = new ContactCacheEntry();
+ mLockedContactInfo .location = LOCATION;
+ mLockedContactInfo .number = NUMBER;
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ ContactsPreferencesFactory.setTestInstance(null);
+ }
+
+ public void testGetNameForCall_Unlocked() {
+ ContactsPreferencesFactory.setTestInstance(mContactsPreferences);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NAME_PRIMARY, presenter.getNameForCall(mUnlockedContactInfo));
+ }
+
+ public void testGetNameForCall_Locked() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NUMBER, presenter.getNameForCall(mLockedContactInfo));
+ }
+
+ public void testGetNameForCall_EmptyPreferredName() {
+ ContactCacheEntry contactInfo = new ContactCacheEntry();
+ contactInfo.number = NUMBER;
+
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NUMBER, presenter.getNameForCall(contactInfo));
+ }
+
+ public void testGetNumberForCall_Unlocked() {
+ ContactsPreferencesFactory.setTestInstance(mContactsPreferences);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NUMBER, presenter.getNumberForCall(mUnlockedContactInfo));
+ }
+
+ public void testGetNumberForCall_Locked() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(LOCATION, presenter.getNumberForCall(mLockedContactInfo));
+ }
+
+ public void testGetNumberForCall_EmptyPreferredName() {
+ ContactCacheEntry contactInfo = new ContactCacheEntry();
+ contactInfo.location = LOCATION;
+
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(LOCATION, presenter.getNumberForCall(contactInfo));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/CallTest.java b/InCallUI/tests/src/com/android/incallui/CallTest.java
new file mode 100644
index 0000000..118ec38
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/CallTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2016 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.incallui;
+
+import android.os.Bundle;
+import android.telecom.Connection;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+// @formatter:off
+/**
+ * Run test with
+ * adb shell am instrument -e class com.android.incallui.CallTest -w com.google.android.dialer.tests/android.test.InstrumentationTestRunner
+ */
+// @formatter:on
+
+@SmallTest
+public class CallTest extends AndroidTestCase {
+
+ private TestCall mCall;
+
+ private final static String CHILD_NUMBER = "123";
+ private final static ArrayList<String> LAST_FORWARDED_NUMBER_LIST =
+ new ArrayList(Arrays.asList("456", "789"));
+ private final static String LAST_FORWARDED_NUMBER = "789";
+ private final static String CALL_SUBJECT = "foo";
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ mCall = new TestCall();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testUpdateFromCallExtras() {
+ mCall.updateFromCallExtras(getTestBundle());
+ verifyTestBundleResult();
+ }
+
+ public void testUpdateFromCallExtras_corruptedBundle() {
+ mCall.setBundleCorrupted(true);
+ mCall.updateFromCallExtras(getTestBundle());
+
+ assertEquals(mCall.getChildNumber(), null);
+ assertEquals(mCall.getLastForwardedNumber(), null);
+ assertEquals(mCall.getCallSubject(), null);
+ }
+
+ public void testUpdateFromCallExtras_corruptedBundleOverwrite() {
+
+ mCall.updateFromCallExtras(getTestBundle());
+ mCall.setBundleCorrupted(true);
+ Bundle bundle = new Bundle();
+ bundle.putString(Connection.EXTRA_CHILD_ADDRESS, "321");
+ bundle.putStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER,
+ new ArrayList(Arrays.asList("654", "987")));
+ bundle.putString(Connection.EXTRA_CALL_SUBJECT, "bar");
+ mCall.updateFromCallExtras(bundle);
+ //corrupted bundle should not overwrite existing values.
+ verifyTestBundleResult();
+ }
+
+ private Bundle getTestBundle() {
+ Bundle bundle = new Bundle();
+ bundle.putString(Connection.EXTRA_CHILD_ADDRESS, CHILD_NUMBER);
+ bundle.putStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER,
+ LAST_FORWARDED_NUMBER_LIST);
+ bundle.putString(Connection.EXTRA_CALL_SUBJECT, CALL_SUBJECT);
+ return bundle;
+ }
+
+ private void verifyTestBundleResult() {
+ assertEquals(CHILD_NUMBER, mCall.getChildNumber());
+ assertEquals(LAST_FORWARDED_NUMBER, mCall.getLastForwardedNumber());
+ assertEquals(CALL_SUBJECT, mCall.getCallSubject());
+ }
+
+ private class TestCall extends Call {
+
+ private boolean mBundleCorrupted = false;
+
+ public TestCall() {
+ super(Call.State.NEW);
+ }
+
+ @Override
+ public void updateFromCallExtras(Bundle bundle) {
+ super.updateFromCallExtras(bundle);
+ }
+
+ public void setBundleCorrupted(boolean value) {
+ this.mBundleCorrupted = value;
+ }
+
+ @Override
+ protected boolean areCallExtrasCorrupted(Bundle callExtras) {
+ if (mBundleCorrupted) {
+ return true;
+ }
+ return super.areCallExtrasCorrupted(callExtras);
+ }
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java b/InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java
new file mode 100644
index 0000000..de5a023
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java
@@ -0,0 +1,31 @@
+/*
+ * 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.incallui;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+@SmallTest
+public class CallerInfoUtilsTest extends AndroidTestCase {
+ public void testToLogSafeNumber_email() {
+ assertEquals("xxx@xxx.xxx", CallerInfoUtils.toLogSafePhoneNumber("foo@foo.com"));
+ }
+
+ public void testToLogSafeNumber_phoneNumber() {
+ assertEquals("xxx-xxx-xxxx", CallerInfoUtils.toLogSafePhoneNumber("123-456-6789"));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java b/InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java
new file mode 100644
index 0000000..bf91555
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 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.incallui;
+
+import com.android.dialer.compat.UserManagerCompat;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+
+import org.mockito.Mockito;
+
+@SmallTest
+public class ContactsPreferencesFactoryTest extends AndroidTestCase {
+
+ public void testNewContactsPreferences_Unlocked() {
+ if (!UserManagerCompat.isUserUnlocked(getContext())) {
+ return;
+ }
+ assertNotNull(ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ }
+
+ public void testNewContactsPreferences_Locked() {
+ if (UserManagerCompat.isUserUnlocked(getContext())) {
+ return;
+ }
+ assertNull(ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ }
+
+ public void testNewContactsPreferences_TestInstance() {
+ ContactsPreferences testInstance = Mockito.mock(ContactsPreferences.class);
+ ContactsPreferencesFactory.setTestInstance(testInstance);
+ // Assert that it returns the same object always
+ assertSame(testInstance, ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ assertSame(testInstance, ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java b/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
new file mode 100644
index 0000000..625cda4
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.incallui;
+
+import android.location.Address;
+import android.test.AndroidTestCase;
+import android.util.Pair;
+
+import com.android.incallui.InCallContactInteractions.BusinessContextInfo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Tests for InCallContactInteractions class methods for formatting info for display.
+ *
+ * NOTE: tests assume system settings are set to 12hr time format and US locale. This means that
+ * the output of InCallContactInteractions methods are compared against strings in 12hr time format
+ * and US locale address formatting unless otherwise specified.
+ */
+public class InCallContactInteractionsTest extends AndroidTestCase {
+ private InCallContactInteractions mInCallContactInteractions;
+ private static final float TEST_DISTANCE = (float) 1234.56;
+
+ @Override
+ protected void setUp() {
+ mInCallContactInteractions = new InCallContactInteractions(mContext, true /* isBusiness */);
+ }
+
+ public void testIsOpenNow_NowMatchesOpenTime() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(8),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testIsOpenNow_ClosingAfterMidnight() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(10),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHourAndDaysFromToday(1, 1))))
+ .heading);
+ }
+
+ public void testIsOpenNow_Open24Hours() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(10),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHourAndDaysFromToday(8, 1))))
+ .heading);
+ }
+
+ public void testIsOpenNow_AfterMiddayBreak() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(13),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15))))
+ .heading);
+ }
+
+ public void testIsClosedNow_DuringMiddayBreak() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(11),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15))))
+ .heading);
+ }
+
+ public void testIsClosedNow_BeforeOpen() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(6),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testIsClosedNow_NowMatchesClosedTime() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(20),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testIsClosedNow_AfterClosed() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testOpeningHours_SingleOpenRangeWhileOpen() {
+ assertEquals("8:00 AM - 8:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(12),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .detail);
+ }
+
+ public void testOpeningHours_TwoOpenRangesWhileOpen() {
+ assertEquals("8:00 AM - 10:00 AM, 12:00 PM - 3:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(12),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15))))
+ .detail);
+ }
+
+ public void testOpeningHours_AfterClosedNoTomorrow() {
+ assertEquals("Closed today at 8:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .detail);
+ }
+
+ public void testOpeningHours_NotOpenTodayOpenTomorrow() {
+ assertEquals("Opens tomorrow at 8:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHourAndDaysFromToday(8, 1),
+ getTestCalendarWithHourAndDaysFromToday(10, 1))))
+ .detail);
+ }
+
+ public void testMultipleOpenRanges_BeforeOpen() {
+ assertEquals("Opens today at 8:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(7),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpenRanges_DuringFirstRange() {
+ assertEquals("Closes at 10:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(9),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpenRanges_BeforeMiddleRange() {
+ assertEquals("Opens today at 12:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(11),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpeningHours_DuringLastRange() {
+ assertEquals("Closes at 9:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(19),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpeningHours_AfterClose() {
+ assertEquals("Opens tomorrow at 8:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(22),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testNotOpenTodayOrTomorrow() {
+ assertEquals(null,
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ new ArrayList<Pair<Calendar, Calendar>>()));
+ }
+
+ public void testLocationInfo_ForUS() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.US,
+ getAddressForTest(),
+ TEST_DISTANCE);
+ assertEquals("0.8 mi away", info.heading);
+ assertEquals("Test address, Test locality", info.detail);
+ }
+
+ public void testLocationInfo_ForNotUS() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.CANADA,
+ getAddressForTest(),
+ TEST_DISTANCE);
+ assertEquals("1.2 km away", info.heading);
+ assertEquals("Test address, Test locality", info.detail);
+ }
+
+ public void testLocationInfo_NoLocality() {
+ Address address = getAddressForTest();
+ address.setLocality(null);
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.CANADA,
+ address,
+ TEST_DISTANCE);
+ assertEquals("1.2 km away", info.heading);
+ assertEquals("Test address", info.detail);
+ }
+
+ public void testLocationInfo_NoAddress() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.CANADA,
+ null,
+ TEST_DISTANCE);
+ assertEquals(null, info);
+ }
+
+ public void testLocationInfo_NoDistance() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.US,
+ getAddressForTest(),
+ DistanceHelper.DISTANCE_NOT_FOUND);
+ assertEquals(null, info.heading);
+ }
+
+ private Address getAddressForTest() {
+ Address address = new Address(Locale.US);
+ address.setAddressLine(0, "Test address");
+ address.setLocality("Test locality");
+ return address;
+ }
+
+ private Calendar getTestCalendarWithHour(int hour) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar;
+ }
+
+ private Calendar getTestCalendarWithHourAndDaysFromToday(int hour, int daysFromToday) {
+ Calendar calendar = getTestCalendarWithHour(hour);
+ calendar.add(Calendar.DATE, daysFromToday);
+ return calendar;
+ }
+
+ private List<Pair<Calendar, Calendar>> getMultipleOpeningHours() {
+ return Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15)),
+ Pair.create(
+ getTestCalendarWithHour(17),
+ getTestCalendarWithHour(21)),
+ Pair.create(
+ getTestCalendarWithHourAndDaysFromToday(8, 1),
+ getTestCalendarWithHourAndDaysFromToday(10, 1)),
+ Pair.create(
+ getTestCalendarWithHourAndDaysFromToday(12, 1),
+ getTestCalendarWithHourAndDaysFromToday(8, 1)));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java b/InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java
new file mode 100644
index 0000000..ed8d622
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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.incallui;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.incallui.InCallPresenter.InCallState;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class InCallPresenterTest extends InstrumentationTestCase {
+ private MockCallListWrapper mCallList;
+ @Mock private InCallActivity mInCallActivity;
+ @Mock private AudioModeProvider mAudioModeProvider;
+ @Mock private StatusBarNotifier mStatusBarNotifier;
+ @Mock private ContactInfoCache mContactInfoCache;
+ @Mock private ProximitySensor mProximitySensor;
+
+ InCallPresenter mInCallPresenter;
+ @Mock private Context mContext;
+ @Mock private TelephonyManager mTelephonyManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ System.setProperty("dexmaker.dexcache",
+ getInstrumentation().getTargetContext().getCacheDir().getPath());
+ MockitoAnnotations.initMocks(this);
+ mCallList = new MockCallListWrapper();
+
+ when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+
+ mInCallPresenter = InCallPresenter.getInstance();
+ mInCallPresenter.setUp(mContext, mCallList.getCallList(), mAudioModeProvider,
+ mStatusBarNotifier, mContactInfoCache, mProximitySensor);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // The tear down method needs to run in the main thread since there is an explicit check
+ // inside TelecomAdapter.getInstance().
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mInCallPresenter.unsetActivity(mInCallActivity);
+ mInCallPresenter.tearDown();
+ InCallPresenter.setInstance(null);
+ }
+ });
+ }
+
+ public void testOnActivitySet_finishesActivityWhenNoCalls() {
+ mInCallPresenter.setActivity(mInCallActivity);
+
+ verify(mInCallActivity).finish();
+ }
+
+ public void testOnCallListChange_sendsNotificationWhenInCall() {
+ mCallList.setHasCall(Call.State.INCOMING, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verify(mStatusBarNotifier).updateNotification(InCallState.INCOMING,
+ mCallList.getCallList());
+ verifyInCallActivityNotStarted();
+ }
+
+ /**
+ * This behavior is required to ensure that the screen is turned on again by the restarting
+ * activity.
+ */
+ public void testOnCallListChange_handlesCallWaitingWhenScreenOffShouldRestartActivity() {
+ mCallList.setHasCall(Call.State.ACTIVE, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+ mInCallPresenter.setActivity(mInCallActivity);
+
+ // Pretend that there is a call waiting and the screen is off
+ when(mInCallActivity.isDestroyed()).thenReturn(false);
+ when(mInCallActivity.isFinishing()).thenReturn(false);
+ when(mProximitySensor.isScreenReallyOff()).thenReturn(true);
+ mCallList.setHasCall(Call.State.INCOMING, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+ verify(mInCallActivity).finish();
+ }
+
+ /**
+ * Verifies that the PENDING_OUTGOING -> IN_CALL transition brings up InCallActivity so
+ * that it can display an error dialog.
+ */
+ public void testOnCallListChange_pendingOutgoingToInCallTransitionShowsUiForErrorDialog() {
+ mCallList.setHasCall(Call.State.CONNECTING, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ mCallList.setHasCall(Call.State.CONNECTING, false);
+ mCallList.setHasCall(Call.State.ACTIVE, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verify(mContext).startActivity(InCallPresenter.getInstance().getInCallIntent(false, false));
+ verifyIncomingCallNotificationNotSent();
+ }
+
+ /**
+ * Verifies that if there is a call in the SELECT_PHONE_ACCOUNT state, InCallActivity is displayed
+ * to display the account picker.
+ */
+ public void testOnCallListChange_noAccountProvidedForCallShowsUiForAccountPicker() {
+ mCallList.setHasCall(Call.State.SELECT_PHONE_ACCOUNT, true);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verify(mContext).startActivity(InCallPresenter.getInstance().getInCallIntent(false, false));
+ verifyIncomingCallNotificationNotSent();
+ }
+
+ /**
+ * Verifies that for an expected call state change (e.g. NO_CALLS -> PENDING_OUTGOING),
+ * InCallActivity is not displayed.
+ */
+ public void testOnCallListChange_noCallsToPendingOutgoingDoesNotShowUi() {
+ mCallList.setHasCall(Call.State.CONNECTING, true);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verifyInCallActivityNotStarted();
+ verifyIncomingCallNotificationNotSent();
+ }
+
+ public void testOnCallListChange_LastCallDisconnectedNoCallsLeftFinishesUi() {
+ mCallList.setHasCall(Call.State.DISCONNECTED, true);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ mInCallPresenter.setActivity(mInCallActivity);
+
+ verify(mInCallActivity, never()).finish();
+
+ // Last remaining disconnected call is removed from CallList, activity should shut down.
+ mCallList.setHasCall(Call.State.DISCONNECTED, false);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+ verify(mInCallActivity).finish();
+ }
+
+
+ //TODO
+ public void testCircularReveal_startsCircularRevealForOutgoingCalls() {
+
+ }
+
+ public void testCircularReveal_waitTillCircularRevealSentBeforeShowingCallCard() {
+ }
+
+ public void testHangupOngoingCall_disconnectsCallCorrectly() {
+ }
+
+ public void testAnswerIncomingCall() {
+ }
+
+ public void testDeclineIncomingCall() {
+ }
+
+ private void verifyInCallActivityNotStarted() {
+ verify(mContext, never()).startActivity(Mockito.any(Intent.class));
+ }
+
+ private void verifyIncomingCallNotificationNotSent() {
+ verify(mStatusBarNotifier, never()).updateNotification(Mockito.any(InCallState.class),
+ Mockito.any(CallList.class));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java b/InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java
new file mode 100644
index 0000000..369c430
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java
@@ -0,0 +1,80 @@
+/*
+ * 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.incallui;
+
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.telecom.PhoneAccountHandle;
+
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.util.HashSet;
+
+/**
+ * Provides an instance of a mock CallList, and provides utility methods to put the CallList into
+ * various states (e.g. incoming call, active call, call waiting).
+ */
+public class MockCallListWrapper {
+ private CallList mCallList;
+ private HashSet<Integer> mCallSet = new HashSet<>();
+
+ public MockCallListWrapper() {
+ mCallList = Mockito.mock(CallList.class);
+ mCallList = spy(new CallList());
+ when(mCallList.getFirstCallWithState(anyInt())).thenAnswer(new Answer<Call>() {
+ @Override
+ public Call answer(InvocationOnMock i) throws Throwable {
+ Object[] args = i.getArguments();
+ final int state = (int) args[0];
+ if (mCallSet.contains(state)) {
+ return getMockCall(state);
+ } else {
+ return null;
+ }
+ }
+ });
+ }
+
+ public CallList getCallList() {
+ return mCallList;
+ }
+
+ public void setHasCall(int state, boolean hasCall) {
+ if (hasCall) {
+ mCallSet.add(state);
+ } else {
+ mCallSet.remove(state);
+ }
+ }
+
+ private static Call getMockCall(int state) {
+ return getMockCall(state, state != Call.State.SELECT_PHONE_ACCOUNT);
+ }
+
+ private static Call getMockCall(int state, boolean hasAccountHandle) {
+ final Call call = Mockito.mock(Call.class);
+ when(call.getState()).thenReturn(Integer.valueOf(state));
+ if (hasAccountHandle) {
+ when(call.getAccountHandle()).thenReturn(new PhoneAccountHandle(null, null));
+ }
+ return call;
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java b/InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java
new file mode 100644
index 0000000..1c8f347
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.incallui;
+
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.incallui.InCallPresenter.InCallState;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class ProximitySensorTest extends InstrumentationTestCase {
+ @Mock private AccelerometerListener mAccelerometerListener;
+ private MockCallListWrapper mCallList;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ System.setProperty("dexmaker.dexcache",
+ getInstrumentation().getTargetContext().getCacheDir().getPath());
+ MockitoAnnotations.initMocks(this);
+ mCallList = new MockCallListWrapper();
+ }
+
+ public void testAccelerometerBehaviorOnDisplayChange() {
+ final ProximitySensor proximitySensor =
+ new ProximitySensor(
+ getInstrumentation().getContext(),
+ new AudioModeProvider(),
+ mAccelerometerListener);
+ verify(mAccelerometerListener, never()).enable(anyBoolean());
+ proximitySensor.onStateChange(null, InCallState.OUTGOING, mCallList.getCallList());
+ verify(mAccelerometerListener).enable(true);
+ verify(mAccelerometerListener, never()).enable(false);
+
+ proximitySensor.onDisplayStateChanged(false);
+ verify(mAccelerometerListener).enable(true);
+ verify(mAccelerometerListener).enable(false);
+
+ proximitySensor.onDisplayStateChanged(true);
+ verify(mAccelerometerListener, times(2)).enable(true);
+ verify(mAccelerometerListener).enable(false);
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java b/InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java
new file mode 100644
index 0000000..4c55ddc
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 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.incallui;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class StatusBarNotifierTest extends AndroidTestCase {
+
+ private static final String NAME_PRIMARY = "Full Name";
+ private static final String NAME_ALTERNATIVE = "Name, Full";
+ private static final String LOCATION = "US";
+ private static final String NUMBER = "8006459001";
+
+ @Mock private Call mCall;
+ @Mock private ContactsPreferences mContactsPreferences;
+ private ContactCacheEntry mUnlockedContactInfo;
+ private ContactCacheEntry mLockedContactInfo;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+
+ Mockito.when(mContactsPreferences.getDisplayOrder())
+ .thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+ // Unlocked all contact info is available
+ mUnlockedContactInfo = new ContactCacheEntry();
+ mUnlockedContactInfo.namePrimary = NAME_PRIMARY;
+ mUnlockedContactInfo.nameAlternative = NAME_ALTERNATIVE;
+ mUnlockedContactInfo.location = LOCATION;
+ mUnlockedContactInfo.number = NUMBER;
+
+ // Locked only number and location are available
+ mLockedContactInfo = new ContactCacheEntry();
+ mLockedContactInfo .location = LOCATION;
+ mLockedContactInfo .number = NUMBER;
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ ContactsPreferencesFactory.setTestInstance(null);
+ }
+
+ public void testGetContentTitle_ConferenceCall() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+
+ Mockito.when(mCall.isConferenceCall()).thenReturn(true);
+ Mockito.when(mCall.hasProperty(Mockito.anyInt())).thenReturn(false);
+
+ assertEquals(mContext.getResources().getString(R.string.card_title_conf_call),
+ statusBarNotifier.getContentTitle(null, mCall));
+ }
+
+ public void testGetContentTitle_Unlocked() {
+ ContactsPreferencesFactory.setTestInstance(mContactsPreferences);
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+ assertEquals(NAME_PRIMARY, statusBarNotifier.getContentTitle(mUnlockedContactInfo, mCall));
+ }
+
+ public void testGetContentTitle_Locked() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+ assertEquals(NUMBER, statusBarNotifier.getContentTitle(mLockedContactInfo, mCall));
+ }
+
+ public void testGetContentTitle_EmptyPreferredName() {
+ ContactCacheEntry contactCacheEntry = new ContactCacheEntry();
+ contactCacheEntry.number = NUMBER;
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+ assertEquals(NUMBER, statusBarNotifier.getContentTitle(contactCacheEntry, mCall));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java b/InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java
new file mode 100644
index 0000000..f94f71d
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ringtone/RingtoneManagerTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2016 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.incallui.ringtone;
+
+import android.media.RingtoneManager;
+import android.test.AndroidTestCase;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.incallui.Call.State;
+
+public class RingtoneManagerTest extends AndroidTestCase {
+
+ private DialerRingtoneManager mRingtoneManager;
+
+ @Override
+ public void setUp() {
+ mRingtoneManager = new DialerRingtoneManager();
+ mRingtoneManager.forceDialerRingingEnabled();
+ }
+
+ @Override
+ public void tearDown() {
+ mRingtoneManager = null;
+ }
+
+ public void testShouldPlayRingtone_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayRingtone(0, null));
+ }
+
+ public void testShouldPlayRingtone_N_NullUri() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayRingtone(State.INCOMING, null));
+ }
+
+ public void testShouldPlayRingtone_N_NotIncoming() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayRingtone(State.ACTIVE, null));
+ }
+
+ // Specific case for call waiting since that needs its own sound
+ public void testShouldPlayRingtone_N_CallWaiting() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayRingtone(State.CALL_WAITING, null));
+ }
+
+ public void testShouldPlayRingtone_N() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertTrue(mRingtoneManager.shouldPlayRingtone(State.INCOMING,
+ RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)));
+ }
+
+ public void testShouldPlayCallWaitingTone_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayCallWaitingTone(0));
+ }
+
+ public void testShouldPlayCallWaitingTone_N_NotCallWaiting() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayCallWaitingTone(State.ACTIVE));
+ }
+
+ // Specific case for incoming since it plays its own sound
+ public void testShouldPlayCallWaitingTone_N_Incoming() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManager.shouldPlayCallWaitingTone(State.INCOMING));
+ }
+
+ public void testShouldPlayCallWaitingTone_N() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertTrue(mRingtoneManager.shouldPlayCallWaitingTone(State.CALL_WAITING));
+ }
+}