merge in KFS78N (no-op)
diff --git a/InCallUI/res/drawable-hdpi/business_unknown.png b/InCallUI/res/drawable-hdpi/business_unknown.png
new file mode 100644
index 0000000..b369939
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/endcall_active.png b/InCallUI/res/drawable-hdpi/endcall_active.png
deleted file mode 100644
index 38f1e1c..0000000
--- a/InCallUI/res/drawable-hdpi/endcall_active.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/endcall_background_texture.png b/InCallUI/res/drawable-hdpi/endcall_background_texture.png
deleted file mode 100644
index 095b0b6..0000000
--- a/InCallUI/res/drawable-hdpi/endcall_background_texture.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/endcall_disable.png b/InCallUI/res/drawable-hdpi/endcall_disable.png
deleted file mode 100644
index 6a0f658..0000000
--- a/InCallUI/res/drawable-hdpi/endcall_disable.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_dial_end_call.png b/InCallUI/res/drawable-hdpi/ic_dial_end_call.png
deleted file mode 100644
index ab3adb4..0000000
--- a/InCallUI/res/drawable-hdpi/ic_dial_end_call.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_end_call_holo_dark.png b/InCallUI/res/drawable-hdpi/ic_end_call_holo_dark.png
deleted file mode 100644
index 0f373bb..0000000
--- a/InCallUI/res/drawable-hdpi/ic_end_call_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_in_call_bt_dk.png b/InCallUI/res/drawable-hdpi/ic_in_call_bt_dk.png
new file mode 100644
index 0000000..4901a2c
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_in_call_bt_dk.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_in_call_phone_hangup.png b/InCallUI/res/drawable-hdpi/ic_in_call_phone_hangup.png
new file mode 100644
index 0000000..d6f26f2
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_in_call_phone_hangup.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_incoming_call_bluetooth.png b/InCallUI/res/drawable-hdpi/ic_incoming_call_bluetooth.png
deleted file mode 100644
index 050c3e7..0000000
--- a/InCallUI/res/drawable-hdpi/ic_incoming_call_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png
index 5654cd6..596accb 100644
--- a/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png b/InCallUI/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
index f6fd30d..c8afb46 100644
--- a/InCallUI/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
+++ b/InCallUI/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/picture_dialing.png b/InCallUI/res/drawable-hdpi/picture_dialing.png
new file mode 100644
index 0000000..6311f69
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/picture_unknown.png b/InCallUI/res/drawable-hdpi/picture_unknown.png
index 278c121..26d2be1 100644
--- a/InCallUI/res/drawable-hdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-hdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-ldrtl-hdpi/picture_dialing.png b/InCallUI/res/drawable-ldrtl-hdpi/picture_dialing.png
new file mode 100644
index 0000000..cb587a8
--- /dev/null
+++ b/InCallUI/res/drawable-ldrtl-hdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-ldrtl-mdpi/picture_dialing.png b/InCallUI/res/drawable-ldrtl-mdpi/picture_dialing.png
new file mode 100644
index 0000000..4047b22
--- /dev/null
+++ b/InCallUI/res/drawable-ldrtl-mdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-ldrtl-xhdpi/picture_dialing.png b/InCallUI/res/drawable-ldrtl-xhdpi/picture_dialing.png
new file mode 100644
index 0000000..f167ecb
--- /dev/null
+++ b/InCallUI/res/drawable-ldrtl-xhdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/business_unknown.png b/InCallUI/res/drawable-mdpi/business_unknown.png
new file mode 100644
index 0000000..eac97a9
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/endcall_active.png b/InCallUI/res/drawable-mdpi/endcall_active.png
deleted file mode 100644
index a82738b..0000000
--- a/InCallUI/res/drawable-mdpi/endcall_active.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/endcall_background_texture.png b/InCallUI/res/drawable-mdpi/endcall_background_texture.png
deleted file mode 100644
index efa6502..0000000
--- a/InCallUI/res/drawable-mdpi/endcall_background_texture.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/endcall_disable.png b/InCallUI/res/drawable-mdpi/endcall_disable.png
deleted file mode 100644
index bd1a2f3..0000000
--- a/InCallUI/res/drawable-mdpi/endcall_disable.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_dial_end_call.png b/InCallUI/res/drawable-mdpi/ic_dial_end_call.png
deleted file mode 100644
index c476642..0000000
--- a/InCallUI/res/drawable-mdpi/ic_dial_end_call.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_end_call_holo_dark.png b/InCallUI/res/drawable-mdpi/ic_end_call_holo_dark.png
deleted file mode 100644
index e090cc8..0000000
--- a/InCallUI/res/drawable-mdpi/ic_end_call_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_in_call_bt_dk.png b/InCallUI/res/drawable-mdpi/ic_in_call_bt_dk.png
new file mode 100644
index 0000000..820ebe1
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_in_call_bt_dk.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_in_call_phone_hangup.png b/InCallUI/res/drawable-mdpi/ic_in_call_phone_hangup.png
new file mode 100644
index 0000000..1dfad3b
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_in_call_phone_hangup.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_incoming_call_bluetooth.png b/InCallUI/res/drawable-mdpi/ic_incoming_call_bluetooth.png
deleted file mode 100644
index 4b317c1..0000000
--- a/InCallUI/res/drawable-mdpi/ic_incoming_call_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png
index 6e77525..fd0e8d7 100644
--- a/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png b/InCallUI/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png
index 92da2f0..c9002b7 100644
--- a/InCallUI/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png
+++ b/InCallUI/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/picture_dialing.png b/InCallUI/res/drawable-mdpi/picture_dialing.png
new file mode 100644
index 0000000..b81b603
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/picture_unknown.png b/InCallUI/res/drawable-mdpi/picture_unknown.png
index cc5dd09..1ee333c 100644
--- a/InCallUI/res/drawable-mdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-mdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/business_unknown.png b/InCallUI/res/drawable-xhdpi/business_unknown.png
new file mode 100644
index 0000000..aa84456
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/endcall_active.png b/InCallUI/res/drawable-xhdpi/endcall_active.png
deleted file mode 100644
index 5347ed2..0000000
--- a/InCallUI/res/drawable-xhdpi/endcall_active.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/endcall_background_texture.png b/InCallUI/res/drawable-xhdpi/endcall_background_texture.png
deleted file mode 100644
index c94eeec..0000000
--- a/InCallUI/res/drawable-xhdpi/endcall_background_texture.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/endcall_disable.png b/InCallUI/res/drawable-xhdpi/endcall_disable.png
deleted file mode 100644
index fa10196..0000000
--- a/InCallUI/res/drawable-xhdpi/endcall_disable.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_dial_end_call.png b/InCallUI/res/drawable-xhdpi/ic_dial_end_call.png
deleted file mode 100644
index c24ec98..0000000
--- a/InCallUI/res/drawable-xhdpi/ic_dial_end_call.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_end_call_holo_dark.png b/InCallUI/res/drawable-xhdpi/ic_end_call_holo_dark.png
deleted file mode 100644
index f64f5e3..0000000
--- a/InCallUI/res/drawable-xhdpi/ic_end_call_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_in_call_bt_dk.png b/InCallUI/res/drawable-xhdpi/ic_in_call_bt_dk.png
new file mode 100644
index 0000000..8ca78f4
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_in_call_bt_dk.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_in_call_phone_hangup.png b/InCallUI/res/drawable-xhdpi/ic_in_call_phone_hangup.png
new file mode 100644
index 0000000..1d1bfeb
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_in_call_phone_hangup.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_incoming_call_bluetooth.png b/InCallUI/res/drawable-xhdpi/ic_incoming_call_bluetooth.png
deleted file mode 100644
index 662e7bb..0000000
--- a/InCallUI/res/drawable-xhdpi/ic_incoming_call_bluetooth.png
+++ /dev/null
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png
index e4b3393..29037a0 100644
--- a/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/picture_dialing.png b/InCallUI/res/drawable-xhdpi/picture_dialing.png
new file mode 100644
index 0000000..792cd8e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/picture_unknown.png b/InCallUI/res/drawable-xhdpi/picture_unknown.png
index b8ee922..db74fd9 100644
--- a/InCallUI/res/drawable-xhdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-xhdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/business_unknown.png b/InCallUI/res/drawable-xxhdpi/business_unknown.png
new file mode 100644
index 0000000..6273bb3
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_background_texture.png b/InCallUI/res/drawable-xxhdpi/dial_background_texture.png
new file mode 100644
index 0000000..437741c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_background_texture.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_0_no_plus_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_0_no_plus_wht.png
new file mode 100644
index 0000000..36d65c7
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_0_no_plus_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_0_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_0_wht.png
new file mode 100644
index 0000000..3737232
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_0_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_1_no_vm_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_1_no_vm_wht.png
new file mode 100644
index 0000000..a41c678
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_1_no_vm_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_1_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_1_wht.png
new file mode 100644
index 0000000..e2afb2f
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_1_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_2_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_2_wht.png
new file mode 100644
index 0000000..e4dd69e
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_2_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_3_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_3_wht.png
new file mode 100644
index 0000000..42b37c7
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_3_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_4_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_4_wht.png
new file mode 100644
index 0000000..37bf49c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_4_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_5_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_5_wht.png
new file mode 100644
index 0000000..a163848
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_5_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_6_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_6_wht.png
new file mode 100644
index 0000000..3ff9d39
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_6_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_7_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_7_wht.png
new file mode 100644
index 0000000..bc91621
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_7_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_8_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_8_wht.png
new file mode 100644
index 0000000..84b2f1c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_8_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_9_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_9_wht.png
new file mode 100644
index 0000000..ced1c94
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_9_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_pound_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_pound_wht.png
new file mode 100644
index 0000000..ab2758c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_pound_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/dial_num_star_wht.png b/InCallUI/res/drawable-xxhdpi/dial_num_star_wht.png
new file mode 100644
index 0000000..75ce198
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/dial_num_star_wht.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_ab_dialer_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_ab_dialer_holo_dark.png
new file mode 100644
index 0000000..3c8021c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_ab_dialer_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_active_state_dialer_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_active_state_dialer_holo_dark.png
new file mode 100644
index 0000000..26a22ba
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_active_state_dialer_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_add_contact_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_add_contact_holo_dark.png
new file mode 100644
index 0000000..6eed276
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_add_contact_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_bluetooth_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_bluetooth_holo_dark.png
new file mode 100644
index 0000000..4b668b7
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_bluetooth_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_dialpad_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_dialpad_holo_dark.png
new file mode 100644
index 0000000..c8ce94b
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_dialpad_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_groups_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_groups_holo_dark.png
new file mode 100644
index 0000000..6fdaa5d
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_groups_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_hold_pause_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_hold_pause_holo_dark.png
new file mode 100644
index 0000000..e38bea1
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_hold_pause_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_in_call_bt_dk.png b/InCallUI/res/drawable-xxhdpi/ic_in_call_bt_dk.png
new file mode 100644
index 0000000..e94c772
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_in_call_bt_dk.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_in_call_phone_hangup.png b/InCallUI/res/drawable-xxhdpi/ic_in_call_phone_hangup.png
new file mode 100644
index 0000000..67d8ad2
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_in_call_phone_hangup.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_in_call_touch_handle_normal.png b/InCallUI/res/drawable-xxhdpi/ic_in_call_touch_handle_normal.png
new file mode 100644
index 0000000..b41967b
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_in_call_touch_handle_normal.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_incall_switch_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_incall_switch_holo_dark.png
new file mode 100644
index 0000000..67c1d7d
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_incall_switch_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_answer_activated.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_answer_activated.png
new file mode 100644
index 0000000..173b54c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_answer_activated.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_answer_normal.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_answer_normal.png
new file mode 100644
index 0000000..fcf4367
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_answer_normal.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_decline_activated.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_decline_activated.png
new file mode 100644
index 0000000..74b6cf0
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_decline_activated.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_decline_normal.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_decline_normal.png
new file mode 100644
index 0000000..54b7965
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_decline_normal.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_text_activated.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_text_activated.png
new file mode 100644
index 0000000..a4e0048
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_text_activated.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_text_normal.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_text_normal.png
new file mode 100644
index 0000000..20ff309
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_text_normal.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_merge_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_merge_holo_dark.png
new file mode 100644
index 0000000..a7125af
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_merge_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_more_indicator_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_more_indicator_holo_dark.png
new file mode 100644
index 0000000..42f6549
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_more_indicator_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_mute_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_mute_holo_dark.png
new file mode 100644
index 0000000..678b7fb
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_mute_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_sound_bluetooth_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_sound_bluetooth_holo_dark.png
new file mode 100644
index 0000000..8646bec
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_sound_bluetooth_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_sound_handset_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_sound_handset_holo_dark.png
new file mode 100644
index 0000000..7f89efb
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_sound_handset_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_sound_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_sound_holo_dark.png
new file mode 100644
index 0000000..5d36d4e
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_sound_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_sound_off_speakerphone_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_sound_off_speakerphone_holo_dark.png
new file mode 100644
index 0000000..caf36e0
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_sound_off_speakerphone_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_sound_speakerphone_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_sound_speakerphone_holo_dark.png
new file mode 100644
index 0000000..e6e974f
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_sound_speakerphone_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_split_holo_dark.png b/InCallUI/res/drawable-xxhdpi/ic_split_holo_dark.png
new file mode 100644
index 0000000..16b6ac0
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_split_holo_dark.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/list_focused_holo.9.png b/InCallUI/res/drawable-xxhdpi/list_focused_holo.9.png
new file mode 100644
index 0000000..3e4ca68
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/list_focused_holo.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png
new file mode 100644
index 0000000..d4952ea
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.png b/InCallUI/res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.png
new file mode 100644
index 0000000..26234b1
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/picture_conference.png b/InCallUI/res/drawable-xxhdpi/picture_conference.png
new file mode 100644
index 0000000..e3dd686
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/picture_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/picture_dialing.png b/InCallUI/res/drawable-xxhdpi/picture_dialing.png
new file mode 100644
index 0000000..17d45f5
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/picture_dialing.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/picture_unknown.png b/InCallUI/res/drawable-xxhdpi/picture_unknown.png
new file mode 100644
index 0000000..38bec2c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call.png b/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call.png
new file mode 100644
index 0000000..9348384
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call_end.png b/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call_end.png
new file mode 100644
index 0000000..1f3a81b
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call_end.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call_on_hold.png b/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call_on_hold.png
new file mode 100644
index 0000000..6403ce8
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/stat_sys_phone_call_on_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable/dialpad_background.xml b/InCallUI/res/drawable/dialpad_background.xml
deleted file mode 100644
index 0e31f5e..0000000
--- a/InCallUI/res/drawable/dialpad_background.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?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.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/dial_background_texture"
- android:tileMode="repeat" />
diff --git a/InCallUI/res/drawable/dialpad_background_opaque.xml b/InCallUI/res/drawable/dialpad_background_opaque.xml
deleted file mode 100644
index d8792f2..0000000
--- a/InCallUI/res/drawable/dialpad_background_opaque.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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.
--->
-
-<!-- Opaque version of dialpad_background.xml. -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-
- <!-- An opaque black layer underneath. -->
- <item android:drawable="@android:color/black" />
-
- <!-- ...and the "dial_background_texture" tiled on top. -->
- <item>
- <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
- android:src="@drawable/dial_background_texture"
- android:tileMode="repeat" />
- </item>
-
-</layer-list>
diff --git a/InCallUI/res/drawable/end_call_background.xml b/InCallUI/res/drawable/end_call_background.xml
index 33ec22f..53f4e54 100644
--- a/InCallUI/res/drawable/end_call_background.xml
+++ b/InCallUI/res/drawable/end_call_background.xml
@@ -17,29 +17,12 @@
<!-- Background drawable used to render the "end call" button. -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false">
- <bitmap
- android:src="@drawable/endcall_disable"
- android:tileMode="repeat" />
- </item>
+ <item android:state_enabled="false"
+ android:drawable="@drawable/end_call_disabled_state" />
- <item android:state_pressed="true">
- <bitmap
- android:src="@drawable/endcall_active"
- android:tileMode="repeat" />
- </item>
+ <item android:state_pressed="true"
+ android:drawable="@drawable/end_call_pressed_state" />
- <item>
- <layer-list>
- <item>
- <bitmap
- android:src="@drawable/endcall_background_texture"
- android:tileMode="repeat" />
- </item>
-
- <!-- The standard "compound button" background. -->
- <item android:drawable="@drawable/btn_compound_background" />
- </layer-list>
- </item>
+ <item android:drawable="@drawable/end_call_active_state" />
</selector>
diff --git a/InCallUI/res/layout/answer_fragment.xml b/InCallUI/res/layout/answer_fragment.xml
index 4f31e3f..ee2b076 100644
--- a/InCallUI/res/layout/answer_fragment.xml
+++ b/InCallUI/res/layout/answer_fragment.xml
@@ -24,6 +24,7 @@
android:layout_height="wrap_content"
android:focusable="true"
android:layout_centerHorizontal="true"
+ android:gravity="center"
android:background="@android:color/black"
android:visibility="gone"
diff --git a/InCallUI/res/layout/call_button_fragment.xml b/InCallUI/res/layout/call_button_fragment.xml
index 6a76a1c..420d2aa 100644
--- a/InCallUI/res/layout/call_button_fragment.xml
+++ b/InCallUI/res/layout/call_button_fragment.xml
@@ -51,7 +51,8 @@
<ImageButton android:id="@+id/endButton"
style="@style/InCallEndButton"
android:layout_width="match_parent"
- android:src="@drawable/ic_dial_end_call"
+ android:layout_marginTop="2dp"
+ android:src="@drawable/ic_in_call_phone_hangup"
android:background="@drawable/end_call_background"
android:contentDescription="@string/onscreenEndCallText"/>
@@ -63,9 +64,9 @@
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/dialpad_background"
android:paddingStart="@dimen/button_cluster_side_padding"
android:paddingEnd="@dimen/button_cluster_side_padding"
+ android:background="@color/button_background"
>
<!-- This row has either 4 or 5 buttons, depending on
diff --git a/InCallUI/res/layout/caller_in_conference.xml b/InCallUI/res/layout/caller_in_conference.xml
index c2c68c8..924bc63 100644
--- a/InCallUI/res/layout/caller_in_conference.xml
+++ b/InCallUI/res/layout/caller_in_conference.xml
@@ -99,7 +99,7 @@
android:id="@+id/conferenceCallerDisconnect"
android:layout_width="80dp"
android:layout_height="match_parent"
- android:src="@drawable/ic_end_call_holo_dark"
+ android:src="@drawable/ic_in_call_phone_hangup"
android:background="@drawable/end_call_background"
android:scaleType="center"
android:contentDescription="@string/onscreenEndCallText" />
diff --git a/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml b/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml
index c4fecf3..fe84010 100644
--- a/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml
+++ b/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml
@@ -60,7 +60,7 @@
android:paddingStart="5dip"
android:paddingEnd="5dip"
android:paddingBottom="10dip"
- android:background="@drawable/dialpad_background"
+ android:background="@color/dialpad_background"
android:layoutDirection="ltr">
<TableRow
diff --git a/InCallUI/res/layout/extra_button_row.xml b/InCallUI/res/layout/extra_button_row.xml
index a1600e8..ade3e4e 100644
--- a/InCallUI/res/layout/extra_button_row.xml
+++ b/InCallUI/res/layout/extra_button_row.xml
@@ -18,7 +18,7 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:background="@drawable/dialpad_background_opaque">
+ android:background="@color/button_background">
<!-- The buttons here have a text label floating off to the side
(which is necessary because these buttons are used only in
a few rare states, and the meaning of the icon might not be
diff --git a/InCallUI/res/layout/primary_call_info.xml b/InCallUI/res/layout/primary_call_info.xml
index 681519b..0d37a73 100644
--- a/InCallUI/res/layout/primary_call_info.xml
+++ b/InCallUI/res/layout/primary_call_info.xml
@@ -38,77 +38,81 @@
android:orientation="vertical">
<!-- "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. -->
- <GridLayout android:id="@+id/primary_call_banner"
- style="@style/PrimaryCallInfoPrimaryCallBanner"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/call_banner_height"
- android:background="@color/incall_call_banner_background"
- android:paddingStart="@dimen/call_banner_side_padding"
- android:paddingEnd="@dimen/call_banner_side_padding"
- android:paddingTop="@dimen/call_banner_top_bottom_padding"
- android:paddingBottom="@dimen/call_banner_top_bottom_padding">
+ 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. -->
+ <RelativeLayout android:id="@+id/primary_call_banner"
+ style="@style/PrimaryCallInfoPrimaryCallBanner"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:minHeight="@dimen/call_banner_height"
+ android:paddingStart="@dimen/call_banner_side_padding"
+ android:paddingEnd="@dimen/call_banner_side_padding"
+ android:paddingTop="@dimen/call_banner_top_bottom_padding"
+ android:paddingBottom="@dimen/call_banner_top_bottom_padding"
+ android:background="@color/incall_call_banner_background">
<!-- Name (or the phone number, if we don't have a name to display). -->
<TextView android:id="@+id/name"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="@color/incall_call_banner_text_color"
- android:singleLine="true"
- android:textAlignment="viewStart"
- android:layout_column="0"
- android:layout_row="0"
- android:layout_columnSpan="2"
- android:layout_gravity="fill"/>
+ android:layout_alignParentTop="true"
+ android:layout_alignParentStart="true"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/call_banner_name_number_right_padding"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:singleLine="true"
+ android:textAlignment="viewStart"/>
<!-- Label (like "Mobile" or "Work", if present) and phone number, side by side -->
- <TextView android:id="@+id/phoneNumber"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="@color/incall_call_banner_text_color"
- android:singleLine="true"
- android:textDirection="ltr"
- android:layout_column="0"
- android:layout_row="1"
- android:layout_gravity="fill"/>
+ <LinearLayout android:id="@+id/labelAndNumber"
+ android:layout_below="@id/name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingEnd="@dimen/call_banner_name_number_right_padding"
+ android:orientation="horizontal">
+ <TextView android:id="@+id/phoneNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:singleLine="true"
+ android:textDirection="ltr" />
+ <TextView android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:textAllCaps="true"
+ android:singleLine="true"
+ android:layout_marginStart="6dp" />
+ </LinearLayout>
- <TextView android:id="@+id/label"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="@color/incall_call_banner_text_color"
- android:textAllCaps="true"
- android:singleLine="true"
- android:paddingStart="6dp"
- android:layout_column="1"
- android:layout_row="1"
- android:layout_gravity="fill"/>
+ <!-- Elapsed time indication for a call in progress. -->
+ <TextView android:id="@+id/elapsedTime"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:singleLine="true"
+ android:visibility="invisible" />
<!-- Call type indication: a special label and/or branding
for certain kinds of calls (like "Internet call" for a SIP call.) -->
<TextView android:id="@+id/callTypeLabel"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="@color/incall_call_banner_text_color"
- android:maxLines="1"
- android:layout_column="0"
- android:layout_row="2"
- android:layout_columnSpan="2"
- android:ellipsize="end"
- android:layout_gravity="fill"/>
+ android:layout_below="@id/labelAndNumber"
+ 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" />
- <!-- Elapsed time indication for a call in progress. -->
- <TextView android:id="@+id/elapsedTime"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="@color/incall_call_banner_text_color"
- android:singleLine="true"
- android:visibility="invisible"
- android:layout_column="2"
- android:layout_row="0"
- android:layout_rowSpan="3"
- android:layout_gravity="fill"
- android:gravity="end|center_vertical"/>
- </GridLayout>
- <!-- End of call_banner -->
+ </RelativeLayout> <!-- End of call_banner -->
+
<LinearLayout android:id="@+id/supplementary_info_container"
style="@style/PrimaryCallInfoSupplementaryInfoContainer"
@@ -167,7 +171,7 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/incall_call_banner_text_color"
android:textAllCaps="true"
- android:background="@color/incall_secondary_info_background"
+ android:background="@android:color/transparent"
android:singleLine="true"
android:ellipsize="end"/>
</LinearLayout>
diff --git a/InCallUI/res/layout/secondary_call_info.xml b/InCallUI/res/layout/secondary_call_info.xml
index 97bc0bf..787dc59 100644
--- a/InCallUI/res/layout/secondary_call_info.xml
+++ b/InCallUI/res/layout/secondary_call_info.xml
@@ -43,18 +43,19 @@
android:layout_width="match_parent"
android:layout_height="@dimen/call_banner_height"
android:paddingStart="@dimen/call_banner_side_padding"
- android:paddingEnd="@dimen/call_banner_side_padding"
+ android:paddingEnd="@dimen/secondary_call_banner_right_padding"
android:paddingTop="@dimen/call_banner_top_bottom_padding"
android:paddingBottom="@dimen/call_banner_top_bottom_padding"
android:background="@color/incall_call_banner_background">
<!-- Name (or the phone number, if we don't have a name to display). -->
<TextView android:id="@+id/secondaryCallName"
style="@style/SecondaryCallInfoSecondaryCallName"
- android:layout_gravity="top|start"
+ android:layout_gravity="bottom|start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/incall_call_banner_text_color"
+ android:ellipsize="marquee"
android:singleLine="true"/>
</FrameLayout>
@@ -63,7 +64,7 @@
style="@style/SecondaryCallInfoSecondaryCallStatus"
android:layout_width="wrap_content"
android:layout_height="@dimen/call_banner_height"
- android:gravity="top|end"
+ android:gravity="bottom|end"
android:layout_gravity="end"
android:paddingStart="@dimen/call_banner_side_padding"
android:paddingEnd="@dimen/call_banner_side_padding"
diff --git a/InCallUI/res/values-af/strings.xml b/InCallUI/res/values-af/strings.xml
index 4cf802b..3a423c8 100644
--- a/InCallUI/res/values-af/strings.xml
+++ b/InCallUI/res/values-af/strings.xml
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ek bel jou later."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nie nou praat nie. Bel my later?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skryf jou eie..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Vinnige antwoorde"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redigeer vinnige antwoorde"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-am/strings.xml b/InCallUI/res/values-am/strings.xml
index 236feb5..9c63e82 100644
--- a/InCallUI/res/values-am/strings.xml
+++ b/InCallUI/res/values-am/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ኋላ እደውላለሁ።"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"አሁን ማውራት አልችልም። ትንሽ ቆይተው ይደውሉ?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"የእራስዎን ይጻፉ..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ፈጣን ምላሾች"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ፈጣን ምላሾች አርትዕ"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ar/strings.xml b/InCallUI/res/values-ar/strings.xml
index 3627fcd..b69714b 100644
--- a/InCallUI/res/values-ar/strings.xml
+++ b/InCallUI/res/values-ar/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"سأتصل بك لاحقًا."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"لا يمكنني التحدث الآن. اتصل بي لاحقًا."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"اكتب ردك..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"الردود السريعة"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"تعديل الردود السريعة"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-be/strings.xml b/InCallUI/res/values-be/strings.xml
index b1e691c..d41b780 100644
--- a/InCallUI/res/values-be/strings.xml
+++ b/InCallUI/res/values-be/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я патэлефаную пазней."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не магу размаўляць. Набяры пазней."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напiшыце сваё..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Хуткія адказы"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Рэдагаваць хуткія адказы"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-bg/strings.xml b/InCallUI/res/values-bg/strings.xml
index 49116b5..3477f92 100644
--- a/InCallUI/res/values-bg/strings.xml
+++ b/InCallUI/res/values-bg/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ще ви се обадя по-късно."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Сега не мога да говоря. По-късно?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишете свой собствен..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Бързи отговори"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Редактиране на бързи отговори"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ca/strings.xml b/InCallUI/res/values-ca/strings.xml
index 02e1b8c..638fb32 100644
--- a/InCallUI/res/values-ca/strings.xml
+++ b/InCallUI/res/values-ca/strings.xml
@@ -502,7 +502,7 @@
<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 configuració de trucades"</string>
+ <string name="other_settings" msgid="3672912580359716394">"Altres opcions de trucades"</string>
<string name="calling_via_template" msgid="4839419581866928142">"Trucada 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>
@@ -521,7 +521,7 @@
<string name="pick_outgoing_call_phone_type" msgid="5622916534828338675">"Fes una trucada"</string>
<string name="pick_outgoing_sip_phone" msgid="7012322118236208875">"Utilitza el compte per a trucades per Internet:"</string>
<string name="remember_my_choice" msgid="7058059586169290705">"Utilitza-ho sempre per fer trucades per Internet"</string>
- <string name="reset_my_choice_hint" msgid="5523030209803567922">"Pots canviar quin compte vols utilitzar com a opció predeterminada per a les trucades per Internet del telèfon a la pantalla > Configuració > Configuració de les trucades per Internet > Comptes."</string>
+ <string name="reset_my_choice_hint" msgid="5523030209803567922">"Pots canviar el compte de trucades per Internet que vols utilitzar de manera predeterminada, accedeix a Telèfon > Configuració > Configuració de trucades per Internet > Comptes."</string>
<string name="pstn_phone" msgid="8782554491484326429">"Trucada amb telèfon mòbil"</string>
<string name="internet_phone" msgid="1147922660195095810">"Trucada per Internet"</string>
<string name="no_sip_account_found_title" msgid="6266249392379373628">"No hi ha cap compte per a trucades per Internet"</string>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Et truco més tard."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ara no puc parlar. Truques després?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escriu la teva…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostes ràpides"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edita les respostes ràpides"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -614,10 +618,10 @@
<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">"To del telèfon"</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="dtmf_tone_enable_title" msgid="827601042915852989">"Sonar en marcar els números"</string>
<string name="dial_pad_autocomplete" msgid="494525952035761075">"Autocompletar amb teclat"</string>
- <string name="preference_category_ringtone" msgid="5197960752529332721">"To i vibració"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"So i vibració"</string>
<string name="manageConferenceLabel" msgid="4691922394301969053">"Gestiona la trucada de conferència"</string>
</resources>
diff --git a/InCallUI/res/values-cs/strings.xml b/InCallUI/res/values-cs/strings.xml
index 85f4f42..2fe3141 100644
--- a/InCallUI/res/values-cs/strings.xml
+++ b/InCallUI/res/values-cs/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zavolám později."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nemůžu telefonovat, volejte jindy."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napsat vlastní odpověď..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Rychlé odpovědi"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Upravit rychlé odpovědi"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-da/strings.xml b/InCallUI/res/values-da/strings.xml
index abba97d..a12972a 100644
--- a/InCallUI/res/values-da/strings.xml
+++ b/InCallUI/res/values-da/strings.xml
@@ -68,7 +68,7 @@
<string name="labelCDMAMore" msgid="1630676740428229339">"Indstillinger for CDMA-opkald"</string>
<string name="apn_settings" msgid="9043423184895642077">"Navn på adgangspunkt"</string>
<string name="settings_label" msgid="3876743539816984008">"Indstillinger for netværk"</string>
- <string name="voicemail" msgid="8693759337917898954">"Voicemail"</string>
+ <string name="voicemail" msgid="8693759337917898954">"Telefonsvarer"</string>
<string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
<string name="networks" msgid="8873030692174541976">"Netværksudbydere"</string>
<string name="call_settings" msgid="6112441768261754562">"Indstillinger for opkald"</string>
@@ -131,7 +131,7 @@
<string name="fw_change_failed" msgid="5298103228470214665">"Telefonsvarernummeret kunne ikke ændres.\nKontakt dit mobilselskab, hvis problemet vedbliver."</string>
<string name="fw_get_in_vm_failed" msgid="8862896836093833973">"De aktuelle indstillinger til viderestillingsnummer kunne ikke hentes og gemmes.\nVil du skifte til den nye udbyder alligevel?"</string>
<string name="no_change" msgid="3186040086622435212">"Der blev ikke foretaget nogen ændringer."</string>
- <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Vælg voicemail-tjeneste"</string>
+ <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Vælg telefonsvarertjeneste"</string>
<string name="voicemail_default" msgid="5902099213882352338">"Min udbyder"</string>
<string name="mobile_networks" msgid="5540397602919106177">"Indstillinger for mobilnetværk"</string>
<string name="label_available" msgid="1181658289009300430">"Tilgængelige netværk"</string>
@@ -407,8 +407,8 @@
<string name="notification_ongoing_call" msgid="7068688957273482989">"Igangværende opkald"</string>
<string name="notification_on_hold" msgid="3480694969511790465">"Ventende"</string>
<string name="notification_incoming_call" msgid="2820429205043529642">"Indgående opkald"</string>
- <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny voicemail"</string>
- <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Ny voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</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">"Voicemailnummeret er ukendt"</string>
<string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen dækning"</string>
@@ -591,6 +591,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Jeg ringer til dig senere."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan ikke tale nu. Ringer du senere?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv dit eget..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hurtige svar"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Rediger hurtige svar"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-de/strings.xml b/InCallUI/res/values-de/strings.xml
index c3776aa..ece9de5 100644
--- a/InCallUI/res/values-de/strings.xml
+++ b/InCallUI/res/values-de/strings.xml
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ich rufe später zurück."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kann jetzt nicht sprechen. Später?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Eigene Antwort schreiben..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Kurzantworten"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Kurzantworten bearbeiten"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-el/strings.xml b/InCallUI/res/values-el/strings.xml
index ed22979..127702a 100644
--- a/InCallUI/res/values-el/strings.xml
+++ b/InCallUI/res/values-el/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Θα σου τηλεφωνήσω αργότερα."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Δεν μπορώ τώρα. Πάρε με αργότερα."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Συντάξτε τη δική σας…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Γρήγορες απαντήσεις"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Επεξεργασία γρήγορων απαντήσεων"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-en-rGB/strings.xml b/InCallUI/res/values-en-rGB/strings.xml
index 55abb56..1b0de27 100644
--- a/InCallUI/res/values-en-rGB/strings.xml
+++ b/InCallUI/res/values-en-rGB/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"I\'ll call you later."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Can\'t talk now. Call me later?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Quick responses"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit quick responses"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-en-rIN/strings.xml b/InCallUI/res/values-en-rIN/strings.xml
index 55abb56..1b0de27 100644
--- a/InCallUI/res/values-en-rIN/strings.xml
+++ b/InCallUI/res/values-en-rIN/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"I\'ll call you later."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Can\'t talk now. Call me later?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Quick responses"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit quick responses"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-es-rUS/strings.xml b/InCallUI/res/values-es-rUS/strings.xml
index 96c4ed7..4bf82cf 100644
--- a/InCallUI/res/values-es-rUS/strings.xml
+++ b/InCallUI/res/values-es-rUS/strings.xml
@@ -86,7 +86,7 @@
<string name="sum_cw_enabled" msgid="8083061901633671397">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
<string name="sum_cw_disabled" msgid="3648693907300104575">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
<string name="call_forwarding_settings" msgid="3378927671091537173">"Configuración de reenvío de llamadas"</string>
- <string name="labelCF" msgid="2574386948026924737">"Reenvío de llamada"</string>
+ <string name="labelCF" msgid="2574386948026924737">"Desvío de llamadas"</string>
<string name="labelCFU" msgid="8147177368148660600">"Reenviar siempre"</string>
<string name="messageCFU" msgid="3560082430662923687">"Usar siempre este número"</string>
<string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Reenviar todas las llamadas"</string>
@@ -369,7 +369,7 @@
<string name="pin_changed" msgid="4365538014588501049">"El PIN de la tarjeta SIM se modificó correctamente."</string>
<string name="puk_requested" msgid="3898394204193202803">"Contraseña incorrecta. La tarjeta SIM está bloqueada. Se solicitó PUK2."</string>
<string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
- <string name="oldPin2Label" msgid="8559146795026261502">"Reenviar cuando está ocupado"</string>
+ <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 viejo"</string>
<string name="newPin2Label" msgid="4573956902204349054">"PIN2 nuevo"</string>
<string name="confirmPin2Label" msgid="8100319484454787708">"Confirmar PIN2 nuevo"</string>
<string name="badPuk2" msgid="4851734468010000418">"El PUK2 que ingresaste es incorrecto. Vuelve a intentarlo."</string>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te llamo más tarde."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"No puedo hablar ahora. ¿Me llamas más tarde?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe tu propia respuesta..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respuestas rápidas"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respuestas rápidas"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -616,7 +620,7 @@
<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="dtmf_tone_enable_title" msgid="827601042915852989">"Tonos táctiles del teclado de marcado"</string>
+ <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Tonos táctiles del teclado"</string>
<string name="dial_pad_autocomplete" msgid="494525952035761075">"Completar automáticamente con teclado"</string>
<string name="preference_category_ringtone" msgid="5197960752529332721">"Tono y vibración"</string>
<string name="manageConferenceLabel" msgid="4691922394301969053">"Administrar conferencia telefónica"</string>
diff --git a/InCallUI/res/values-es/strings.xml b/InCallUI/res/values-es/strings.xml
index 6bb3b32..66577a9 100644
--- a/InCallUI/res/values-es/strings.xml
+++ b/InCallUI/res/values-es/strings.xml
@@ -519,7 +519,7 @@
<string name="sip_call_options_title" msgid="27433718808839672">"Llamadas por Internet"</string>
<string name="sip_call_options_wifi_only_title" msgid="145572394529090811">"Llamadas por Internet (Wi-Fi)"</string>
<string name="sip_call_options_entry_1" msgid="6556668894178520760">"Para todas las llamadas cuando haya redes de datos disponibles"</string>
- <string name="sip_call_options_entry_2" msgid="6789764029719494361">"Solo llamadas Internet"</string>
+ <string name="sip_call_options_entry_2" msgid="6789764029719494361">"Solo para llamadas de Internet"</string>
<string name="sip_call_options_entry_3" msgid="7474809001402649185">"Preguntar cada vez"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="7423523864471650069">"En todas las llamadas"</string>
<string name="pick_outgoing_call_phone_type" msgid="5622916534828338675">"Llamadas"</string>
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te llamo más tarde."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"No puedo hablar. Llámame luego."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe tu propia respuesta..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respuestas rápidas"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respuestas rápidas"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-et-rEE/strings.xml b/InCallUI/res/values-et-rEE/strings.xml
index 8c44da7..4f03b6d 100644
--- a/InCallUI/res/values-et-rEE/strings.xml
+++ b/InCallUI/res/values-et-rEE/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Helistan sulle hiljem."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ei saa rääkida. Helistad hiljem?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kirjutage ise …"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Kiirvastused"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Kiirvastuste muutmine"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fa/strings.xml b/InCallUI/res/values-fa/strings.xml
index f80f6eb..71d6c84 100644
--- a/InCallUI/res/values-fa/strings.xml
+++ b/InCallUI/res/values-fa/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"بعداً با شما تماس میگیرم."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"اکنون نمیتوانم صحبت کنم. بعداً به من زنگ میزنید؟"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"نوشتن پاسخ خود…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"پاسخهای سریع"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ویرایش پاسخهای سریع"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fi/strings.xml b/InCallUI/res/values-fi/strings.xml
index d900183..dfa12b1 100644
--- a/InCallUI/res/values-fi/strings.xml
+++ b/InCallUI/res/values-fi/strings.xml
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Soitan sinulle myöhemmin."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"En voi puhua nyt. Soita myöhemmin?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kirjoita oma…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Pikavastaukset"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Muokkaa pikavastausta"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fr-rCA/strings.xml b/InCallUI/res/values-fr-rCA/strings.xml
index 79c41c9..e18ec6d 100644
--- a/InCallUI/res/values-fr-rCA/strings.xml
+++ b/InCallUI/res/values-fr-rCA/strings.xml
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Je t\'appellerai plus tard."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Peux pas parler. On se rappelle?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Réponse personnalisée..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Réponses rapides"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modif. rép. rapides"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fr/strings.xml b/InCallUI/res/values-fr/strings.xml
index b3dd8c8..06c1320 100644
--- a/InCallUI/res/values-fr/strings.xml
+++ b/InCallUI/res/values-fr/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Je t\'appellerai plus tard."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Peux pas parler. On se rappelle ?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Réponse personnalisée..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Réponses rapides"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modifier les réponses rapides"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hi/strings.xml b/InCallUI/res/values-hi/strings.xml
index 825c082..48fefe4 100644
--- a/InCallUI/res/values-hi/strings.xml
+++ b/InCallUI/res/values-hi/strings.xml
@@ -111,16 +111,16 @@
<string name="updating_title" msgid="6146755386174019046">"कॉल सेटिंग"</string>
<string name="error_updating_title" msgid="7970259216988931777">"कॉल सेटिंग त्रुटि"</string>
<string name="reading_settings" msgid="1920291699287055284">"सेटिंग पढ़ रहा है..."</string>
- <string name="updating_settings" msgid="8171225533884883252">"सेटिंग अपडेट कर रहा है..."</string>
+ <string name="updating_settings" msgid="8171225533884883252">"सेटिंग के लिए नई जानकारी मिल रही है..."</string>
<string name="reverting_settings" msgid="4752151682666912828">"सेटिंग वापस ला रहा है..."</string>
<string name="response_error" msgid="6674110501330139405">"नेटवर्क से अनपेक्षित प्रतिसाद."</string>
<string name="exception_error" msgid="7027667130619518211">"नेटवर्क या सिम कार्ड त्रुटि."</string>
- <string name="fdn_check_failure" msgid="18200614306525434">"आपके फ़ोन एप्लिकेशन की फ़िक्स्ड डायलिंग नंबर सेटिंग चालू है. इसके परिणामस्वरूप, कॉल से संबंधित कुछ सुविधाएं कार्य नहीं कर रही हैं."</string>
+ <string name="fdn_check_failure" msgid="18200614306525434">"आपके फ़ोन एप्स की फ़िक्स्ड डायलिंग नंबर सेटिंग चालू है. इसके परिणामस्वरूप, कॉल से संबंधित कुछ सुविधाएं कार्य नहीं कर रही हैं."</string>
<string name="radio_off_error" msgid="2304459933248513376">"इन सेटिंग को देखने के पहले रेडियो चालू करें."</string>
<string name="close_dialog" msgid="2365884406356986917">"ठीक है"</string>
<string name="enable" msgid="1059008390636773574">"सक्षम करें"</string>
<string name="disable" msgid="7274240979164762320">"अक्षम करें"</string>
- <string name="change_num" msgid="239476305819844391">"अपडेट करें"</string>
+ <string name="change_num" msgid="239476305819844391">"नई जानकारी पाएं"</string>
<string-array name="clir_display_values">
<item msgid="5560134294467334594">"नेटवर्क सामान्य"</item>
<item msgid="7876195870037833661">"नंबर छुपाएं"</item>
@@ -339,14 +339,14 @@
<string name="adding_fdn_contact" msgid="7627379633721940991">"फ़िक्स्ड डायलिंग नंबर जोड़ रहा है..."</string>
<string name="fdn_contact_added" msgid="7458335758501736665">"फ़िक्स्ड डायलिंग नंबर जोड़ा गया."</string>
<string name="edit_fdn_contact" msgid="7976936035587081480">"फ़िक्स्ड डायलिंग नंबर संपादित करें"</string>
- <string name="updating_fdn_contact" msgid="8370929876849803600">"फ़िक्स्ड डायलिंग नंबर अपडेट कर रहा है…"</string>
- <string name="fdn_contact_updated" msgid="5497828782609005017">"फ़िक्स्ड डायलिंग नंबर अपडेट किया गया."</string>
+ <string name="updating_fdn_contact" msgid="8370929876849803600">"फ़िक्स्ड डायलिंग नंबर के लिए नई जानकारी…"</string>
+ <string name="fdn_contact_updated" msgid="5497828782609005017">"फ़िक्स्ड डायलिंग नंबर के लिए नई जानकारी."</string>
<string name="delete_fdn_contact" msgid="6668958073074151717">"फ़िक्स्ड डायलिंग नंबर हटाएं"</string>
<string name="deleting_fdn_contact" msgid="5669163206349319969">"फ़िक्स्ड डायलिंग नंबर हटा रहा है..."</string>
<string name="fdn_contact_deleted" msgid="7154162327112259569">"फ़िक्स्ड डायलिंग नंबर हटाया गया."</string>
- <string name="pin2_invalid" msgid="5470854099230755944">"FDN अपडेट नहीं किया गया था क्योंकि आपने गलत पिन लिखा है."</string>
- <string name="fdn_invalid_number" msgid="1494755047900009147">"FDN अपडेट नहीं था क्योंकि नंबर में 20 से अधिक अंक नहीं हो सकते."</string>
- <string name="pin2_or_fdn_invalid" msgid="6025144083384701197">"FDN अपडेट नहीं किया गया था. PIN2 गलत था, या फ़ोन नंबर अस्वीकृत था."</string>
+ <string name="pin2_invalid" msgid="5470854099230755944">"FDN पे नई जानकारी नहीं है क्योंकि आपने गलत पिन लिखा है."</string>
+ <string name="fdn_invalid_number" msgid="1494755047900009147">"FDN पे नई जानकारी नहीं है क्योंकि नंबर में 20 से अधिक अंक नहीं हो सकते."</string>
+ <string name="pin2_or_fdn_invalid" msgid="6025144083384701197">"FDN पे नई जानकारी नहीं है. PIN2 गलत था, या फ़ोन नंबर अस्वीकृत था."</string>
<string name="simContacts_emptyLoading" msgid="2203331234764498011">"सिम कार्ड से पढ़ रहा है…"</string>
<string name="simContacts_empty" msgid="5270660846489561932">"आपके सिम कार्ड पर कोई संपर्क नहीं है."</string>
<string name="simContacts_title" msgid="1861472842524839921">"आयात करने के लिए संपर्कों को चुनें"</string>
@@ -487,8 +487,8 @@
<item quantity="other" msgid="3122217344579273583">"<xliff:g id="COUNT">%s</xliff:g> मिनट के लिए कोई डेटा कनेक्शन नहीं"</item>
</plurals>
<plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="8060210887681426682">"फ़ोन <xliff:g id="COUNT">%s</xliff:g> मिनट के लिए आपातकालीन कॉलबैक मोड में रहेगा. हालांकि, इस मोड में होने पर डेटा कनेक्शन का उपयोग करने वाले किसी एप्लिकेशन का उपयोग नहीं किया जा सकता. क्या आप अभी बाहर निकलना चाहते हैं?"</item>
- <item quantity="other" msgid="8617116564023933114">"फ़ोन <xliff:g id="COUNT">%s</xliff:g> मिनट के लिए आपातकालीन कॉलबैक मोड में रहेगा. हालांकि, इस मोड में होने पर डेटा कनेक्शन का उपयोग करने वाले किसी एप्लिकेशन का उपयोग नहीं किया जा सकता. क्या आप अभी बाहर निकलना चाहते हैं?"</item>
+ <item quantity="one" msgid="8060210887681426682">"फ़ोन <xliff:g id="COUNT">%s</xliff:g> मिनट के लिए आपातकालीन कॉलबैक मोड में रहेगा. हालांकि, इस मोड में होने पर डेटा कनेक्शन का उपयोग करने वाले किसी एप्स का उपयोग नहीं किया जा सकता. क्या आप अभी बाहर निकलना चाहते हैं?"</item>
+ <item quantity="other" msgid="8617116564023933114">"फ़ोन <xliff:g id="COUNT">%s</xliff:g> मिनट के लिए आपातकालीन कॉलबैक मोड में रहेगा. हालांकि, इस मोड में होने पर डेटा कनेक्शन का उपयोग करने वाले किसी एप्स का उपयोग नहीं किया जा सकता. क्या आप अभी बाहर निकलना चाहते हैं?"</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm">
<item quantity="one" msgid="2585506997024726599">"आपातकालीन कॉलबैक मोड के समय चयनित क्रिया उपलब्ध नहीं है. फ़ोन <xliff:g id="COUNT">%s</xliff:g> मिनट तक इस मोड में रहेगा. क्या आप अभी बाहर निकलना चाहते हैं?"</item>
@@ -549,7 +549,7 @@
<string name="registration_status_failed_try_later" msgid="5214474354451220581">"खाता पंजीकरण विफल: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); बाद में पुन: प्रयास किया जाएगा"</string>
<string name="registration_status_invalid_credentials" msgid="4908446367559341757">"खाता पंजीकरण विफल: गलत उपयोगकर्ता नाम या पासवर्ड."</string>
<string name="registration_status_server_unreachable" msgid="5733421582468991276">"खाता पंजीकरण विफल: सर्वर नाम जांचें."</string>
- <string name="third_party_account_summary" msgid="2532526738862533028">"वर्तमान में इस खाते का उपयोग <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> एप्लिकेशन द्वारा किया जा रहा है."</string>
+ <string name="third_party_account_summary" msgid="2532526738862533028">"वर्तमान में इस खाते का उपयोग <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> एप्स द्वारा किया जा रहा है."</string>
<string name="sip_edit_title" msgid="489288416435014385">"SIP खाता विवरण"</string>
<string name="sip_edit_new_title" msgid="3659149255856520385">"SIP खाता विवरण"</string>
<string name="domain_address_title" msgid="9071787581316160480">"सर्वर"</string>
@@ -585,11 +585,15 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"मैं आपको बाद में कॉल करूंगा/करूंगी."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"अभी बात नहीं हो सकती. बाद में कॉल करें?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"अपना स्वयं का लिखें..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"त्वरित प्रतिसाद"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"त्वरित प्रतिसाद संपादित करें"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
<string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"त्वरित प्रतिसाद"</string>
- <string name="respond_via_sms_menu_reset_default_activity" msgid="1461742052902053466">"डिफ़ॉल्ट एप्लिकेशन रीसेट करें"</string>
+ <string name="respond_via_sms_menu_reset_default_activity" msgid="1461742052902053466">"डिफ़ॉल्ट एप्स रीसेट करें"</string>
<string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"<xliff:g id="PHONE_NUMBER">%s</xliff:g> को संदेश भेजा गया."</string>
<string name="description_image_button_one" msgid="5502718871331943463">"एक"</string>
<string name="description_image_button_two" msgid="4903738528222924522">"दो"</string>
diff --git a/InCallUI/res/values-hr/strings.xml b/InCallUI/res/values-hr/strings.xml
index 6ee1cbe..d87d49e 100644
--- a/InCallUI/res/values-hr/strings.xml
+++ b/InCallUI/res/values-hr/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zvat ću vas kasnije."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Sada ne mogu razgovarati. Nazovite me kasnije?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite odgovor..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Brzi odgovori"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Uređivanje brzih odgovora"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hu/strings.xml b/InCallUI/res/values-hu/strings.xml
index 07790e2..79e9c92 100644
--- a/InCallUI/res/values-hu/strings.xml
+++ b/InCallUI/res/values-hu/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Később visszahívom."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Most nem alkalmas. Hívna később?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Saját válasz írása..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Gyors válaszok"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Gyors válaszok szerkesztése"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hy-rAM/strings.xml b/InCallUI/res/values-hy-rAM/strings.xml
index 8cae8d9..172bd83 100644
--- a/InCallUI/res/values-hy-rAM/strings.xml
+++ b/InCallUI/res/values-hy-rAM/strings.xml
@@ -581,7 +581,7 @@
<string name="no_internet_available_title" msgid="3327109242858406165">"Ինտերնետ կապ չկա"</string>
<string name="no_wifi_available_title" msgid="747881033089378758">"Wi-Fi կապ չկա"</string>
<string name="no_internet_available" msgid="7877142631803238549">"Ինտերնետային զանգի կատարման համար նախ ստուգեք ձեր ինտերնետ կապը:"</string>
- <string name="no_wifi_available" msgid="1225073547318465713">"Ինտերնետային զանգերի համար դուք պետք է միացված լինեք Wi-Fi ցանցին (օգտագործեք Անլար & Ցանցային կարգավորումները):"</string>
+ <string name="no_wifi_available" msgid="1225073547318465713">"Ինտերնետային զանգերի համար դուք պետք է միացված լինեք Wi-Fi ցանցին (օգտագործեք Անլար կապ և Ցանցեր կարգավորումները):"</string>
<string name="no_voip" msgid="8901474054537199865">"Ինտերնետային զանգերը չեն սպասարկվում"</string>
<string name="sip_system_decide" msgid="368030746310423471">"Ավտոմատ"</string>
<string name="sip_always_send_keepalive" msgid="8192080724632877132">"Միշտ ուղարկել"</string>
@@ -591,6 +591,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ես ձեր մի փոքր ուշ կզանգեմ:"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Չեմ կարող խոսել հիմա: Զանգե՞մ ձեզ մի փոքր ուշ:"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Գրեք ձեր սեփականը..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Արագ պատասխաններ"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Խմբագրել արագ պատասխանները"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-in/strings.xml b/InCallUI/res/values-in/strings.xml
index c87bee3..0136b35 100644
--- a/InCallUI/res/values-in/strings.xml
+++ b/InCallUI/res/values-in/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Nanti saya telepon balik."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Tak bisa bicara skrg. Tlp lg nanti?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Tulis respons Anda sendiri…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Tanggapan cepat"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit tanggapan cepat"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-it/strings.xml b/InCallUI/res/values-it/strings.xml
index 5e2b144..85875b6 100644
--- a/InCallUI/res/values-it/strings.xml
+++ b/InCallUI/res/values-it/strings.xml
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ti chiamo dopo."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Non posso parlare ora. Mi chiami dopo?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Scrivi risposta personale..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Risposte rapide"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modifica risposte rapide"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-iw/strings.xml b/InCallUI/res/values-iw/strings.xml
index 89060a8..c55a1c1 100644
--- a/InCallUI/res/values-iw/strings.xml
+++ b/InCallUI/res/values-iw/strings.xml
@@ -115,7 +115,7 @@
<string name="reverting_settings" msgid="4752151682666912828">"מאחזר הגדרות הקודמות…"</string>
<string name="response_error" msgid="6674110501330139405">"תגובה לא צפויה מהרשת."</string>
<string name="exception_error" msgid="7027667130619518211">"שגיאת רשת או שגיאה של כרטיס SIM."</string>
- <string name="fdn_check_failure" msgid="18200614306525434">"הגדרת מספרי החיוג הקבועים של יישום הטלפון שלך מופעלת. כתוצאה מכך, חלק מהתכונות הקשורות לשיחות לא פועלות."</string>
+ <string name="fdn_check_failure" msgid="18200614306525434">"הגדרת מספרי החיוג הקבועים של אפליקציית הטלפון שלך מופעלת. כתוצאה מכך, חלק מהתכונות הקשורות לשיחות לא פועלות."</string>
<string name="radio_off_error" msgid="2304459933248513376">"הפעל את הרדיו לפני ההצגה של הגדרות אלה."</string>
<string name="close_dialog" msgid="2365884406356986917">"אישור"</string>
<string name="enable" msgid="1059008390636773574">"הפעל"</string>
@@ -487,8 +487,8 @@
<item quantity="other" msgid="3122217344579273583">"אין חיבור נתונים במשך <xliff:g id="COUNT">%s</xliff:g> דקות"</item>
</plurals>
<plurals name="alert_dialog_exit_ecm">
- <item quantity="one" msgid="8060210887681426682">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך דקה <xliff:g id="COUNT">%s</xliff:g>. במצב זה לא ניתן להשתמש ביישומים המשתמשים בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
- <item quantity="other" msgid="8617116564023933114">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך <xliff:g id="COUNT">%s</xliff:g> דקות. במצב זה לא ניתן להשתמש ביישומים המשתמשים בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
+ <item quantity="one" msgid="8060210887681426682">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך דקה <xliff:g id="COUNT">%s</xliff:g>. במצב זה לא ניתן להשתמש באפליקציות המשתמשות בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
+ <item quantity="other" msgid="8617116564023933114">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך <xliff:g id="COUNT">%s</xliff:g> דקות. במצב זה לא ניתן להשתמש באפליקציות המשתמשים בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
</plurals>
<plurals name="alert_dialog_not_avaialble_in_ecm">
<item quantity="one" msgid="2585506997024726599">"הפעולה שנבחרה אינה זמינה במצב התקשרות חזרה בחירום. הטלפון יהיה במצב זה במשך <xliff:g id="COUNT">%s</xliff:g> דקות. האם אתה רוצה לצאת כעת?"</item>
@@ -549,7 +549,7 @@
<string name="registration_status_failed_try_later" msgid="5214474354451220581">"הרשמת החשבון נכשלה: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); יתבצע ניסיון חוזר מאוחר יותר"</string>
<string name="registration_status_invalid_credentials" msgid="4908446367559341757">"רישום החשבון נכשל: שם המשתמש או הסיסמה שגויים."</string>
<string name="registration_status_server_unreachable" msgid="5733421582468991276">"רישום החשבון נכשל: בדוק את שם השרת."</string>
- <string name="third_party_account_summary" msgid="2532526738862533028">"היישום <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> משתמש כרגע בחשבון זה."</string>
+ <string name="third_party_account_summary" msgid="2532526738862533028">"האפליקציה <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> משתמש כרגע בחשבון זה."</string>
<string name="sip_edit_title" msgid="489288416435014385">"פרטי חשבון SIP"</string>
<string name="sip_edit_new_title" msgid="3659149255856520385">"פרטי חשבון SIP"</string>
<string name="domain_address_title" msgid="9071787581316160480">"שרת"</string>
@@ -585,11 +585,15 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"אני אתקשר אליך יותר מאוחר."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"אני לא יכול לדבר עכשיו. תתקשר אלי מאוחר יותר?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"כתוב אחת משלך..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"תגובות מהירות"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ערוך תגובות מהירות"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
<string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"תגובה מהירה"</string>
- <string name="respond_via_sms_menu_reset_default_activity" msgid="1461742052902053466">"אפס את היישום המוגדר כברירת מחדל"</string>
+ <string name="respond_via_sms_menu_reset_default_activity" msgid="1461742052902053466">"אפס את האפליקציה המוגדר כברירת מחדל"</string>
<string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"הודעה נשלחה אל <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
<string name="description_image_button_one" msgid="5502718871331943463">"אחת"</string>
<string name="description_image_button_two" msgid="4903738528222924522">"שתיים"</string>
diff --git a/InCallUI/res/values-ja/strings.xml b/InCallUI/res/values-ja/strings.xml
index 9e16a39..a7db5d6 100644
--- a/InCallUI/res/values-ja/strings.xml
+++ b/InCallUI/res/values-ja/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ただいま電話に出られません。後ほど折り返しご連絡いたします。"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ただいま電話に出られません。後ほどご連絡をお願いいたします。"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"カスタム返信を作成..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"クイック返信"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"クイック返信の編集"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ka-rGE/strings.xml b/InCallUI/res/values-ka-rGE/strings.xml
index a049ba6..658180d 100644
--- a/InCallUI/res/values-ka-rGE/strings.xml
+++ b/InCallUI/res/values-ka-rGE/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"მოგვიანებით გადმოვრეკავ."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ვერ ვპასუხობ. მოგვიანებით დამირეკე."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ჩაწერეთ საკუთარი..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"სწრაფი პასუხი"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"სწრაფი პასუხის რედაქტირება"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-km-rKH/strings.xml b/InCallUI/res/values-km-rKH/strings.xml
index cea0a6c..39b4ea2 100644
--- a/InCallUI/res/values-km-rKH/strings.xml
+++ b/InCallUI/res/values-km-rKH/strings.xml
@@ -350,7 +350,7 @@
<string name="simContacts_emptyLoading" msgid="2203331234764498011">"កំពុងអានពីស៊ីមកាត…"</string>
<string name="simContacts_empty" msgid="5270660846489561932">"គ្មានទំនាក់ទំនងនៅលើស៊ីមកាតរបស់អ្នកទេ។"</string>
<string name="simContacts_title" msgid="1861472842524839921">"ជ្រើសទំនាក់ទំនងដើម្បីនាំចូល"</string>
- <string name="simContacts_airplaneMode" msgid="1846161429087789936">"ដើម្បីនាំចូលទំនាក់ទំនងពីស៊ីមកាត ដំបូងបិទរបៀបពេលជិះយន្តហោះ។"</string>
+ <string name="simContacts_airplaneMode" msgid="1846161429087789936">"ដើម្បីនាំចូលទំនាក់ទំនងពីស៊ីមកាត ដំបូងត្រូវបិទរបៀបពេលជិះយន្តហោះ។"</string>
<string name="enable_pin" msgid="5422767284133234860">"បិទ/បើកកូដ PIN ស៊ីមកាត"</string>
<string name="change_pin" msgid="9174186126330785343">"ប្ដូរកូដ PIN ស៊ីមកាត"</string>
<string name="enter_pin_text" msgid="8532615714751931951">"កូដ PIN ស៊ីមកាត៖"</string>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ខ្ញុំនឹងហៅទៅអ្នកនៅពេលក្រោយ។"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"មិនអាចនិយាយបានទេឥឡូវនេះ។ ហៅមកខ្ញុំពេលក្រោយ?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"សរសេរផ្ទាល់ខ្លួនរបស់អ្នក"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ការឆ្លើយតបរហ័ស"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"កែការឆ្លើយតបរហ័ស"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ko/strings.xml b/InCallUI/res/values-ko/strings.xml
index 3eb6214..cc795b8 100644
--- a/InCallUI/res/values-ko/strings.xml
+++ b/InCallUI/res/values-ko/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"나중에 전화드리겠습니다."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"통화 불가. 나중에 전화주세요."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"나만의 응답 작성…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"빠른 응답"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"빠른 응답 수정"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-lo-rLA/strings.xml b/InCallUI/res/values-lo-rLA/strings.xml
index 4cd2961..b09ab35 100644
--- a/InCallUI/res/values-lo-rLA/strings.xml
+++ b/InCallUI/res/values-lo-rLA/strings.xml
@@ -66,7 +66,7 @@
<string name="unlock_success" msgid="6770085622238180152">"ການປົດລັອກເຄືອຂ່າຍບໍ່ສຳເລັດ."</string>
<string name="labelGSMMore" msgid="5930842194056092106">"ການຕັ້ງຄ່າການໂທ GSM"</string>
<string name="labelCDMAMore" msgid="1630676740428229339">"ການຕັ້ງຄ່າໂທ CDMA"</string>
- <string name="apn_settings" msgid="9043423184895642077">"ຊື່ຂອງຈຸດການເຂົ້າເຖິງ"</string>
+ <string name="apn_settings" msgid="9043423184895642077">"ຊື່ຂອງຈຸດການເຂົ້າເຖິງ (APN)"</string>
<string name="settings_label" msgid="3876743539816984008">"ການຕັ້ງຄ່າເຄືອຂ່າຍ"</string>
<string name="voicemail" msgid="8693759337917898954">"ຂໍ້ຄວາມສຽງ"</string>
<string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
@@ -180,7 +180,7 @@
<item msgid="1524224863879435516">"GSM ເທົ່ານັ້ນ"</item>
<item msgid="3817924849415716259">"ຕ້ອງການ GSM/WCDMA"</item>
</string-array>
- <string name="data_enabled" msgid="5972538663568715366">"ເປີດໃຊ້ຂໍ້ມູນແລ້ວ"</string>
+ <string name="data_enabled" msgid="5972538663568715366">"ເປີດໃຊ້ເດຕາ"</string>
<string name="data_enable_summary" msgid="5022018967714633874">"ເປີດໃຊ້ການເຂົ້າເຖິງຂໍ້ມູນຜ່ານເຄືອຂ່າຍມືຖື"</string>
<string name="roaming" msgid="8871412572928323707">"ການໂຣມມິງຂໍ້ມູນ"</string>
<string name="roaming_enable" msgid="7331106985174381987">"ເຊື່ອມຕໍ່ບໍລິການຂໍ້ມູນເມື່ອໂຣມມິງ"</string>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ຂ້ອຍຈະໂທຫາເຈົ້ານຳຫຼັງ."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ຕອນນີ້ລົມບໍ່ໄດ້ເທື່ອ. ເຈົ້າຄ່ອຍໂທຫາຂ້ອຍໃໝ່ໄດ້ບໍ່?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ຂຽນຂໍ້ຄວາມຂອງທ່ານເອງ..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ຕອບກັບດ່ວນ"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ແກ້ໄຂຂໍ້ຄວາມຕອບກັບດ່ວນ"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-lt/strings.xml b/InCallUI/res/values-lt/strings.xml
index eaee183..d73194b 100644
--- a/InCallUI/res/values-lt/strings.xml
+++ b/InCallUI/res/values-lt/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Paskambinsiu vėliau."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Dabar negaliu kalb. Pask. vėliau."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Sukurkite patys..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Greiti atsakai"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redaguoti greitus atsakus"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-lv/strings.xml b/InCallUI/res/values-lv/strings.xml
index cd36e8a..9e316ac 100644
--- a/InCallUI/res/values-lv/strings.xml
+++ b/InCallUI/res/values-lv/strings.xml
@@ -587,6 +587,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Piezvanīšu vēlāk."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nevaru runāt. Vai piezvanīsi vēlāk?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Rakstīt savu…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Ātrās atbildes"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Ātro atbilžu rediģēšana"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-mn-rMN/strings.xml b/InCallUI/res/values-mn-rMN/strings.xml
index a3b4a75..26f3eeb 100644
--- a/InCallUI/res/values-mn-rMN/strings.xml
+++ b/InCallUI/res/values-mn-rMN/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Би тань руу дараа залгана."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Одоо ярих боломжгүй байна. Дараа надруу залгах уу?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Өөрийн гэснийг бичээрэй..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Шуурхай хариунууд"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Шуурхай хариунуудыг засах"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ms-rMY/strings.xml b/InCallUI/res/values-ms-rMY/strings.xml
index ba61a2c..2813fb3 100644
--- a/InCallUI/res/values-ms-rMY/strings.xml
+++ b/InCallUI/res/values-ms-rMY/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Saya akan hubungi awak kemudian."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Tdk blh berckp skg. Tel saya nanti?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Tulis sendiri…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respons pantas"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit respons pantas"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-nb/strings.xml b/InCallUI/res/values-nb/strings.xml
index 2a574fc..f7f7be0 100644
--- a/InCallUI/res/values-nb/strings.xml
+++ b/InCallUI/res/values-nb/strings.xml
@@ -591,6 +591,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Jeg ringer deg senere."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ikke nå. Ringer du meg senere?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv ditt eget"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hurtigsvar"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Rediger hurtigsvar"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-nl/strings.xml b/InCallUI/res/values-nl/strings.xml
index e8d0efa..8e557f7 100644
--- a/InCallUI/res/values-nl/strings.xml
+++ b/InCallUI/res/values-nl/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ik bel je later."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nu niet opnemen. Bel me later."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Eigen reactie opstellen..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Snelle reacties"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Snelle reacties bewerken"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-pl/strings.xml b/InCallUI/res/values-pl/strings.xml
index 461439f..b0da245 100644
--- a/InCallUI/res/values-pl/strings.xml
+++ b/InCallUI/res/values-pl/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zadzwonię do Ciebie później."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nie mogę rozmawiać. Zadzwonisz później?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napisz własną..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Szybkie odpowiedzi"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edytuj szybkie odpowiedzi"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-pt-rPT/strings.xml b/InCallUI/res/values-pt-rPT/strings.xml
index ce60bbb..9ac0ac6 100644
--- a/InCallUI/res/values-pt-rPT/strings.xml
+++ b/InCallUI/res/values-pt-rPT/strings.xml
@@ -181,7 +181,7 @@
<item msgid="3817924849415716259">"GSM/WCDMA preferido"</item>
</string-array>
<string name="data_enabled" msgid="5972538663568715366">"Dados ativados"</string>
- <string name="data_enable_summary" msgid="5022018967714633874">"Activar acesso a dados através de rede móvel"</string>
+ <string name="data_enable_summary" msgid="5022018967714633874">"Ativar acesso a dados através de rede móvel"</string>
<string name="roaming" msgid="8871412572928323707">"Roaming de dados"</string>
<string name="roaming_enable" msgid="7331106985174381987">"Ligar a serviços de dados em roaming"</string>
<string name="roaming_disable" msgid="1843417228755568110">"Ligar a serviços de dados em roaming"</string>
@@ -202,18 +202,18 @@
<string name="throttle_help_subtext" msgid="5217706521499010816">"Mais informações sobre a política de utilização de dados da rede móvel do seu operador."</string>
<string name="cell_broadcast_sms" msgid="5584192824053625842">"Transmissão Celular SMS"</string>
<string name="enable_disable_cell_bc_sms" msgid="4851147873691392255">"Transmissão Celular SMS"</string>
- <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Definições da Transmissão Celular SMS activada"</string>
- <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Transmissão Celular SMS desactivada"</string>
- <string name="cb_sms_settings" msgid="651715019785107312">"Definições da Transmissão Celular SMS"</string>
+ <string name="cell_bc_sms_enable" msgid="6441688565738921084">"Definições da transmissão celular SMS ativada"</string>
+ <string name="cell_bc_sms_disable" msgid="3398365088309408749">"Transmissão Celular SMS desativada"</string>
+ <string name="cb_sms_settings" msgid="651715019785107312">"Definições da transmissão celular SMS"</string>
<string name="enable_disable_emergency_broadcast" msgid="2157014609041245335">"Difusão de Emergência"</string>
<string name="emergency_broadcast_enable" msgid="2645980025414010211">"Difusão de Emergência activada"</string>
- <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Difusão de Emergência desactivada"</string>
+ <string name="emergency_broadcast_disable" msgid="3665199821267569426">"Difusão de Emergência desativada"</string>
<string name="enable_disable_administrative" msgid="6501582322182059412">"Administrativo"</string>
<string name="administrative_enable" msgid="1750086122962032235">"Modo Administrativo ativado"</string>
<string name="administrative_disable" msgid="8433273857248698539">"Modo administrativo desativado"</string>
<string name="enable_disable_maintenance" msgid="1819693083025106678">"Manutenção"</string>
<string name="maintenance_enable" msgid="8566636458770971189">"Manutenção activada"</string>
- <string name="maintenance_disable" msgid="7340189100885066077">"Manutenção desactivada"</string>
+ <string name="maintenance_disable" msgid="7340189100885066077">"Manutenção desativada"</string>
<string name="general_news_settings" msgid="4968779723948432978">"Notícias Gerais"</string>
<string name="bf_news_settings" msgid="3935593091894685267">"Notícias de Negócios e Finanças"</string>
<string name="sports_news_settings" msgid="7649399631270052835">"Notícias Desportivas"</string>
@@ -253,7 +253,7 @@
<string name="list_language_dtitle" msgid="5442908726538951934">"Idiomas"</string>
<string name="enable_disable_local_weather" msgid="986967454867219114">"Informação Meteorológica Local"</string>
<string name="local_weather_enable" msgid="6199315114382448922">"Informação Meteorológica Local activada"</string>
- <string name="local_weather_disable" msgid="2510158089142626480">"Informação meteorológica local desactivada"</string>
+ <string name="local_weather_disable" msgid="2510158089142626480">"Informação meteorológica local desativada"</string>
<string name="enable_disable_atr" msgid="8339572391278872343">"Relatórios de Tráfego de Área"</string>
<string name="atr_enable" msgid="5541757457789181799">"Relatórios de Tráfego de Área ativados"</string>
<string name="atr_disable" msgid="7085558154727596455">"Relatórios de Tráfego de Área desativados"</string>
@@ -268,7 +268,7 @@
<string name="lodgings_disable" msgid="3387879742320682391">"Alojamento desativado"</string>
<string name="enable_disable_retail_directory" msgid="1357809784475660303">"Lista de Retalho"</string>
<string name="retail_directory_enable" msgid="3280626290436111496">"Lista de Retalho activada"</string>
- <string name="retail_directory_disable" msgid="6479739816662879027">"Lista de Retalho desactivada"</string>
+ <string name="retail_directory_disable" msgid="6479739816662879027">"Lista de Retalho desativada"</string>
<string name="enable_disable_advertisements" msgid="5999495926176182128">"Anúncios"</string>
<string name="advertisements_enable" msgid="2050305021264683786">"Anúncios ativados"</string>
<string name="advertisements_disable" msgid="8350985908788707935">"Anúncios desativados"</string>
@@ -307,23 +307,23 @@
<item msgid="7494167883478914080">"0"</item>
<item msgid="6043847456049107742">"1"</item>
</string-array>
- <string name="cdma_activate_device" msgid="3793805892364814518">"Activar dispositivo"</string>
+ <string name="cdma_activate_device" msgid="3793805892364814518">"Ativar dispositivo"</string>
<string name="cdma_lte_data_service" msgid="4255018217292548962">"Configurar serviço de dados"</string>
<string name="fdn" msgid="7878832555095183202">"Números de marcação fixa (FDN)"</string>
<string name="manage_fdn_list" msgid="8777755791892122369">"Lista de números de marcação fixa (FDN)"</string>
<string name="fdn_activation" msgid="2156479741307463576">"Activação de FDN"</string>
<string name="fdn_enabled" msgid="5238109009915521240">"Os números de marcação fixa estão ativados"</string>
<string name="fdn_disabled" msgid="4700049736675368279">"Os números de marcação fixa estão desativados"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Activar FDN"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"Desactivar FDN"</string>
+ <string name="enable_fdn" msgid="3740191529180493851">"Ativar FDN"</string>
+ <string name="disable_fdn" msgid="7944020890722540616">"Desativar FDN"</string>
<string name="change_pin2" msgid="2153563695382176676">"Alterar PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"Desactivar FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Activar FDN"</string>
+ <string name="enable_fdn_ok" msgid="7215588870329688132">"Desativar FDN"</string>
+ <string name="disable_fdn_ok" msgid="5727046928930740173">"Ativar FDN"</string>
<string name="sum_fdn" msgid="1959399454900272878">"Gerir os números de marcação fixa"</string>
<string name="sum_fdn_change_pin" msgid="6666549734792827932">"Alterar o PIN de acesso aos números de marcação fixa"</string>
<string name="sum_fdn_manage_list" msgid="8431088265332628316">"Gerir a lista telefónica"</string>
<string name="voice_privacy" msgid="3776841382844614716">"Privacidade de voz"</string>
- <string name="voice_privacy_summary" msgid="3159383389833516214">"Activar modo de privacidade optimizado"</string>
+ <string name="voice_privacy_summary" msgid="3159383389833516214">"Ativar modo de privacidade optimizado"</string>
<string name="tty_mode_option_title" msgid="9033098925144434669">"Modo TTY"</string>
<string name="tty_mode_option_summary" msgid="1073835131534808732">"Definir modo TTY"</string>
<string name="auto_retry_mode_title" msgid="4073265511427813322">"Nova tentativa automática"</string>
@@ -351,7 +351,7 @@
<string name="simContacts_empty" msgid="5270660846489561932">"Sem contactos no cartão SIM."</string>
<string name="simContacts_title" msgid="1861472842524839921">"Seleccione os contactos a importar"</string>
<string name="simContacts_airplaneMode" msgid="1846161429087789936">"Para importar contactos do cartão SIM, primeiro desative o Modo de Avião."</string>
- <string name="enable_pin" msgid="5422767284133234860">"Activar/desactivar o PIN do cartão SIM"</string>
+ <string name="enable_pin" msgid="5422767284133234860">"Ativar/desativar o PIN do cartão SIM"</string>
<string name="change_pin" msgid="9174186126330785343">"Alterar o PIN do cartão SIM"</string>
<string name="enter_pin_text" msgid="8532615714751931951">"PIN do SIM:"</string>
<string name="oldPinLabel" msgid="5287773661246368314">"PIN antigo"</string>
@@ -360,8 +360,8 @@
<string name="badPin" msgid="8955102849303984935">"O PIN antigo introduzido não está correto. Tente novamente."</string>
<string name="mismatchPin" msgid="5923253370683071889">"Os PINs introduzidos não correspondem. Tente novamente."</string>
<string name="invalidPin" msgid="5981171102258684792">"Introduza um PIN com 4 a 8 números."</string>
- <string name="disable_sim_pin" msgid="3992926931620188855">"Desactivar o PIN do SIM"</string>
- <string name="enable_sim_pin" msgid="5803702443844458831">"Activar o PIN do cartão SIM"</string>
+ <string name="disable_sim_pin" msgid="3992926931620188855">"Desativar o PIN do SIM"</string>
+ <string name="enable_sim_pin" msgid="5803702443844458831">"Ativar o PIN do cartão SIM"</string>
<string name="enable_in_progress" msgid="3695303775100109650">"Queira aguardar..."</string>
<string name="enable_pin_ok" msgid="9166061915030865848">"PIN do SIM ativado"</string>
<string name="disable_pin_ok" msgid="5596999379593924850">"PIN do SIM desativado"</string>
@@ -446,7 +446,7 @@
<string name="importingSimContacts" msgid="7374056215462575769">"A importar contactos do cartão SIM"</string>
<string name="importToFDNfromContacts" msgid="2130620207013368580">"Importar a partir dos contactos"</string>
<string name="hac_mode_title" msgid="8740268574688743289">"Aparelhos auxiliares de audição"</string>
- <string name="hac_mode_summary" msgid="6833851160514929341">"Activar compatibilidade com aparelho auxiliar de audição"</string>
+ <string name="hac_mode_summary" msgid="6833851160514929341">"Ativar compatibilidade com aparelho auxiliar de audição"</string>
<string-array name="tty_mode_entries">
<item msgid="512950011423868021">"TTY desativado"</item>
<item msgid="3971695875449640648">"TTY total"</item>
@@ -460,10 +460,10 @@
<item msgid="2883365539347850535">"Longo"</item>
</string-array>
<string name="network_message" msgid="4483886461245213802">"Mensagem de rede"</string>
- <string name="ota_title_activate" msgid="8616918561356194398">"Activar o seu telefone"</string>
- <string name="ota_touch_activate" msgid="6553212803262586244">"É necessário efectuar uma chamada especial para activar o seu serviço telefónico. \n\nDepois de premir “Activar”, ouça as instruções fornecidas para activar o telefone."</string>
+ <string name="ota_title_activate" msgid="8616918561356194398">"Ativar o seu telefone"</string>
+ <string name="ota_touch_activate" msgid="6553212803262586244">"É necessário efectuar uma chamada especial para ativar o seu serviço telefónico. \n\nDepois de premir “Ativar”, ouça as instruções fornecidas para activar o telefone."</string>
<string name="ota_skip_activation_dialog_title" msgid="2943366608272261306">"Ignorar activação?"</string>
- <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Se ignorar a activação, não poderá fazer chamadas nem estabelecer ligação a redes móveis de dados (apesar de poder estabelecer ligação a redes Wi-Fi). Enquanto não activar o telefone, ser-lhe-á solicitada activação sempre que ligar o telefone."</string>
+ <string name="ota_skip_activation_dialog_message" msgid="2440770373498870550">"Se ignorar a ativação, não poderá fazer chamadas nem estabelecer ligação a redes móveis de dados (apesar de poder estabelecer ligação a redes Wi-Fi). Enquanto não ativar o telefone, ser-lhe-á solicitada activação sempre que ligar o telefone."</string>
<string name="ota_skip_activation_dialog_skip_label" msgid="3458532775091563208">"Ignorar"</string>
<string name="ota_activate" msgid="1368528132525626264">"Ativar"</string>
<string name="ota_title_activate_success" msgid="6570240212263372046">"O telemóvel está ativado!"</string>
@@ -481,7 +481,7 @@
<string name="ecm_exit_dialog" msgid="4448531867763097533">"EcmExitDialog"</string>
<string name="phone_entered_ecm_text" msgid="6266424252578731203">"Entrou em Modo de Chamada de Retorno de Emergência"</string>
<string name="phone_in_ecm_notification_title" msgid="3226896828951687085">"Modo de Chamada de Retorno de Emergência"</string>
- <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Ligação de dados desactivada"</string>
+ <string name="phone_in_ecm_call_notification_text" msgid="4611608947314729773">"Ligação de dados desativada"</string>
<plurals name="phone_in_ecm_notification_time">
<item quantity="one" msgid="4866221796252472622">"Sem ligação de dados durante <xliff:g id="COUNT">%s</xliff:g> minuto"</item>
<item quantity="other" msgid="3122217344579273583">"Sem ligação de dados durante <xliff:g id="COUNT">%s</xliff:g> minutos"</item>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Telefono-lhe mais tarde."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Pode telefonar-me mais tarde?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escrever a sua própria..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostas rápidas"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respostas rápidas"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -616,7 +620,7 @@
<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="dtmf_tone_enable_title" msgid="827601042915852989">"Sons dos toques no teclado de marcar"</string>
+ <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Sons dos toques no teclado"</string>
<string name="dial_pad_autocomplete" msgid="494525952035761075">"Preenchimento automático do teclado"</string>
<string name="preference_category_ringtone" msgid="5197960752529332721">"Tocar e Vibrar"</string>
<string name="manageConferenceLabel" msgid="4691922394301969053">"Gerir chamada de conferência"</string>
diff --git a/InCallUI/res/values-pt/strings.xml b/InCallUI/res/values-pt/strings.xml
index 01e88c3..09057a4 100644
--- a/InCallUI/res/values-pt/strings.xml
+++ b/InCallUI/res/values-pt/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Eu te ligo mais tarde."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Não posso falar agora. Liga depois, por favor?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escreva sua resposta..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostas rápidas"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respostas rápidas"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ro/strings.xml b/InCallUI/res/values-ro/strings.xml
index d2acb06..0fb3911 100644
--- a/InCallUI/res/values-ro/strings.xml
+++ b/InCallUI/res/values-ro/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te sun mai târziu."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nu pot acum. Vorbim mai târziu?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Scrieți propriul răspuns…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Răspunsuri rapide"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editaţi răspunsurile rapide"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ru/strings.xml b/InCallUI/res/values-ru/strings.xml
index 6594d42..7897e54 100644
--- a/InCallUI/res/values-ru/strings.xml
+++ b/InCallUI/res/values-ru/strings.xml
@@ -587,6 +587,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я перезвоню вам позже."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не могу говорить. Позвоните позже."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Ваш ответ…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Быстрые ответы"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Быстрые ответы"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sk/strings.xml b/InCallUI/res/values-sk/strings.xml
index 8cd330e..27a994f 100644
--- a/InCallUI/res/values-sk/strings.xml
+++ b/InCallUI/res/values-sk/strings.xml
@@ -512,7 +512,7 @@
<string name="sip_accounts_title" msgid="1212889069281054570">"Účty"</string>
<string name="sip_receive_calls" msgid="5635685570889971559">"Prijímať prichádzajúce hovory"</string>
<string name="sip_receive_calls_summary" msgid="8403613238633679184">"Znižuje výdrž batérie"</string>
- <string name="sip_call_options_title" msgid="27433718808839672">"Použiť internetový volanie"</string>
+ <string name="sip_call_options_title" msgid="27433718808839672">"Použiť internetové volanie"</string>
<string name="sip_call_options_wifi_only_title" msgid="145572394529090811">"Použiť internetový hovor (iba s pripojením Wi-Fi)"</string>
<string name="sip_call_options_entry_1" msgid="6556668894178520760">"Pre všetky hovory, pokiaľ je k dispozícii dátová sieť"</string>
<string name="sip_call_options_entry_2" msgid="6789764029719494361">"Iba pre internetové hovory"</string>
@@ -580,11 +580,15 @@
<string name="sip_system_decide" msgid="368030746310423471">"Automatické"</string>
<string name="sip_always_send_keepalive" msgid="8192080724632877132">"Vždy odoslať"</string>
<string name="not_voice_capable" msgid="2739898841461577811">"Hlasové volanie nie je podporované"</string>
- <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Nemôžem telefonovať, čo sa deje?"</string>
+ <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Teraz nemôžem hovoriť, o čo ide?"</string>
<string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Zavolám späť."</string>
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zavolám neskôr."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Teraz nemôžem, zavolajte inokedy."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napísať vlastnú..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Rýchle odpovede"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Upraviť rýchle odpovede"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -616,7 +620,7 @@
<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="dtmf_tone_enable_title" msgid="827601042915852989">"Zvuky pri dotyku na číselnú klávesnicu"</string>
+ <string name="dtmf_tone_enable_title" msgid="827601042915852989">"Zvuky pri dotyku číselníku"</string>
<string name="dial_pad_autocomplete" msgid="494525952035761075">"Automatické dokonč. číselnej klávesnice"</string>
<string name="preference_category_ringtone" msgid="5197960752529332721">"Tón zvonenia a vibrovanie"</string>
<string name="manageConferenceLabel" msgid="4691922394301969053">"Spravovať konferenčný hovor"</string>
diff --git a/InCallUI/res/values-sl/strings.xml b/InCallUI/res/values-sl/strings.xml
index 8aec816..7079213 100644
--- a/InCallUI/res/values-sl/strings.xml
+++ b/InCallUI/res/values-sl/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Poklical bom pozneje."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Zdaj ne morem govoriti. Pozneje?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite svoje besedilo …"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hitri odgovori"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Urejanje hitrih odgovorov"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sr/strings.xml b/InCallUI/res/values-sr/strings.xml
index 1edd80c..67b4677 100644
--- a/InCallUI/res/values-sr/strings.xml
+++ b/InCallUI/res/values-sr/strings.xml
@@ -129,7 +129,7 @@
<string name="vm_changed" msgid="380744030726254139">"Промењен је број говорне поште."</string>
<string name="vm_change_failed" msgid="3352934863246208918">"Није могуће променити број говорне поште.\nКонтактирајте мобилног оператера ако се овај проблем настави."</string>
<string name="fw_change_failed" msgid="5298103228470214665">"Није могуће променити број за преусмеравање.\nКонтактирајте мобилног оператера ако се овај проблем настави."</string>
- <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"Није било могуће преузети и сачувати тренутна подешавања броја за прослеђивање.\nЖелите ли да ипак пређете на новог добављача?"</string>
+ <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"Није могуће преузети и сачувати тренутна подешавања броја за прослеђивање.\nЖелите ли да ипак пређете на новог добављача?"</string>
<string name="no_change" msgid="3186040086622435212">"Нису начињене промене."</string>
<string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Одаберите услугу говорне поште"</string>
<string name="voicemail_default" msgid="5902099213882352338">" Мој мобилни оператер"</string>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Позваћу те касније."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"У гужви сам. Да се чујемо касније?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишите сами…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Брзи одговори"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Измена брзих одговора"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sv/strings.xml b/InCallUI/res/values-sv/strings.xml
index 3539477..1910e1e 100644
--- a/InCallUI/res/values-sv/strings.xml
+++ b/InCallUI/res/values-sv/strings.xml
@@ -591,6 +591,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Jag ringer dig senare."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan inte prata nu. Ring senare!"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv ett eget svar ..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Snabbsvar"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redigera snabbsvar"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sw/strings.xml b/InCallUI/res/values-sw/strings.xml
index 51c8add..931c08d 100644
--- a/InCallUI/res/values-sw/strings.xml
+++ b/InCallUI/res/values-sw/strings.xml
@@ -48,7 +48,7 @@
<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">"Tuma toni zinazofuata? \n"</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>
@@ -309,16 +309,16 @@
</string-array>
<string name="cdma_activate_device" msgid="3793805892364814518">"Wezesha kifaa"</string>
<string name="cdma_lte_data_service" msgid="4255018217292548962">"Sanidi huduma ya data"</string>
- <string name="fdn" msgid="7878832555095183202">"Nambari zilizopangiwa za Upigaji"</string>
+ <string name="fdn" msgid="7878832555095183202">"Nambari za kupiga zisizobadilishwa"</string>
<string name="manage_fdn_list" msgid="8777755791892122369">"Orodha ya FDN"</string>
<string name="fdn_activation" msgid="2156479741307463576">"Uwezeshaji wa FDN"</string>
<string name="fdn_enabled" msgid="5238109009915521240">"Nambari za upigaji simu zilizobanwa zimelemazwa"</string>
<string name="fdn_disabled" msgid="4700049736675368279">"Nambari za upigaji simu zilizobanwa zimelemazwa"</string>
- <string name="enable_fdn" msgid="3740191529180493851">"Wezesha FDN"</string>
+ <string name="enable_fdn" msgid="3740191529180493851">"Washa FDN"</string>
<string name="disable_fdn" msgid="7944020890722540616">"Lemaza FDN"</string>
<string name="change_pin2" msgid="2153563695382176676">"Badilisha PIN2"</string>
<string name="enable_fdn_ok" msgid="7215588870329688132">"Lemaza FDN"</string>
- <string name="disable_fdn_ok" msgid="5727046928930740173">"Wezesha FDN"</string>
+ <string name="disable_fdn_ok" msgid="5727046928930740173">"Washa FDN"</string>
<string name="sum_fdn" msgid="1959399454900272878">"Dhibiti nambari Za Upigaji simu Zilizobanwa"</string>
<string name="sum_fdn_change_pin" msgid="6666549734792827932">"Badilisha nenosiri la kufikia FDN"</string>
<string name="sum_fdn_manage_list" msgid="8431088265332628316">"Dhibiti orodha ya nambari ya simu"</string>
@@ -347,9 +347,9 @@
<string name="pin2_invalid" msgid="5470854099230755944">"FDN haikusasishwa kwa sababu uliweka PIN isiyo sahihi."</string>
<string name="fdn_invalid_number" msgid="1494755047900009147">"FDN haikusasishwa kwa sababu namba haiwezi kuzidisha herufi 20."</string>
<string name="pin2_or_fdn_invalid" msgid="6025144083384701197">"FDN haikusasishwa. PIN2 haikuwa sahihi, au namba ya simu ilikataliwa."</string>
- <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Inasoma kutoka kwa SIM kadi"</string>
- <string name="simContacts_empty" msgid="5270660846489561932">"Hakuna anwani kwenye kadi yako ya SIM."</string>
- <string name="simContacts_title" msgid="1861472842524839921">"Chagua anwani za kuagiza"</string>
+ <string name="simContacts_emptyLoading" msgid="2203331234764498011">"Inasoma kutoka kwa SIM kadi…"</string>
+ <string name="simContacts_empty" msgid="5270660846489561932">"Hakuna anwani kwenye SIM kadi yako."</string>
+ <string name="simContacts_title" msgid="1861472842524839921">"Chagua anwani za kuingiza"</string>
<string name="simContacts_airplaneMode" msgid="1846161429087789936">"Ili kuleta anwani kutoka kwa SIM kadi, kwanza zima hali ya Ndege."</string>
<string name="enable_pin" msgid="5422767284133234860">"Wezesha/zima nenosiri la SIM"</string>
<string name="change_pin" msgid="9174186126330785343">"Badilisha nenosiri la SIM"</string>
@@ -581,10 +581,14 @@
<string name="sip_always_send_keepalive" msgid="8192080724632877132">"Tuma kila wakati"</string>
<string name="not_voice_capable" msgid="2739898841461577811">"Upigaji simu za sauti hauhimiliwi"</string>
<string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Siwezi kuongea sasa. Kuna nini?"</string>
- <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Nitakupigia mara moja."</string>
+ <string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Nitakupigia sasa hivi."</string>
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Nitakupigia baadaye."</string>
- <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Siwezi kuongea sasa. Nipigie baadaye?"</string>
+ <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Siwezi kuongea sasa. Nipigie baadaye"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Andika yako binafsi..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Majibu ya haraka"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Hariri majibu ya haraka"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
@@ -615,9 +619,9 @@
<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 kuita"</string>
+ <string name="vibrate_on_ring_title" msgid="9197564612065258960">"Tetema wakati wa kulia"</string>
<string name="dtmf_tone_enable_title" msgid="827601042915852989">"Toa sauti vitufe vya kupiga vinapoguswa"</string>
<string name="dial_pad_autocomplete" msgid="494525952035761075">"Jaza nambari kiotomatiki"</string>
- <string name="preference_category_ringtone" msgid="5197960752529332721">"Malio wa simu na Mtetemo"</string>
+ <string name="preference_category_ringtone" msgid="5197960752529332721">"Mlio wa simu na Mtetemo"</string>
<string name="manageConferenceLabel" msgid="4691922394301969053">"Dhibiti simu ya kongamano"</string>
</resources>
diff --git a/InCallUI/res/values-th/strings.xml b/InCallUI/res/values-th/strings.xml
index 7f902f2..fc8e9bf 100644
--- a/InCallUI/res/values-th/strings.xml
+++ b/InCallUI/res/values-th/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"เดี๋ยวจะโทรหาทีหลัง"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ตอนนี้คุยไม่ได้ โทรมาใหม่ได้ไหม"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"เขียนคำตอบของคุณเอง..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"คำตอบด่วน"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"แก้ไขคำตอบด่วน"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-tl/strings.xml b/InCallUI/res/values-tl/strings.xml
index fc74466..b03f75b 100644
--- a/InCallUI/res/values-tl/strings.xml
+++ b/InCallUI/res/values-tl/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Tawagan kita mamaya."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Di masagot ngayon. Tawag ka mamaya?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Sumulat ng sarili mong tugon…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Mga mabilisang tugon"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"I-edit ang mga mabilisang tugon"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-tr/strings.xml b/InCallUI/res/values-tr/strings.xml
index fc8b9d4..da790d2 100644
--- a/InCallUI/res/values-tr/strings.xml
+++ b/InCallUI/res/values-tr/strings.xml
@@ -580,11 +580,15 @@
<string name="sip_system_decide" msgid="368030746310423471">"Otomatik"</string>
<string name="sip_always_send_keepalive" msgid="8192080724632877132">"Her zaman gönder"</string>
<string name="not_voice_capable" msgid="2739898841461577811">"Sesli arama desteklenmiyor"</string>
- <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Şimdi konuşamam. Ne oldu?"</string>
+ <string name="respond_via_sms_canned_response_1" msgid="2461606462788380215">"Şimdi konuşamam. Konu nedir?"</string>
<string name="respond_via_sms_canned_response_2" msgid="4074450431532859214">"Seni hemen geri arayacağım."</string>
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Seni daha sonra ararım."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Şimdi konuşamam. Daha sonra arar mısın?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kendi yanıtınızı oluşturun…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hızlı yanıtlar"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Hızlı yanıtları düzenle"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-uk/strings.xml b/InCallUI/res/values-uk/strings.xml
index 596df5d..9b00439 100644
--- a/InCallUI/res/values-uk/strings.xml
+++ b/InCallUI/res/values-uk/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я передзвоню пізніше."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не можу говорити. Передзвоніть."</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишіть власну відповідь..."</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Швидкі відповіді"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Редагувати швидкі відповіді"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-vi/strings.xml b/InCallUI/res/values-vi/strings.xml
index 656bf09..ce6b8af 100644
--- a/InCallUI/res/values-vi/strings.xml
+++ b/InCallUI/res/values-vi/strings.xml
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Tôi sẽ gọi lại sau."</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Giờ tôi ko thể nói chuyện. Gọi sau nhé?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Viết trả lời của riêng bạn…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Trả lời nhanh"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Chỉnh sửa trả lời nhanh"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zh-rCN/strings.xml b/InCallUI/res/values-zh-rCN/strings.xml
index a12d1bd..674e7ad 100644
--- a/InCallUI/res/values-zh-rCN/strings.xml
+++ b/InCallUI/res/values-zh-rCN/strings.xml
@@ -92,21 +92,21 @@
<string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"转接所有来电"</string>
<string name="sum_cfu_enabled" msgid="2450052502198827927">"将所有来电转接到 <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
<string name="sum_cfu_enabled_no_number" msgid="6591985777096823616">"未提供电话号码"</string>
- <string name="sum_cfu_disabled" msgid="3698472522160364904">"已停用"</string>
+ <string name="sum_cfu_disabled" msgid="3698472522160364904">"未启用"</string>
<string name="labelCFB" msgid="218938523102207587">"占线时转接"</string>
<string name="messageCFB" msgid="3711089705936187129">"占线时的转接号码"</string>
<string name="sum_cfb_enabled" msgid="5984198104833116690">"转接到 <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfb_disabled" msgid="227440009979537651">"已停用"</string>
+ <string name="sum_cfb_disabled" msgid="227440009979537651">"未启用"</string>
<string name="disable_cfb_forbidden" msgid="3506984333877998061">"您的运营商不支持在手机占线时停用来电转接功能。"</string>
<string name="labelCFNRy" msgid="3646316323834351390">"无人接听时转接"</string>
<string name="messageCFNRy" msgid="672317899884380374">"无人接听时的转接号码"</string>
<string name="sum_cfnry_enabled" msgid="6955775691317662910">"转接到 <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfnry_disabled" msgid="8422350929957344729">"已停用"</string>
+ <string name="sum_cfnry_disabled" msgid="8422350929957344729">"未启用"</string>
<string name="disable_cfnry_forbidden" msgid="4308233959150658058">"您的运营商不支持在手机无人接听时停用来电转接功能。"</string>
<string name="labelCFNRc" msgid="47183615370850000">"无法接通时转接"</string>
<string name="messageCFNRc" msgid="6380695421020295119">"无法接通时的转接号码"</string>
<string name="sum_cfnrc_enabled" msgid="7010898346095497421">"转接到 <xliff:g id="PHONENUMBER">{0}</xliff:g>"</string>
- <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"已停用"</string>
+ <string name="sum_cfnrc_disabled" msgid="7222141261321276464">"未启用"</string>
<string name="disable_cfnrc_forbidden" msgid="5646361343094064333">"您的运营商不支持在手机无法接通时停用来电转接功能。"</string>
<string name="updating_title" msgid="6146755386174019046">"通话设置"</string>
<string name="error_updating_title" msgid="7970259216988931777">"通话设置出错"</string>
@@ -313,14 +313,14 @@
<string name="manage_fdn_list" msgid="8777755791892122369">"固定拨号列表"</string>
<string name="fdn_activation" msgid="2156479741307463576">"激活固定拨号"</string>
<string name="fdn_enabled" msgid="5238109009915521240">"已启用固定拨号"</string>
- <string name="fdn_disabled" msgid="4700049736675368279">"已停用固定拨号"</string>
+ <string name="fdn_disabled" msgid="4700049736675368279">"未启用固定拨号"</string>
<string name="enable_fdn" msgid="3740191529180493851">"启用固定拨号"</string>
- <string name="disable_fdn" msgid="7944020890722540616">"禁用固定拨号"</string>
+ <string name="disable_fdn" msgid="7944020890722540616">"停用固定拨号"</string>
<string name="change_pin2" msgid="2153563695382176676">"更改 PIN2"</string>
- <string name="enable_fdn_ok" msgid="7215588870329688132">"禁用固定拨号"</string>
+ <string name="enable_fdn_ok" msgid="7215588870329688132">"停用固定拨号"</string>
<string name="disable_fdn_ok" msgid="5727046928930740173">"启用固定拨号"</string>
<string name="sum_fdn" msgid="1959399454900272878">"管理固定拨号"</string>
- <string name="sum_fdn_change_pin" msgid="6666549734792827932">"更改为访问固定拨号设置的 PIN"</string>
+ <string name="sum_fdn_change_pin" msgid="6666549734792827932">"更改使用固定拨号所需的 PIN 码"</string>
<string name="sum_fdn_manage_list" msgid="8431088265332628316">"管理手机号码列表"</string>
<string name="voice_privacy" msgid="3776841382844614716">"语音隐私权"</string>
<string name="voice_privacy_summary" msgid="3159383389833516214">"启用增强型隐秘模式"</string>
@@ -364,7 +364,7 @@
<string name="enable_sim_pin" msgid="5803702443844458831">"启用 SIM 卡 PIN"</string>
<string name="enable_in_progress" msgid="3695303775100109650">"请稍候..."</string>
<string name="enable_pin_ok" msgid="9166061915030865848">"SIM 卡 PIN 已启用。"</string>
- <string name="disable_pin_ok" msgid="5596999379593924850">"SIM 卡 PIN 已停用。"</string>
+ <string name="disable_pin_ok" msgid="5596999379593924850">"未启用 SIM 卡 PIN 码。"</string>
<string name="pin_failed" msgid="2298841192582192277">"键入的 PIN 有误。"</string>
<string name="pin_changed" msgid="4365538014588501049">"已成功更改 SIM 卡 PIN。"</string>
<string name="puk_requested" msgid="3898394204193202803">"密码不正确,SIM 已锁定!需要 PUK2。"</string>
@@ -448,8 +448,8 @@
<string name="hac_mode_title" msgid="8740268574688743289">"助听器"</string>
<string name="hac_mode_summary" msgid="6833851160514929341">"启用助听器兼容模式"</string>
<string-array name="tty_mode_entries">
- <item msgid="512950011423868021">"TTY 已停用"</item>
- <item msgid="3971695875449640648">"TTY 已满"</item>
+ <item msgid="512950011423868021">"未启用 TTY"</item>
+ <item msgid="3971695875449640648">"TTY 完整"</item>
<item msgid="1937509904407445684">"TTY HCO"</item>
<item msgid="5644925873488772224">"TTY VCO"</item>
</string-array>
@@ -507,15 +507,15 @@
<string name="contactPhoto" msgid="4713193418046639466">"联系人照片"</string>
<string name="goPrivate" msgid="865837794424530980">"私聊"</string>
<string name="selectContact" msgid="781975788478987237">"选择联系人"</string>
- <string name="sip_settings" msgid="6699045718560859691">"互联网通话设置"</string>
+ <string name="sip_settings" msgid="6699045718560859691">"互联网电话设置"</string>
<string name="sip_accounts" msgid="2097054001288457163">"互联网电话 (SIP) 帐户"</string>
<string name="sip_accounts_title" msgid="1212889069281054570">"帐户"</string>
<string name="sip_receive_calls" msgid="5635685570889971559">"接听来电"</string>
<string name="sip_receive_calls_summary" msgid="8403613238633679184">"会缩短电池待机时间"</string>
<string name="sip_call_options_title" msgid="27433718808839672">"使用互联网电话"</string>
- <string name="sip_call_options_wifi_only_title" msgid="145572394529090811">"使用互联网通话(仅限 WLAN)"</string>
+ <string name="sip_call_options_wifi_only_title" msgid="145572394529090811">"使用互联网电话(仅限 WLAN)"</string>
<string name="sip_call_options_entry_1" msgid="6556668894178520760">"数据网络接通时适用于所有通话"</string>
- <string name="sip_call_options_entry_2" msgid="6789764029719494361">"仅适用于互联网通话"</string>
+ <string name="sip_call_options_entry_2" msgid="6789764029719494361">"仅适用于互联网电话"</string>
<string name="sip_call_options_entry_3" msgid="7474809001402649185">"每次呼叫时询问"</string>
<string name="sip_call_options_wifi_only_entry_1" msgid="7423523864471650069">"适用于所有通话"</string>
<string name="pick_outgoing_call_phone_type" msgid="5622916534828338675">"拨打电话"</string>
@@ -585,6 +585,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我稍后会再打给你。"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"现在无法接听。能稍后再打给我吗?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰写回复…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回复"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"修改快速回复"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zh-rHK/strings.xml b/InCallUI/res/values-zh-rHK/strings.xml
index b353680..de26ecc 100644
--- a/InCallUI/res/values-zh-rHK/strings.xml
+++ b/InCallUI/res/values-zh-rHK/strings.xml
@@ -591,6 +591,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我晚點打電話給你。"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"我現在不方便通話,晚點再打來好嗎?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰寫回覆…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回應"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"編輯快速回應"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zh-rTW/strings.xml b/InCallUI/res/values-zh-rTW/strings.xml
index 6940a3a..702d0ef 100644
--- a/InCallUI/res/values-zh-rTW/strings.xml
+++ b/InCallUI/res/values-zh-rTW/strings.xml
@@ -591,6 +591,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我晚點回電。"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"我現在不方便通話,晚點再打來好嗎?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰寫回應…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回應"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"編輯快速回應"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zu/strings.xml b/InCallUI/res/values-zu/strings.xml
index e204e89..2959d4e 100644
--- a/InCallUI/res/values-zu/strings.xml
+++ b/InCallUI/res/values-zu/strings.xml
@@ -589,6 +589,10 @@
<string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ngizokushayela ucingo emva kwesikhathi"</string>
<string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Angikwazi ukukhuluma okwamanje. Ngicela uphinde ungishayele ucingo kamuva?"</string>
<string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Bhala okwakho…"</string>
+ <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+ <skip />
+ <!-- no translation found for custom_message_send (5795754217085747742) -->
+ <skip />
<string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Izimpendulo ezisheshayo"</string>
<string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Hlela izimpendulo ezisheshayo"</string>
<string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values/colors.xml b/InCallUI/res/values/colors.xml
index 4040008..6080e91 100644
--- a/InCallUI/res/values/colors.xml
+++ b/InCallUI/res/values/colors.xml
@@ -34,4 +34,19 @@
<!-- Used with some smaller texts in manage conference screen. -->
<color name="manage_conference_secondary_text_color">#888888</color>
+
+ <!-- Used when the End Call button is active -->
+ <drawable name="end_call_active_state">#f22121</drawable>
+
+ <!-- Used when the End Call button is pressed -->
+ <drawable name="end_call_pressed_state">#ff4e4e</drawable>
+
+ <!-- Used when the End Call button is disabled -->
+ <drawable name="end_call_disabled_state">#303030</drawable>
+
+ <!-- Dialpad background -->
+ <color name="dialpad_background">#000000</color>
+
+ <!-- Button background -->
+ <color name="button_background">#000000</color>
</resources>
diff --git a/InCallUI/res/values/dimens.xml b/InCallUI/res/values/dimens.xml
index 1d94971..204657b 100644
--- a/InCallUI/res/values/dimens.xml
+++ b/InCallUI/res/values/dimens.xml
@@ -28,6 +28,8 @@
<!-- Padding at the left and right edges of the "call banner". -->
<dimen name="call_banner_side_padding">24dp</dimen>
+ <!-- Padding at the right edges of the secondary call banner. -->
+ <dimen name="secondary_call_banner_right_padding">100dp</dimen>
<!-- Padding at the top and bottom edges of the "call banner". -->
<dimen name="call_banner_top_bottom_padding">16dp</dimen>
diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml
index e7049e5..7c588b3 100755
--- a/InCallUI/res/values/strings.xml
+++ b/InCallUI/res/values/strings.xml
@@ -1280,6 +1280,10 @@
<string name="respond_via_sms_canned_response_4">Can\'t talk now. Call me later?</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>
<!-- Title of settings screen for managing the "Respond via SMS" feature. [CHAR LIMIT=30] -->
<string name="respond_via_sms_setting_title">Quick responses</string>
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
index 324d522..1b249f2 100644
--- a/InCallUI/src/com/android/incallui/AnswerFragment.java
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -18,12 +18,18 @@
import android.app.AlertDialog;
import android.app.Dialog;
+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.google.common.base.Preconditions;
@@ -45,6 +51,11 @@
*/
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> mTextResponsesAdapter = null;
private GlowPadWrapper mGlowpad;
@@ -106,12 +117,7 @@
}
@Override
- public boolean isMessageDialogueShowing() {
- return mCannedResponsePopup != null && mCannedResponsePopup.isShowing();
- }
-
- @Override
- public void showMessageDialogue() {
+ public void showMessageDialog() {
final ListView lv = new ListView(getActivity());
Preconditions.checkNotNull(mTextResponsesAdapter);
@@ -124,22 +130,117 @@
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 currently visible popups.
+ * 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.
*/
- @Override
- public void dismissPopup() {
+ private 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 dismissPendingDialogues() {
+ 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 EditText et = new EditText(getActivity());
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).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();
+ }
+ })
+ .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.show();
+
+ // Send button starts out disabled
+ final Button sendButton = mCustomMessagePopup.getButton(DialogInterface.BUTTON_POSITIVE);
+ sendButton.setEnabled(false);
+ }
+
@Override
- public void configureMessageDialogue(ArrayList<String> textResponses) {
+ public void configureMessageDialog(ArrayList<String> textResponses) {
final ArrayList<String> textResponsesForDisplay = new ArrayList<String>(textResponses);
textResponsesForDisplay.add(getResources().getString(
@@ -178,12 +279,13 @@
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)) {
- // Take the user to the standard SMS compose UI.
- getPresenter().rejectCallWithMessage(null);
+ // Show the custom message dialog
+ showCustomMessageDialog();
} else {
getPresenter().rejectCallWithMessage(message);
}
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
index e820929..bfe8405 100644
--- a/InCallUI/src/com/android/incallui/AnswerPresenter.java
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -29,6 +29,7 @@
private static final String TAG = AnswerPresenter.class.getSimpleName();
private int mCallId = Call.INVALID_CALL_ID;
+ private Call mCall = null;
@Override
public void onUiReady(AnswerUi ui) {
@@ -64,6 +65,11 @@
}
@Override
+ public void onDisconnect(Call call) {
+ // no-op
+ }
+
+ @Override
public void onIncomingCall(Call call) {
// TODO: Ui is being destroyed when the fragment detaches. Need clean up step to stop
// getting updates here.
@@ -77,6 +83,7 @@
private void processIncomingCall(Call call) {
mCallId = call.getCallId();
+ mCall = call;
// Listen for call updates for the current call.
CallList.getInstance().addCallUpdateListener(mCallId, this);
@@ -88,7 +95,7 @@
if (call.can(Call.Capabilities.RESPOND_VIA_TEXT) && textMsgs != null) {
getUi().showTextButton(true);
- getUi().configureMessageDialogue(textMsgs);
+ getUi().configureMessageDialog(textMsgs);
} else {
getUi().showTextButton(false);
}
@@ -103,6 +110,9 @@
CallList.getInstance().removeCallUpdateListener(mCallId, this);
getUi().showAnswerUi(false);
+
+ // mCallId will hold the state of the call. We don't clear the mCall variable here as
+ // it may be useful for sending text messages after phone disconnects.
mCallId = Call.INVALID_CALL_ID;
}
}
@@ -118,35 +128,33 @@
}
public void onDecline() {
- if (mCallId == Call.INVALID_CALL_ID) {
- return;
- }
-
Log.d(this, "onDecline " + mCallId);
- CallCommandClient.getInstance().rejectCall(mCallId, false, null);
+ CallCommandClient.getInstance().rejectCall(mCall, false, null);
}
public void onText() {
if (getUi() != null) {
- getUi().showMessageDialogue();
+ getUi().showMessageDialog();
}
}
public void rejectCallWithMessage(String message) {
Log.d(this, "sendTextToDefaultActivity()...");
- if (getUi() != null) {
- getUi().dismissPopup();
- }
- CallCommandClient.getInstance().rejectCall(mCallId, true, message);
+
+ CallCommandClient.getInstance().rejectCall(mCall, true, message);
+
+ onDismissDialog();
+ }
+
+ public void onDismissDialog() {
+ InCallPresenter.getInstance().onDismissDialog();
}
interface AnswerUi extends Ui {
public void showAnswerUi(boolean show);
public void showTextButton(boolean show);
- public boolean isMessageDialogueShowing();
- public void showMessageDialogue();
- public void dismissPopup();
- public void configureMessageDialogue(ArrayList<String> textResponses);
+ public void showMessageDialog();
+ public void configureMessageDialog(ArrayList<String> textResponses);
}
}
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
index 4c42a78..b0fdda1 100644
--- a/InCallUI/src/com/android/incallui/CallButtonFragment.java
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -22,8 +22,8 @@
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.view.ViewStub;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.PopupMenu;
@@ -54,7 +54,7 @@
private View mEndCallButton;
private View mExtraRowButton;
private View mManageConferenceButton;
- private View mCDMAMergeButton;
+ private View mGenericMergeButton;
@Override
CallButtonPresenter createPresenter() {
@@ -87,7 +87,13 @@
getPresenter().manageConferenceButtonClicked();
}
});
- mCDMAMergeButton = parent.findViewById(R.id.cdmaMergeButton);
+ mGenericMergeButton = parent.findViewById(R.id.cdmaMergeButton);
+ mGenericMergeButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().mergeClicked();
+ }
+ });
mEndCallButton = parent.findViewById(R.id.endButton);
mEndCallButton.setOnClickListener(new View.OnClickListener() {
@@ -97,11 +103,16 @@
}
});
+ // make the hit target smaller for the end button so that is creates a deadzone
+ // along the inside perimeter of the button.
+ mEndCallButton.setOnTouchListener(new SmallerHitTargetTouchListener());
+
mMuteButton = (ToggleButton) parent.findViewById(R.id.muteButton);
- mMuteButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ mMuteButton.setOnClickListener(new OnClickListener() {
@Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- getPresenter().muteClicked(isChecked);
+ public void onClick(View v) {
+ final CompoundButton button = (CompoundButton) v;
+ getPresenter().muteClicked(button.isChecked());
}
});
@@ -142,6 +153,14 @@
}
@Override
+ public void onResume() {
+ if (getPresenter() != null) {
+ getPresenter().refreshMuteState();
+ }
+ super.onResume();
+ }
+
+ @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
@@ -170,12 +189,23 @@
}
@Override
- public void setVisible(boolean on) {
- if (on) {
- getView().setVisibility(View.VISIBLE);
- } else {
- getView().setVisibility(View.INVISIBLE);
+ public void setEnabled(boolean isEnabled) {
+ View view = getView();
+ if (view.getVisibility() != View.VISIBLE) {
+ view.setVisibility(View.VISIBLE);
}
+
+ // The main end-call button spanning across the screen.
+ mEndCallButton.setEnabled(isEnabled);
+
+ // The smaller buttons laid out horizontally just below the end-call button.
+ mMuteButton.setEnabled(isEnabled);
+ mAudioButton.setEnabled(isEnabled);
+ mHoldButton.setEnabled(isEnabled);
+ mShowDialpadButton.setEnabled(isEnabled);
+ mMergeButton.setEnabled(isEnabled);
+ mAddCallButton.setEnabled(isEnabled);
+ mSwapButton.setEnabled(isEnabled);
}
@Override
@@ -184,6 +214,11 @@
}
@Override
+ public void enableMute(boolean enabled) {
+ mMuteButton.setEnabled(enabled);
+ }
+
+ @Override
public void setHold(boolean value) {
mHoldButton.setChecked(value);
}
@@ -194,6 +229,11 @@
}
@Override
+ public void enableHold(boolean enabled) {
+ mHoldButton.setEnabled(enabled);
+ }
+
+ @Override
public void showMerge(boolean show) {
mMergeButton.setVisibility(show ? View.VISIBLE : View.GONE);
}
@@ -209,6 +249,11 @@
}
@Override
+ public void enableAddCall(boolean enabled) {
+ mAddCallButton.setEnabled(enabled);
+ }
+
+ @Override
public void setAudio(int mode) {
updateAudioButtons(getPresenter().getSupportedAudio());
refreshAudioModePopup();
@@ -485,14 +530,14 @@
public void showManageConferenceCallButton() {
mExtraRowButton.setVisibility(View.VISIBLE);
mManageConferenceButton.setVisibility(View.VISIBLE);
- mCDMAMergeButton.setVisibility(View.GONE);
+ mGenericMergeButton.setVisibility(View.GONE);
}
@Override
- public void showCDMAMergeButton() {
+ public void showGenericMergeButton() {
mExtraRowButton.setVisibility(View.VISIBLE);
mManageConferenceButton.setVisibility(View.GONE);
- mCDMAMergeButton.setVisibility(View.VISIBLE);
+ mGenericMergeButton.setVisibility(View.VISIBLE);
}
@Override
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index ec8e844..3642630 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -19,21 +19,29 @@
import com.android.incallui.AudioModeProvider.AudioModeListener;
import com.android.incallui.InCallPresenter.InCallState;
import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
import com.android.services.telephony.common.AudioMode;
import com.android.services.telephony.common.Call;
import com.android.services.telephony.common.Call.Capabilities;
+import android.telephony.PhoneNumberUtils;
+
/**
* Logic for call buttons.
*/
public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButtonUi>
- implements InCallStateListener, AudioModeListener {
+ implements InCallStateListener, AudioModeListener, IncomingCallListener {
private Call mCall;
private ProximitySensor mProximitySensor;
private boolean mAutomaticallyMuted = false;
private boolean mPreviousMuteState = false;
+ private boolean mShowGenericMerge = false;
+ private boolean mShowManageConference = false;
+
+ private InCallState mPreviousState = null;
+
public CallButtonPresenter() {
}
@@ -46,6 +54,7 @@
// register for call state changes last
InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
}
@Override
@@ -54,6 +63,7 @@
InCallPresenter.getInstance().removeListener(this);
AudioModeProvider.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
mProximitySensor = null;
}
@@ -64,11 +74,29 @@
mCall = callList.getOutgoingCall();
} else if (state == 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 (mPreviousState == InCallState.OUTGOING
+ && mCall != null && PhoneNumberUtils.isVoiceMailNumber(mCall.getNumber())) {
+ getUi().displayDialpad(true);
+ }
+ } else if (state == InCallState.INCOMING) {
+ getUi().displayDialpad(false);
+ mCall = null;
} else {
mCall = null;
}
-
updateUi(state, mCall);
+
+ mPreviousState = state;
+ }
+
+ @Override
+ public void onIncomingCall(InCallState state, Call call) {
+ onStateChange(state, CallList.getInstance());
}
@Override
@@ -138,7 +166,6 @@
return;
}
- // TODO(klp): hook up call id.
CallCommandClient.getInstance().disconnectCall(mCall.getCallId());
}
@@ -148,7 +175,6 @@
public void muteClicked(boolean checked) {
Log.d(this, "turning on mute: " + checked);
-
CallCommandClient.getInstance().mute(checked);
}
@@ -159,7 +185,6 @@
Log.d(this, "holding: " + mCall.getCallId());
- // TODO(klp): use appropriate hold callId.
CallCommandClient.getInstance().hold(mCall.getCallId(), checked);
getUi().setHold(checked);
}
@@ -172,7 +197,8 @@
// Automatically mute the current call
mAutomaticallyMuted = true;
mPreviousMuteState = AudioModeProvider.getInstance().getMute();
- getUi().setMute(true);
+ // Simulate a click on the mute button
+ muteClicked(true);
CallCommandClient.getInstance().addCall();
}
@@ -185,6 +211,8 @@
Log.v(this, "Show dialpad " + String.valueOf(checked));
getUi().displayDialpad(checked);
mProximitySensor.onDialpadVisible(checked);
+
+ updateExtraButtonRow();
}
private void updateUi(InCallState state, Call call) {
@@ -193,33 +221,73 @@
return;
}
- final boolean isVisible = state.isConnectingOrConnected() &&
+ final boolean isEnabled = state.isConnectingOrConnected() &&
!state.isIncoming() && call != null;
- ui.setVisible(isVisible);
+ ui.setEnabled(isEnabled);
Log.d(this, "Updating call UI for call: ", call);
- if (isVisible) {
- Log.v(this, "Show hold ", call.can(Capabilities.HOLD));
+ if (isEnabled) {
+ Log.v(this, "Show hold ", call.can(Capabilities.SUPPORT_HOLD));
+ Log.v(this, "Enable hold", call.can(Capabilities.HOLD));
Log.v(this, "Show merge ", call.can(Capabilities.MERGE_CALLS));
Log.v(this, "Show swap ", call.can(Capabilities.SWAP_CALLS));
Log.v(this, "Show add call ", call.can(Capabilities.ADD_CALL));
+ Log.v(this, "Show mute ", call.can(Capabilities.MUTE));
- ui.setHold(call.getState() == Call.State.ONHOLD);
+ final boolean canMerge = call.can(Capabilities.MERGE_CALLS);
+ final boolean canAdd = call.can(Capabilities.ADD_CALL);
+ final boolean isGenericConference = call.can(Capabilities.GENERIC_CONFERENCE);
- ui.showHold(call.can(Capabilities.HOLD));
- ui.showMerge(call.can(Capabilities.MERGE_CALLS));
- ui.showSwap(call.can(Capabilities.SWAP_CALLS));
- ui.showAddCall(call.can(Capabilities.ADD_CALL));
- // Restore the previous mute state
- if (mAutomaticallyMuted &&
- AudioModeProvider.getInstance().getMute() != mPreviousMuteState) {
- ui.setMute(mPreviousMuteState);
- mAutomaticallyMuted = false;
+ final boolean showMerge = !isGenericConference && canMerge;
+
+ if (showMerge) {
+ ui.showMerge(true);
+ ui.showAddCall(false);
+ } else {
+ ui.showMerge(false);
+ ui.showAddCall(true);
+ ui.enableAddCall(canAdd);
}
+ final boolean canHold = call.can(Capabilities.HOLD);
+ final boolean canSwap = call.can(Capabilities.SWAP_CALLS);
+ final boolean supportHold = call.can(Capabilities.SUPPORT_HOLD);
+
+ if (canHold) {
+ ui.showHold(true);
+ ui.setHold(call.getState() == Call.State.ONHOLD);
+ ui.enableHold(true);
+ ui.showSwap(false);
+ } else if (canSwap) {
+ ui.showHold(false);
+ ui.showSwap(true);
+ } else {
+ // Neither "Hold" nor "Swap" is available. This can happen for two
+ // reasons:
+ // (1) this is a transient state on a device that *can*
+ // normally hold or swap, or
+ // (2) this device just doesn't have the concept of hold/swap.
+ //
+ // In case (1), show the "Hold" button in a disabled state. In case
+ // (2), remove the button entirely. (This means that the button row
+ // will only have 4 buttons on some devices.)
+
+ if (supportHold) {
+ ui.showHold(true);
+ ui.enableHold(false);
+ ui.setHold(call.getState() == Call.State.ONHOLD);
+ ui.showSwap(false);
+ } else {
+ ui.showHold(false);
+ ui.showSwap(false);
+ }
+ }
+
+ ui.enableMute(call.can(Capabilities.MUTE));
+
// Finally, update the "extra button row": It's displayed above the
// "End" button, but only if necessary. Also, it's never displayed
// while the dialpad is visible (since it would overlap.)
@@ -228,42 +296,61 @@
//
// - "Manage conference" (used only on GSM devices)
// - "Merge" button (used only on CDMA devices)
- // TODO(klp) Add cdma merge button
- final boolean showCdmaMerge = false;
-// (phoneType == PhoneConstants.PHONE_TYPE_CDMA) && inCallControlState.canMerge;
- final boolean showExtraButtonRow =
- (showCdmaMerge || call.isConferenceCall()) && !getUi().isDialpadVisible();
- if (showExtraButtonRow) {
- // Need to set up mCdmaMergeButton and mManageConferenceButton if this is the first
- // time they're visible.
- // TODO(klp) add cdma merge button
-// if (mCdmaMergeButton == null) {
-// setupExtraButtons();
-// }
-// mCdmaMergeButton.setVisibility(showCdmaMerge ? View.VISIBLE : View.GONE);
- if (call.isConferenceCall()) {
- getUi().showManageConferenceCallButton();
- }
- } else {
- getUi().hideExtraRow();
- }
+
+ mShowGenericMerge = isGenericConference && canMerge;
+ mShowManageConference = (call.isConferenceCall() && !isGenericConference);
+
+ updateExtraButtonRow();
}
}
+ private void updateExtraButtonRow() {
+ final boolean showExtraButtonRow = (mShowGenericMerge || mShowManageConference) &&
+ !getUi().isDialpadVisible();
+
+ Log.d(this, "isGeneric: " + mShowGenericMerge);
+ Log.d(this, "mShowManageConference : " + mShowManageConference);
+ Log.d(this, "mShowGenericMerge: " + mShowGenericMerge);
+ if (showExtraButtonRow) {
+ if (mShowGenericMerge) {
+ getUi().showGenericMergeButton();
+ } else if (mShowManageConference) {
+ getUi().showManageConferenceCallButton();
+ }
+ } else {
+ getUi().hideExtraRow();
+ }
+ }
+
+ public void refreshMuteState() {
+ // Restore the previous mute state
+ if (mAutomaticallyMuted &&
+ AudioModeProvider.getInstance().getMute() != mPreviousMuteState) {
+ if (getUi() == null) {
+ return;
+ }
+ muteClicked(mPreviousMuteState);
+ }
+ mAutomaticallyMuted = false;
+ }
+
public interface CallButtonUi extends Ui {
- void setVisible(boolean on);
+ void setEnabled(boolean on);
void setMute(boolean on);
+ void enableMute(boolean enabled);
void setHold(boolean on);
void showHold(boolean show);
+ void enableHold(boolean enabled);
void showMerge(boolean show);
void showSwap(boolean show);
void showAddCall(boolean show);
+ void enableAddCall(boolean enabled);
void displayDialpad(boolean on);
boolean isDialpadVisible();
void setAudio(int mode);
void setSupportedAudio(int mask);
void showManageConferenceCallButton();
- void showCDMAMergeButton();
+ void showGenericMergeButton();
void hideExtraRow();
void displayManageConferencePanel(boolean on);
}
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index b8df2cf..0d26b82 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -29,11 +29,14 @@
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewStub;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.services.telephony.common.Call;
+import java.util.List;
+
/**
* Fragment for call card.
*/
@@ -45,6 +48,7 @@
private TextView mNumberLabel;
private TextView mPrimaryName;
private TextView mCallStateLabel;
+ private TextView mCallTypeLabel;
private ImageView mPhoto;
private TextView mElapsedTime;
private View mProviderInfo;
@@ -74,6 +78,12 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ }
+
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
final CallList calls = CallList.getInstance();
final Call call = calls.getFirstCall();
@@ -100,6 +110,7 @@
mSecondaryCallInfo = (ViewStub) view.findViewById(R.id.secondary_call_info);
mPhoto = (ImageView) view.findViewById(R.id.photo);
mCallStateLabel = (TextView) view.findViewById(R.id.callStateLabel);
+ mCallTypeLabel = (TextView) view.findViewById(R.id.callTypeLabel);
mElapsedTime = (TextView) view.findViewById(R.id.elapsedTime);
mProviderInfo = view.findViewById(R.id.providerInfo);
mProviderLabel = (TextView) view.findViewById(R.id.providerLabel);
@@ -134,9 +145,9 @@
}
@Override
- public void setPrimaryImage(Bitmap image) {
+ public void setPrimaryImage(Drawable image) {
if (image != null) {
- setDrawableToImageView(mPhoto, new BitmapDrawable(getResources(), image));
+ setDrawableToImageView(mPhoto, image);
}
}
@@ -165,49 +176,37 @@
}
@Override
- public void setPrimaryGateway(String gatewayLabel, String gatewayNumber) {
- if (!TextUtils.isEmpty(gatewayLabel) && !TextUtils.isEmpty(gatewayNumber)) {
- mProviderLabel.setText(gatewayLabel);
- mProviderNumber.setText(gatewayNumber);
- mProviderInfo.setVisibility(View.VISIBLE);
- } else {
- mProviderInfo.setVisibility(View.GONE);
- }
- }
-
- @Override
public void setPrimary(String number, String name, boolean nameIsNumber, String label,
- Drawable photo, boolean isConference, String gatewayLabel, String gatewayNumber) {
- Log.d(this, "Setting primary call [" + gatewayLabel + "][" + gatewayNumber + "]");
+ Drawable photo, boolean isConference, boolean isGeneric, boolean isSipCall) {
+ Log.d(this, "Setting primary call");
if (isConference) {
- name = getView().getResources().getString(R.string.card_title_conf_call);
- photo = getView().getResources().getDrawable(R.drawable.picture_conference);
+ name = getConferenceString(isGeneric);
+ photo = getConferencePhoto(isGeneric);
nameIsNumber = false;
}
setPrimaryPhoneNumber(number);
- // Set any gateway information
- setPrimaryGateway(gatewayLabel, gatewayNumber);
-
// set the name field.
setPrimaryName(name, nameIsNumber);
// Set the label (Mobile, Work, etc)
setPrimaryLabel(label);
+ showInternetCallLabel(isSipCall);
+
setDrawableToImageView(mPhoto, photo);
}
@Override
public void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
- Drawable photo, boolean isConference) {
+ Drawable photo, boolean isConference, boolean isGeneric) {
if (show) {
if (isConference) {
- name = getView().getResources().getString(R.string.card_title_conf_call);
- photo = getView().getResources().getDrawable(R.drawable.picture_conference);
+ name = getConferenceString(isGeneric);
+ photo = getConferencePhoto(isGeneric);
nameIsNumber = false;
}
@@ -227,41 +226,40 @@
}
@Override
- public void setSecondaryImage(Bitmap bitmap) {
- if (bitmap != null) {
- setDrawableToImageView(mSecondaryPhoto, new BitmapDrawable(getResources(), bitmap));
+ public void setSecondaryImage(Drawable image) {
+ if (image != null) {
+ setDrawableToImageView(mSecondaryPhoto, image);
}
}
@Override
- public void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn) {
+ public void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn,
+ String gatewayLabel, String gatewayNumber) {
String callStateLabel = null;
// States other than disconnected not yet supported
callStateLabel = getCallStateLabelFromState(state, cause);
- Log.v(this, "setCallState ", callStateLabel);
- Log.v(this, "DisconnectCause ", cause);
- Log.v(this, "bluetooth on ", bluetoothOn);
+ Log.v(this, "setCallState " + callStateLabel);
+ Log.v(this, "DisconnectCause " + cause);
+ Log.v(this, "bluetooth on " + bluetoothOn);
+ Log.v(this, "gateway " + gatewayLabel + gatewayNumber);
+ // There are cases where we totally skip the animation, in which case remove the transition
+ // animation here and restore it afterwards.
+ final boolean skipAnimation = (Call.State.isDialing(state)
+ || state == Call.State.DISCONNECTED || state == Call.State.DISCONNECTING);
+ LayoutTransition transition = null;
+ if (skipAnimation) {
+ transition = mSupplementaryInfoContainer.getLayoutTransition();
+ mSupplementaryInfoContainer.setLayoutTransition(null);
+ }
+
+ // Update the call state label.
if (!TextUtils.isEmpty(callStateLabel)) {
- // There are cases where we totally skip the animation
- final boolean skipAnimation = (state == Call.State.DIALING
- || state == Call.State.DISCONNECTED);
-
- LayoutTransition transition = null;
- if (skipAnimation) {
- transition = mSupplementaryInfoContainer.getLayoutTransition();
- mSupplementaryInfoContainer.setLayoutTransition(null);
- }
-
mCallStateLabel.setVisibility(View.VISIBLE);
mCallStateLabel.setText(callStateLabel);
- if (skipAnimation) {
- mSupplementaryInfoContainer.setLayoutTransition(transition);
- }
-
if (Call.State.INCOMING == state) {
setBluetoothOn(bluetoothOn);
}
@@ -276,6 +274,31 @@
mCallStateLabel.setGravity(Gravity.END);
}
}
+
+ // Provider info: (e.g. "Calling via <gatewayLabel>")
+ if (!TextUtils.isEmpty(gatewayLabel) && !TextUtils.isEmpty(gatewayNumber)) {
+ mProviderLabel.setText(gatewayLabel);
+ mProviderNumber.setText(gatewayNumber);
+ mProviderInfo.setVisibility(View.VISIBLE);
+ } else {
+ mProviderInfo.setVisibility(View.GONE);
+ }
+
+ // Restore the animation.
+ if (skipAnimation) {
+ mSupplementaryInfoContainer.setLayoutTransition(transition);
+ }
+ }
+
+ 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
@@ -302,15 +325,27 @@
AnimationUtils.Fade.show(view);
} else {
AnimationUtils.startCrossFade(view, current, photo);
- mPhoto.setVisibility(View.VISIBLE);
+ view.setVisibility(View.VISIBLE);
}
}
+ private String getConferenceString(boolean isGeneric) {
+ Log.v(this, "isGenericString: " + isGeneric);
+ final int resId = isGeneric ? R.string.card_title_in_call : R.string.card_title_conf_call;
+ return getView().getResources().getString(resId);
+ }
+
+ private Drawable getConferencePhoto(boolean isGeneric) {
+ Log.v(this, "isGenericPhoto: " + isGeneric);
+ final int resId = isGeneric ? R.drawable.picture_dialing : R.drawable.picture_conference;
+ return getView().getResources().getDrawable(resId);
+ }
+
private void setBluetoothOn(boolean onOff) {
// Also, display a special icon (alongside the "Incoming call"
// label) if there's an incoming call and audio will be routed
// to bluetooth when you answer it.
- final int bluetoothIconId = R.drawable.ic_incoming_call_bluetooth;
+ final int bluetoothIconId = R.drawable.ic_in_call_bt_dk;
if (onOff) {
mCallStateLabel.setCompoundDrawablesWithIntrinsicBounds(bluetoothIconId, 0, 0, 0);
@@ -338,22 +373,21 @@
} else if (Call.State.ONHOLD == state) {
callStateLabel = context.getString(R.string.card_title_on_hold);
-
} else if (Call.State.DIALING == state) {
callStateLabel = context.getString(R.string.card_title_dialing);
-
+ } else if (Call.State.REDIALING == state) {
+ callStateLabel = context.getString(R.string.card_title_redialing);
} else if (Call.State.INCOMING == state || Call.State.CALL_WAITING == state) {
callStateLabel = context.getString(R.string.card_title_incoming_call);
- // TODO(klp): Add a disconnecting state
- //} else if (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);
+ } else if (Call.State.DISCONNECTING == state) {
+ // 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);
} else if (Call.State.DISCONNECTED == state) {
callStateLabel = getCallFailedString(cause);
@@ -461,6 +495,33 @@
getPresenter().secondaryPhotoClicked();
}
});
+ mSecondaryPhotoOverlay.setOnTouchListener(new SmallerHitTargetTouchListener());
+ }
+ }
+
+ public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
+ dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+ dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+ return;
+ }
+ dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+ dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+ dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+ dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+ dispatchPopulateAccessibilityEvent(event, mSecondaryCallName);
+
+ return;
+ }
+
+ 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);
}
}
}
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index d44a661..949d718 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -30,8 +30,10 @@
import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
import com.android.incallui.InCallPresenter.InCallState;
import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
import com.android.services.telephony.common.AudioMode;
import com.android.services.telephony.common.Call;
+import com.android.services.telephony.common.Call.Capabilities;
import com.android.services.telephony.common.CallIdentification;
import com.google.common.base.Preconditions;
@@ -41,7 +43,7 @@
* This class listens for changes to InCallState and passes it along to the fragment.
*/
public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
- implements InCallStateListener, AudioModeListener {
+ implements InCallStateListener, AudioModeListener, IncomingCallListener {
private static final String TAG = CallCardPresenter.class.getSimpleName();
private static final long CALL_TIME_UPDATE_INTERVAL = 1000; // in milliseconds
@@ -73,15 +75,13 @@
final CallIdentification identification = call.getIdentification();
- // TODO(klp): Logic to determine which ui field get what data resides in
- // contactInfoCache.
- // It needs to be moved so it can be re-used.
- mPrimaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext, identification,
- call.getState() == Call.State.INCOMING);
-
// start processing lookups right away.
- startContactInfoSearch(identification, true, false,
- call.getState() == Call.State.INCOMING);
+ if (!call.isConferenceCall()) {
+ startContactInfoSearch(identification, true,
+ call.getState() == Call.State.INCOMING);
+ } else {
+ updateContactEntry(null, true, true);
+ }
}
}
@@ -93,11 +93,12 @@
// Contact search may have completed before ui is ready.
if (mPrimaryContactInfo != null) {
- updatePrimaryDisplayInfo(mPrimaryContactInfo, false);
+ updatePrimaryDisplayInfo(mPrimaryContactInfo, isConference(mPrimary));
}
// Register for call state changes last
InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
}
@Override
@@ -106,6 +107,7 @@
// stop getting call state changes
InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
AudioModeProvider.getInstance().removeListener(this);
@@ -115,6 +117,12 @@
}
@Override
+ public void onIncomingCall(InCallState state, Call call) {
+ // same logic should happen as with onStateChange()
+ onStateChange(state, CallList.getInstance());
+ }
+
+ @Override
public void onStateChange(InCallState state, CallList callList) {
Log.d(this, "onStateChange() " + state);
final CallCardUi ui = getUi();
@@ -141,35 +149,31 @@
Log.d(this, "Primary call: " + primary);
Log.d(this, "Secondary call: " + secondary);
- if (primary != null) {
- if (mPrimary == null || mPrimary.getCallId() != primary.getCallId()) {
- // primary call has changed
- mPrimaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext,
- primary.getIdentification(), primary.getState() == Call.State.INCOMING);
- updatePrimaryDisplayInfo(mPrimaryContactInfo, isConference(primary));
- startContactInfoSearch(primary.getIdentification(), true,
- primary.isConferenceCall(), primary.getState() == Call.State.INCOMING);
- }
+ final boolean primaryChanged = !areCallsSame(mPrimary, primary);
+ final boolean secondaryChanged = !areCallsSame(mSecondary, secondary);
+ mSecondary = secondary;
+ mPrimary = primary;
+
+ if (primaryChanged && mPrimary != null) {
+ // primary call has changed
+ mPrimaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext,
+ mPrimary.getIdentification(), mPrimary.getState() == Call.State.INCOMING);
+ updatePrimaryDisplayInfo(mPrimaryContactInfo, isConference(mPrimary));
+ maybeStartSearch(mPrimary, true);
}
- if (secondary == null) {
+ if (mSecondary == null) {
// Secondary call may have ended. Update the ui.
mSecondaryContactInfo = null;
updateSecondaryDisplayInfo(false);
- } else {
- if (mSecondary == null || mSecondary.getCallId() != secondary.getCallId()) {
- // secondary call has changed
- mSecondaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext,
- secondary.getIdentification(), secondary.getState() == Call.State.INCOMING);
- updateSecondaryDisplayInfo(secondary.isConferenceCall());
- startContactInfoSearch(secondary.getIdentification(), false,
- secondary.isConferenceCall(), secondary.getState() == Call.State.INCOMING);
- }
+ } else if (secondaryChanged) {
+ // secondary call has changed
+ mSecondaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext,
+ mSecondary.getIdentification(), mSecondary.getState() == Call.State.INCOMING);
+ updateSecondaryDisplayInfo(mSecondary.isConferenceCall());
+ maybeStartSearch(mSecondary, false);
}
- mPrimary = primary;
- mSecondary = secondary;
-
// Start/Stop the call time update timer
if (mPrimary != null && mPrimary.getState() == Call.State.ACTIVE) {
Log.d(this, "Starting the calltime timer");
@@ -184,9 +188,10 @@
if (mPrimary != null) {
final boolean bluetoothOn =
(AudioModeProvider.getInstance().getAudioMode() == AudioMode.BLUETOOTH);
- ui.setCallState(mPrimary.getState(), mPrimary.getDisconnectCause(), bluetoothOn);
+ ui.setCallState(mPrimary.getState(), mPrimary.getDisconnectCause(), bluetoothOn,
+ getGatewayLabel(), getGatewayNumber());
} else {
- ui.setCallState(Call.State.IDLE, Call.DisconnectCause.UNKNOWN, false);
+ ui.setCallState(Call.State.IDLE, Call.DisconnectCause.UNKNOWN, false, null, null);
}
}
@@ -195,7 +200,8 @@
if (mPrimary != null && getUi() != null) {
final boolean bluetoothOn = (AudioMode.BLUETOOTH == mode);
- getUi().setCallState(mPrimary.getState(), mPrimary.getDisconnectCause(), bluetoothOn);
+ getUi().setCallState(mPrimary.getState(), mPrimary.getDisconnectCause(), bluetoothOn,
+ getGatewayLabel(), getGatewayNumber());
}
}
@@ -222,39 +228,66 @@
}
}
+ private boolean areCallsSame(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.getCallId() == call2.getCallId();
+ }
+
+ 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.getIdentification(), isPrimary,
+ call.getState() == Call.State.INCOMING);
+ }
+ }
+
/**
* Starts a query for more contact data for the save primary and secondary calls.
*/
private void startContactInfoSearch(final CallIdentification identification,
- final boolean isPrimary, final boolean isConference, boolean isIncoming) {
-
+ final boolean isPrimary, boolean isIncoming) {
final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
cache.findInfo(identification, isIncoming, new ContactInfoCacheCallback() {
@Override
public void onContactInfoComplete(int callId, ContactCacheEntry entry) {
- updateContactEntry(entry, isPrimary, isConference);
+ updateContactEntry(entry, isPrimary, false);
if (entry.name != null) {
Log.d(TAG, "Contact found: " + entry);
}
+ if (entry.personUri != null) {
+ CallerInfoUtils.sendViewNotification(mContext, entry.personUri);
+ }
}
@Override
- public void onImageLoadComplete(int callId, Bitmap photo) {
- if (mPrimary != null && callId == mPrimary.getCallId()) {
- getUi().setPrimaryImage(photo);
- } else if (mSecondary != null && callId == mSecondary.getCallId()) {
- getUi().setSecondaryImage(photo);
+ public void onImageLoadComplete(int callId, ContactCacheEntry entry) {
+ if (getUi() == null) {
+ return;
+ }
+ if (entry.photo != null) {
+ if (mPrimary != null && callId == mPrimary.getCallId()) {
+ getUi().setPrimaryImage(entry.photo);
+ } else if (mSecondary != null && callId == mSecondary.getCallId()) {
+ getUi().setSecondaryImage(entry.photo);
+ }
}
}
});
}
- private boolean isConference(Call call) {
- if (call == null) {
- return false;
- }
- return call.isConferenceCall();
+ private static boolean isConference(Call call) {
+ return call != null && call.isConferenceCall();
+ }
+
+ private static boolean isGenericConference(Call call) {
+ return call != null && call.can(Capabilities.GENERIC_CONFERENCE);
}
private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary,
@@ -288,6 +321,10 @@
// 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;
@@ -316,19 +353,15 @@
return;
}
+ final boolean isGenericConf = isGenericConference(mPrimary);
if (entry != null) {
final String name = getNameForCall(entry);
final String number = getNumberForCall(entry);
final boolean nameIsNumber = name != null && name.equals(entry.number);
- final String gatewayLabel = getGatewayLabel();
- final String gatewayNumber = getGatewayNumber();
-
ui.setPrimary(number, name, nameIsNumber, entry.label,
- entry.photo, isConference, gatewayLabel,
- gatewayNumber);
+ entry.photo, isConference, isGenericConf, entry.isSipCall);
} else {
- // reset to nothing (like at end of call)
- ui.setPrimary(null, null, false, null, null, false, null, null);
+ ui.setPrimary(null, null, false, null, null, isConference, isGenericConf, false);
}
}
@@ -340,6 +373,7 @@
return;
}
+ final boolean isGenericConf = isGenericConference(mSecondary);
if (mSecondaryContactInfo != null) {
Log.d(TAG, "updateSecondaryDisplayInfo() " + mSecondaryContactInfo);
final String nameForCall = getNameForCall(mSecondaryContactInfo);
@@ -347,10 +381,10 @@
final boolean nameIsNumber = nameForCall != null && nameForCall.equals(
mSecondaryContactInfo.number);
ui.setSecondary(true, nameForCall, nameIsNumber, mSecondaryContactInfo.label,
- mSecondaryContactInfo.photo, isConference);
+ mSecondaryContactInfo.photo, isConference, isGenericConf);
} else {
// reset to nothing so that it starts off blank next time we use it.
- ui.setSecondary(false, null, false, null, null, false);
+ ui.setSecondary(false, null, false, null, null, isConference, isGenericConf);
}
}
@@ -390,7 +424,7 @@
if (mPrimary == null) {
return false;
}
- return (mPrimary.getState() == Call.State.DIALING &&
+ return (Call.State.isDialing(mPrimary.getState()) &&
!TextUtils.isEmpty(mPrimary.getGatewayNumber()) &&
!TextUtils.isEmpty(mPrimary.getGatewayPackage()));
}
@@ -424,16 +458,16 @@
public interface CallCardUi extends Ui {
void setVisible(boolean on);
void setPrimary(String number, String name, boolean nameIsNumber, String label,
- Drawable photo, boolean isConference, String gatewayLabel, String gatewayNumber);
+ Drawable photo, boolean isConference, boolean isGeneric, boolean isSipCall);
void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
- Drawable photo, boolean isConference);
- void setSecondaryImage(Bitmap bitmap);
- void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn);
+ Drawable photo, boolean isConference, boolean isGeneric);
+ void setSecondaryImage(Drawable image);
+ void setCallState(int state, Call.DisconnectCause cause, boolean bluetoothOn,
+ String gatewayLabel, String gatewayNumber);
void setPrimaryCallElapsedTime(boolean show, String duration);
void setPrimaryName(String name, boolean nameIsNumber);
- void setPrimaryImage(Bitmap bitmap);
+ void setPrimaryImage(Drawable image);
void setPrimaryPhoneNumber(String phoneNumber);
void setPrimaryLabel(String label);
- void setPrimaryGateway(String label, String number);
}
}
diff --git a/InCallUI/src/com/android/incallui/CallCommandClient.java b/InCallUI/src/com/android/incallui/CallCommandClient.java
index cb49dca..52d2100 100644
--- a/InCallUI/src/com/android/incallui/CallCommandClient.java
+++ b/InCallUI/src/com/android/incallui/CallCommandClient.java
@@ -18,8 +18,10 @@
import android.os.RemoteException;
+
import com.android.services.telephony.common.AudioMode;
import com.android.services.telephony.common.ICallCommandService;
+import com.android.services.telephony.common.Call;
/**
* Main interface for phone related commands.
@@ -57,14 +59,15 @@
}
}
- public void rejectCall(int callId, boolean rejectWithMessage, String message) {
- Log.i(this, "rejectCall: " + callId + ", with rejectMessage? " + rejectWithMessage);
+ public void rejectCall(Call call, boolean rejectWithMessage, String message) {
+ Log.i(this, "rejectCall: " + call.getCallId() +
+ ", with rejectMessage? " + rejectWithMessage);
if (mCommandService == null) {
Log.e(this, "Cannot reject call; CallCommandService == null");
return;
}
try {
- mCommandService.rejectCall(callId, rejectWithMessage, message);
+ mCommandService.rejectCall(call, rejectWithMessage, message);
} catch (RemoteException e) {
Log.e(this, "Error rejecting call.", e);
}
@@ -227,4 +230,17 @@
}
}
+ public void setSystemBarNavigationEnabled(boolean enable) {
+ if (mCommandService == null) {
+ Log.e(this, "Cannot setSystemBarNavigationEnabled(); CallCommandService == null");
+ return;
+ }
+ try {
+ Log.v(this, "setSystemBarNavigationEnabled() enabled = " + enable);
+ mCommandService.setSystemBarNavigationEnabled(enable);
+ } catch (RemoteException e) {
+ Log.d(this, "Error on setSystemBarNavigationEnabled().");
+ }
+ }
+
}
diff --git a/InCallUI/src/com/android/incallui/CallHandlerService.java b/InCallUI/src/com/android/incallui/CallHandlerService.java
index d50635d..06b10ab 100644
--- a/InCallUI/src/com/android/incallui/CallHandlerService.java
+++ b/InCallUI/src/com/android/incallui/CallHandlerService.java
@@ -174,8 +174,9 @@
}
@Override
- public void bringToForeground() {
- mMainHandler.sendMessage(mMainHandler.obtainMessage(ON_BRING_TO_FOREGROUND));
+ public void bringToForeground(boolean showDialpad) {
+ mMainHandler.sendMessage(mMainHandler.obtainMessage(ON_BRING_TO_FOREGROUND,
+ showDialpad ? 1 : 0, 0));
}
@Override
@@ -290,9 +291,9 @@
mAudioModeProvider.onSupportedAudioModeChange(msg.arg1);
break;
case ON_BRING_TO_FOREGROUND:
- Log.i(TAG, "ON_BRING_TO_FOREGROUND");
+ Log.i(TAG, "ON_BRING_TO_FOREGROUND" + msg.arg1);
if (mInCallPresenter != null) {
- mInCallPresenter.bringToForeground();
+ mInCallPresenter.bringToForeground(msg.arg1 != 0);
}
break;
case ON_START:
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index 42f4eb9..ba123b0 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -83,10 +83,15 @@
public void onDisconnect(Call call) {
Log.d(this, "onDisconnect: ", call);
- updateCallInMap(call);
+ boolean updated = updateCallInMap(call);
- notifyCallUpdateListeners(call);
- notifyListenersOfChange();
+ if (updated) {
+ // notify those listening for changes on this specific change
+ notifyCallUpdateListeners(call);
+
+ // notify those listening for all disconnects
+ notifyListenersOfDisconnect(call);
+ }
}
/**
@@ -187,7 +192,11 @@
}
public Call getOutgoingCall() {
- return getFirstCallWithState(Call.State.DIALING);
+ Call call = getFirstCallWithState(Call.State.DIALING);
+ if (call == null) {
+ call = getFirstCallWithState(Call.State.REDIALING);
+ }
+ return call;
}
public Call getActiveCall() {
@@ -202,6 +211,10 @@
return getFirstCallWithState(Call.State.DISCONNECTED);
}
+ public Call getDisconnectingCall() {
+ return getFirstCallWithState(Call.State.DISCONNECTING);
+ }
+
public Call getSecondBackgroundCall() {
return getCallWithState(Call.State.ONHOLD, 1);
}
@@ -223,19 +236,27 @@
return call;
}
-
public Call getFirstCall() {
- // TODO: should we switch to a simple list and pull the first one?
Call result = getIncomingCall();
if (result == null) {
- result = getFirstCallWithState(Call.State.DIALING);
+ result = getOutgoingCall();
}
if (result == null) {
result = getFirstCallWithState(Call.State.ACTIVE);
}
+ if (result == null) {
+ result = getDisconnectingCall();
+ }
+ if (result == null) {
+ result = getDisconnectedCall();
+ }
return result;
}
+ public Call getCall(int callId) {
+ return mCallMap.get(callId);
+ }
+
public boolean existsLiveCall() {
for (Call call : mCallMap.values()) {
if (!isCallDead(call)) {
@@ -258,7 +279,7 @@
/**
* Returns the [position]th call found in the call map with the specified state.
- * TODO(klp): Improve this logic to sort by call time.
+ * TODO: Improve this logic to sort by call time.
*/
public Call getCallWithState(int state, int positionToFind) {
Call retval = null;
@@ -306,13 +327,24 @@
}
}
- private void updateCallInMap(Call call) {
+ 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;
+
final Integer id = new Integer(call.getCallId());
if (call.getState() == Call.State.DISCONNECTED) {
-
// update existing (but do not add!!) disconnected calls
if (mCallMap.containsKey(id)) {
@@ -324,12 +356,17 @@
mHandler.sendMessageDelayed(msg, getDelayForDisconnect(call));
mCallMap.put(id, call);
+ updated = true;
}
} else if (!isCallDead(call)) {
mCallMap.put(id, call);
+ updated = true;
} else if (mCallMap.containsKey(id)) {
mCallMap.remove(id);
+ updated = true;
}
+
+ return updated;
}
private int getDelayForDisconnect(Call call) {
@@ -409,8 +446,28 @@
* to the call list.
*/
public interface Listener {
- public void onCallListChange(CallList callList);
+ /**
+ * 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 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 {
diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
index e282d50..3d2c5c4 100644
--- a/InCallUI/src/com/android/incallui/CallerInfoUtils.java
+++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
@@ -1,6 +1,8 @@
package com.android.incallui;
import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
import android.text.TextUtils;
import com.android.services.telephony.common.Call;
@@ -9,7 +11,7 @@
import java.util.Arrays;
/**
- * TODO: Insert description here. (generated by yorkelee)
+ * Utility methods for contact and caller info related functionality
*/
public class CallerInfoUtils {
@@ -18,6 +20,12 @@
/** Define for not a special CNAP string */
private static final int CNAP_SPECIAL_CASE_NO = -1;
+ private static final String VIEW_NOTIFICATION_ACTION =
+ "com.android.contacts.VIEW_NOTIFICATION";
+ private static final String VIEW_NOTIFICATION_PACKAGE = "com.android.contacts";
+ private static final String VIEW_NOTIFICATION_CLASS =
+ "com.android.contacts.ViewNotificationService";
+
public CallerInfoUtils() {
}
@@ -153,7 +161,7 @@
return "";
}
- // Todo (klp): Figure out an equivalent for VDBG
+ // Todo: Figure out an equivalent for VDBG
if (false) {
// When VDBG is true we emit PII.
return number;
@@ -172,4 +180,14 @@
}
return builder.toString();
}
+
+ /**
+ * Send a notification that that we are viewing a particular contact, so that the high-res
+ * photo is downloaded by the sync adapter.
+ */
+ public static void sendViewNotification(Context context, Uri contactUri) {
+ final Intent intent = new Intent(VIEW_NOTIFICATION_ACTION, contactUri);
+ intent.setClassName(VIEW_NOTIFICATION_PACKAGE, VIEW_NOTIFICATION_CLASS);
+ context.startService(intent);
+ }
}
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
index 041614d..1ba88cb 100644
--- a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
@@ -21,6 +21,7 @@
import com.android.incallui.ContactInfoCache.ContactCacheEntry;
import com.android.incallui.InCallPresenter.InCallState;
import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.services.telephony.common.Call;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSortedSet;
@@ -57,11 +58,15 @@
public void onStateChange(InCallState state, CallList callList) {
if (getUi().isFragmentVisible()) {
Log.v(this, "onStateChange" + state);
- if (state == InCallState.INCALL && callList.getActiveOrBackgroundCall() != null &&
- callList.getActiveOrBackgroundCall().isConferenceCall()) {
- Log.v(this, "Number of existing calls is " +
- String.valueOf(callList.getActiveCall().getChildCallIds().size()));
- update(callList);
+ if (state == 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 {
+ getUi().setVisible(false);
+ }
} else {
getUi().setVisible(false);
}
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
index 9ad7c54..4b482cb 100644
--- a/InCallUI/src/com/android/incallui/ContactInfoCache.java
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -25,6 +25,7 @@
import android.os.Looper;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import com.android.incallui.service.PhoneNumberService;
@@ -34,11 +35,13 @@
import com.android.services.telephony.common.MoreStrings;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
+import com.google.android.collect.Sets;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import java.util.HashMap;
import java.util.List;
+import java.util.Set;
/**
* Class responsible for querying Contact Information for Call objects. Can perform asynchronous
@@ -54,8 +57,7 @@
private final Context mContext;
private final PhoneNumberService mPhoneNumberService;
private final HashMap<Integer, ContactCacheEntry> mInfoMap = Maps.newHashMap();
- private final HashMap<Integer, List<ContactInfoCacheCallback>> mCallBacks =
- Maps.newHashMap();
+ private final HashMap<Integer, Set<ContactInfoCacheCallback>> mCallBacks = Maps.newHashMap();
private static ContactInfoCache sCache = null;
@@ -115,7 +117,7 @@
final int callId = identification.getCallId();
final ContactCacheEntry cacheEntry = mInfoMap.get(callId);
- List<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
// If we have a previously obtained intermediate result return that now
if (cacheEntry != null) {
@@ -135,7 +137,7 @@
}
Log.d(TAG, "Contact lookup. In memory cache miss; searching provider.");
// New lookup
- callBacks = Lists.newArrayList();
+ callBacks = Sets.newHashSet();
callBacks.add(callback);
mCallBacks.put(callId, callBacks);
@@ -232,6 +234,12 @@
entry.location = oldEntry.location;
}
+ // 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.business_unknown);
+ }
+
// Add the contact info to the cache.
mInfoMap.put(mCallId, entry);
sendInfoNotifications(mCallId, entry);
@@ -239,7 +247,8 @@
// If there's an associated image, fetch that
if (info.getImageUrl() != null) {
Log.d(TAG, "Contact lookup. Remote contact found, loading image.");
- mPhoneNumberService.fetchImage(info.getImageUrl(), this);
+ mPhoneNumberService.fetchImage(info.getNormalizedNumber(),
+ info.getImageUrl(), this);
} else {
// Otherwise, we're done, so clear callbacks
Log.d(TAG, "Contact lookup. Remote contact found, no image.");
@@ -263,8 +272,6 @@
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.
- // TODO (klp): What is this, and why does it need the write_contacts permission?
- // CallerInfoUtils.sendViewNotificationAsync(mContext, mLoadingPersonUri);
final int callId = (Integer) cookie;
final ContactCacheEntry entry = mInfoMap.get(callId);
@@ -276,7 +283,7 @@
}
Log.d(this, "setting photo for entry: ", entry);
- // TODO (klp): Handle conference calls
+ // Conference call icons are being handled in CallCardPresenter.
if (photo != null) {
Log.v(this, "direct drawable: ", photo);
entry.photo = photo;
@@ -329,12 +336,6 @@
photo = context.getResources().getDrawable(R.drawable.picture_unknown);
} else {
cce.personUri = personUri;
-
- // If the image load is too slow, we show a default avatar icon afterward.
- // If it is fast enough, this message will be canceled on onImageLoadComplete().
- // TODO (klp): Figure out if this handler is still needed.
- // mHandler.removeMessages(MESSAGE_SHOW_UNKNOWN_PHOTO);
- // mHandler.sendEmptyMessageDelayed(MESSAGE_SHOW_UNKNOWN_PHOTO, MESSAGE_DELAY);
}
}
@@ -352,6 +353,7 @@
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
@@ -376,8 +378,12 @@
// 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 (number != null && number.startsWith("sip:")) {
- number = number.substring(4);
+
+ if (!TextUtils.isEmpty(number)) {
+ isSipCall = PhoneNumberUtils.isUriNumber(number);
+ if (number.startsWith("sip:")) {
+ number = number.substring(4);
+ }
}
if (TextUtils.isEmpty(info.name)) {
@@ -402,7 +408,8 @@
displayName = info.cnapName;
info.name = info.cnapName;
displayNumber = number;
- Log.d(TAG, " ==> cnapName available: displayName '" + displayName + "', displayNumber '" + displayNumber + "'");
+ 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,
@@ -432,8 +439,8 @@
// AND a restricted presentation. However we leave it here in case of weird
// network behavior
displayName = getPresentationString(context, presentation);
- Log.d(TAG,
- " ==> valid name, but presentation not allowed!" + " displayName = " + displayName);
+ Log.d(TAG, " ==> valid name, but presentation not allowed!" +
+ " displayName = " + displayName);
} else {
displayName = info.name;
displayNumber = number;
@@ -447,13 +454,14 @@
cce.number = displayNumber;
cce.location = displayLocation;
cce.label = label;
+ cce.isSipCall = isSipCall;
}
/**
* Sends the updated information to call the callbacks for the entry.
*/
private void sendInfoNotifications(int callId, ContactCacheEntry entry) {
- final List<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);;
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
if (callBacks != null) {
for (ContactInfoCacheCallback callBack : callBacks) {
callBack.onContactInfoComplete(callId, entry);
@@ -462,21 +470,16 @@
}
private void sendImageNotifications(int callId, ContactCacheEntry entry) {
- final List<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);;
- if (callBacks != null) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null && entry.photo != null) {
for (ContactInfoCacheCallback callBack : callBacks) {
- if (entry.photo == null) {
- callBack.onImageLoadComplete(callId, null);
- } else {
- callBack.onImageLoadComplete(callId, ((BitmapDrawable) entry.photo)
- .getBitmap());
- }
+ callBack.onImageLoadComplete(callId, entry);
}
}
}
private void clearCallbacks(int callId) {
- mCallBacks.remove(callId);;
+ mCallBacks.remove(callId);
}
/**
@@ -497,7 +500,7 @@
*/
public interface ContactInfoCacheCallback {
public void onContactInfoComplete(int callId, ContactCacheEntry entry);
- public void onImageLoadComplete(int callId, Bitmap photo);
+ public void onImageLoadComplete(int callId, ContactCacheEntry entry);
}
public static class ContactCacheEntry {
@@ -506,6 +509,7 @@
public String location;
public String label;
public Drawable photo;
+ public boolean isSipCall;
public Uri personUri; // Used for local photo load
@Override
@@ -516,6 +520,7 @@
.add("location", MoreStrings.toSafeString(location))
.add("label", label)
.add("photo", photo)
+ .add("isSipCall", isSipCall)
.toString();
}
}
diff --git a/InCallUI/src/com/android/incallui/DialpadFragment.java b/InCallUI/src/com/android/incallui/DialpadFragment.java
index 428750d..5087561 100644
--- a/InCallUI/src/com/android/incallui/DialpadFragment.java
+++ b/InCallUI/src/com/android/incallui/DialpadFragment.java
@@ -18,6 +18,8 @@
import android.content.Context;
import android.os.Bundle;
+import android.text.Editable;
+import android.text.method.DialerKeyListener;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -58,6 +60,198 @@
mDisplayMap.put(R.id.star, '*');
}
+ // KeyListener used with the "dialpad digits" EditText widget.
+ private DTMFKeyListener mDialerKeyListener;
+
+ /**
+ * 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().stopTone();
+ 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().stopTone();
+ 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) {
Log.d(this, "onClick");
@@ -180,6 +374,8 @@
com.android.incallui.R.layout.dtmf_twelve_key_dialer_view, container, false);
mDtmfDialerField = (EditText) parent.findViewById(R.id.dtmfDialerField);
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);
@@ -190,6 +386,12 @@
}
@Override
+ public void onDestroyView() {
+ mDialerKeyListener = null;
+ super.onDestroyView();
+ }
+
+ @Override
public void setVisible(boolean on) {
if (on) {
getView().setVisibility(View.VISIBLE);
@@ -215,6 +417,30 @@
}
/**
+ * 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;
+ }
+ }
+
+ /**
* setup the keys on the dialer activity, using the keymaps.
*/
private void setupKeypad(View parent) {
diff --git a/InCallUI/src/com/android/incallui/DialpadPresenter.java b/InCallUI/src/com/android/incallui/DialpadPresenter.java
index cee80d2..8640f8a 100644
--- a/InCallUI/src/com/android/incallui/DialpadPresenter.java
+++ b/InCallUI/src/com/android/incallui/DialpadPresenter.java
@@ -50,7 +50,6 @@
* DTMF tone (or short tone if requested), and appending the digit to the
* EditText field that displays the DTMF digits sent so far.
*/
- // TODO(klp) Add timedShortTone==true handling for accessibility cases.
public final void processDtmf(char c, boolean timedShortTone) {
Log.d(this, "Processing dtmf key " + c);
// if it is a valid key, then update the display and send the dtmf tone.
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
index 7d7ca4b..ac21d52 100644
--- a/InCallUI/src/com/android/incallui/InCallActivity.java
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -16,7 +16,14 @@
package com.android.incallui;
+import com.android.services.telephony.common.Call;
+import com.android.services.telephony.common.Call.State;
+
import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
@@ -24,18 +31,28 @@
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.Toast;
/**
* Phone app "in call" screen.
*/
public class InCallActivity extends Activity {
+
+ public static final String SHOW_DIALPAD_EXTRA = "InCallActivity.show_dialpad";
+
+ private static final int INVALID_RES_ID = -1;
+
private CallButtonFragment mCallButtonFragment;
private CallCardFragment mCallCardFragment;
private AnswerFragment mAnswerFragment;
private DialpadFragment mDialpadFragment;
private ConferenceManagerFragment mConferenceManagerFragment;
private boolean mIsForegroundActivity;
+ private AlertDialog mDialog;
+
+ /** Use to pass 'showDialpad' from {@link #onNewIntent} to {@link #onResume} */
+ private boolean mShowDialpadRequested;
@Override
protected void onCreate(Bundle icicle) {
@@ -73,11 +90,16 @@
@Override
protected void onResume() {
- Log.d(this, "onResume()...");
+ Log.i(this, "onResume()...");
super.onResume();
mIsForegroundActivity = true;
InCallPresenter.getInstance().onUiShowing(true);
+
+ if (mShowDialpadRequested) {
+ mCallButtonFragment.displayDialpad(true);
+ mShowDialpadRequested = false;
+ }
}
// onPause is guaranteed to be called when the InCallActivity goes
@@ -88,6 +110,9 @@
super.onPause();
mIsForegroundActivity = false;
+
+ mDialpadFragment.onDialerKeyUp(null);
+
InCallPresenter.getInstance().onUiShowing(false);
}
@@ -113,6 +138,9 @@
return mIsForegroundActivity;
}
+ private boolean hasPendingErrorDialog() {
+ return mDialog != null;
+ }
/**
* Dismisses the in-call screen.
*
@@ -130,8 +158,12 @@
*/
@Override
public void finish() {
- Log.d(this, "finish()...");
- super.finish();
+ Log.i(this, "finish(). Dialog showing: " + (mDialog != null));
+
+ // skip finish if we are still showing a dialog.
+ if (!hasPendingErrorDialog() && !mAnswerFragment.hasPendingDialogs()) {
+ super.finish();
+ }
}
@Override
@@ -157,7 +189,6 @@
@Override
public void onBackPressed() {
- // TODO(klp): implement fully
Log.d(this, "onBackPressed()...");
// BACK is also used to exit out of any "special modes" of the
@@ -166,6 +197,9 @@
if (mDialpadFragment.isVisible()) {
mCallButtonFragment.displayDialpad(false); // do the "closing" animation
return;
+ } else if (mConferenceManagerFragment.isVisible()) {
+ mConferenceManagerFragment.setVisible(false);
+ return;
}
// Nothing special to do. Fall back to the default behavior.
@@ -173,10 +207,25 @@
}
@Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ // push input to the dialer.
+ if ((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 onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_CALL:
- // TODO(klp): handle call key
+ 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;
@@ -195,11 +244,12 @@
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
case KeyEvent.KEYCODE_VOLUME_MUTE:
- // Not sure if needed. If so, silence ringer.
+ // Ringer silencing handled by PhoneWindowManager.
break;
case KeyEvent.KEYCODE_MUTE:
- toast("mute");
+ // toggle mute
+ CallCommandClient.getInstance().mute(!AudioModeProvider.getInstance().getMute());
return true;
// Various testing/debugging features, enabled ONLY when VERBOSE == true.
@@ -214,14 +264,37 @@
}
break;
case KeyEvent.KEYCODE_EQUALS:
- // TODO(klp): Dump phone state?
+ // TODO: Dump phone state?
break;
}
- // TODO(klp) Adds hardware keyboard support
+ 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.isVisible()) {
+ return mDialpadFragment.onDialerKeyDown(event);
+
+ // TODO: If the dialpad isn't currently visible, maybe
+ // consider automatically bringing it up right now?
+ // (Just to make sure the user sees the digits widget...)
+ // But this probably isn't too critical since it's awkward to
+ // use the hard keyboard while in-call in the first place,
+ // especially now that the in-call UI is portrait-only...
+ }
+
+ return false;
+ }
+
@Override
public void onConfigurationChanged(Configuration config) {
InCallPresenter.getInstance().getProximitySensor().onConfigurationChanged(config);
@@ -236,40 +309,35 @@
// But we do check here for one extra that can come along with the
// ACTION_MAIN intent:
- // TODO(klp): Enable this for klp
- /*
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.
- boolean showDialpad = intent.getBooleanExtra(SHOW_DIALPAD_EXTRA, false);
- if (VDBG) log("- internalResolveIntent: SHOW_DIALPAD_EXTRA: " + showDialpad);
+ final boolean showDialpad = intent.getBooleanExtra(SHOW_DIALPAD_EXTRA, false);
+ Log.d(this, "- internalResolveIntent: SHOW_DIALPAD_EXTRA: " + showDialpad);
- // If SHOW_DIALPAD_EXTRA is specified, that overrides whatever
- // the previous state of inCallUiState.showDialpad was.
- mApp.inCallUiState.showDialpad = showDialpad;
-
- final boolean hasActiveCall = mCM.hasActiveFgCall();
- final boolean hasHoldingCall = mCM.hasActiveBgCall();
-
- // There's only one line in use, AND it's on hold, at which we're sure the user
- // wants to use the dialpad toward the exact line, so un-hold the holding line.
- if (showDialpad && !hasActiveCall && hasHoldingCall) {
- PhoneUtils.switchHoldingAndActive(mCM.getFirstActiveBgCall());
- }
+ relaunchedFromDialer(showDialpad);
}
- */
- // ...and in onResume() we'll update the onscreen dialpad state to
- // match the InCallUiState.
return;
}
}
+ private void relaunchedFromDialer(boolean showDialpad) {
+ mShowDialpadRequested = showDialpad;
+
+ if (mShowDialpadRequested) {
+ // 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) {
+ CallCommandClient.getInstance().hold(call.getCallId(), false);
+ }
+ }
+ }
+
private void initializeInCall() {
- // TODO(klp): Make sure that this doesn't need to move back to onResume() since they are
- // statically added fragments.
if (mCallButtonFragment == null) {
mCallButtonFragment = (CallButtonFragment) getFragmentManager()
.findFragmentById(R.id.callButtonFragment);
@@ -305,6 +373,14 @@
toast.show();
}
+ /**
+ * Simulates a user click to hide the dialpad. This will update the UI to show the call card,
+ * update the checked state of the dialpad button, and update the proximity sensor state.
+ */
+ public void hideDialpadForDisconnect() {
+ mCallButtonFragment.displayDialpad(false);
+ }
+
public void displayDialpad(boolean showDialpad) {
if (showDialpad) {
mDialpadFragment.setVisible(true);
@@ -329,4 +405,81 @@
final PostCharDialogFragment fragment = new PostCharDialogFragment(callId, chars);
fragment.show(getFragmentManager(), "postCharWait");
}
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (mCallCardFragment != null) {
+ mCallCardFragment.dispatchPopulateAccessibilityEvent(event);
+ }
+ return super.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ public void maybeShowErrorDialogOnDisconnect(Call.DisconnectCause cause) {
+ Log.d(this, "maybeShowErrorDialogOnDisconnect");
+
+ if (!isFinishing()) {
+ final int resId = getResIdForDisconnectCause(cause);
+ if (resId != INVALID_RES_ID) {
+ showErrorDialog(resId);
+ }
+ }
+ }
+
+ public void dismissPendingDialogs() {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ mDialog = null;
+ }
+ mAnswerFragment.dismissPendingDialogues();
+ }
+
+ /**
+ * Utility function to bring up a generic "error" dialog.
+ */
+ private void showErrorDialog(int resId) {
+ final CharSequence msg = getResources().getText(resId);
+ Log.i(this, "Show Dialog: " + msg);
+
+ dismissPendingDialogs();
+
+ mDialog = new AlertDialog.Builder(this)
+ .setMessage(msg)
+ .setPositiveButton(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 int getResIdForDisconnectCause(Call.DisconnectCause cause) {
+ int resId = INVALID_RES_ID;
+
+ if (cause == Call.DisconnectCause.CALL_BARRED) {
+ resId = R.string.callFailed_cb_enabled;
+ } else if (cause == Call.DisconnectCause.FDN_BLOCKED) {
+ resId = R.string.callFailed_fdn_only;
+ } else if (cause == Call.DisconnectCause.CS_RESTRICTED) {
+ resId = R.string.callFailed_dsac_restricted;
+ } else if (cause == Call.DisconnectCause.CS_RESTRICTED_EMERGENCY) {
+ resId = R.string.callFailed_dsac_restricted_emergency;
+ } else if (cause == Call.DisconnectCause.CS_RESTRICTED_NORMAL) {
+ resId = R.string.callFailed_dsac_restricted_normal;
+ }
+
+ return resId;
+ }
+
+ private void onDialogDismissed() {
+ mDialog = null;
+ InCallPresenter.getInstance().onDismissDialog();
+ }
}
diff --git a/InCallUI/src/com/android/incallui/InCallApp.java b/InCallUI/src/com/android/incallui/InCallApp.java
index 02f07b8..dcc7848 100644
--- a/InCallUI/src/com/android/incallui/InCallApp.java
+++ b/InCallUI/src/com/android/incallui/InCallApp.java
@@ -44,7 +44,6 @@
@Override
public void onConfigurationChanged(Configuration newConfig) {
- // TODO(klp): See what configuration changes we need for klp
super.onConfigurationChanged(newConfig);
}
@@ -58,7 +57,7 @@
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
- Log.v(this, "Broadcast from Notification: ", action);
+ Log.i(this, "Broadcast from Notification: " + action);
if (action.equals(ACTION_HANG_UP_ONGOING_CALL)) {
// TODO: Commands of this nature should exist in the CallList or a
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 0f8d407..1b9f60c 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -23,6 +23,7 @@
import android.content.Intent;
import com.android.services.telephony.common.Call;
+import com.android.services.telephony.common.Call.Capabilities;
import com.google.common.collect.Lists;
import java.util.ArrayList;
@@ -35,7 +36,7 @@
* 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(klp): This class has become more of a state machine at this point. Consider renaming.
+ * TODO: This class has become more of a state machine at this point. Consider renaming.
*/
public class InCallPresenter implements CallList.Listener {
@@ -50,9 +51,17 @@
private Context mContext;
private CallList mCallList;
private InCallActivity mInCallActivity;
- private boolean mServiceConnected = false;
private InCallState mInCallState = InCallState.NO_CALLS;
private ProximitySensor mProximitySensor;
+ private boolean mServiceConnected = false;
+
+ /**
+ * 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;
public static synchronized InCallPresenter getInstance() {
if (sInCallPresenter == null) {
@@ -78,7 +87,6 @@
mStatusBarNotifier = new StatusBarNotifier(context, mContactInfoCache, mCallList);
addListener(mStatusBarNotifier);
- addIncomingCallListener(mStatusBarNotifier);
mAudioModeProvider = audioModeProvider;
@@ -111,6 +119,15 @@
attemptCleanup();
}
+ private void attemptFinishActivity() {
+ final boolean doFinish = (mInCallActivity != null && isActivityStarted());
+ Log.i(this, "Hide in call UI: " + doFinish);
+
+ if (doFinish) {
+ mInCallActivity.finish();
+ }
+ }
+
/**
* Called when the UI begins or ends. Starts the callstate callbacks if the UI just began.
* Attempts to tear down everything if the UI just ended. See #tearDown for more insight on
@@ -132,6 +149,24 @@
}
mInCallActivity = inCallActivity;
+
+ // 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 Intialized, but no calls left. shut down.");
+ attemptFinishActivity();
+ return;
+ }
} else {
Log.i(this, "UI Destroyed)");
updateListeners = true;
@@ -166,6 +201,12 @@
InCallState newState = getPotentialStateFromCallList(callList);
newState = startOrFinishUi(newState);
+ // Renable notification shade and soft navigation buttons, if we are no longer in the
+ // incoming call screen
+ if (!newState.isIncoming()) {
+ CallCommandClient.getInstance().setSystemBarNavigationEnabled(true);
+ }
+
// Set the new state before announcing it to the world
Log.i(this, "Phone switching state: " + mInCallState + " -> " + newState);
mInCallState = newState;
@@ -189,9 +230,27 @@
Log.i(this, "Phone switching state: " + mInCallState + " -> " + newState);
mInCallState = newState;
- for (IncomingCallListener listener : mIncomingCallListeners) {
- listener.onIncomingCall(call);
+ // Disable notification shade and soft navigation buttons
+ if (newState.isIncoming()) {
+ CallCommandClient.getInstance().setSystemBarNavigationEnabled(false);
}
+
+ for (IncomingCallListener listener : mIncomingCallListeners) {
+ listener.onIncomingCall(mInCallState, call);
+ }
+ }
+
+ /**
+ * 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) {
+ hideDialpadForDisconnect();
+ maybeShowErrorDialogOnDisconnect(call);
+
+ // We need to do the run the same code as onCallListChange.
+ onCallListChange(CallList.getInstance());
}
/**
@@ -206,7 +265,8 @@
newState = InCallState.OUTGOING;
} else if (callList.getActiveCall() != null ||
callList.getBackgroundCall() != null ||
- callList.getDisconnectedCall() != null) {
+ callList.getDisconnectedCall() != null ||
+ callList.getDisconnectingCall() != null) {
newState = InCallState.INCALL;
}
@@ -218,6 +278,11 @@
mIncomingCallListeners.add(listener);
}
+ public void removeIncomingCallListener(IncomingCallListener listener) {
+ Preconditions.checkNotNull(listener);
+ mIncomingCallListeners.remove(listener);
+ }
+
public void addListener(InCallStateListener listener) {
Preconditions.checkNotNull(listener);
mListeners.add(listener);
@@ -244,6 +309,12 @@
* Hangs up any active or outgoing calls.
*/
public void hangUpOngoingCall() {
+ // 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) {
+ return;
+ }
+
Call call = mCallList.getOutgoingCall();
if (call == null) {
call = mCallList.getActiveOrBackgroundCall();
@@ -272,8 +343,12 @@
!mInCallActivity.isFinishing());
}
+ public boolean isActivityPreviouslyStarted() {
+ return mIsActivityPreviouslyStarted;
+ }
+
/**
- * Called when the activity goes out of the foreground.
+ * 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
@@ -285,20 +360,23 @@
if (mProximitySensor != null) {
mProximitySensor.onInCallShowing(showing);
}
+
+ if (showing) {
+ mIsActivityPreviouslyStarted = true;
+ }
}
/**
* Brings the app into the foreground if possible.
*/
- public void bringToForeground() {
+ public void bringToForeground(boolean showDialpad) {
// Before we bring the incall UI to the foreground, we check to see if:
- // 1. there is an activity
- // 2. the activity is not already in the foreground
+ // 1. We've already started the activity once for this session
+ // 2. If it exists, the activity is not already in the foreground
// 3. We are in a state where we want to show the incall ui
- if (isActivityStarted() &&
- !isShowingInCallUi() &&
+ if (mIsActivityPreviouslyStarted && !isShowingInCallUi() &&
mInCallState != InCallState.NO_CALLS) {
- showInCall();
+ showInCall(showDialpad);
}
}
@@ -307,13 +385,124 @@
}
/**
+ * 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 = CallList.getInstance();
+ final Call incomingCall = calls.getIncomingCall();
+ Log.v(this, "incomingCall: " + incomingCall);
+
+ // (1) Attempt to answer a call
+ if (incomingCall != null) {
+ CallCommandClient.getInstance().answerCall(incomingCall.getCallId());
+ return true;
+ }
+
+ /**
+ * 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 isGeneric = activeCall.can(Capabilities.GENERIC_CONFERENCE);
+ final boolean canMerge = activeCall.can(Capabilities.MERGE_CALLS);
+ final boolean canSwap = activeCall.can(Capabilities.SWAP_CALLS);
+
+ Log.v(this, "activeCall: " + activeCall + ", isGeneric: " + isGeneric + ", canMerge: " +
+ canMerge + ", canSwap: " + canSwap);
+
+ // (2) Attempt actions on Generic conference calls
+ if (activeCall.isConferenceCall() && isGeneric) {
+ if (canMerge) {
+ CallCommandClient.getInstance().merge();
+ return true;
+ } else if (canSwap) {
+ CallCommandClient.getInstance().swap();
+ return true;
+ }
+ }
+
+ // (3) Swap calls
+ if (canSwap) {
+ CallCommandClient.getInstance().swap();
+ 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(Capabilities.HOLD);
+
+ Log.v(this, "heldCall: " + heldCall + ", canHold: " + canHold);
+
+ // (4) unhold call
+ if (heldCall.getState() == Call.State.ONHOLD && canHold) {
+ CallCommandClient.getInstance().hold(heldCall.getCallId(), false);
+ 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();
+ }
+ }
+
+ /**
+ * 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) {
+ mInCallActivity.maybeShowErrorDialogOnDisconnect(call.getDisconnectCause());
+ }
+ }
+
+ /**
+ * Hides the dialpad. Called when a call is disconnected (Requires hiding dialpad).
+ */
+ private void hideDialpadForDisconnect() {
+ if (isActivityStarted()) {
+ mInCallActivity.hideDialpadForDisconnect();
+ }
+ }
+
+ /**
* 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(klp): Consider a proper state machine implementation
+ // 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
@@ -370,68 +559,105 @@
if (showCallUi) {
Log.i(this, "Start in call UI");
- showInCall();
+ showInCall(false);
} else if (startStartupSequence) {
Log.i(this, "Start Full Screen in call UI");
- mStatusBarNotifier.updateNotificationAndLaunchIncomingCallUi(newState, mCallList);
- } else if (newState == InCallState.NO_CALLS) {
- Log.i(this, "Hide in call UI");
- // The new state is the no calls state. Tear everything down.
- if (mInCallActivity != null) {
- if (isActivityStarted()) {
- mInCallActivity.finish();
- }
+ // 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();
}
+ startUi(newState);
+ } else if (newState == InCallState.NO_CALLS) {
+ // The new state is the no calls state. Tear everything down.
+ attemptFinishActivity();
}
return newState;
}
+ private void startUi(InCallState inCallState) {
+ final Call incomingCall = mCallList.getIncomingCall();
+ final boolean isCallWaiting = (incomingCall != null &&
+ incomingCall.getState() == Call.State.CALL_WAITING);
+
+ // 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 (mProximitySensor.isScreenReallyOff() && isCallWaiting) {
+ if (isActivityStarted()) {
+ mInCallActivity.finish();
+ }
+ mInCallActivity = null;
+ }
+
+ mStatusBarNotifier.updateNotificationAndLaunchIncomingCallUi(inCallState, mCallList);
+ }
+
/**
* 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);
+ boolean shouldCleanup = (mInCallActivity == null && !mServiceConnected &&
+ mInCallState == InCallState.NO_CALLS);
Log.i(this, "attemptCleanup? " + shouldCleanup);
if (shouldCleanup) {
+ mIsActivityPreviouslyStarted = false;
// blow away stale contact info so that we get fresh data on
// the next set of calls
- mContactInfoCache.clearCache();
+ if (mContactInfoCache != null) {
+ mContactInfoCache.clearCache();
+ }
mContactInfoCache = null;
+ if (mProximitySensor != null) {
+ removeListener(mProximitySensor);
+ mProximitySensor.tearDown();
+ }
mProximitySensor = null;
mAudioModeProvider = null;
- removeListener(mStatusBarNotifier);
+ if (mStatusBarNotifier != null) {
+ removeListener(mStatusBarNotifier);
+ }
mStatusBarNotifier = null;
- mCallList.removeListener(this);
+ if (mCallList != null) {
+ mCallList.removeListener(this);
+ }
mCallList = null;
mContext = null;
mInCallActivity = null;
mListeners.clear();
+ mIncomingCallListeners.clear();
Log.d(this, "Finished InCallPresenter.CleanUp");
}
}
- private void showInCall() {
- mContext.startActivity(getInCallIntent());
+ private void showInCall(boolean showDialpad) {
+ mContext.startActivity(getInCallIntent(showDialpad));
}
- private Intent getInCallIntent() {
+ public Intent getInCallIntent(boolean showDialpad) {
final Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
| Intent.FLAG_ACTIVITY_NO_USER_ACTION);
intent.setClass(mContext, InCallActivity.class);
+ if (showDialpad) {
+ intent.putExtra(InCallActivity.SHOW_DIALPAD_EXTRA, true);
+ }
return intent;
}
@@ -473,11 +699,11 @@
* Interface implemented by classes that need to know about the InCall State.
*/
public interface InCallStateListener {
- // TODO(klp): Enhance state to contain the call objects instead of passing CallList
+ // TODO: Enhance state to contain the call objects instead of passing CallList
public void onStateChange(InCallState state, CallList callList);
}
public interface IncomingCallListener {
- public void onIncomingCall(Call call);
+ public void onIncomingCall(InCallState state, Call call);
}
}
diff --git a/InCallUI/src/com/android/incallui/Log.java b/InCallUI/src/com/android/incallui/Log.java
index c859e5c..35cb370 100644
--- a/InCallUI/src/com/android/incallui/Log.java
+++ b/InCallUI/src/com/android/incallui/Log.java
@@ -24,7 +24,8 @@
// Generic tag for all In Call logging
private static final String TAG = "InCall";
- public static final boolean DEBUG = android.util.Log.isLoggable(TAG, android.util.Log.DEBUG);
+ public static final boolean DEBUG = android.util.Log.isLoggable(TAG, android.util.Log.DEBUG)
+ || (System.getProperty("ro.build.type", "").equals("userdebug"));
public static final boolean VERBOSE = android.util.Log.isLoggable(TAG,
android.util.Log.VERBOSE);
public static final String TAG_DELIMETER = " - ";
diff --git a/InCallUI/src/com/android/incallui/ProximitySensor.java b/InCallUI/src/com/android/incallui/ProximitySensor.java
index 0dc54dc..5776b56 100644
--- a/InCallUI/src/com/android/incallui/ProximitySensor.java
+++ b/InCallUI/src/com/android/incallui/ProximitySensor.java
@@ -68,6 +68,16 @@
mAudioModeProvider.addListener(this);
}
+ public void tearDown() {
+ mAudioModeProvider.removeListener(this);
+
+ mAccelerometerListener.enable(false);
+
+ if (mProximityWakeLock.isHeld()) {
+ mProximityWakeLock.release();
+ }
+ }
+
/**
* Called to identify when the device is laid down flat.
*/
@@ -144,11 +154,20 @@
}
/**
+ * 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.
+ */
+ public boolean isScreenReallyOff() {
+ return !mPowerManager.isScreenOn();
+ }
+
+ /**
* @return true if this device supports the "proximity sensor
* auto-lock" feature while in-call (see updateProximitySensorMode()).
*/
private boolean proximitySensorModeEnabled() {
- // TODO(klp): Do we disable notification's expanded view when app is in foreground and
+ // TODO: Do we disable notification's expanded view when app is in foreground and
// proximity sensor is on? Is it even possible to do this any more?
return (mProximityWakeLock != null);
}
@@ -206,8 +225,9 @@
.add("keybrd", mIsHardKeyboardOpen ? 1 : 0)
.add("dpad", mDialpadVisible ? 1 : 0)
.add("offhook", mIsPhoneOffhook ? 1 : 0)
- .add("aud", audioMode)
- .add("hor", horizontal ? 1 : 0).toString());
+ .add("hor", horizontal ? 1 : 0)
+ .add("ui", mUiShowing ? 1 : 0)
+ .add("aud", AudioMode.toString(audioMode)).toString());
if (mIsPhoneOffhook && !screenOnImmediately) {
final String logStr = "turning on proximity sensor: ";
diff --git a/InCallUI/src/com/android/incallui/SmallerHitTargetTouchListener.java b/InCallUI/src/com/android/incallui/SmallerHitTargetTouchListener.java
new file mode 100644
index 0000000..83feaf5
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/SmallerHitTargetTouchListener.java
@@ -0,0 +1,114 @@
+/*
+ * 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.view.MotionEvent;
+import android.view.View;
+
+/**
+ * OnTouchListener used to shrink the "hit target" of some onscreen buttons.
+ *
+ * We do this for a few specific buttons which are vulnerable to
+ * "false touches" because either (1) they're near the edge of the
+ * screen and might be unintentionally touched while holding the
+ * device in your hand, (2) they're in the upper corners and might
+ * be touched by the user's ear before the prox sensor has a chance to
+ * kick in, or (3) they are close to other buttons.
+ */
+public class SmallerHitTargetTouchListener implements View.OnTouchListener {
+ private static final String TAG = "SmallerHitTargetTouchListener";
+
+ /**
+ * Edge dimensions where a touch does not register an action (in DIP).
+ */
+ private static final int HIT_TARGET_EDGE_IGNORE_DP_X = 30;
+ private static final int HIT_TARGET_EDGE_IGNORE_DP_Y = 10;
+ private static final int HIT_TARGET_MIN_SIZE_DP_X = HIT_TARGET_EDGE_IGNORE_DP_X * 3;
+ private static final int HIT_TARGET_MIN_SIZE_DP_Y = HIT_TARGET_EDGE_IGNORE_DP_Y * 3;
+
+ // True if the most recent DOWN event was a "hit".
+ boolean mDownEventHit;
+
+ /**
+ * Called when a touch event is dispatched to a view. This allows listeners to
+ * get a chance to respond before the target view.
+ *
+ * @return True if the listener has consumed the event, false otherwise.
+ * (In other words, we return true when the touch is *outside*
+ * the "smaller hit target", which will prevent the actual
+ * button from handling these events.)
+ */
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ // if (DBG) log("SmallerHitTargetTouchListener: " + v + ", event " + event);
+
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ // Note that event.getX() and event.getY() are already
+ // translated into the View's coordinates. (In other words,
+ // "0,0" is a touch on the upper-left-most corner of the view.)
+ final int touchX = (int) event.getX();
+ final int touchY = (int) event.getY();
+
+ final int viewWidth = v.getWidth();
+ final int viewHeight = v.getHeight();
+
+ final float pixelDensity = v.getResources().getDisplayMetrics().density;
+ final int targetMinSizeX = (int) (HIT_TARGET_MIN_SIZE_DP_X * pixelDensity);
+ final int targetMinSizeY = (int) (HIT_TARGET_MIN_SIZE_DP_Y * pixelDensity);
+
+ int edgeIgnoreX = (int) (HIT_TARGET_EDGE_IGNORE_DP_X * pixelDensity);
+ int edgeIgnoreY = (int) (HIT_TARGET_EDGE_IGNORE_DP_Y * pixelDensity);
+
+ // If we are dealing with smaller buttons where the dead zone defined by
+ // HIT_TARGET_EDGE_IGNORE_DP_[X|Y] is too large.
+ if (viewWidth < targetMinSizeX || viewHeight < targetMinSizeY) {
+ // This really should not happen given our two use cases (as of this writing)
+ // in the call edge button and secondary calling card. However, we leave
+ // this is as a precautionary measure.
+ Log.w(TAG, "onTouch: view is too small for SmallerHitTargetTouchListener");
+ edgeIgnoreX = 0;
+ edgeIgnoreY = 0;
+ }
+
+ final int minTouchX = edgeIgnoreX;
+ final int maxTouchX = viewWidth - edgeIgnoreX;
+ final int minTouchY = edgeIgnoreY;
+ final int maxTouchY = viewHeight - edgeIgnoreY;
+
+ if (touchX < minTouchX || touchX > maxTouchX ||
+ touchY < minTouchY || touchY > maxTouchY) {
+ // Missed!
+ // if (DBG) log(" -> MISSED!");
+ mDownEventHit = false;
+ return true; // Consume this event; don't let the button see it
+ } else {
+ // Hit!
+ // if (DBG) log(" -> HIT!");
+ mDownEventHit = true;
+ return false; // Let this event through to the actual button
+ }
+ } else {
+ // This is a MOVE, UP or CANCEL event.
+ //
+ // We only do the "smaller hit target" check on DOWN events.
+ // For the subsequent MOVE/UP/CANCEL events, we let them
+ // through to the actual button IFF the previous DOWN event
+ // got through to the actual button (i.e. it was a "hit".)
+ return !mDownEventHit;
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 97d0e8c..1690c54 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -36,11 +36,12 @@
import com.android.incallui.InCallPresenter.InCallState;
import com.android.services.telephony.common.Call;
+import java.util.HashMap;
+
/**
* This class adds Notifications to the status bar for the in-call experience.
*/
-public class StatusBarNotifier implements InCallPresenter.InCallStateListener,
- InCallPresenter.IncomingCallListener {
+public class StatusBarNotifier implements InCallPresenter.InCallStateListener {
// notification types
private static final int IN_CALL_NOTIFICATION = 1;
@@ -49,7 +50,7 @@
private final CallList mCallList;
private final NotificationManager mNotificationManager;
private boolean mIsShowingNotification = false;
- private InCallState mInCallState = InCallState.NO_CALLS;
+ private int mCallState = Call.State.INVALID;
private int mSavedIcon = 0;
private int mSavedContent = 0;
private Bitmap mSavedLargeIcon;
@@ -72,47 +73,10 @@
@Override
public void onStateChange(InCallState state, CallList callList) {
Log.d(this, "onStateChange");
+
updateNotification(state, callList);
}
- @Override
- public void onIncomingCall(final Call call) {
- final ContactCacheEntry entry = ContactInfoCache.buildCacheEntryFromCall(mContext,
- call.getIdentification(), true);
-
- // Initial update with no contact information.
- buildAndSendNotification(InCallState.INCOMING, call, entry, false);
-
- // TODO(klp): InCallPresenter already calls updateNofication() when it wants to start
- // the notification. We shouldn't do this twice.
- // TODO(klp): This search doesn't happen for outgoing calls any more. It works because
- // the call card makes a requests that are cached...but eventually this startup process
- // needs to incorporate call searches for all new calls, not just incoming.
-
- // 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.getIdentification(), true, new ContactInfoCacheCallback() {
- private ContactCacheEntry mEntry;
-
- @Override
- public void onContactInfoComplete(int callId, ContactCacheEntry entry) {
- mEntry = entry;
- buildAndSendNotification(InCallState.INCOMING, call, entry, false);
- }
-
- @Override
- public void onImageLoadComplete(int callId, Bitmap photo) {
- if (mEntry != null) {
- mEntry.photo = new BitmapDrawable(mContext.getResources(), photo);
- buildAndSendNotification(InCallState.INCOMING, call, mEntry, false);
- }
- }
- });
- }
-
/**
* Updates the phone app's status bar notification based on the
* current telephony state, or cancels the notification if the phone
@@ -165,7 +129,6 @@
updateInCallNotification(true, state, callList);
}
-
/**
* Take down the in-call notification.
* @see updateInCallNotification()
@@ -202,22 +165,51 @@
return;
}
- // Contact info should have already been done on incoming calls.
- // TODO(klp): This also needs to be done for outgoing calls.
- ContactCacheEntry entry = mContactInfoCache.getInfo(call.getCallId());
- if (entry == null) {
- entry = ContactInfoCache.buildCacheEntryFromCall(mContext, call.getIdentification(),
- state == InCallState.INCOMING);
- }
- buildAndSendNotification(state, call, entry, allowFullScreenIntent);
+ // 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.getIdentification(), call.getState() == Call.State.INCOMING,
+ new ContactInfoCacheCallback() {
+ private boolean mAllowFullScreenIntent = allowFullScreenIntent;
+
+ @Override
+ public void onContactInfoComplete(int callId, ContactCacheEntry entry) {
+ Call call = CallList.getInstance().getCall(callId);
+ if (call != null) {
+ buildAndSendNotification(call, entry, mAllowFullScreenIntent);
+ }
+
+ // Full screen intents are what bring up the in call screen. We only want
+ // to do this the first time we are called back.
+ mAllowFullScreenIntent = false;
+ }
+
+ @Override
+ public void onImageLoadComplete(int callId, ContactCacheEntry entry) {
+ Call call = CallList.getInstance().getCall(callId);
+ if (call != null) {
+ buildAndSendNotification(call, entry, mAllowFullScreenIntent);
+ }
+ } });
}
/**
* Sets up the main Ui for the notification
*/
- private void buildAndSendNotification(InCallState state, Call call,
- ContactCacheEntry contactInfo, boolean allowFullScreenIntent) {
+ private void buildAndSendNotification(Call originalCall, ContactCacheEntry contactInfo,
+ boolean allowFullScreenIntent) {
+ // 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.getCallId() != originalCall.getCallId()) {
+ return;
+ }
+
+ final int state = call.getState();
final boolean isConference = call.isConferenceCall();
final int iconResId = getIconToDisplay(call);
final Bitmap largeIcon = getLargeIconToDisplay(contactInfo, isConference);
@@ -250,15 +242,17 @@
builder.setContentTitle(contentTitle);
builder.setLargeIcon(largeIcon);
- if (call.getState() == Call.State.ACTIVE) {
+ if (state == Call.State.ACTIVE) {
builder.setUsesChronometer(true);
builder.setWhen(call.getConnectTime());
} else {
builder.setUsesChronometer(false);
}
- // Add special Content for calls that are ongoing
- if (InCallState.INCALL == state || InCallState.OUTGOING == state) {
+ // 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);
}
@@ -277,7 +271,7 @@
* we do not issue a new notification for the exact same data.
*/
private boolean checkForChangeAndSaveData(int icon, int content, Bitmap largeIcon,
- String contentTitle, InCallState state, boolean showFullScreenIntent) {
+ String contentTitle, int state, boolean showFullScreenIntent) {
// The two are different:
// if new title is not null, it should be different from saved version OR
@@ -288,7 +282,7 @@
// any change means we are definitely updating
boolean retval = (mSavedIcon != icon) || (mSavedContent != content) ||
- (mInCallState != state) || (mSavedLargeIcon != largeIcon) ||
+ (mCallState != state) || (mSavedLargeIcon != largeIcon) ||
contentTitleChanged;
// A full screen intent means that we have been asked to interrupt an activity,
@@ -306,7 +300,7 @@
mSavedIcon = icon;
mSavedContent = content;
- mInCallState = state;
+ mCallState = state;
mSavedLargeIcon = largeIcon;
mSavedContentTitle = contentTitle;
@@ -335,15 +329,24 @@
* Gets a large icon from the contact info object to display in the notification.
*/
private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo, boolean isConference) {
+ Bitmap largeIcon = null;
if (isConference) {
- return BitmapFactory.decodeResource(mContext.getResources(),
+ largeIcon = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.picture_conference);
}
if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) {
- return ((BitmapDrawable) contactInfo.photo).getBitmap();
+ largeIcon = ((BitmapDrawable) contactInfo.photo).getBitmap();
}
- return null;
+ if (largeIcon != 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);
+ largeIcon = Bitmap.createScaledBitmap(largeIcon, width, height, false);
+ }
+
+ return largeIcon;
}
/**
@@ -376,7 +379,7 @@
} else if (call.getState() == Call.State.ONHOLD) {
resId = R.string.notification_on_hold;
- } else if (call.getState() == Call.State.DIALING) {
+ } else if (Call.State.isDialing(call.getState())) {
resId = R.string.notification_dialing;
}
@@ -463,6 +466,14 @@
* Returns true if notification should not be shown in the current state.
*/
private boolean shouldSuppressNotification(InCallState state, Call call) {
+
+ // We can still be in the INCALL state when a call is disconnected (in order to show
+ // the "Call ended" screen. So check that we have an active connection too.
+ if (call == null) {
+ Log.v(this, "suppressing: no call");
+ return true;
+ }
+
// Suppress the in-call notification if the InCallScreen is the
// foreground activity, since it's already obvious that you're on a
// call. (The status bar icon is needed only if you navigate *away*
@@ -475,13 +486,6 @@
shouldSuppress = true;
}
- // We can still be in the INCALL state when a call is disconnected (in order to show
- // the "Call ended" screen. So check that we have an active connection too.
- if (call == null) {
- Log.v(this, "suppressing: no call");
- shouldSuppress = true;
- }
-
// If there's an incoming ringing call: always show the
// notification, since the in-call notification is what actually
// launches the incoming call UI in the first place (see
@@ -500,7 +504,8 @@
// comes up the user will see it flash on and off on an outgoing call.
// This code ensures that we do not show the notification for outgoing calls before
// the activity has started.
- if (state == InCallState.OUTGOING && !InCallPresenter.getInstance().isActivityStarted()) {
+ if (state == InCallState.OUTGOING &&
+ !InCallPresenter.getInstance().isActivityPreviouslyStarted()) {
Log.v(this, "suppressing: activity not started.");
shouldSuppress = true;
}
@@ -510,11 +515,7 @@
private PendingIntent createLaunchPendingIntent() {
- final Intent intent = new Intent(Intent.ACTION_MAIN, null);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
- intent.setClass(mContext, InCallActivity.class);
+ final Intent intent = InCallPresenter.getInstance().getInCallIntent(/*showdialpad=*/false);
// PendingIntent that can be used to launch the InCallActivity. The
// system fires off this intent if the user pulls down the windowshade
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
index 279593d..24303cd 100644
--- a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -34,10 +34,11 @@
/**
* Get an image asynchronously.
*
+ * @param number The phone number for the image.
* @param url The url to fetch the image from.
* @param listener The listener to notify when the image lookup is complete.
*/
- public void fetchImage(String url, ImageLookupListener listener);
+ public void fetchImage(String number, String url, ImageLookupListener listener);
public interface NumberLookupListener {
@@ -66,5 +67,6 @@
public String getPhoneLabel();
public String getNormalizedNumber();
public String getImageUrl();
+ public boolean isBusiness();
}
}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
index 3fc978a..a346ba5 100644
--- a/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
@@ -48,7 +48,7 @@
/**
* 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.
@@ -1114,9 +1114,9 @@
final float placementWidth = getRingWidth();
final float placementHeight = getRingHeight();
float newWaveCenterX = mHorizontalInset
- + Math.max(width, mMaxTargetWidth + placementWidth) / 2;
+ + (mMaxTargetWidth + placementWidth) / 2;
float newWaveCenterY = mVerticalInset
- + Math.max(height, + mMaxTargetHeight + placementHeight) / 2;
+ + (mMaxTargetHeight + placementHeight) / 2;
if (mInitialLayout) {
stopAndHideWaveAnimation();