summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.mk27
-rw-r--r--AndroidManifest.xml99
-rw-r--r--InCallUI/AndroidManifest.xml24
-rw-r--r--InCallUI/build.gradle14
-rw-r--r--InCallUI/proguard.flags14
-rw-r--r--InCallUI/res/anim/activity_open_enter.xml35
-rw-r--r--InCallUI/res/anim/activity_open_exit.xml26
-rw-r--r--InCallUI/res/anim/call_status_pulse.xml22
-rw-r--r--InCallUI/res/anim/decelerate_cubic.xml21
-rw-r--r--InCallUI/res/anim/decelerate_quint.xml21
-rw-r--r--InCallUI/res/color/ota_title_color.xml21
-rw-r--r--InCallUI/res/color/selectable_icon_tint.xml24
-rw-r--r--InCallUI/res/drawable-hdpi/fab_blue.pngbin0 -> 2805 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/fab_ic_call.pngbin0 -> 875 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/fab_ic_end_call.pngbin0 -> 852 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/fab_ic_message.pngbin0 -> 617 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/fab_red.pngbin0 -> 2783 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_business_white_24dp.pngbin0 -> 152 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.pngbin0 -> 454 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.pngbin0 -> 326 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_call_white_24dp.pngbin0 -> 451 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_forward_white_24dp.pngbin0 -> 139 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_hd_24dp.pngbin0 -> 236 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.pngbin0 -> 371 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.pngbin0 -> 738 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.pngbin0 -> 458 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.pngbin0 -> 575 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_add_call.pngbin0 -> 1230 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.pngbin0 -> 489 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.pngbin0 -> 833 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.pngbin0 -> 1142 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.pngbin0 -> 1301 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.pngbin0 -> 624 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_hold.pngbin0 -> 511 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_merge.pngbin0 -> 772 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.pngbin0 -> 1155 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.pngbin0 -> 1118 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_swap.pngbin0 -> 1110 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_video.pngbin0 -> 711 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_video_off.pngbin0 -> 932 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.pngbin0 -> 972 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/img_business.pngbin0 -> 3311 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/img_conference.pngbin0 -> 7037 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/img_no_image.pngbin0 -> 5362 bytes
-rw-r--r--InCallUI/res/drawable-hdpi/img_phone.pngbin0 -> 6157 bytes
-rw-r--r--InCallUI/res/drawable-land/rounded_call_card_background.xml23
-rw-r--r--InCallUI/res/drawable-mdpi/fab_blue.pngbin0 -> 1841 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/fab_ic_call.pngbin0 -> 698 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/fab_ic_end_call.pngbin0 -> 668 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/fab_ic_message.pngbin0 -> 561 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/fab_red.pngbin0 -> 1843 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_business_white_24dp.pngbin0 -> 105 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.pngbin0 -> 315 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.pngbin0 -> 256 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_call_white_24dp.pngbin0 -> 348 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_forward_white_24dp.pngbin0 -> 117 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_hd_24dp.pngbin0 -> 154 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.pngbin0 -> 265 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.pngbin0 -> 538 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.pngbin0 -> 346 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.pngbin0 -> 377 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_add_call.pngbin0 -> 883 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.pngbin0 -> 431 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.pngbin0 -> 630 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.pngbin0 -> 885 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.pngbin0 -> 921 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.pngbin0 -> 527 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_hold.pngbin0 -> 455 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_merge.pngbin0 -> 669 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.pngbin0 -> 822 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.pngbin0 -> 847 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_swap.pngbin0 -> 808 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_video.pngbin0 -> 607 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_video_off.pngbin0 -> 797 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.pngbin0 -> 776 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/img_business.pngbin0 -> 2240 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/img_conference.pngbin0 -> 4629 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/img_no_image.pngbin0 -> 3509 bytes
-rw-r--r--InCallUI/res/drawable-mdpi/img_phone.pngbin0 -> 3798 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/fab_blue.pngbin0 -> 4085 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/fab_ic_call.pngbin0 -> 1266 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/fab_ic_end_call.pngbin0 -> 1215 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/fab_ic_message.pngbin0 -> 795 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/fab_red.pngbin0 -> 4047 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_business_white_24dp.pngbin0 -> 112 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.pngbin0 -> 534 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.pngbin0 -> 377 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_call_white_24dp.pngbin0 -> 535 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.pngbin0 -> 159 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_hd_24dp.pngbin0 -> 201 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.pngbin0 -> 456 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.pngbin0 -> 964 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.pngbin0 -> 584 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.pngbin0 -> 737 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.pngbin0 -> 1549 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.pngbin0 -> 543 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.pngbin0 -> 882 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.pngbin0 -> 1479 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.pngbin0 -> 1837 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.pngbin0 -> 709 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_hold.pngbin0 -> 565 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_merge.pngbin0 -> 921 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.pngbin0 -> 1454 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.pngbin0 -> 1505 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_swap.pngbin0 -> 1487 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_video.pngbin0 -> 830 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.pngbin0 -> 1160 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.pngbin0 -> 1120 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/img_business.pngbin0 -> 4759 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/img_conference.pngbin0 -> 9517 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/img_no_image.pngbin0 -> 7369 bytes
-rw-r--r--InCallUI/res/drawable-xhdpi/img_phone.pngbin0 -> 8189 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/fab_blue.pngbin0 -> 7009 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/fab_ic_call.pngbin0 -> 2320 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/fab_ic_end_call.pngbin0 -> 2227 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/fab_ic_message.pngbin0 -> 1556 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/fab_red.pngbin0 -> 6965 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.pngbin0 -> 119 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.pngbin0 -> 736 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.pngbin0 -> 461 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.pngbin0 -> 750 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.pngbin0 -> 204 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_hd_24dp.pngbin0 -> 290 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.pngbin0 -> 675 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.pngbin0 -> 1907 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.pngbin0 -> 842 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.pngbin0 -> 1107 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.pngbin0 -> 1874 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.pngbin0 -> 1188 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.pngbin0 -> 1528 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.pngbin0 -> 1858 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.pngbin0 -> 2285 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.pngbin0 -> 1449 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.pngbin0 -> 1143 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.pngbin0 -> 1385 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.pngbin0 -> 1956 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.pngbin0 -> 2065 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.pngbin0 -> 1970 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_video.pngbin0 -> 1347 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.pngbin0 -> 1538 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.pngbin0 -> 1534 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/img_business.pngbin0 -> 6499 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/img_conference.pngbin0 -> 16306 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/img_no_image.pngbin0 -> 9850 bytes
-rw-r--r--InCallUI/res/drawable-xxhdpi/img_phone.pngbin0 -> 10848 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/fab_blue.pngbin0 -> 9807 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/fab_ic_call.pngbin0 -> 2921 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.pngbin0 -> 2567 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/fab_ic_message.pngbin0 -> 1850 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/fab_red.pngbin0 -> 9802 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.pngbin0 -> 114 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.pngbin0 -> 929 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.pngbin0 -> 646 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.pngbin0 -> 236 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.pngbin0 -> 348 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.pngbin0 -> 869 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.pngbin0 -> 1478 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.pngbin0 -> 2271 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.pngbin0 -> 1262 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.pngbin0 -> 1728 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.pngbin0 -> 2158 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.pngbin0 -> 2830 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.pngbin0 -> 1651 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.pngbin0 -> 1179 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.pngbin0 -> 1444 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.pngbin0 -> 2284 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.pngbin0 -> 2532 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.pngbin0 -> 2370 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.pngbin0 -> 1394 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.pngbin0 -> 1703 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.pngbin0 -> 1610 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/img_business.pngbin0 -> 10730 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/img_conference.pngbin0 -> 19584 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/img_no_image.pngbin0 -> 16251 bytes
-rw-r--r--InCallUI/res/drawable-xxxhdpi/img_phone.pngbin0 -> 18635 bytes
-rw-r--r--InCallUI/res/drawable/btn_add.xml30
-rw-r--r--InCallUI/res/drawable/btn_background.xml33
-rw-r--r--InCallUI/res/drawable/btn_change_to_video.xml31
-rw-r--r--InCallUI/res/drawable/btn_change_to_voice.xml31
-rw-r--r--InCallUI/res/drawable/btn_compound_audio.xml93
-rw-r--r--InCallUI/res/drawable/btn_compound_background.xml35
-rw-r--r--InCallUI/res/drawable/btn_compound_dialpad.xml32
-rw-r--r--InCallUI/res/drawable/btn_compound_hold.xml32
-rw-r--r--InCallUI/res/drawable/btn_compound_mute.xml31
-rw-r--r--InCallUI/res/drawable/btn_compound_video_off.xml33
-rw-r--r--InCallUI/res/drawable/btn_compound_video_switch.xml33
-rw-r--r--InCallUI/res/drawable/btn_merge.xml30
-rw-r--r--InCallUI/res/drawable/btn_overflow.xml30
-rw-r--r--InCallUI/res/drawable/btn_selected.xml (renamed from res/drawable/tab_recents.xml)17
-rw-r--r--InCallUI/res/drawable/btn_selected_focused.xml (renamed from res/drawable/tab_contacts.xml)19
-rw-r--r--InCallUI/res/drawable/btn_swap.xml30
-rw-r--r--InCallUI/res/drawable/btn_unselected.xml25
-rw-r--r--InCallUI/res/drawable/btn_unselected_focused.xml28
-rw-r--r--InCallUI/res/drawable/conference_ripple.xml (renamed from res/drawable/tab_speed_dial.xml)17
-rw-r--r--InCallUI/res/drawable/end_call_background.xml25
-rw-r--r--InCallUI/res/drawable/ic_incall_audio_handle.xml40
-rw-r--r--InCallUI/res/drawable/ic_incall_video_handle.xml41
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_answer.xml27
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml25
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml33
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_answer_video.xml28
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml26
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml34
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_decline.xml27
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml24
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml32
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_decline_video.xml28
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml26
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml34
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_outerring.xml22
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_text.xml27
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml32
-rw-r--r--InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml33
-rw-r--r--InCallUI/res/drawable/img_conference_automirrored.xml21
-rw-r--r--InCallUI/res/drawable/img_no_image_automirrored.xml21
-rw-r--r--InCallUI/res/drawable/incoming_sms_background.xml25
-rw-r--r--InCallUI/res/drawable/outgoing_sms_background.xml25
-rw-r--r--InCallUI/res/drawable/subject_bubble.xml22
-rw-r--r--InCallUI/res/layout-h400dp/call_card_fragment.xml172
-rw-r--r--InCallUI/res/layout-h600dp/manage_conference_call_button.xml61
-rw-r--r--InCallUI/res/layout-w500dp-land/call_card_fragment.xml158
-rw-r--r--InCallUI/res/layout-w600dp-land/manage_conference_call_button.xml61
-rw-r--r--InCallUI/res/layout/accessible_answer_fragment.xml104
-rw-r--r--InCallUI/res/layout/answer_fragment.xml42
-rw-r--r--InCallUI/res/layout/business_contact_context_list_header.xml40
-rw-r--r--InCallUI/res/layout/business_context_info_list_item.xml48
-rw-r--r--InCallUI/res/layout/call_button_fragment.xml171
-rw-r--r--InCallUI/res/layout/call_card_fragment.xml158
-rw-r--r--InCallUI/res/layout/caller_in_conference.xml116
-rw-r--r--InCallUI/res/layout/conference_manager_fragment.xml36
-rw-r--r--InCallUI/res/layout/incall_dialpad_fragment.xml (renamed from res/layout/call_detail_history_header.xml)20
-rw-r--r--InCallUI/res/layout/incall_screen.xml (renamed from res/layout/call_details_voicemail_header.xml)24
-rw-r--r--InCallUI/res/layout/manage_conference_call_button.xml72
-rw-r--r--InCallUI/res/layout/outgoing_call_animation.xml22
-rw-r--r--InCallUI/res/layout/person_context_info_list_item.xml40
-rw-r--r--InCallUI/res/layout/primary_call_info.xml221
-rw-r--r--InCallUI/res/layout/secondary_call_info.xml105
-rw-r--r--InCallUI/res/layout/video_call_fragment.xml28
-rw-r--r--InCallUI/res/layout/video_call_views.xml66
-rw-r--r--InCallUI/res/menu/incall_audio_mode_menu.xml39
-rw-r--r--InCallUI/res/values-af/strings.xml196
-rw-r--r--InCallUI/res/values-am/strings.xml196
-rw-r--r--InCallUI/res/values-ar/strings.xml208
-rw-r--r--InCallUI/res/values-az-rAZ/strings.xml196
-rw-r--r--InCallUI/res/values-b+sr+Latn/strings.xml199
-rw-r--r--InCallUI/res/values-be-rBY/strings.xml202
-rw-r--r--InCallUI/res/values-bg/strings.xml196
-rw-r--r--InCallUI/res/values-bn-rBD/strings.xml196
-rw-r--r--InCallUI/res/values-bs-rBA/strings.xml199
-rw-r--r--InCallUI/res/values-ca/strings.xml196
-rw-r--r--InCallUI/res/values-cs/strings.xml202
-rw-r--r--InCallUI/res/values-da/strings.xml196
-rw-r--r--InCallUI/res/values-de/strings.xml196
-rw-r--r--InCallUI/res/values-el/strings.xml196
-rw-r--r--InCallUI/res/values-en-rAU/strings.xml196
-rw-r--r--InCallUI/res/values-en-rGB/strings.xml196
-rw-r--r--InCallUI/res/values-en-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-es-rUS/strings.xml196
-rw-r--r--InCallUI/res/values-es/strings.xml196
-rw-r--r--InCallUI/res/values-et-rEE/strings.xml196
-rw-r--r--InCallUI/res/values-eu-rES/strings.xml196
-rw-r--r--InCallUI/res/values-fa/strings.xml196
-rw-r--r--InCallUI/res/values-fi/strings.xml196
-rw-r--r--InCallUI/res/values-fr-rCA/strings.xml196
-rw-r--r--InCallUI/res/values-fr/strings.xml196
-rw-r--r--InCallUI/res/values-gl-rES/strings.xml196
-rw-r--r--InCallUI/res/values-gu-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-h400dp/dimens.xml31
-rw-r--r--InCallUI/res/values-hi/strings.xml196
-rw-r--r--InCallUI/res/values-hr/strings.xml199
-rw-r--r--InCallUI/res/values-hu/strings.xml196
-rw-r--r--InCallUI/res/values-hy-rAM/strings.xml196
-rw-r--r--InCallUI/res/values-in/strings.xml196
-rw-r--r--InCallUI/res/values-is-rIS/strings.xml196
-rw-r--r--InCallUI/res/values-it/strings.xml196
-rw-r--r--InCallUI/res/values-iw/strings.xml202
-rw-r--r--InCallUI/res/values-ja/strings.xml196
-rw-r--r--InCallUI/res/values-ka-rGE/strings.xml196
-rw-r--r--InCallUI/res/values-kk-rKZ/strings.xml196
-rw-r--r--InCallUI/res/values-km-rKH/strings.xml196
-rw-r--r--InCallUI/res/values-kn-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-ko/strings.xml196
-rw-r--r--InCallUI/res/values-ky-rKG/strings.xml196
-rw-r--r--InCallUI/res/values-lo-rLA/strings.xml196
-rw-r--r--InCallUI/res/values-lt/strings.xml202
-rw-r--r--InCallUI/res/values-lv/strings.xml199
-rw-r--r--InCallUI/res/values-mk-rMK/strings.xml196
-rw-r--r--InCallUI/res/values-ml-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-mn-rMN/strings.xml196
-rw-r--r--InCallUI/res/values-mr-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-ms-rMY/strings.xml196
-rw-r--r--InCallUI/res/values-my-rMM/strings.xml196
-rw-r--r--InCallUI/res/values-nb/strings.xml196
-rw-r--r--InCallUI/res/values-ne-rNP/strings.xml196
-rw-r--r--InCallUI/res/values-nl/strings.xml196
-rw-r--r--InCallUI/res/values-pa-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-pl/strings.xml202
-rw-r--r--InCallUI/res/values-pt-rBR/strings.xml196
-rw-r--r--InCallUI/res/values-pt-rPT/strings.xml196
-rw-r--r--InCallUI/res/values-pt/strings.xml196
-rw-r--r--InCallUI/res/values-ro/strings.xml199
-rw-r--r--InCallUI/res/values-ru/strings.xml202
-rw-r--r--InCallUI/res/values-si-rLK/strings.xml196
-rw-r--r--InCallUI/res/values-sk/strings.xml202
-rw-r--r--InCallUI/res/values-sl/strings.xml202
-rw-r--r--InCallUI/res/values-sq-rAL/strings.xml196
-rw-r--r--InCallUI/res/values-sr/strings.xml199
-rw-r--r--InCallUI/res/values-sv/strings.xml196
-rw-r--r--InCallUI/res/values-sw/strings.xml196
-rw-r--r--InCallUI/res/values-sw360dp/dimens.xml35
-rw-r--r--InCallUI/res/values-sw410dp/config.xml21
-rw-r--r--InCallUI/res/values-ta-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-te-rIN/strings.xml196
-rw-r--r--InCallUI/res/values-th/strings.xml196
-rw-r--r--InCallUI/res/values-tl/strings.xml196
-rw-r--r--InCallUI/res/values-tr/strings.xml196
-rw-r--r--InCallUI/res/values-uk/strings.xml202
-rw-r--r--InCallUI/res/values-ur-rPK/strings.xml196
-rw-r--r--InCallUI/res/values-uz-rUZ/strings.xml196
-rw-r--r--InCallUI/res/values-vi/strings.xml196
-rw-r--r--InCallUI/res/values-w500dp-land/colors.xml21
-rw-r--r--InCallUI/res/values-w500dp-land/dimens.xml35
-rw-r--r--InCallUI/res/values-zh-rCN/strings.xml196
-rw-r--r--InCallUI/res/values-zh-rHK/strings.xml196
-rw-r--r--InCallUI/res/values-zh-rTW/strings.xml196
-rw-r--r--InCallUI/res/values-zu/strings.xml196
-rw-r--r--InCallUI/res/values/animation_constants.xml22
-rw-r--r--InCallUI/res/values/array.xml135
-rw-r--r--InCallUI/res/values/attrs.xml71
-rw-r--r--InCallUI/res/values/colors.xml125
-rw-r--r--InCallUI/res/values/config.xml27
-rw-r--r--InCallUI/res/values/dimens.xml150
-rw-r--r--InCallUI/res/values/ids.xml (renamed from res/menu/call_details_cab.xml)14
-rw-r--r--InCallUI/res/values/strings.xml526
-rw-r--r--InCallUI/res/values/styles.xml100
-rw-r--r--InCallUI/src/com/android/incallui/AccelerometerListener.java169
-rw-r--r--InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java157
-rw-r--r--InCallUI/src/com/android/incallui/AnswerFragment.java307
-rw-r--r--InCallUI/src/com/android/incallui/AnswerPresenter.java315
-rw-r--r--InCallUI/src/com/android/incallui/AudioModeProvider.java105
-rw-r--r--InCallUI/src/com/android/incallui/BaseFragment.java84
-rw-r--r--InCallUI/src/com/android/incallui/Call.java922
-rw-r--r--InCallUI/src/com/android/incallui/CallButtonFragment.java814
-rw-r--r--InCallUI/src/com/android/incallui/CallButtonPresenter.java483
-rw-r--r--InCallUI/src/com/android/incallui/CallCardFragment.java1492
-rw-r--r--InCallUI/src/com/android/incallui/CallCardPresenter.java1173
-rw-r--r--InCallUI/src/com/android/incallui/CallList.java678
-rw-r--r--InCallUI/src/com/android/incallui/CallTimer.java90
-rw-r--r--InCallUI/src/com/android/incallui/CallerInfo.java585
-rw-r--r--InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java599
-rw-r--r--InCallUI/src/com/android/incallui/CallerInfoUtils.java234
-rw-r--r--InCallUI/src/com/android/incallui/CircularRevealFragment.java170
-rw-r--r--InCallUI/src/com/android/incallui/ConferenceManagerFragment.java139
-rw-r--r--InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java144
-rw-r--r--InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java533
-rw-r--r--InCallUI/src/com/android/incallui/ContactInfoCache.java699
-rw-r--r--InCallUI/src/com/android/incallui/ContactUtils.java48
-rw-r--r--InCallUI/src/com/android/incallui/ContactsAsyncHelper.java258
-rw-r--r--InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java61
-rw-r--r--InCallUI/src/com/android/incallui/DialpadFragment.java563
-rw-r--r--InCallUI/src/com/android/incallui/DialpadPresenter.java84
-rw-r--r--InCallUI/src/com/android/incallui/DistanceHelper.java37
-rw-r--r--InCallUI/src/com/android/incallui/FragmentDisplayManager.java23
-rw-r--r--InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java155
-rw-r--r--InCallUI/src/com/android/incallui/GlowPadWrapper.java158
-rw-r--r--InCallUI/src/com/android/incallui/InCallActivity.java964
-rw-r--r--InCallUI/src/com/android/incallui/InCallAnimationUtils.java184
-rw-r--r--InCallUI/src/com/android/incallui/InCallCameraManager.java184
-rw-r--r--InCallUI/src/com/android/incallui/InCallContactInteractions.java399
-rw-r--r--InCallUI/src/com/android/incallui/InCallDateUtils.java56
-rw-r--r--InCallUI/src/com/android/incallui/InCallOrientationEventListener.java151
-rw-r--r--InCallUI/src/com/android/incallui/InCallPresenter.java1887
-rw-r--r--InCallUI/src/com/android/incallui/InCallServiceImpl.java98
-rw-r--r--InCallUI/src/com/android/incallui/InCallServiceListener.java41
-rw-r--r--InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java55
-rw-r--r--InCallUI/src/com/android/incallui/InCallVideoCallCallback.java156
-rw-r--r--InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java284
-rw-r--r--InCallUI/src/com/android/incallui/Log.java176
-rw-r--r--InCallUI/src/com/android/incallui/NeededForReflection.java30
-rw-r--r--InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java74
-rw-r--r--InCallUI/src/com/android/incallui/PostCharDialogFragment.java95
-rw-r--r--InCallUI/src/com/android/incallui/Presenter.java59
-rw-r--r--InCallUI/src/com/android/incallui/ProximitySensor.java317
-rw-r--r--InCallUI/src/com/android/incallui/StatusBarNotifier.java767
-rw-r--r--InCallUI/src/com/android/incallui/TelecomAdapter.java226
-rw-r--r--InCallUI/src/com/android/incallui/Ui.java24
-rw-r--r--InCallUI/src/com/android/incallui/VideoCallFragment.java899
-rw-r--r--InCallUI/src/com/android/incallui/VideoCallPresenter.java1297
-rw-r--r--InCallUI/src/com/android/incallui/VideoPauseController.java418
-rw-r--r--InCallUI/src/com/android/incallui/VideoUtils.java101
-rw-r--r--InCallUI/src/com/android/incallui/async/PausableExecutor.java61
-rw-r--r--InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java42
-rw-r--r--InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java140
-rw-r--r--InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java168
-rw-r--r--InCallUI/src/com/android/incallui/ringtone/ToneGeneratorFactory.java36
-rw-r--r--InCallUI/src/com/android/incallui/service/PhoneNumberService.java67
-rw-r--r--InCallUI/src/com/android/incallui/util/AccessibilityUtil.java30
-rw-r--r--InCallUI/src/com/android/incallui/util/TelecomCallUtil.java53
-rw-r--r--InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java132
-rw-r--r--InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java1473
-rw-r--r--InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java235
-rw-r--r--InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java250
-rw-r--r--InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java178
-rw-r--r--InCallUI/src/com/android/incalluibind/ObjectFactory.java59
-rw-r--r--InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java121
-rw-r--r--InCallUI/tests/src/com/android/incallui/CallTest.java125
-rw-r--r--InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java31
-rw-r--r--InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java51
-rw-r--r--InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java325
-rw-r--r--InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java196
-rw-r--r--InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java80
-rw-r--r--InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java66
-rw-r--r--InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java98
-rw-r--r--InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java69
-rw-r--r--InCallUI/tests/src/com/android/incallui/ringtone/DialerRingtoneManagerTest.java219
-rw-r--r--InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java148
-rw-r--r--build-app.gradle39
-rw-r--r--build-library.gradle39
-rw-r--r--proguard.flags7
-rw-r--r--res/drawable-hdpi/ab_stacked_opaque_dark_holo.9.pngbin225 -> 0 bytes
-rw-r--r--res/drawable-hdpi/divider.9.pngbin118 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_ab_dialer_holo_light.pngbin1696 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_archive_white_24dp.pngbin0 -> 247 bytes
-rw-r--r--res/drawable-hdpi/ic_block_24dp.pngbin0 -> 478 bytes
-rw-r--r--res/drawable-hdpi/ic_call_log_blue.pngbin1734 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_cancel_holo_light.pngbin393 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_content_copy_24dp.pngbin0 -> 203 bytes
-rw-r--r--res/drawable-hdpi/ic_fav_undo_dk.pngbin1644 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_all_contacts_dk.pngbin1778 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_history_dk.pngbin1629 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_mic_grey600.pngbin0 -> 377 bytes
-rw-r--r--res/drawable-hdpi/ic_more_horiz_24dp.pngbin134 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_not_interested_googblue_24dp.pngbin0 -> 565 bytes
-rw-r--r--res/drawable-hdpi/ic_phone_24dp.pngbin0 -> 347 bytes
-rw-r--r--res/drawable-hdpi/ic_report_24dp.pngbin0 -> 240 bytes
-rw-r--r--res/drawable-hdpi/ic_report_problem_24dp.pngbin306 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_share_white_24dp.pngbin0 -> 397 bytes
-rw-r--r--res/drawable-hdpi/ic_unblock.pngbin0 -> 1049 bytes
-rw-r--r--res/drawable-hdpi/ic_vm_bt_dk.pngbin1703 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_vm_phone_broadcast_dk.pngbin1365 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_voice_search.pngbin1249 -> 0 bytes
-rw-r--r--res/drawable-hdpi/list_selector_disabled_holo_dark.9.pngbin189 -> 0 bytes
-rw-r--r--res/drawable-hdpi/rounded_corner_bg.9.pngbin333 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.pngbin598 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.pngbin529 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.pngbin602 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.pngbin399 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.pngbin351 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.pngbin370 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.pngbin766 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.pngbin672 -> 0 bytes
-rw-r--r--res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.pngbin816 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ab_stacked_opaque_dark_holo.9.pngbin177 -> 0 bytes
-rw-r--r--res/drawable-mdpi/divider.9.pngbin118 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_archive_white_24dp.pngbin0 -> 181 bytes
-rw-r--r--res/drawable-mdpi/ic_block_24dp.pngbin0 -> 335 bytes
-rw-r--r--res/drawable-mdpi/ic_call_log_blue.pngbin1141 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_cancel_holo_light.pngbin312 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_content_copy_24dp.pngbin0 -> 134 bytes
-rw-r--r--res/drawable-mdpi/ic_fav_undo_dk.pngbin1384 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_all_contacts_dk.pngbin1225 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_dialpad_dk.pngbin1088 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_dialpad_lt.pngbin986 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_history_dk.pngbin1111 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_mic_grey600.pngbin0 -> 252 bytes
-rw-r--r--res/drawable-mdpi/ic_more_horiz_24dp.pngbin109 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_not_interested_googblue_24dp.pngbin0 -> 377 bytes
-rw-r--r--res/drawable-mdpi/ic_phone_24dp.pngbin0 -> 262 bytes
-rw-r--r--res/drawable-mdpi/ic_report_24dp.pngbin0 -> 174 bytes
-rw-r--r--res/drawable-mdpi/ic_report_problem_24dp.pngbin236 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_share_white_24dp.pngbin0 -> 268 bytes
-rw-r--r--res/drawable-mdpi/ic_unblock.pngbin0 -> 746 bytes
-rw-r--r--res/drawable-mdpi/ic_vm_bt_dk.pngbin1169 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_vm_phone_broadcast_dk.pngbin1030 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_voice_search.pngbin912 -> 0 bytes
-rw-r--r--res/drawable-mdpi/list_selector_disabled_holo_dark.9.pngbin172 -> 0 bytes
-rw-r--r--res/drawable-mdpi/rounded_corner_bg.9.pngbin205 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ab_stacked_opaque_dark_holo.9.pngbin236 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/divider.9.pngbin118 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_archive_white_24dp.pngbin0 -> 267 bytes
-rw-r--r--res/drawable-xhdpi/ic_block_24dp.pngbin0 -> 665 bytes
-rw-r--r--res/drawable-xhdpi/ic_call_log_blue.pngbin2386 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_cancel_holo_light.pngbin1477 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_content_copy_24dp.pngbin0 -> 188 bytes
-rw-r--r--res/drawable-xhdpi/ic_fav_undo_dk.pngbin1935 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_all_contacts_dk.pngbin2396 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_dialpad_dk.pngbin1957 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_dialpad_lt.pngbin1607 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_history_dk.pngbin2299 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_mic_grey600.pngbin0 -> 454 bytes
-rw-r--r--res/drawable-xhdpi/ic_more_horiz_24dp.pngbin161 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_not_interested_googblue_24dp.pngbin0 -> 755 bytes
-rw-r--r--res/drawable-xhdpi/ic_phone_24dp.pngbin0 -> 439 bytes
-rw-r--r--res/drawable-xhdpi/ic_report_24dp.pngbin0 -> 272 bytes
-rw-r--r--res/drawable-xhdpi/ic_report_problem_24dp.pngbin364 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_share_white_24dp.pngbin0 -> 496 bytes
-rw-r--r--res/drawable-xhdpi/ic_unblock.pngbin0 -> 1356 bytes
-rw-r--r--res/drawable-xhdpi/ic_vm_bt_dk.pngbin2283 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_vm_phone_broadcast_dk.pngbin1787 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_voice_search.pngbin1572 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/list_selector_disabled_holo_dark.9.pngbin190 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/rounded_corner_bg.9.pngbin427 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ab_stacked_opaque_dark_holo.9.pngbin1143 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/divider.9.pngbin118 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_archive_white_24dp.pngbin0 -> 390 bytes
-rw-r--r--res/drawable-xxhdpi/ic_block_24dp.pngbin0 -> 973 bytes
-rw-r--r--res/drawable-xxhdpi/ic_call_log_blue.pngbin2967 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_cancel_holo_light.pngbin1637 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_content_copy_24dp.pngbin0 -> 266 bytes
-rw-r--r--res/drawable-xxhdpi/ic_fav_undo_dk.pngbin2090 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_menu_all_contacts_dk.pngbin3002 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_menu_dialpad_dk.pngbin2044 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_menu_dialpad_lt.pngbin1302 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_menu_history_dk.pngbin2996 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_mic_grey600.pngbin0 -> 631 bytes
-rw-r--r--res/drawable-xxhdpi/ic_more_horiz_24dp.pngbin213 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_not_interested_googblue_24dp.pngbin0 -> 1112 bytes
-rw-r--r--res/drawable-xxhdpi/ic_phone_24dp.pngbin0 -> 619 bytes
-rw-r--r--res/drawable-xxhdpi/ic_report_24dp.pngbin0 -> 340 bytes
-rw-r--r--res/drawable-xxhdpi/ic_report_problem_24dp.pngbin473 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_share_white_24dp.pngbin0 -> 698 bytes
-rw-r--r--res/drawable-xxhdpi/ic_unblock.pngbin0 -> 1990 bytes
-rw-r--r--res/drawable-xxhdpi/ic_vm_bt_dk.pngbin2913 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_vm_phone_broadcast_dk.pngbin2166 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/ic_voice_search.pngbin2075 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.pngbin1137 -> 0 bytes
-rw-r--r--res/drawable-xxhdpi/rounded_corner_bg.9.pngbin1307 -> 0 bytes
-rw-r--r--res/drawable-xxxhdpi/empty_speeddial.pngbin14741 -> 0 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_archive_white_24dp.pngbin0 -> 489 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_block_24dp.pngbin0 -> 1295 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_content_copy_24dp.pngbin0 -> 329 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_mic_grey600.pngbin0 -> 853 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_more_horiz_24dp.pngbin267 -> 0 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_not_interested_googblue_24dp.pngbin0 -> 1458 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_phone_24dp.pngbin0 -> 837 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_report_24dp.pngbin0 -> 450 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_report_problem_24dp.pngbin590 -> 0 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_share_white_24dp.pngbin0 -> 938 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_unblock.pngbin0 -> 1389 bytes
-rw-r--r--res/drawable/blocked_contact.xml33
-rw-r--r--res/drawable/ic_call_detail_block.xml20
-rw-r--r--res/drawable/ic_call_detail_content_copy.xml20
-rw-r--r--res/drawable/ic_call_detail_edit.xml20
-rw-r--r--res/drawable/ic_call_detail_report.xml20
-rw-r--r--res/drawable/ic_call_detail_unblock.xml20
-rw-r--r--res/drawable/ic_voicemail_seek_handle.xml1
-rw-r--r--res/drawable/ic_voicemail_seek_handle_disabled.xml (renamed from res/drawable/tab_voicemail.xml)18
-rw-r--r--res/drawable/selectable_primary_flat_button.xml27
-rw-r--r--res/layout-land/dialpad_fragment.xml6
-rw-r--r--res/layout/blocked_number_footer.xml37
-rw-r--r--res/layout/blocked_number_fragment.xml (renamed from res/layout/show_call_history_list_item.xml)23
-rw-r--r--res/layout/blocked_number_header.xml217
-rw-r--r--res/layout/blocked_number_item.xml72
-rw-r--r--res/layout/blocked_numbers_activity.xml22
-rw-r--r--res/layout/call_detail.xml82
-rw-r--r--res/layout/call_detail_footer.xml56
-rw-r--r--res/layout/call_detail_header.xml89
-rw-r--r--res/layout/call_detail_history_item.xml4
-rw-r--r--res/layout/call_log_fragment.xml4
-rw-r--r--res/layout/call_log_list_item.xml44
-rw-r--r--res/layout/call_log_list_item_actions.xml24
-rw-r--r--res/layout/dialtacts_activity.xml8
-rw-r--r--res/layout/lists_fragment.xml10
-rw-r--r--res/layout/phone_favorite_tile_view.xml6
-rw-r--r--res/layout/search_edittext.xml14
-rw-r--r--res/layout/view_numbers_to_import_fragment.xml56
-rw-r--r--res/layout/voicemail_playback_layout.xml148
-rw-r--r--res/layout/voicemail_promo_card.xml10
-rw-r--r--res/menu/call_details_options.xml34
-rw-r--r--res/menu/call_log_options.xml2
-rw-r--r--res/menu/dialtacts_options.xml4
-rw-r--r--res/mipmap-hdpi/ic_launcher_phone.pngbin7524 -> 2780 bytes
-rw-r--r--res/mipmap-mdpi/ic_launcher_phone.pngbin4350 -> 1778 bytes
-rw-r--r--res/mipmap-xhdpi/ic_launcher_phone.pngbin11180 -> 3939 bytes
-rw-r--r--res/mipmap-xxhdpi/ic_launcher_phone.pngbin17308 -> 6251 bytes
-rw-r--r--res/mipmap-xxxhdpi/ic_launcher_phone.pngbin27988 -> 8793 bytes
-rw-r--r--res/values-af/strings.xml114
-rw-r--r--res/values-am/strings.xml114
-rw-r--r--res/values-ar/strings.xml114
-rw-r--r--res/values-az-rAZ/strings.xml114
-rw-r--r--res/values-b+sr+Latn/strings.xml276
-rw-r--r--res/values-be-rBY/strings.xml278
-rw-r--r--res/values-bg/strings.xml114
-rw-r--r--res/values-bn-rBD/strings.xml114
-rw-r--r--res/values-bs-rBA/strings.xml276
-rw-r--r--res/values-ca/strings.xml114
-rw-r--r--res/values-cs/strings.xml114
-rw-r--r--res/values-da/strings.xml114
-rw-r--r--res/values-de/strings.xml114
-rw-r--r--res/values-el/strings.xml114
-rw-r--r--res/values-en-rAU/strings.xml114
-rw-r--r--res/values-en-rGB/strings.xml114
-rw-r--r--res/values-en-rIN/strings.xml114
-rw-r--r--res/values-es-rUS/strings.xml114
-rw-r--r--res/values-es/strings.xml114
-rw-r--r--res/values-et-rEE/strings.xml114
-rw-r--r--res/values-eu-rES/strings.xml114
-rw-r--r--res/values-fa/strings.xml114
-rw-r--r--res/values-fi/strings.xml114
-rw-r--r--res/values-fr-rCA/strings.xml114
-rw-r--r--res/values-fr/strings.xml114
-rw-r--r--res/values-gl-rES/strings.xml114
-rw-r--r--res/values-gu-rIN/strings.xml114
-rw-r--r--res/values-hi/strings.xml114
-rw-r--r--res/values-hr/strings.xml114
-rw-r--r--res/values-hu/strings.xml114
-rw-r--r--res/values-hy-rAM/strings.xml114
-rw-r--r--res/values-in/strings.xml114
-rw-r--r--res/values-is-rIS/strings.xml114
-rw-r--r--res/values-it/strings.xml114
-rw-r--r--res/values-iw/strings.xml114
-rw-r--r--res/values-ja/strings.xml114
-rw-r--r--res/values-ka-rGE/strings.xml114
-rw-r--r--res/values-kk-rKZ/strings.xml114
-rw-r--r--res/values-km-rKH/strings.xml114
-rw-r--r--res/values-kn-rIN/strings.xml114
-rw-r--r--res/values-ko/strings.xml114
-rw-r--r--res/values-ky-rKG/strings.xml116
-rw-r--r--res/values-lo-rLA/strings.xml114
-rw-r--r--res/values-lt/strings.xml114
-rw-r--r--res/values-lv/strings.xml114
-rw-r--r--res/values-mk-rMK/strings.xml114
-rw-r--r--res/values-ml-rIN/strings.xml114
-rw-r--r--res/values-mn-rMN/strings.xml114
-rw-r--r--res/values-mr-rIN/strings.xml114
-rw-r--r--res/values-ms-rMY/strings.xml114
-rw-r--r--res/values-my-rMM/strings.xml114
-rw-r--r--res/values-nb/strings.xml114
-rw-r--r--res/values-ne-rNP/strings.xml114
-rw-r--r--res/values-nl/strings.xml114
-rw-r--r--res/values-pa-rIN/strings.xml114
-rw-r--r--res/values-pl/strings.xml114
-rw-r--r--res/values-pt-rBR/strings.xml114
-rw-r--r--res/values-pt-rPT/strings.xml114
-rw-r--r--res/values-pt/strings.xml114
-rw-r--r--res/values-ro/strings.xml114
-rw-r--r--res/values-ru/strings.xml114
-rw-r--r--res/values-si-rLK/strings.xml114
-rw-r--r--res/values-sk/strings.xml114
-rw-r--r--res/values-sl/strings.xml114
-rw-r--r--res/values-sq-rAL/strings.xml114
-rw-r--r--res/values-sr/strings.xml114
-rw-r--r--res/values-sv/strings.xml114
-rw-r--r--res/values-sw/strings.xml114
-rw-r--r--res/values-ta-rIN/strings.xml114
-rw-r--r--res/values-te-rIN/strings.xml114
-rw-r--r--res/values-th/strings.xml114
-rw-r--r--res/values-tl/strings.xml114
-rw-r--r--res/values-tr/strings.xml114
-rw-r--r--res/values-uk/strings.xml114
-rw-r--r--res/values-ur-rPK/strings.xml114
-rw-r--r--res/values-uz-rUZ/strings.xml114
-rw-r--r--res/values-vi/strings.xml114
-rw-r--r--res/values-zh-rCN/strings.xml114
-rw-r--r--res/values-zh-rHK/strings.xml114
-rw-r--r--res/values-zh-rTW/strings.xml114
-rw-r--r--res/values-zu/strings.xml114
-rw-r--r--res/values/colors.xml39
-rw-r--r--res/values/dimens.xml50
-rw-r--r--res/values/donottranslate_config.xml2
-rw-r--r--res/values/ids.xml4
-rw-r--r--res/values/strings.xml369
-rw-r--r--res/values/styles.xml115
-rw-r--r--res/xml/file_paths.xml22
-rw-r--r--src-N/com/android/dialer/SdkSelectionUtils.java35
-rw-r--r--src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java37
-rw-r--r--src-N/com/android/dialer/compat/CallsSdkCompat.java25
-rw-r--r--src-N/com/android/dialer/compat/UserManagerSdkCompat.java39
-rw-r--r--src-pre-N/com/android/dialer/SdkSelectionUtils.java35
-rw-r--r--src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java35
-rw-r--r--src-pre-N/com/android/dialer/compat/CallsSdkCompat.java25
-rw-r--r--src-pre-N/com/android/dialer/compat/UserManagerSdkCompat.java34
-rw-r--r--src/com/android/dialer/CallDetailActivity.java416
-rw-r--r--src/com/android/dialer/DialerApplication.java25
-rw-r--r--src/com/android/dialer/DialtactsActivity.java307
-rw-r--r--src/com/android/dialer/FloatingActionButtonBehavior.java47
-rw-r--r--src/com/android/dialer/PhoneCallDetails.java66
-rw-r--r--src/com/android/dialer/SpecialCharSequenceMgr.java62
-rw-r--r--src/com/android/dialer/TransactionSafeActivity.java65
-rw-r--r--src/com/android/dialer/calllog/CallDetailHistoryAdapter.java28
-rw-r--r--src/com/android/dialer/calllog/CallLogActivity.java54
-rw-r--r--src/com/android/dialer/calllog/CallLogAdapter.java427
-rw-r--r--src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java252
-rw-r--r--src/com/android/dialer/calllog/CallLogFragment.java188
-rw-r--r--src/com/android/dialer/calllog/CallLogGroupBuilder.java197
-rw-r--r--src/com/android/dialer/calllog/CallLogListItemHelper.java60
-rw-r--r--src/com/android/dialer/calllog/CallLogListItemViewHolder.java354
-rw-r--r--src/com/android/dialer/calllog/CallLogNotificationsHelper.java317
-rw-r--r--src/com/android/dialer/calllog/CallLogNotificationsService.java129
-rw-r--r--src/com/android/dialer/calllog/CallLogQuery.java45
-rw-r--r--src/com/android/dialer/calllog/CallLogQueryHandler.java117
-rw-r--r--src/com/android/dialer/calllog/CallTypeHelper.java35
-rw-r--r--src/com/android/dialer/calllog/CallTypeIconsView.java93
-rw-r--r--src/com/android/dialer/calllog/ContactInfo.java25
-rw-r--r--src/com/android/dialer/calllog/ContactInfoHelper.java213
-rw-r--r--src/com/android/dialer/calllog/DefaultVoicemailNotifier.java328
-rw-r--r--src/com/android/dialer/calllog/GroupingListAdapter.java374
-rw-r--r--src/com/android/dialer/calllog/IntentProvider.java21
-rw-r--r--src/com/android/dialer/calllog/MissedCallNotificationReceiver.java53
-rw-r--r--src/com/android/dialer/calllog/MissedCallNotifier.java290
-rw-r--r--src/com/android/dialer/calllog/PhoneAccountUtils.java48
-rw-r--r--src/com/android/dialer/calllog/PhoneCallDetailsHelper.java186
-rw-r--r--src/com/android/dialer/calllog/PhoneNumberDisplayUtil.java7
-rw-r--r--src/com/android/dialer/calllog/PhoneQuery.java59
-rw-r--r--src/com/android/dialer/calllog/PromoCardViewHolder.java42
-rw-r--r--src/com/android/dialer/calllog/ShowCallHistoryViewHolder.java46
-rw-r--r--src/com/android/dialer/calllog/VisualVoicemailCallLogFragment.java87
-rw-r--r--src/com/android/dialer/calllog/VoicemailQueryHandler.java3
-rw-r--r--src/com/android/dialer/calllog/calllogcache/CallLogCache.java96
-rw-r--r--src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipop.java73
-rw-r--r--src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipopMr1.java (renamed from src/com/android/dialer/calllog/TelecomCallLogCache.java)64
-rw-r--r--src/com/android/dialer/compat/DialerCompatUtils.java31
-rw-r--r--src/com/android/dialer/compat/FilteredNumberCompat.java372
-rw-r--r--src/com/android/dialer/compat/SettingsCompat.java47
-rw-r--r--src/com/android/dialer/compat/UserManagerCompat.java71
-rw-r--r--src/com/android/dialer/contactinfo/ContactInfoCache.java5
-rw-r--r--src/com/android/dialer/contactinfo/ContactPhotoLoader.java120
-rw-r--r--src/com/android/dialer/database/DialerDatabaseHelper.java322
-rw-r--r--src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java273
-rw-r--r--src/com/android/dialer/database/FilteredNumberContract.java163
-rw-r--r--src/com/android/dialer/database/FilteredNumberProvider.java211
-rw-r--r--src/com/android/dialer/database/VoicemailArchiveContract.java203
-rw-r--r--src/com/android/dialer/database/VoicemailArchiveProvider.java218
-rw-r--r--src/com/android/dialer/dialpad/DialpadFragment.java406
-rw-r--r--src/com/android/dialer/dialpad/SmartDialCursorLoader.java1
-rw-r--r--src/com/android/dialer/dialpad/SmartDialNameMatcher.java5
-rw-r--r--src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java320
-rw-r--r--src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java96
-rw-r--r--src/com/android/dialer/filterednumber/BlockedNumbersAutoMigrator.java101
-rw-r--r--src/com/android/dialer/filterednumber/BlockedNumbersFragment.java264
-rw-r--r--src/com/android/dialer/filterednumber/BlockedNumbersMigrator.java135
-rw-r--r--src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java162
-rw-r--r--src/com/android/dialer/filterednumber/FilteredNumbersUtil.java368
-rw-r--r--src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragment.java110
-rw-r--r--src/com/android/dialer/filterednumber/NumbersAdapter.java137
-rw-r--r--src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java57
-rw-r--r--src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java133
-rw-r--r--src/com/android/dialer/interactions/PhoneNumberInteraction.java113
-rw-r--r--src/com/android/dialer/list/AllContactsFragment.java17
-rw-r--r--src/com/android/dialer/list/BlockedListSearchAdapter.java90
-rw-r--r--src/com/android/dialer/list/BlockedListSearchFragment.java244
-rw-r--r--src/com/android/dialer/list/ContentChangedFilter.java40
-rw-r--r--src/com/android/dialer/list/DialerPhoneNumberListAdapter.java28
-rw-r--r--src/com/android/dialer/list/DragDropController.java20
-rw-r--r--src/com/android/dialer/list/ListsFragment.java207
-rw-r--r--src/com/android/dialer/list/PhoneFavoriteListView.java2
-rw-r--r--src/com/android/dialer/list/PhoneFavoriteSquareTileView.java15
-rw-r--r--src/com/android/dialer/list/PhoneFavoritesTileAdapter.java46
-rw-r--r--src/com/android/dialer/list/RegularSearchFragment.java69
-rw-r--r--src/com/android/dialer/list/RegularSearchListAdapter.java40
-rw-r--r--src/com/android/dialer/list/RemoveView.java5
-rw-r--r--src/com/android/dialer/list/SearchFragment.java41
-rw-r--r--src/com/android/dialer/list/SmartDialSearchFragment.java16
-rw-r--r--src/com/android/dialer/list/SpeedDialFragment.java24
-rw-r--r--src/com/android/dialer/logging/InteractionEvent.java76
-rw-r--r--src/com/android/dialer/logging/Logger.java85
-rw-r--r--src/com/android/dialer/logging/ScreenEvent.java172
-rw-r--r--src/com/android/dialer/service/CachedNumberLookupService.java9
-rw-r--r--src/com/android/dialer/service/ExtendedBlockingButtonRenderer.java86
-rw-r--r--src/com/android/dialer/settings/AppCompatPreferenceActivity.java155
-rw-r--r--src/com/android/dialer/settings/DefaultRingtonePreference.java5
-rw-r--r--src/com/android/dialer/settings/DialerSettingsActivity.java140
-rw-r--r--src/com/android/dialer/settings/SoundSettingsFragment.java29
-rw-r--r--src/com/android/dialer/util/AppCompatConstants.java30
-rw-r--r--src/com/android/dialer/util/Assert.java36
-rw-r--r--src/com/android/dialer/util/DialerUtils.java26
-rw-r--r--src/com/android/dialer/util/IntentUtil.java136
-rw-r--r--src/com/android/dialer/util/MoreStrings.java43
-rw-r--r--src/com/android/dialer/util/PhoneLookupUtil.java40
-rw-r--r--src/com/android/dialer/util/PhoneNumberUtil.java53
-rw-r--r--src/com/android/dialer/util/TelecomUtil.java124
-rw-r--r--src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java103
-rw-r--r--src/com/android/dialer/voicemail/VoicemailArchiveActivity.java160
-rw-r--r--src/com/android/dialer/voicemail/VoicemailArchivePlaybackPresenter.java90
-rw-r--r--src/com/android/dialer/voicemail/VoicemailAsyncTaskUtil.java346
-rw-r--r--src/com/android/dialer/voicemail/VoicemailAudioManager.java200
-rw-r--r--src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java328
-rw-r--r--src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java482
-rw-r--r--src/com/android/dialer/voicemail/WiredHeadsetManager.java88
-rw-r--r--src/com/android/dialer/widget/ActionBarController.java17
-rw-r--r--src/com/android/dialer/widget/EmptyContentView.java3
-rw-r--r--src/com/android/dialer/widget/SearchEditTextLayout.java1
-rw-r--r--src/com/android/dialerbind/ObjectFactory.java43
-rw-r--r--tests/Android.mk7
-rw-r--r--tests/AndroidManifest.xml6
-rw-r--r--tests/res/layout/fill_call_log_test.xml20
-rw-r--r--tests/res/values/donottranslate_strings.xml1
-rw-r--r--tests/src/com/android/dialer/CallDetailActivityTest.java62
-rw-r--r--tests/src/com/android/dialer/DialerLaunchPerformance.java3
-rw-r--r--tests/src/com/android/dialer/calllog/CallLogAdapterTest.java810
-rw-r--r--tests/src/com/android/dialer/calllog/CallLogFragmentTest.java658
-rw-r--r--tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java287
-rw-r--r--tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java122
-rw-r--r--tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java137
-rw-r--r--tests/src/com/android/dialer/calllog/CallLogQueryTestUtils.java19
-rw-r--r--tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java137
-rw-r--r--tests/src/com/android/dialer/calllog/GroupingListAdapterTests.java195
-rw-r--r--tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java104
-rw-r--r--tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java270
-rw-r--r--tests/src/com/android/dialer/calllog/PhoneCallDetailsTest.java63
-rw-r--r--tests/src/com/android/dialer/calllog/calllogcache/TestTelecomCallLogCache.java (renamed from tests/src/com/android/dialer/calllog/TestTelecomCallLogCache.java)35
-rw-r--r--tests/src/com/android/dialer/compat/FilteredNumberCompatInstrumentationTest.java92
-rw-r--r--tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java292
-rw-r--r--tests/src/com/android/dialer/compat/UserManagerCompatTest.java44
-rw-r--r--tests/src/com/android/dialer/contactinfo/ContactPhotoLoaderTest.java106
-rw-r--r--tests/src/com/android/dialer/database/DatabaseTestUtils.java82
-rw-r--r--tests/src/com/android/dialer/database/DialerDatabaseHelperTest.java154
-rw-r--r--tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java457
-rw-r--r--tests/src/com/android/dialer/database/FilteredNumberProviderTest.java232
-rw-r--r--tests/src/com/android/dialer/database/SmartDialPrefixTest.java78
-rw-r--r--tests/src/com/android/dialer/database/VoicemailArchiveProviderTest.java306
-rw-r--r--tests/src/com/android/dialer/dialpad/DialpadFragmentInstrumentationTest.java121
-rw-r--r--tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java26
-rw-r--r--tests/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigratorTest.java201
-rw-r--r--tests/src/com/android/dialer/filterednumber/BlockedNumbersFragmentInstrumentationTest.java93
-rw-r--r--tests/src/com/android/dialer/filterednumber/BlockedNumbersMigratorTest.java160
-rw-r--r--tests/src/com/android/dialer/filterednumber/FilteredNumbersUtilTest.java132
-rw-r--r--tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentInstrumentationTest.java93
-rw-r--r--tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentTest.java61
-rw-r--r--tests/src/com/android/dialer/interactions/PhoneNumberInteractionTest.java26
-rw-r--r--tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java250
-rw-r--r--tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java162
-rw-r--r--tests/src/com/android/dialer/voicemail/VoicemailActivityInstrumentationTestCase2.java227
-rw-r--r--tests/src/com/android/dialer/voicemail/VoicemailArchiveTest.java116
-rw-r--r--tests/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtilTest.java388
-rw-r--r--tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java227
-rw-r--r--tools/gradle/android.properties2
-rwxr-xr-xtools/gradle/gradlew204
-rw-r--r--tools/gradle/repositories.properties1
-rw-r--r--tools/gradle/settings.gradle63
830 files changed, 71913 insertions, 6408 deletions
diff --git a/Android.mk b/Android.mk
index 1440fcc3f..eb6cbdc37 100644
--- a/Android.mk
+++ b/Android.mk
@@ -3,10 +3,16 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
-incallui_dir := ../InCallUI
+incallui_dir := InCallUI
contacts_common_dir := ../ContactsCommon
phone_common_dir := ../PhoneCommon
+ifeq ($(TARGET_BUILD_APPS),)
+support_library_root_dir := frameworks/support
+else
+support_library_root_dir := prebuilts/sdk/current/support
+endif
+
src_dirs := src \
$(incallui_dir)/src \
$(contacts_common_dir)/src \
@@ -17,26 +23,37 @@ res_dirs := res \
$(contacts_common_dir)/res \
$(phone_common_dir)/res
+src_dirs += \
+ src-N \
+ $(incallui_dir)/src-N \
+ $(contacts_common_dir)/src-N \
+ $(phone_common_dir)/src-N
+
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs)) \
- frameworks/support/v7/cardview/res frameworks/support/v7/recyclerview/res
+ $(support_library_root_dir)/v7/cardview/res \
+ $(support_library_root_dir)/v7/recyclerview/res \
+ $(support_library_root_dir)/v7/appcompat/res \
+ $(support_library_root_dir)/design/res
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
+ --extra-packages android.support.v7.appcompat \
--extra-packages android.support.v7.cardview \
--extra-packages android.support.v7.recyclerview \
+ --extra-packages android.support.design \
--extra-packages com.android.incallui \
--extra-packages com.android.contacts.common \
--extra-packages com.android.phone.common
-LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := \
android-common \
android-support-v13 \
android-support-v4 \
+ android-support-v7-appcompat \
android-support-v7-cardview \
android-support-v7-recyclerview \
- com.android.services.telephony.common \
+ android-support-design \
com.android.vcard \
guava \
libphonenumber
@@ -47,8 +64,6 @@ LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags $(incallui_dir)/proguard.flags
-# Uncomment the following line to build against the current SDK
-# This is required for building an unbundled app.
LOCAL_SDK_VERSION := current
include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4055b4441..8892c24c1 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,14 +17,13 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.dialer"
coreApp="true"
- android:versionCode="20210"
- android:versionName="2.21">
+ android:versionCode="30000"
+ android:versionName="3.00.00">
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="23" />
-
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
@@ -33,6 +32,7 @@
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
@@ -82,8 +82,9 @@
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:icon="@mipmap/ic_launcher_phone"
- android:enabled="@*android:bool/config_voice_capable"
- android:windowSoftInputMode="stateAlwaysHidden|adjustNothing">
+ android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
+ android:resizeableActivity="true"
+ android:directBootAware="true">
<intent-filter>
<action android:name="android.intent.action.DIAL" />
<category android:name="android.intent.category.DEFAULT" />
@@ -132,7 +133,7 @@
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.TAB" />
</intent-filter>
- <intent-filter android:label="@string/recentCallsIconLabel">
+ <intent-filter android:label="@string/callHistoryIconLabel">
<action android:name="com.android.phone.action.RECENT_CALLS" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.TAB" />
@@ -143,10 +144,22 @@
</activity>
<activity android:name="com.android.dialer.settings.DialerSettingsActivity"
- android:label="@string/dialer_settings_label"
- android:parentActivityName="com.android.dialer.DialtactsActivity"
- android:theme="@style/SettingsStyle"
- android:exported="false">
+ android:label="@string/dialer_settings_label"
+ android:parentActivityName="com.android.dialer.DialtactsActivity"
+ android:theme="@style/SettingsStyle"
+ android:exported="false">
+ </activity>
+
+ <activity android:name="com.android.dialer.filterednumber.BlockedNumbersSettingsActivity"
+ android:label="@string/manage_blocked_numbers_label"
+ android:parentActivityName="com.android.dialer.settings.DialerSettingsActivity"
+ android:theme="@style/ManageBlockedNumbersStyle"
+ android:exported="false">
+ </activity>
+
+ <activity android:name="com.android.dialer.voicemail.VoicemailArchiveActivity"
+ android:label="@string/voicemail_archive_activity_title"
+ android:theme="@style/DialtactsThemeWithoutActionBarOverlay">
</activity>
<activity android:name="com.android.dialer.calllog.CallLogActivity"
@@ -156,11 +169,9 @@
</activity>
<activity android:name="com.android.dialer.CallDetailActivity"
- android:label="@string/callDetailTitle"
- android:theme="@style/CallDetailActivityTheme"
- android:icon="@mipmap/ic_launcher_phone"
- android:parentActivityName="com.android.dialer.calllog.CallLogActivity"
- >
+ android:label="@string/callDetailTitle"
+ android:theme="@style/CallDetailActivityTheme"
+ android:icon="@mipmap/ic_launcher_phone">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
@@ -238,13 +249,15 @@
<activity android:name="com.android.contacts.common.vcard.ExportVCardActivity"
android:theme="@style/BackgroundOnlyTheme"/>
+ <activity android:name="com.android.contacts.common.vcard.ShareVCardActivity"
+ android:theme="@style/BackgroundOnlyTheme" />
+
<service
android:name="com.android.contacts.common.vcard.VCardService"
android:exported="false"/>
<!-- end vCard related -->
- <receiver android:name=".calllog.CallLogReceiver"
- android:enabled="@*android:bool/config_voice_capable">
+ <receiver android:name=".calllog.CallLogReceiver">
<intent-filter>
<action android:name="android.intent.action.NEW_VOICEMAIL" />
<data
@@ -266,9 +279,17 @@
<service
android:name=".calllog.CallLogNotificationsService"
+ android:directBootAware="true"
android:exported="false"
/>
+ <receiver android:name=".calllog.MissedCallNotificationReceiver"
+ android:directBootAware="true">
+ <intent-filter>
+ <action android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" />
+ </intent-filter>
+ </receiver>
+
<!-- Service to update a contact -->
<service
android:name=".contact.ContactUpdateService"
@@ -290,21 +311,51 @@
android:label="@string/phoneAppLabel"
android:excludeFromRecents="true"
android:launchMode="singleInstance"
- android:configChanges="keyboardHidden"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden"
android:exported="false"
- android:screenOrientation="nosensor" >
+ android:screenOrientation="nosensor"
+ android:directBootAware="true"
+ android:resizeableActivity="true">
</activity>
- <!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
- <receiver android:name="com.android.incallui.NotificationBroadcastReceiver"
- android:exported="false" />
-
<service android:name="com.android.incallui.InCallServiceImpl"
- android:permission="android.permission.BIND_INCALL_SERVICE" >
+ android:permission="android.permission.BIND_INCALL_SERVICE"
+ android:directBootAware="true" >
<meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
+ <meta-data android:name="android.telecom.IN_CALL_SERVICE_RINGING"
+ android:value="false"/>
<intent-filter>
<action android:name="android.telecom.InCallService"/>
</intent-filter>
</service>
+
+ <!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
+ <receiver android:name="com.android.incallui.NotificationBroadcastReceiver"
+ android:directBootAware="true"
+ android:exported="false" />
+
+ <provider
+ android:name=".database.FilteredNumberProvider"
+ android:authorities="com.android.dialer.database.filterednumberprovider"
+ android:exported="false"
+ android:multiprocess="false"
+ />
+
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="@string/contacts_file_provider_authority"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_paths" />
+ </provider>
+
+ <provider
+ android:name=".database.VoicemailArchiveProvider"
+ android:authorities="com.android.dialer.database.voicemailarchiveprovider"
+ android:exported="false"
+ android:multiprocess="false"
+ />
</application>
</manifest>
diff --git a/InCallUI/AndroidManifest.xml b/InCallUI/AndroidManifest.xml
new file mode 100644
index 000000000..5c758edaa
--- /dev/null
+++ b/InCallUI/AndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.incallui">
+ <uses-sdk
+ android:minSdkVersion="23"
+ android:targetSdkVersion="23" />
+</manifest>
+
diff --git a/InCallUI/build.gradle b/InCallUI/build.gradle
new file mode 100644
index 000000000..de4725199
--- /dev/null
+++ b/InCallUI/build.gradle
@@ -0,0 +1,14 @@
+apply plugin: 'com.android.library'
+
+android {
+ sourceSets.main {
+ manifest.srcFile 'AndroidManifest.xml'
+ res.srcDirs = ['res']
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:23.1.+'
+ compile project(':phonecommon')
+ compile project(':contactscommon')
+}
diff --git a/InCallUI/proguard.flags b/InCallUI/proguard.flags
new file mode 100644
index 000000000..4e8310ca9
--- /dev/null
+++ b/InCallUI/proguard.flags
@@ -0,0 +1,14 @@
+-keep class com.android.incallui.widget.multiwaveview.* {
+ *;
+}
+
+# Keep names that are used only by animation framework.
+-keepclasseswithmembers class com.android.incallui.AnimationUtils$CrossFadeDrawable {
+ *** setCrossFadeAlpha(...);
+}
+
+# Any class or method annotated with NeededForTesting or NeededForReflection.
+-keepclassmembers class * {
+@com.android.contacts.common.test.NeededForTesting *;
+@com.android.incallui.NeededForReflection *;
+}
diff --git a/InCallUI/res/anim/activity_open_enter.xml b/InCallUI/res/anim/activity_open_enter.xml
new file mode 100644
index 000000000..303b9ddc0
--- /dev/null
+++ b/InCallUI/res/anim/activity_open_enter.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shareInterpolator="false"
+ android:zAdjustment="top">
+ <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
+ android:interpolator="@anim/decelerate_cubic"
+ android:fillEnabled="true"
+ android:fillBefore="false" android:fillAfter="true"
+ android:duration="300"/>
+ <scale android:fromXScale=".8" android:toXScale="1.0"
+ android:fromYScale=".8" android:toYScale="1.0"
+ android:pivotX="50%p" android:pivotY="50%p"
+ android:interpolator="@anim/decelerate_cubic"
+ android:fillEnabled="true"
+ android:fillBefore="false" android:fillAfter="true"
+ android:duration="300"/>
+</set> \ No newline at end of file
diff --git a/InCallUI/res/anim/activity_open_exit.xml b/InCallUI/res/anim/activity_open_exit.xml
new file mode 100644
index 000000000..afa7c5e72
--- /dev/null
+++ b/InCallUI/res/anim/activity_open_exit.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2009, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:background="#ff000000" android:zAdjustment="normal">
+ <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
+ android:fillEnabled="true" android:fillBefore="false" android:fillAfter="true"
+ android:interpolator="@anim/decelerate_quint"
+ android:duration="300"/>
+</set> \ No newline at end of file
diff --git a/InCallUI/res/anim/call_status_pulse.xml b/InCallUI/res/anim/call_status_pulse.xml
new file mode 100644
index 000000000..abda25b73
--- /dev/null
+++ b/InCallUI/res/anim/call_status_pulse.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+ android:fromAlpha="0.5"
+ android:toAlpha="1"
+ android:duration="600"
+ android:repeatCount="infinite"
+ android:repeatMode="reverse" />
diff --git a/InCallUI/res/anim/decelerate_cubic.xml b/InCallUI/res/anim/decelerate_cubic.xml
new file mode 100644
index 000000000..f98809165
--- /dev/null
+++ b/InCallUI/res/anim/decelerate_cubic.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:factor="1.5" />
diff --git a/InCallUI/res/anim/decelerate_quint.xml b/InCallUI/res/anim/decelerate_quint.xml
new file mode 100644
index 000000000..ff2d5a9d0
--- /dev/null
+++ b/InCallUI/res/anim/decelerate_quint.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+
+<decelerateInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
+ android:factor="2.5" />
diff --git a/InCallUI/res/color/ota_title_color.xml b/InCallUI/res/color/ota_title_color.xml
new file mode 100644
index 000000000..14a283a6b
--- /dev/null
+++ b/InCallUI/res/color/ota_title_color.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="#FFA6C839"/>
+</selector>
+
diff --git a/InCallUI/res/color/selectable_icon_tint.xml b/InCallUI/res/color/selectable_icon_tint.xml
new file mode 100644
index 000000000..b8aad1303
--- /dev/null
+++ b/InCallUI/res/color/selectable_icon_tint.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@color/button_disabled_color" android:state_enabled="false" />
+ <item android:color="@color/incall_accent_color" android:state_selected="true" />
+ <item android:color="@color/incall_accent_color" android:state_pressed="true" />
+ <item android:color="@color/button_default_color" />
+</selector>
+
diff --git a/InCallUI/res/drawable-hdpi/fab_blue.png b/InCallUI/res/drawable-hdpi/fab_blue.png
new file mode 100644
index 000000000..8ff3d2918
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_ic_call.png b/InCallUI/res/drawable-hdpi/fab_ic_call.png
new file mode 100644
index 000000000..548a391a6
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_ic_end_call.png b/InCallUI/res/drawable-hdpi/fab_ic_end_call.png
new file mode 100644
index 000000000..b7f54d3bb
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_ic_message.png b/InCallUI/res/drawable-hdpi/fab_ic_message.png
new file mode 100644
index 000000000..a1cf2ad82
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/fab_red.png b/InCallUI/res/drawable-hdpi/fab_red.png
new file mode 100644
index 000000000..497cc7916
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..d10ebb766
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.png
new file mode 100644
index 000000000..757d339c4
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.png
new file mode 100644
index 000000000..4e3dbf55d
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_call_white_24dp.png
new file mode 100644
index 000000000..1902e721b
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_forward_white_24dp.png
new file mode 100644
index 000000000..a0711d377
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_hd_24dp.png b/InCallUI/res/drawable-hdpi/ic_hd_24dp.png
new file mode 100644
index 000000000..35bf51a4f
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..7c281c3f5
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 000000000..983c45e2c
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 000000000..a2177f58a
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.png
new file mode 100644
index 000000000..f3581d104
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-hdpi/ic_toolbar_add_call.png
new file mode 100644
index 000000000..06603f21c
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 000000000..ea02daad2
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 000000000..05e19bc25
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 000000000..413fdff26
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 000000000..90ee1fb5f
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.png
new file mode 100644
index 000000000..69ece11be
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-hdpi/ic_toolbar_hold.png
new file mode 100644
index 000000000..f32d6d552
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-hdpi/ic_toolbar_merge.png
new file mode 100644
index 000000000..2871555e4
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.png
new file mode 100644
index 000000000..b142ca869
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 000000000..c934b1344
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-hdpi/ic_toolbar_swap.png
new file mode 100644
index 000000000..e673f3251
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_video.png b/InCallUI/res/drawable-hdpi/ic_toolbar_video.png
new file mode 100644
index 000000000..cef47aaff
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-hdpi/ic_toolbar_video_off.png
new file mode 100644
index 000000000..968ded7d8
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.png
new file mode 100644
index 000000000..cdd623dc0
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_business.png b/InCallUI/res/drawable-hdpi/img_business.png
new file mode 100644
index 000000000..f70634262
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_conference.png b/InCallUI/res/drawable-hdpi/img_conference.png
new file mode 100644
index 000000000..3d9f683a5
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_no_image.png b/InCallUI/res/drawable-hdpi/img_no_image.png
new file mode 100644
index 000000000..fd0ab3211
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/img_phone.png b/InCallUI/res/drawable-hdpi/img_phone.png
new file mode 100644
index 000000000..748312e6e
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-land/rounded_call_card_background.xml b/InCallUI/res/drawable-land/rounded_call_card_background.xml
new file mode 100644
index 000000000..f41ecda79
--- /dev/null
+++ b/InCallUI/res/drawable-land/rounded_call_card_background.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/incall_call_banner_background_color" />
+ <corners
+ android:radius="4dp" />
+</shape> \ No newline at end of file
diff --git a/InCallUI/res/drawable-mdpi/fab_blue.png b/InCallUI/res/drawable-mdpi/fab_blue.png
new file mode 100644
index 000000000..2ca6b4bdf
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_ic_call.png b/InCallUI/res/drawable-mdpi/fab_ic_call.png
new file mode 100644
index 000000000..ff7b345e1
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_ic_end_call.png b/InCallUI/res/drawable-mdpi/fab_ic_end_call.png
new file mode 100644
index 000000000..76ce3973d
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_ic_message.png b/InCallUI/res/drawable-mdpi/fab_ic_message.png
new file mode 100644
index 000000000..74876fe77
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/fab_red.png b/InCallUI/res/drawable-mdpi/fab_red.png
new file mode 100644
index 000000000..c9e76a057
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..7b9227c06
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.png
new file mode 100644
index 000000000..17eb4824e
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.png
new file mode 100644
index 000000000..cb7ee1f35
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_call_white_24dp.png
new file mode 100644
index 000000000..d4e5f5d7d
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_forward_white_24dp.png
new file mode 100644
index 000000000..65f73299f
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_hd_24dp.png b/InCallUI/res/drawable-mdpi/ic_hd_24dp.png
new file mode 100644
index 000000000..30938fe4d
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..933eb5148
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 000000000..056c3f175
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 000000000..7dc920b2b
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.png
new file mode 100644
index 000000000..501ee842e
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-mdpi/ic_toolbar_add_call.png
new file mode 100644
index 000000000..1ee2fb1f5
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 000000000..c39990deb
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 000000000..a6634ed66
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 000000000..b387e850a
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 000000000..b4d887cf3
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.png
new file mode 100644
index 000000000..9baa21b95
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-mdpi/ic_toolbar_hold.png
new file mode 100644
index 000000000..c8372738b
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-mdpi/ic_toolbar_merge.png
new file mode 100644
index 000000000..2fba86514
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.png
new file mode 100644
index 000000000..c6b02b82c
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 000000000..008e245f8
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-mdpi/ic_toolbar_swap.png
new file mode 100644
index 000000000..acc9850d5
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_video.png b/InCallUI/res/drawable-mdpi/ic_toolbar_video.png
new file mode 100644
index 000000000..3f13f9c31
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-mdpi/ic_toolbar_video_off.png
new file mode 100644
index 000000000..64a69f2a7
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.png
new file mode 100644
index 000000000..6d097c9e7
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_business.png b/InCallUI/res/drawable-mdpi/img_business.png
new file mode 100644
index 000000000..90738a7ee
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_conference.png b/InCallUI/res/drawable-mdpi/img_conference.png
new file mode 100644
index 000000000..0694dbd55
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_no_image.png b/InCallUI/res/drawable-mdpi/img_no_image.png
new file mode 100644
index 000000000..014a1c414
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/img_phone.png b/InCallUI/res/drawable-mdpi/img_phone.png
new file mode 100644
index 000000000..41a1d339d
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_blue.png b/InCallUI/res/drawable-xhdpi/fab_blue.png
new file mode 100644
index 000000000..300b07eb4
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_ic_call.png b/InCallUI/res/drawable-xhdpi/fab_ic_call.png
new file mode 100644
index 000000000..2bff65e0a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_ic_end_call.png b/InCallUI/res/drawable-xhdpi/fab_ic_end_call.png
new file mode 100644
index 000000000..1c95e175a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_ic_message.png b/InCallUI/res/drawable-xhdpi/fab_ic_message.png
new file mode 100644
index 000000000..5e3334ae0
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/fab_red.png b/InCallUI/res/drawable-xhdpi/fab_red.png
new file mode 100644
index 000000000..373e49e8f
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..e5630455a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.png
new file mode 100644
index 000000000..b00d82edd
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.png
new file mode 100644
index 000000000..218cb1214
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_call_white_24dp.png
new file mode 100644
index 000000000..cde9cea3a
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.png
new file mode 100644
index 000000000..7a5df52bf
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_hd_24dp.png b/InCallUI/res/drawable-xhdpi/ic_hd_24dp.png
new file mode 100644
index 000000000..4c954d86f
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..814ca8ddc
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 000000000..cbd039afd
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 000000000..a8becf485
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.png
new file mode 100644
index 000000000..2e27936a4
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.png
new file mode 100644
index 000000000..b251d6bd8
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 000000000..cdaa79d37
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 000000000..88f6bb945
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 000000000..1acfcafbd
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 000000000..0ba8f1e3e
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.png
new file mode 100644
index 000000000..cf803d1c1
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_hold.png
new file mode 100644
index 000000000..8fecf7514
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_merge.png
new file mode 100644
index 000000000..777483eb0
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.png
new file mode 100644
index 000000000..cf2041ad6
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 000000000..5b5831cc0
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_swap.png
new file mode 100644
index 000000000..38917cb88
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_video.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_video.png
new file mode 100644
index 000000000..b20f50498
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.png
new file mode 100644
index 000000000..1b269a6a7
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.png
new file mode 100644
index 000000000..fae6bfdb1
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_business.png b/InCallUI/res/drawable-xhdpi/img_business.png
new file mode 100644
index 000000000..7b04d956f
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_conference.png b/InCallUI/res/drawable-xhdpi/img_conference.png
new file mode 100644
index 000000000..b0dbcc2dc
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_no_image.png b/InCallUI/res/drawable-xhdpi/img_no_image.png
new file mode 100644
index 000000000..4022207d0
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/img_phone.png b/InCallUI/res/drawable-xhdpi/img_phone.png
new file mode 100644
index 000000000..2e0ceec0f
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_blue.png b/InCallUI/res/drawable-xxhdpi/fab_blue.png
new file mode 100644
index 000000000..76d68ac6a
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_ic_call.png b/InCallUI/res/drawable-xxhdpi/fab_ic_call.png
new file mode 100644
index 000000000..a756b95ad
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_ic_end_call.png b/InCallUI/res/drawable-xxhdpi/fab_ic_end_call.png
new file mode 100644
index 000000000..37e826402
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_ic_message.png b/InCallUI/res/drawable-xxhdpi/fab_ic_message.png
new file mode 100644
index 000000000..66984b1e3
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/fab_red.png b/InCallUI/res/drawable-xxhdpi/fab_red.png
new file mode 100644
index 000000000..92eb979d5
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..7dfc8dc52
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.png
new file mode 100644
index 000000000..aeabe4a81
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.png
new file mode 100644
index 000000000..5ea577716
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.png
new file mode 100644
index 000000000..b761bc466
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_call_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.png
new file mode 100644
index 000000000..7bd5b1635
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_hd_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_hd_24dp.png
new file mode 100644
index 000000000..dd08bbbec
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..078b10d4f
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png
new file mode 100644
index 000000000..c0edd91c8
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_lockscreen_glowdot.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.png
new file mode 100644
index 000000000..baf0cf27f
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_phone_paused_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.png
new file mode 100644
index 000000000..bfc72736a
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.png
new file mode 100644
index 000000000..6e343c74e
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 000000000..737704018
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 000000000..b8a385d14
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 000000000..62d0ae331
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 000000000..0e88501d6
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.png
new file mode 100644
index 000000000..a754f6875
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.png
new file mode 100644
index 000000000..f3757a8b5
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.png
new file mode 100644
index 000000000..5d046008c
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.png
new file mode 100644
index 000000000..ae41d5c35
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 000000000..d1bbb0947
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.png
new file mode 100644
index 000000000..ea9127ee2
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_video.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video.png
new file mode 100644
index 000000000..5c52dd6c6
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.png
new file mode 100644
index 000000000..898b7c04d
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.png
new file mode 100644
index 000000000..4380a47ca
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_business.png b/InCallUI/res/drawable-xxhdpi/img_business.png
new file mode 100644
index 000000000..c17e4c9d8
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_conference.png b/InCallUI/res/drawable-xxhdpi/img_conference.png
new file mode 100644
index 000000000..a8dba5ed0
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_no_image.png b/InCallUI/res/drawable-xxhdpi/img_no_image.png
new file mode 100644
index 000000000..2cf7f23a0
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/img_phone.png b/InCallUI/res/drawable-xxhdpi/img_phone.png
new file mode 100644
index 000000000..4eaaba509
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_blue.png b/InCallUI/res/drawable-xxxhdpi/fab_blue.png
new file mode 100644
index 000000000..1dd8a9260
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_blue.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_ic_call.png b/InCallUI/res/drawable-xxxhdpi/fab_ic_call.png
new file mode 100644
index 000000000..7af3396b4
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_ic_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.png b/InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.png
new file mode 100644
index 000000000..aabdadec2
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_ic_end_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_ic_message.png b/InCallUI/res/drawable-xxxhdpi/fab_ic_message.png
new file mode 100644
index 000000000..c5a108aba
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_ic_message.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/fab_red.png b/InCallUI/res/drawable-xxxhdpi/fab_red.png
new file mode 100644
index 000000000..f1b36f70b
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/fab_red.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png
new file mode 100644
index 000000000..c9aea72ce
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_business_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.png
new file mode 100644
index 000000000..a6e8a7bc1
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_call_end_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.png
new file mode 100644
index 000000000..600cec8e6
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_call_split_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.png
new file mode 100644
index 000000000..428009cfe
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_forward_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.png
new file mode 100644
index 000000000..3f87b882e
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_hd_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png
new file mode 100644
index 000000000..8bcb6f620
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_location_on_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.png b/InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.png
new file mode 100644
index 000000000..b94f4dfa1
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_schedule_white_24dp.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.png
new file mode 100644
index 000000000..c97e4bb15
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_add_call.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.png
new file mode 100644
index 000000000..1c11c5d0f
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_arrow_whitespace.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.png
new file mode 100644
index 000000000..f7fa12c8b
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_bluetooth.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.png
new file mode 100644
index 000000000..8199701ce
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_headphones.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.png
new file mode 100644
index 000000000..ee14ea67a
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_audio_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.png
new file mode 100644
index 000000000..e537112fb
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_dialpad.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.png
new file mode 100644
index 000000000..883d0d609
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_hold.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.png
new file mode 100644
index 000000000..4b6437507
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_merge.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.png
new file mode 100644
index 000000000..2d8f279da
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_mic_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.png
new file mode 100644
index 000000000..0560bb262
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_speaker_on.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.png
new file mode 100644
index 000000000..6f03b3f66
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_swap.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.png
new file mode 100644
index 000000000..0797fd019
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.png
new file mode 100644
index 000000000..63f742bef
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_off.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.png b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.png
new file mode 100644
index 000000000..77ff73cdb
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/ic_toolbar_video_switch.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_business.png b/InCallUI/res/drawable-xxxhdpi/img_business.png
new file mode 100644
index 000000000..88f14e999
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_business.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_conference.png b/InCallUI/res/drawable-xxxhdpi/img_conference.png
new file mode 100644
index 000000000..eb42b5552
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_conference.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_no_image.png b/InCallUI/res/drawable-xxxhdpi/img_no_image.png
new file mode 100644
index 000000000..216574222
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_no_image.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxxhdpi/img_phone.png b/InCallUI/res/drawable-xxxhdpi/img_phone.png
new file mode 100644
index 000000000..7cbfbd75e
--- /dev/null
+++ b/InCallUI/res/drawable-xxxhdpi/img_phone.png
Binary files differ
diff --git a/InCallUI/res/drawable/btn_add.xml b/InCallUI/res/drawable/btn_add.xml
new file mode 100644
index 000000000..7d5e90f71
--- /dev/null
+++ b/InCallUI/res/drawable/btn_add.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_add_call"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_background.xml b/InCallUI/res/drawable/btn_background.xml
new file mode 100644
index 000000000..597885803
--- /dev/null
+++ b/InCallUI/res/drawable/btn_background.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Background resource for "compound buttons" in the in-call UI.
+ These buttons have two states (checked and unchecked), and
+ show a blue bar along the bottom edge when checked. -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/incall_accent_color">
+ <item>
+ <selector>
+
+ <item android:state_focused="true"
+ android:drawable="@drawable/btn_unselected_focused" />
+
+ <item android:drawable="@drawable/btn_unselected" />
+
+ </selector>
+ </item>
+</ripple>
diff --git a/InCallUI/res/drawable/btn_change_to_video.xml b/InCallUI/res/drawable/btn_change_to_video.xml
new file mode 100644
index 000000000..a26cee3e9
--- /dev/null
+++ b/InCallUI/res/drawable/btn_change_to_video.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_video"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_change_to_voice.xml b/InCallUI/res/drawable/btn_change_to_voice.xml
new file mode 100644
index 000000000..86a7f21d5
--- /dev/null
+++ b/InCallUI/res/drawable/btn_change_to_voice.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_audio_phone"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_compound_audio.xml b/InCallUI/res/drawable/btn_compound_audio.xml
new file mode 100644
index 000000000..25a64a6ab
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_audio.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Layers used to render the in-call "Audio mode" compound button.
+
+ This is a multi-mode button:
+
+ - If no bluetooth headset is connected, it behaves like a simple
+ "compound button" that switches the speaker on and off. (This is why
+ the button itself is a ToggleButton instance.)
+
+ - But if a bluetooth headset is connected, this becomes a simple
+ action button (with no concept of a "checked" state) that brings
+ up a popup menu offering you a 3-way choice between earpiece /
+ speaker / bluetooth.
+
+ See InCallTouchUi.updateAudioButton() for the corresponding code. -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background, used to distinguish
+ between the "checked" and "unchecked" states when this button is
+ simply an on/off toggle for the speaker.
+ (In states where the audio button *not* a toggle, we explicitly
+ hide this layer.) -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- The little triangle that indicates that this isn't a plain
+ button, but will instead pop up a menu. This layer is *not*
+ shown when the audio button is simply an on/off toggle. -->
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full
+ size of the button. -->
+ <item android:id="@+id/moreIndicatorItem">
+ <bitmap android:src="@drawable/ic_toolbar_arrow_whitespace"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+ <!-- Finally, the button icon.
+
+ When the audio button is simply an on/off toggle for the speaker,
+ the icon is a "speakerphone" regardless of whether the speaker is
+ active. (Instead, the "on/off" indication comes from the
+ btn_compound_background selector.)
+
+ But when the audio button is connected to the 3-way popup menu,
+ we use the button's icon to indicate the current audio mode
+ (i.e. one of { earpiece (or wired headset) , speaker , bluetooth }).
+
+ Here we have separate layers for each possible foreground icon,
+ and in InCallTouchUi.updateAudioButton() we hide them all
+ *except* the one needed for the current state. -->
+
+ <!-- These all use an explicit <bitmap> to avoid scaling the icon up
+ to the full size of the button. -->
+
+ <!-- Bluetooth is active -->
+ <item android:id="@+id/bluetoothItem">
+ <bitmap android:src="@drawable/ic_toolbar_audio_bluetooth"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+
+ <!-- Handset earpiece is active -->
+ <item android:id="@+id/handsetItem">
+ <bitmap android:src="@drawable/ic_toolbar_audio_phone"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+ <!-- Speakerphone icon showing 'speaker on' state -->
+ <item android:id="@+id/speakerphoneItem">
+ <bitmap android:src="@drawable/ic_toolbar_speaker_on"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_background.xml b/InCallUI/res/drawable/btn_compound_background.xml
new file mode 100644
index 000000000..20e2a3056
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_background.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Background resource for "compound buttons" in the in-call UI.
+ These buttons have two states (selected and unselected). -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/incall_accent_color">
+ <item>
+ <selector>
+ <item android:state_selected="true" android:state_focused="true"
+ android:drawable="@drawable/btn_selected_focused" />
+
+ <item android:state_focused="true"
+ android:drawable="@drawable/btn_unselected_focused" />
+
+ <item android:state_selected="true"
+ android:drawable="@drawable/btn_selected" />
+
+ <item android:drawable="@drawable/btn_unselected" />
+ </selector>
+ </item>
+</ripple>
diff --git a/InCallUI/res/drawable/btn_compound_dialpad.xml b/InCallUI/res/drawable/btn_compound_dialpad.xml
new file mode 100644
index 000000000..1b78ead44
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_dialpad.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Layers used to render the in-call "Dialpad" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- ...and the actual icon on top. Use an explicit <bitmap> to avoid scaling
+ the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_dialpad"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_hold.xml b/InCallUI/res/drawable/btn_compound_hold.xml
new file mode 100644
index 000000000..7974efae5
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_hold.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Layers used to render the in-call "Hold" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- ...and the actual icon on top. Use an explicit <bitmap> to avoid scaling
+ the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_hold"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_mute.xml b/InCallUI/res/drawable/btn_compound_mute.xml
new file mode 100644
index 000000000..86708fb0c
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_mute.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Layers used to render the in-call "Mute" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_mic_off"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_video_off.xml b/InCallUI/res/drawable/btn_compound_video_off.xml
new file mode 100644
index 000000000..b942cd0c3
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_video_off.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Layers used to render the in-call "Mute" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_video_off"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_compound_video_switch.xml b/InCallUI/res/drawable/btn_compound_video_switch.xml
new file mode 100644
index 000000000..f8111866e
--- /dev/null
+++ b/InCallUI/res/drawable/btn_compound_video_switch.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Layers used to render the in-call "Mute" compound button. -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- The standard "compound button" background. -->
+ <item android:id="@+id/compoundBackgroundItem"
+ android:drawable="@drawable/btn_compound_background" />
+
+ <!-- Use an explicit <bitmap> to avoid scaling the icon up to the full size of the button. -->
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_video_switch"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint"
+ android:autoMirrored="true" />
+ </item>
+
+</layer-list>
diff --git a/InCallUI/res/drawable/btn_merge.xml b/InCallUI/res/drawable/btn_merge.xml
new file mode 100644
index 000000000..2b4818a47
--- /dev/null
+++ b/InCallUI/res/drawable/btn_merge.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_merge"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_overflow.xml b/InCallUI/res/drawable/btn_overflow.xml
new file mode 100644
index 000000000..2eb26cc14
--- /dev/null
+++ b/InCallUI/res/drawable/btn_overflow.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_overflow_menu"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/res/drawable/tab_recents.xml b/InCallUI/res/drawable/btn_selected.xml
index b1a531840..1446e4163 100644
--- a/res/drawable/tab_recents.xml
+++ b/InCallUI/res/drawable/btn_selected.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
+
<!--
~ Copyright (C) 2014 The Android Open Source Project
~
@@ -15,16 +16,10 @@
~ limitations under the License
-->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/tab_ripple_color">
-
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
- <bitmap android:src="@drawable/ic_schedule_24dp"
- android:gravity="center" />
+ <shape android:shape="oval">
+ <solid android:color="@color/button_selected_color" />
+ </shape>
</item>
-
- <item android:id="@android:id/mask">
- <color android:color="@android:color/white" />
- </item>
-
-</ripple>
+</layer-list> \ No newline at end of file
diff --git a/res/drawable/tab_contacts.xml b/InCallUI/res/drawable/btn_selected_focused.xml
index ed3f86b9b..2eda9bf8b 100644
--- a/res/drawable/tab_contacts.xml
+++ b/InCallUI/res/drawable/btn_selected_focused.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
+
<!--
~ Copyright (C) 2014 The Android Open Source Project
~
@@ -15,16 +16,14 @@
~ limitations under the License
-->
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/tab_ripple_color">
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/btn_selected" />
<item>
- <bitmap android:src="@drawable/ic_people_24dp"
- android:gravity="center" />
- </item>
-
- <item android:id="@android:id/mask">
- <color android:color="@android:color/white" />
+ <shape android:shape="oval" >
+ <stroke
+ android:width="4dp"
+ android:color="@color/focus_color" />
+ </shape>
</item>
-
-</ripple>
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_swap.xml b/InCallUI/res/drawable/btn_swap.xml
new file mode 100644
index 000000000..5d6c8ecaf
--- /dev/null
+++ b/InCallUI/res/drawable/btn_swap.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@+id/backgroundItem"
+ android:drawable="@drawable/btn_background" />
+
+ <item>
+ <bitmap android:src="@drawable/ic_toolbar_swap"
+ android:gravity="center"
+ android:tint="@color/selectable_icon_tint" />
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_unselected.xml b/InCallUI/res/drawable/btn_unselected.xml
new file mode 100644
index 000000000..aed995cec
--- /dev/null
+++ b/InCallUI/res/drawable/btn_unselected.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item>
+ <shape android:shape="oval">
+ <solid android:color="@color/incall_background_color" />
+ </shape>
+ </item>
+</layer-list> \ No newline at end of file
diff --git a/InCallUI/res/drawable/btn_unselected_focused.xml b/InCallUI/res/drawable/btn_unselected_focused.xml
new file mode 100644
index 000000000..66075d427
--- /dev/null
+++ b/InCallUI/res/drawable/btn_unselected_focused.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:drawable="@drawable/btn_unselected" />
+ <item>
+ <shape android:shape="oval" >
+ <stroke
+ android:width="4dp"
+ android:color="@color/focus_color" />
+ </shape>
+ </item>
+</layer-list> \ No newline at end of file
diff --git a/res/drawable/tab_speed_dial.xml b/InCallUI/res/drawable/conference_ripple.xml
index c9c4820b3..4e4a21304 100644
--- a/res/drawable/tab_speed_dial.xml
+++ b/InCallUI/res/drawable/conference_ripple.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2014 The Android Open Source Project
~
@@ -16,15 +15,11 @@
-->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/tab_ripple_color">
-
+ android:color="@color/ripple_light">
+ <!-- Constrain the ripple to a rectangular area -->
<item>
- <bitmap android:src="@drawable/ic_grade_24dp"
- android:gravity="center" />
- </item>
-
- <item android:id="@android:id/mask">
- <color android:color="@android:color/white" />
+ <shape android:shape="rectangle">
+ <solid android:color="@color/background_dialer_white" />
+ </shape>
</item>
-
-</ripple>
+</ripple> \ No newline at end of file
diff --git a/InCallUI/res/drawable/end_call_background.xml b/InCallUI/res/drawable/end_call_background.xml
new file mode 100644
index 000000000..c43deac4f
--- /dev/null
+++ b/InCallUI/res/drawable/end_call_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Background drawable used to render the "end call" button. -->
+<ripple xmlns:android="http://schemas.android.com/apk/res/android"
+ android:color="@color/end_call_touch_feedback_tint">
+ <item android:id="@android:id/mask">
+ <shape android:shape="oval">
+ <solid android:color="@android:color/white" />
+ </shape>
+ </item>
+</ripple>
diff --git a/InCallUI/res/drawable/ic_incall_audio_handle.xml b/InCallUI/res/drawable/ic_incall_audio_handle.xml
new file mode 100644
index 000000000..2e71a5b70
--- /dev/null
+++ b/InCallUI/res/drawable/ic_incall_audio_handle.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Touch handle for the GlowPadView widget on the incoming call screen -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Audio call icon on tinted floating action bar background. -->
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="false">
+ <layer-list>
+ <item>
+ <bitmap
+ android:src="@drawable/fab_blue"
+ android:tint="@color/glowpad_incoming_widget_background_tint" />
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_call"
+ android:tint="@color/glowpad_incoming_widget_tint" />
+ </item>
+ </layer-list>
+ </item>
+
+</selector>
diff --git a/InCallUI/res/drawable/ic_incall_video_handle.xml b/InCallUI/res/drawable/ic_incall_video_handle.xml
new file mode 100644
index 000000000..a24e305c4
--- /dev/null
+++ b/InCallUI/res/drawable/ic_incall_video_handle.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Touch handle for the GlowPadView widget on the incoming call screen -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- Video call icon on tinted floating action bar background. -->
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="false">
+ <layer-list>
+ <item>
+ <bitmap
+ android:src="@drawable/fab_blue"
+ android:tint="@color/glowpad_incoming_widget_background_tint" />
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_videocam"
+ android:tint="@color/glowpad_incoming_widget_tint" />
+ </item>
+ </layer-list>
+ </item>
+
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer.xml b/InCallUI/res/drawable/ic_lockscreen_answer.xml
new file mode 100644
index 000000000..3184111fb
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml
new file mode 100644
index 000000000..f22b87e34
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_green"/>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_call"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml
new file mode 100644
index 000000000..31b884f99
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_normal_layer.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_call"
+ android:tint="@color/glowpad_call_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_video.xml b/InCallUI/res/drawable/ic_lockscreen_answer_video.xml
new file mode 100644
index 000000000..05577979a
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_video.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_video_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_video_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_video_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml
new file mode 100644
index 000000000..7895e1b6d
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_video_activated_layer.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_blue" />
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_videocam"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml
new file mode 100644
index 000000000..793a36e10
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_answer_video_normal_layer.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_videocam"
+ android:tint="@color/glowpad_call_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline.xml b/InCallUI/res/drawable/ic_lockscreen_decline.xml
new file mode 100644
index 000000000..6643816d9
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_normal_layer" />
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_decline_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml
new file mode 100644
index 000000000..096c32b4a
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_activated_layer.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_red" />
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_end_call"
+ android:tint="@color/glowpad_widget_active_color" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml
new file mode 100644
index 000000000..4da5f8d66
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_normal_layer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_end_call"
+ android:tint="@color/glowpad_end_call_widget_normal_tint" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_video.xml b/InCallUI/res/drawable/ic_lockscreen_decline_video.xml
new file mode 100644
index 000000000..cedd49757
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_video.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_video_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_decline_video_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_decline_video_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml
new file mode 100644
index 000000000..0790aed19
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_video_activated_layer.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@drawable/fab_red" />
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_toolbar_video_off"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml
new file mode 100644
index 000000000..e3b89b947
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_decline_video_normal_layer.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_toolbar_video_off"
+ android:tint="@color/glowpad_end_call_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_outerring.xml b/InCallUI/res/drawable/ic_lockscreen_outerring.xml
new file mode 100644
index 000000000..489515fbc
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_outerring.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="oval">
+ <size android:height="@dimen/glowpadview_outerring_diameter"
+ android:width="@dimen/glowpadview_outerring_diameter" />
+ <stroke android:color="@color/glowpad_outer_ring_color" android:width="1dp" />
+</shape>
diff --git a/InCallUI/res/drawable/ic_lockscreen_text.xml b/InCallUI/res/drawable/ic_lockscreen_text.xml
new file mode 100644
index 000000000..f9caac818
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_text.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Used with incoming call wigdet. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_text_normal_layer" />
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_text_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_text_activated_layer" />
+</selector>
diff --git a/InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml
new file mode 100644
index 000000000..a74e36b31
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_text_activated_layer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <stroke android:color="@color/glowpad_text_widget_ring_color" android:width="1dp"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_message"
+ android:tint="@color/glowpad_widget_active_color"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml b/InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml
new file mode 100644
index 000000000..be32d0baa
--- /dev/null
+++ b/InCallUI/res/drawable/ic_lockscreen_text_normal_layer.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- A fake circle to fix the size of this layer asset. -->
+ <item>
+ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
+ <solid android:color="#00000000"/>
+ <size
+ android:width="@dimen/incoming_call_widget_circle_size"
+ android:height="@dimen/incoming_call_widget_circle_size" />
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/fab_ic_message"
+ android:tint="@color/glowpad_text_widget_normal_tint"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/InCallUI/res/drawable/img_conference_automirrored.xml b/InCallUI/res/drawable/img_conference_automirrored.xml
new file mode 100644
index 000000000..fa1fd4920
--- /dev/null
+++ b/InCallUI/res/drawable/img_conference_automirrored.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/img_conference"
+ android:autoMirrored="true" /> \ No newline at end of file
diff --git a/InCallUI/res/drawable/img_no_image_automirrored.xml b/InCallUI/res/drawable/img_no_image_automirrored.xml
new file mode 100644
index 000000000..f0cf0db31
--- /dev/null
+++ b/InCallUI/res/drawable/img_no_image_automirrored.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/img_no_image"
+ android:autoMirrored="true" /> \ No newline at end of file
diff --git a/InCallUI/res/drawable/incoming_sms_background.xml b/InCallUI/res/drawable/incoming_sms_background.xml
new file mode 100644
index 000000000..81ff21c61
--- /dev/null
+++ b/InCallUI/res/drawable/incoming_sms_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners
+ android:topLeftRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:topRightRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomRightRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomLeftRadius="@dimen/person_contact_context_message_background_accent_radius"/>
+ <solid android:color="@color/person_contact_context_message_background_color" />
+</shape>
diff --git a/InCallUI/res/drawable/outgoing_sms_background.xml b/InCallUI/res/drawable/outgoing_sms_background.xml
new file mode 100644
index 000000000..e4f868fea
--- /dev/null
+++ b/InCallUI/res/drawable/outgoing_sms_background.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners
+ android:topLeftRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:topRightRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomLeftRadius="@dimen/person_contact_context_message_background_main_radius"
+ android:bottomRightRadius="@dimen/person_contact_context_message_background_accent_radius"/>
+ <solid android:color="@color/person_contact_context_message_background_color" />
+</shape>
diff --git a/InCallUI/res/drawable/subject_bubble.xml b/InCallUI/res/drawable/subject_bubble.xml
new file mode 100644
index 000000000..adab67833
--- /dev/null
+++ b/InCallUI/res/drawable/subject_bubble.xml
@@ -0,0 +1,22 @@
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#ffffff" />
+ <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
+ <corners android:topLeftRadius="6dp" android:topRightRadius="6dp"
+ android:bottomLeftRadius="0dp" android:bottomRightRadius="6dp"/>
+</shape> \ No newline at end of file
diff --git a/InCallUI/res/layout-h400dp/call_card_fragment.xml b/InCallUI/res/layout-h400dp/call_card_fragment.xml
new file mode 100644
index 000000000..2ef6e52da
--- /dev/null
+++ b/InCallUI/res/layout-h400dp/call_card_fragment.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <!-- Primary "call card" block, for the foreground call. -->
+ <LinearLayout
+ android:id="@+id/primary_call_info_container"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:elevation="@dimen/primary_call_elevation"
+ android:background="@color/incall_call_banner_background_color"
+ android:paddingTop="@dimen/call_banner_primary_call_container_top_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:gravity="bottom">
+
+ <include layout="@layout/primary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:minHeight="@dimen/call_banner_height"
+ android:animateLayoutChanges="true"
+ android:gravity="center" />
+
+ <fragment android:name="com.android.incallui.CallButtonFragment"
+ android:id="@+id/callButtonFragment"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="2">
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/call_card_content">
+
+ <!-- Contact photo for primary call info -->
+ <ImageView android:id="@+id/photoLarge"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:importantForAccessibility="no"
+ android:background="@color/incall_photo_background_color"
+ android:src="@drawable/img_no_image_automirrored" />
+
+ <!-- Call context -->
+ <LinearLayout
+ android:id="@+id/contact_context"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@color/incall_background_color"
+ android:visibility="gone">
+ <TextView android:id="@+id/contactContextTitle"
+ android:textSize="@dimen/contact_context_title_text_size"
+ android:textColor="@color/contact_context_title_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="@dimen/contact_context_title_margin_bottom"/>
+ <ListView android:id="@+id/contactContextInfo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"
+ android:dividerHeight="@dimen/contact_context_list_item_padding"/>
+ </LinearLayout>
+ </FrameLayout>
+
+ <fragment android:name="com.android.incallui.VideoCallFragment"
+ android:id="@+id/videoCallFragment"
+ android:layout_alignParentTop="true"
+ android:layout_gravity="top|center_horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- Progress spinner, useful for indicating pending operations such as upgrade to video. -->
+ <FrameLayout
+ android:id="@+id/progressSpinner"
+ android:background="#63000000"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:visibility="gone">
+
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.ProgressBar"
+ android:layout_gravity="center"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:indeterminate="true" />
+
+ </FrameLayout>
+
+
+ <include layout="@layout/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <!-- Placeholder for various fragments that are added dynamically underneath the caller info. -->
+ <FrameLayout
+ android:id="@+id/answer_and_dialpad_container"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_alignParentBottom="true"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:elevation="@dimen/dialpad_elevation" />
+
+ <FrameLayout
+ android:id="@+id/floating_end_call_action_button_container"
+ android:layout_width="@dimen/end_call_floating_action_button_diameter"
+ android:layout_height="@dimen/end_call_floating_action_button_diameter"
+ android:background="@drawable/fab_red"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="@dimen/end_call_button_margin_bottom">
+
+ <ImageButton android:id="@+id/floating_end_call_action_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/end_call_background"
+ android:src="@drawable/fab_ic_end_call"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText" />
+
+ </FrameLayout>
+
+ <TextView android:id="@+id/connectionServiceMessage"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:visibility="gone"
+ android:padding="@dimen/call_banner_side_padding"
+ android:background="@android:color/white" />
+
+ </RelativeLayout>
+
+ </LinearLayout>
+ <!-- Secondary "Call info" block, for the background ("on hold") call. -->
+ <include layout="@layout/secondary_call_info" />
+</RelativeLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout-h600dp/manage_conference_call_button.xml b/InCallUI/res/layout-h600dp/manage_conference_call_button.xml
new file mode 100644
index 000000000..9a83313ac
--- /dev/null
+++ b/InCallUI/res/layout-h600dp/manage_conference_call_button.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- This button is used only on GSM and IMS devices, during a conference call. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/incall_banner_secondary_background_color"
+ android:focusable="true"
+ android:contentDescription="@string/onscreenManageConferenceText">
+
+ <Space android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/secondary_call_info_divider_highlight_color" />
+
+ <!-- This LinearLayout nested immediately in a FrameLayout is necessary to apply both a
+ background color and ripple to the button. -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingEnd="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingTop="@dimen/secondary_call_info_vertical_padding"
+ android:paddingBottom="@dimen/secondary_call_info_vertical_padding"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView android:id="@+id/manageConferenceButtonImage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_group_white_24dp"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"
+ android:importantForAccessibility="no" />
+
+ <TextView android:id="@+id/manageConferenceButtonLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:text="@string/onscreenManageConferenceText"
+ android:importantForAccessibility="no" />
+
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/InCallUI/res/layout-w500dp-land/call_card_fragment.xml b/InCallUI/res/layout-w500dp-land/call_card_fragment.xml
new file mode 100644
index 000000000..c71cf07a6
--- /dev/null
+++ b/InCallUI/res/layout-w500dp-land/call_card_fragment.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+
+ <LinearLayout
+ android:id="@+id/primary_call_info_container"
+ android:layout_centerVertical="true"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:elevation="@dimen/primary_call_elevation"
+ android:background="@drawable/rounded_call_card_background"
+ android:paddingTop="@dimen/call_banner_primary_call_container_top_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:alpha="0.9"
+ android:layout_margin="10dp">
+
+ <include layout="@layout/primary_call_info" />
+
+ <fragment android:name="com.android.incallui.CallButtonFragment"
+ android:id="@+id/callButtonFragment"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_marginBottom="@dimen/call_buttons_bottom_margin" />
+
+ <!-- Secondary "Call info" block, for the background ("on hold") call. -->
+ <include layout="@layout/secondary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom" />
+
+ </LinearLayout>
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1">
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/call_card_content">
+
+ <ImageView android:id="@+id/photoLarge"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:contentDescription="@string/contactPhoto"
+ android:background="@color/incall_photo_background_color"
+ android:src="@drawable/img_no_image_automirrored" />
+
+ <!-- Call context -->
+ <LinearLayout
+ android:id="@+id/contact_context"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@color/incall_background_color"
+ android:visibility="gone">
+ <TextView android:id="@+id/contactContextTitle"
+ android:textSize="@dimen/contact_context_title_text_size"
+ android:textColor="@color/contact_context_title_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="@dimen/contact_context_title_margin_bottom" />
+ <ListView android:id="@+id/contactContextInfo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"
+ android:dividerHeight="@dimen/contact_context_list_item_padding" />
+ </LinearLayout>
+
+ </FrameLayout>
+
+ <include layout="@layout/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@id/photoLarge" />
+
+ <!-- Progress spinner, useful for indicating pending operations such as upgrade to video. -->
+ <FrameLayout
+ android:id="@+id/progressSpinner"
+ android:background="#63000000"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:visibility="gone" >
+
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.ProgressBar"
+ android:layout_gravity="center"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:indeterminate="true" />
+
+ </FrameLayout>
+
+ <fragment android:name="com.android.incallui.VideoCallFragment"
+ android:layout_alignParentStart="true"
+ android:layout_gravity="start|center_vertical"
+ android:id="@+id/videoCallFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- Placeholder for the dialpad which is replaced with the dialpad fragment when shown. -->
+ <FrameLayout
+ android:id="@+id/answer_and_dialpad_container"
+ android:layout_gravity="bottom"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <FrameLayout
+ android:id="@+id/floating_end_call_action_button_container"
+ android:layout_width="@dimen/end_call_floating_action_button_diameter"
+ android:layout_height="@dimen/end_call_floating_action_button_diameter"
+ android:background="@drawable/fab_red"
+ android:layout_gravity="bottom|center_horizontal"
+ android:layout_marginBottom="@dimen/end_call_button_margin_bottom">
+
+ <ImageButton android:id="@+id/floating_end_call_action_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/end_call_background"
+ android:src="@drawable/fab_ic_end_call"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText" />
+
+ </FrameLayout>
+
+ </FrameLayout>
+
+</LinearLayout>
diff --git a/InCallUI/res/layout-w600dp-land/manage_conference_call_button.xml b/InCallUI/res/layout-w600dp-land/manage_conference_call_button.xml
new file mode 100644
index 000000000..9a83313ac
--- /dev/null
+++ b/InCallUI/res/layout-w600dp-land/manage_conference_call_button.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- This button is used only on GSM and IMS devices, during a conference call. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@color/incall_banner_secondary_background_color"
+ android:focusable="true"
+ android:contentDescription="@string/onscreenManageConferenceText">
+
+ <Space android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/secondary_call_info_divider_highlight_color" />
+
+ <!-- This LinearLayout nested immediately in a FrameLayout is necessary to apply both a
+ background color and ripple to the button. -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingEnd="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingTop="@dimen/secondary_call_info_vertical_padding"
+ android:paddingBottom="@dimen/secondary_call_info_vertical_padding"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView android:id="@+id/manageConferenceButtonImage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_group_white_24dp"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"
+ android:importantForAccessibility="no" />
+
+ <TextView android:id="@+id/manageConferenceButtonLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:text="@string/onscreenManageConferenceText"
+ android:importantForAccessibility="no" />
+
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/InCallUI/res/layout/accessible_answer_fragment.xml b/InCallUI/res/layout/accessible_answer_fragment.xml
new file mode 100644
index 000000000..90fe57788
--- /dev/null
+++ b/InCallUI/res/layout/accessible_answer_fragment.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+~ Copyright (C) 2013 The Android Open Source Project
+~
+~ Licensed under the Apache License, Version 2.0 (the "License");
+~ you may not use this file except in compliance with the License.
+~ You may obtain a copy of the License at
+~
+~ http://www.apache.org/licenses/LICENSE-2.0
+~
+~ Unless required by applicable law or agreed to in writing, software
+~ distributed under the License is distributed on an "AS IS" BASIS,
+~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+~ See the License for the specific language governing permissions and
+~ limitations under the License
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal"
+ android:background="@color/glowpad_background_color">
+ <RelativeLayout
+ android:id="@+id/accessible_answer_fragment_answer"
+ android:orientation="vertical"
+ android:layout_width="120dp"
+ android:layout_height="120dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ android:layout_alignParentRight="true"
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp">
+ <ImageView
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:src="@drawable/ic_lockscreen_answer_activated_layer"
+ android:layout_centerInParent="true">
+ </ImageView>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/description_target_answer"
+ android:textSize="12sp"
+ android:textColor="@color/accessible_answer_hint_text_color"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="8dp"/>
+ </RelativeLayout>
+ <RelativeLayout
+ android:id="@+id/accessible_answer_fragment_decline"
+ android:orientation="vertical"
+ android:layout_width="120dp"
+ android:layout_height="120dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ android:layout_alignParentLeft="true"
+ android:layout_centerVertical="true"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp">
+ <ImageView
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:src="@drawable/ic_lockscreen_decline_activated_layer"
+ android:layout_centerInParent="true">
+ </ImageView>
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/description_target_decline"
+ android:textSize="12sp"
+ android:textColor="@color/accessible_answer_hint_text_color"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="8dp"/>
+ </RelativeLayout>
+ <LinearLayout
+ android:id="@+id/accessible_answer_fragment_text"
+ android:orientation="vertical"
+ android:layout_width="92dp"
+ android:layout_height="92dp"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
+ android:clickable="true"
+ android:layout_alignParentEnd="false"
+ android:layout_alignParentStart="false"
+ android:layout_above="@+id/accessible_answer_fragment_decline"
+ android:layout_alignWithParentIfMissing="false"
+ android:layout_alignParentTop="false"
+ android:layout_alignParentLeft="false"
+ android:layout_alignParentBottom="false"
+ android:layout_alignParentRight="false"
+ android:layout_centerHorizontal="true"
+ android:contentDescription="@string/description_target_send_sms"
+ android:gravity="center">
+ <ImageView
+ android:layout_width="64dp"
+ android:layout_height="64dp"
+ android:src="@drawable/ic_lockscreen_text">
+ </ImageView>
+ </LinearLayout>
+
+</RelativeLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout/answer_fragment.xml b/InCallUI/res/layout/answer_fragment.xml
new file mode 100644
index 000000000..ec6ef30ac
--- /dev/null
+++ b/InCallUI/res/layout/answer_fragment.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<com.android.incallui.GlowPadWrapper
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:dc="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/glow_pad_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:focusable="true"
+ android:layout_centerHorizontal="true"
+ android:gravity="center"
+ android:background="@color/glowpad_background_color"
+ android:layout_marginBottom="@dimen/glowpadview_margin_bottom"
+
+ dc:targetDrawables="@array/incoming_call_widget_audio_with_sms_targets"
+ dc:targetDescriptions="@array/incoming_call_widget_audio_with_sms_target_descriptions"
+ dc:directionDescriptions="@array/incoming_call_widget_audio_with_sms_direction_descriptions"
+ dc:handleDrawable="@drawable/ic_incall_audio_handle"
+ dc:outerRingDrawable="@drawable/ic_lockscreen_outerring"
+ dc:outerRadius="@dimen/glowpadview_target_placement_radius"
+ dc:innerRadius="@dimen/glowpadview_inner_radius"
+ dc:snapMargin="@dimen/glowpadview_snap_margin"
+ dc:feedbackCount="1"
+ dc:vibrationDuration="20"
+ dc:glowRadius="@dimen/glowpadview_glow_radius"
+ dc:pointDrawable="@drawable/ic_lockscreen_glowdot"
+ dc:allowScaling="true" />
diff --git a/InCallUI/res/layout/business_contact_context_list_header.xml b/InCallUI/res/layout/business_contact_context_list_header.xml
new file mode 100644
index 000000000..90521188e
--- /dev/null
+++ b/InCallUI/res/layout/business_contact_context_list_header.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingEnd="@dimen/business_contact_context_end_padding">
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@dimen/contact_context_title_image_size"
+ android:layout_height="@dimen/contact_context_title_image_size"
+ android:layout_marginLeft="@dimen/contact_context_title_image_side_padding"
+ android:layout_marginRight="@dimen/contact_context_title_image_side_padding"
+ android:layout_gravity="center"
+ android:scaleType="center"
+ android:src="@drawable/ic_business_white_24dp"
+ android:tint="@color/business_contact_context_text_color"
+ android:alpha="0.8"
+ android:importantForAccessibility="no"/>
+ <TextView android:id="@+id/title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:text="@string/business_contact_context_title"
+ android:textSize="@dimen/business_contact_context_detail_font_size"
+ android:textColor="@color/business_contact_context_text_color"
+ android:fontFamily="sans-serif-medium"/>
+ </LinearLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout/business_context_info_list_item.xml b/InCallUI/res/layout/business_context_info_list_item.xml
new file mode 100644
index 000000000..616d219d9
--- /dev/null
+++ b/InCallUI/res/layout/business_context_info_list_item.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingEnd="@dimen/business_contact_context_end_padding">
+ <ImageView android:id="@+id/icon"
+ android:layout_width="@dimen/business_contact_context_image_size"
+ android:layout_height="@dimen/business_contact_context_image_size"
+ android:layout_marginLeft="@dimen/business_contact_context_image_padding"
+ android:layout_marginRight="@dimen/business_contact_context_image_padding"
+ android:layout_gravity="center"
+ android:scaleType="centerCrop"
+ android:tint="@color/business_contact_context_text_color"
+ android:alpha="0.8"/>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:orientation="vertical">
+ <TextView android:id="@+id/heading"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="@dimen/business_contact_context_heading_font_size"
+ android:textColor="@color/business_contact_context_text_color"
+ android:fontFamily="sans-serif-medium"/>
+ <TextView android:id="@+id/detail"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textSize="@dimen/business_contact_context_detail_font_size"
+ android:textColor="@color/business_contact_context_text_color"
+ android:fontFamily="sans-serif-medium"/>
+ </LinearLayout>
+ </LinearLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout/call_button_fragment.xml b/InCallUI/res/layout/call_button_fragment.xml
new file mode 100644
index 000000000..6dbfbf73a
--- /dev/null
+++ b/InCallUI/res/layout/call_button_fragment.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- In-call onscreen touch UI elements, used on some platforms.
+
+ This layout is a fullscreen overlay, drawn on top of the
+ non-touch-sensitive parts of the in-call UI (i.e. the call card).
+
+ The top-level View here is a InCallTouchUi (FrameLayout) with 2 children:
+ (1) inCallControls: the widgets visible while a regular call (or calls) is in progress
+ (2) incomingCallWidget: the UI displayed while an incoming call is ringing
+ In usual cases, one of these is visible at any given moment.
+ One exception is when incomingCallWidget is fading-out. At that moment, we show
+ inCallControls beneath incomingCallWidget for smoother transition.
+ -->
+
+<!-- Main cluster of onscreen buttons on the lower part of the screen. -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/bottomButtons"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_margin="0dp"
+ android:padding="0dp"
+ android:background="@color/button_background_color"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:animateLayoutChanges="true" >
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="bottom|center_horizontal"
+ android:baselineAligned="false">
+
+ <!-- This row only ever shows either 4 or 5 buttons. This may depend on whether the device
+ supports "Hold" (i.e. 4 buttons on CDMA devices, 5 buttons on GSM devices.) or whether
+ it is in a video call.
+
+ There are a couple of *pairs* of buttons that share a single "slot", namely Hold/Swap
+ and Add/Merge. For these, the code in InCallTouchUi is responsible for making sure
+ that at any point exactly one of the pair is VISIBLE and the other is GONE.
+
+ If there are more than 5 buttons eligible to be shown, the presenter is responsible for
+ collapsing those options into an overflow menu, which appears as one of the buttons
+ in the row instead. -->
+
+ <!-- FAR LEFT SLOT ===================================================================== -->
+
+ <!-- "Audio mode". this is a multi-mode button that can behave either like a simple
+ "compound button" with two states *or* like an action button that brings up a popup
+ menu; see btn_compound_audio.xml and CallButtonFragment.updateAudioButtons(). -->
+ <ToggleButton android:id="@+id/audioButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_audio"
+ android:contentDescription="@string/audio_mode_speaker" />
+
+ <!-- MIDDLE LEFT SLOT ================================================================== -->
+
+ <!-- "Mute" -->
+ <ToggleButton android:id="@+id/muteButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_mute"
+ android:contentDescription="@string/onscreenMuteText_unselected" />
+
+ <!-- CENTER SLOT ======================================================================= -->
+
+ <!-- "Dialpad" -->
+ <ToggleButton android:id="@+id/dialpadButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_dialpad"
+ android:contentDescription="@string/onscreenShowDialpadText_unselected" />
+
+ <!-- MIDDLE RIGHT SLOT ================================================================= -->
+
+ <!-- This slot is either "Hold" or "Swap", depending on the state of the call. One or the
+ other of these must always be set to GONE. -->
+
+ <!-- "Hold" -->
+ <ToggleButton android:id="@+id/holdButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_hold"
+ android:contentDescription="@string/onscreenHoldText_unselected" />
+
+ <!-- "Swap" (or "Manage calls" in some CDMA states) -->
+ <ImageButton android:id="@+id/swapButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_swap"
+ android:contentDescription="@string/onscreenSwapCallsText"
+ android:visibility="gone" />
+
+ <!-- "Change to video call" -->
+ <ImageButton android:id="@+id/changeToVideoButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_change_to_video"
+ android:contentDescription="@string/onscreenVideoCallText"
+ android:visibility="gone" />
+
+ <!-- "Switch camera" for video calls. -->
+ <ToggleButton android:id="@+id/switchCameraButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_video_switch"
+ android:contentDescription="@string/onscreenSwitchCameraText"
+ android:visibility="gone" />
+
+ <!-- FAR RIGHT SLOT ==================================================================== -->
+
+ <!-- This slot is either "Add" or "Merge", depending on the state of the call. One or the
+ other of these must always be set to GONE. -->
+
+ <!-- "Turn off camera" for video calls. -->
+ <ToggleButton android:id="@+id/pauseVideoButton"
+ style="@style/InCallCompoundButton"
+ android:background="@drawable/btn_compound_video_off"
+ android:contentDescription="@string/onscreenPauseVideoText"
+ android:visibility="gone" />
+
+ <!-- "Change to audio call" for video calls. -->
+ <ImageButton android:id="@+id/changeToVoiceButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_change_to_voice"
+ android:contentDescription="@string/onscreenChangeToVoiceText"
+ android:visibility="gone" />
+
+ <!-- "Add Call" -->
+ <ImageButton android:id="@+id/addButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_add"
+ android:contentDescription="@string/onscreenAddCallText"
+ android:visibility="gone" />
+
+ <!-- "Merge calls". This button is used only on GSM devices, where we know that "Add" and
+ "Merge" are never available at the same time. The "Merge" button for CDMA devices is
+ "cdmaMergeButton" above. -->
+ <ImageButton android:id="@+id/mergeButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_merge"
+ android:contentDescription="@string/onscreenMergeCallsText"
+ android:visibility="gone" />
+
+ <!-- "Overflow" -->
+ <ImageButton android:id="@+id/overflowButton"
+ style="@style/InCallButton"
+ android:background="@drawable/btn_overflow"
+ android:contentDescription="@string/onscreenOverflowText"
+ android:visibility="gone" />
+
+ <!-- "Manage conference button (Video Call) " -->
+ <ImageButton android:id="@+id/manageVideoCallConferenceButton"
+ style="@style/InCallButton"
+ android:background="@drawable/ic_group_white_24dp"
+ android:contentDescription="@string/onscreenManageConferenceText"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/InCallUI/res/layout/call_card_fragment.xml b/InCallUI/res/layout/call_card_fragment.xml
new file mode 100644
index 000000000..fabde378a
--- /dev/null
+++ b/InCallUI/res/layout/call_card_fragment.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout
+ android:id="@+id/primary_call_info_container"
+ android:layout_centerVertical="true"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:elevation="@dimen/primary_call_elevation"
+ android:background="@color/incall_call_banner_background_color"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:alpha="0.9">
+
+ <include layout="@layout/primary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/call_banner_vertical_margin"
+ android:layout_marginBottom="@dimen/call_banner_vertical_margin"/>
+
+ <fragment android:name="com.android.incallui.CallButtonFragment"
+ android:id="@+id/callButtonFragment"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal" />
+
+ </LinearLayout>
+
+ <!-- Placeholder for the dialpad which is replaced with the dialpad fragment when shown. -->
+ <FrameLayout
+ android:id="@+id/answer_and_dialpad_container"
+ android:layout_width="match_parent"
+ android:elevation="@dimen/dialpad_elevation"
+ android:layout_height="match_parent" />
+
+ <!-- Secondary "Call info" block, for the background ("on hold") call. -->
+ <include layout="@layout/secondary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:elevation="4dp"
+ android:layout_alignParentBottom="true" />
+
+ <include layout="@layout/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:elevation="5dp"
+ android:layout_alignParentBottom="true"/>
+
+ <FrameLayout
+ android:id="@+id/floating_end_call_action_button_container"
+ android:layout_width="@dimen/end_call_floating_action_button_diameter"
+ android:layout_height="@dimen/end_call_floating_action_button_diameter"
+ android:background="@drawable/fab_red"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true">
+
+ <ImageButton android:id="@+id/floating_end_call_action_button"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/end_call_background"
+ android:src="@drawable/fab_ic_end_call"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText" />
+
+ </FrameLayout>
+
+ <!-- Progress spinner, useful for indicating pending operations such as upgrade to video. -->
+ <FrameLayout
+ android:id="@+id/progressSpinner"
+ android:background="#63000000"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:visibility="gone" >
+
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.ProgressBar"
+ android:layout_gravity="center"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:indeterminate="true" />
+
+ </FrameLayout>
+
+ <fragment android:name="com.android.incallui.VideoCallFragment"
+ android:layout_alignParentStart="true"
+ android:layout_gravity="start|center_vertical"
+ android:id="@+id/videoCallFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:visibility="gone">
+
+ <FrameLayout
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:id="@+id/call_card_content">
+
+ <ImageView android:id="@+id/photoLarge"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop"
+ android:contentDescription="@string/contactPhoto"
+ android:background="@color/incall_photo_background_color"
+ android:src="@drawable/img_no_image_automirrored" />
+
+ <!-- Call context -->
+ <LinearLayout
+ android:id="@+id/contact_context"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:background="@color/incall_background_color"
+ android:visibility="gone">
+ <TextView android:id="@+id/contactContextTitle"
+ android:textSize="@dimen/contact_context_title_text_size"
+ android:textColor="@color/glowpad_background_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ android:layout_marginBottom="@dimen/contact_context_title_margin_bottom" />
+ <ListView android:id="@+id/contactContextInfo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:divider="@null"
+ android:dividerHeight="@dimen/contact_context_list_item_padding" />
+ </LinearLayout>
+ </FrameLayout>
+ </FrameLayout>
+
+</RelativeLayout>
diff --git a/InCallUI/res/layout/caller_in_conference.xml b/InCallUI/res/layout/caller_in_conference.xml
new file mode 100644
index 000000000..ac78096f6
--- /dev/null
+++ b/InCallUI/res/layout/caller_in_conference.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="64dp"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:paddingStart="16dp"
+ android:paddingEnd="8dp">
+
+ <!-- Caller information -->
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+
+ <ImageView android:id="@+id/callerPhoto"
+ android:layout_width="@dimen/contact_browser_list_item_photo_size"
+ android:layout_height="@dimen/contact_browser_list_item_photo_size" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:orientation="vertical"
+ android:layout_marginStart="16dp"
+ android:paddingBottom="2dp">
+
+ <!-- Name or number of this caller -->
+ <TextView android:id="@+id/conferenceCallerName"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="16sp"
+ android:textColor="@color/conference_call_manager_caller_name_text_color"
+ android:singleLine="true"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="2dp" />
+
+ <!-- Number of this caller if name is supplied above -->
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:gravity="bottom">
+
+ <!-- Number -->
+ <TextView
+ android:id="@+id/conferenceCallerNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="14sp"
+ android:ellipsize="marquee"
+ android:textColor="@color/conference_call_manager_secondary_text_color"
+ android:singleLine="true"
+ android:layout_marginEnd="8dp" />
+
+ <!-- Number type -->
+ <TextView
+ android:id="@+id/conferenceCallerNumberType"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="12sp"
+ android:textColor="@color/conference_call_manager_secondary_text_color"
+ android:ellipsize="marquee"
+ android:singleLine="true"
+ android:textAllCaps="true"
+ android:gravity="start" />
+
+ </LinearLayout> <!-- End of caller number -->
+
+ </LinearLayout> <!-- End of caller information -->
+
+ </LinearLayout>
+
+ <!-- "Separate" (i.e. "go private") button for this caller -->
+ <ImageView android:id="@+id/conferenceCallerSeparate"
+ android:src="@drawable/ic_call_split_white_24dp"
+ android:layout_width="@dimen/conference_call_manager_button_dimension"
+ android:layout_height="@dimen/conference_call_manager_button_dimension"
+ android:scaleType="center"
+ android:contentDescription="@string/goPrivate"
+ android:tint="@color/conference_call_manager_icon_color"
+ android:background="@drawable/conference_ripple"
+ android:clickable="true" />
+
+ <!-- "Disconnect" button which terminates the connection with this caller. -->
+ <ImageButton
+ android:id="@+id/conferenceCallerDisconnect"
+ android:layout_width="@dimen/conference_call_manager_button_dimension"
+ android:layout_height="@dimen/conference_call_manager_button_dimension"
+ android:layout_marginStart="8dp"
+ android:src="@drawable/ic_call_end_white_24dp"
+ android:scaleType="center"
+ android:contentDescription="@string/onscreenEndCallText"
+ android:tint="@color/conference_call_manager_icon_color"
+ android:background="@drawable/conference_ripple"
+ android:clickable="true" />
+
+</LinearLayout> <!-- End of single list element -->
diff --git a/InCallUI/res/layout/conference_manager_fragment.xml b/InCallUI/res/layout/conference_manager_fragment.xml
new file mode 100644
index 000000000..7350bee14
--- /dev/null
+++ b/InCallUI/res/layout/conference_manager_fragment.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- The "Manage conference" UI. This panel is displayed (instead of
+ the inCallPanel) when the user clicks the "Manage conference"
+ button while on a conference call. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/manageConferencePanel"
+ android:background="@color/conference_call_manager_background_color"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="@dimen/conference_call_manager_padding_top" >
+ <!-- List of conference participants. -->
+ <ListView
+ android:id="@+id/participantList"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:listSelector="@null"
+ android:background="@color/background_dialer_white"
+ android:divider="@null"
+ android:focusableInTouchMode="true"
+ android:focusable="true"/>
+</FrameLayout>
diff --git a/res/layout/call_detail_history_header.xml b/InCallUI/res/layout/incall_dialpad_fragment.xml
index def1fd805..b567dbbf2 100644
--- a/res/layout/call_detail_history_header.xml
+++ b/InCallUI/res/layout/incall_dialpad_fragment.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- Copyright (C) 2006 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,17 +14,11 @@
limitations under the License.
-->
-<TextView
+<view class="com.android.incallui.DialpadFragment$DialpadSlidingLinearLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:ex="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/dtmf_twelve_key_dialer_view"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/call_detail_header_top_margin"
- android:paddingBottom="@dimen/call_detail_header_bottom_margin"
- android:paddingStart="@dimen/call_detail_horizontal_margin"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
- android:fontFamily="sans-serif-medium"
- android:singleLine="true"
- android:text="@string/call_detail_list_header"
- />
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <include layout="@layout/dialpad_view"/>
+</view>
diff --git a/res/layout/call_details_voicemail_header.xml b/InCallUI/res/layout/incall_screen.xml
index e3640faf4..3922ea073 100644
--- a/res/layout/call_details_voicemail_header.xml
+++ b/InCallUI/res/layout/incall_screen.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2009 The Android Open Source Project
+<!-- Copyright (C) 2007 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,19 +13,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
-
- <LinearLayout
- android:id="@+id/voicemail_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingBottom="@dimen/call_detail_button_spacing"
- android:visibility="gone">
- <!-- The voicemail fragment will be put here. -->
- </LinearLayout>
-</LinearLayout>
+<!-- In-call Phone UI; see InCallActivity.java. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@android:color/black"
+ android:id="@+id/main" >
+</FrameLayout>
diff --git a/InCallUI/res/layout/manage_conference_call_button.xml b/InCallUI/res/layout/manage_conference_call_button.xml
new file mode 100644
index 000000000..01ca1bdc3
--- /dev/null
+++ b/InCallUI/res/layout/manage_conference_call_button.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- This button is used only on GSM and IMS devices, during a conference call. -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/manage_conference_call_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:background="@color/incall_banner_secondary_background_color"
+ android:visibility="gone">
+
+ <Space android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/secondary_call_info_divider_highlight_color" />
+
+ <!-- This LinearLayout nested immediately in a FrameLayout is necessary to apply both a
+ background color and ripple to the button. -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:paddingStart="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingEnd="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingTop="@dimen/secondary_call_info_vertical_padding"
+ android:paddingBottom="@dimen/secondary_call_info_vertical_padding"
+ android:background="?android:attr/selectableItemBackground">
+
+ <!-- Call status of the background call, usually the string "On hold". -->
+ <TextView android:id="@+id/conferenceLabel"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_gravity="center_vertical"
+ android:paddingEnd="18dp"
+ android:text="@string/onscreenConferenceText"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:singleLine="true" />
+
+ <ImageView android:id="@+id/manageConferenceImage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_group_white_24dp"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"/>
+
+ <TextView android:id="@+id/manageConferenceLabel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:textAlignment="viewStart"
+ android:text="@string/onscreenManageText"
+ android:singleLine="true"/>
+
+ </LinearLayout>
+
+</FrameLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout/outgoing_call_animation.xml b/InCallUI/res/layout/outgoing_call_animation.xml
new file mode 100644
index 000000000..69ba3d3c6
--- /dev/null
+++ b/InCallUI/res/layout/outgoing_call_animation.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/outgoing_call_animation_circle"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/incall_background_color" /> \ No newline at end of file
diff --git a/InCallUI/res/layout/person_context_info_list_item.xml b/InCallUI/res/layout/person_context_info_list_item.xml
new file mode 100644
index 000000000..4f973d564
--- /dev/null
+++ b/InCallUI/res/layout/person_context_info_list_item.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingRight="@dimen/person_contact_context_horizontal_padding"
+ android:paddingLeft="@dimen/person_contact_context_horizontal_padding">
+ <TextView android:id="@+id/message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingLeft="@dimen/person_contact_context_message_horizontal_padding"
+ android:paddingRight="@dimen/person_contact_context_message_horizontal_padding"
+ android:paddingTop="@dimen/person_contact_context_message_vertical_padding"
+ android:paddingBottom="@dimen/person_contact_context_message_vertical_padding"
+ android:textSize="@dimen/person_contact_context_message_text_size"
+ android:textColor="@color/person_contact_context_message_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:background="@drawable/incoming_sms_background"/>
+ <TextView android:id="@+id/detail"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/person_contact_context_detail_padding_top"
+ android:textSize="@dimen/person_contact_context_detail_text_size"
+ android:textColor="@color/person_contact_context_detail_text_color"
+ android:fontFamily="sans-serif-medium"
+ android:layout_below="@id/message"/>
+</RelativeLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout/primary_call_info.xml b/InCallUI/res/layout/primary_call_info.xml
new file mode 100644
index 000000000..2aa583c18
--- /dev/null
+++ b/InCallUI/res/layout/primary_call_info.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- "Call Banner" for primary call, the foregound or ringing call. The "call banner" is a block
+ of info about a single call, including the contact name, phone number, call time counter, and
+ other status info. This info is shown as a "banner" overlaid across the top of contact photo.
+ -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/primary_call_banner"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:paddingStart="@dimen/call_banner_side_padding"
+ android:paddingEnd="@dimen/call_banner_side_padding"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:gravity="center">
+
+ <LinearLayout android:id="@+id/callSubjectLayout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <TextView android:id="@+id/callSubject"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_background_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:background="@drawable/subject_bubble"
+ android:maxLines="2"
+ android:ellipsize="end"
+ android:singleLine="false"
+ android:visibility="gone" />
+ </LinearLayout>
+
+ <LinearLayout android:id="@+id/callStateButton"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <ImageView android:id="@+id/workProfileIcon"
+ android:src="@drawable/ic_work_profile"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:layout_marginEnd="8dp"
+ android:baselineAlignBottom="true"
+ android:tint="@color/incall_accent_color"
+ android:scaleType="center"
+ android:visibility="gone" />
+
+ <!-- Subscription provider or WiFi calling icon displayed to the left of the label -->
+ <ImageView android:id="@+id/callStateIcon"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="10dp"
+ android:tint="@color/incall_accent_color"
+ android:alpha="0.0"
+ android:scaleType="fitCenter"
+ android:visibility="gone" />
+
+ <ImageView android:id="@+id/videoCallIcon"
+ android:src="@drawable/ic_toolbar_video"
+ android:layout_width="16dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="16dp"
+ android:baselineAlignBottom="true"
+ android:tint="@color/incall_accent_color"
+ android:scaleType="center"
+ android:visibility="gone" />
+
+ <com.android.phone.common.widget.ResizingTextTextView
+ xmlns:ex="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/callStateLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textColor="@color/incall_accent_color"
+ android:textSize="@dimen/call_status_text_size"
+ android:alpha="0.7"
+ android:singleLine="true"
+ android:gravity="start"
+ android:ellipsize="end"
+ ex:resizing_text_min_size="@dimen/call_status_text_min_size" />
+
+ </LinearLayout>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <!-- Name (or the phone number, if we don't have a name to display). -->
+ <com.android.phone.common.widget.ResizingTextTextView
+ xmlns:ex="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="-5dp"
+ android:fontFamily="sans-serif-light"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:textSize="@dimen/call_name_text_size"
+ android:singleLine="true"
+ ex:resizing_text_min_size="@dimen/call_name_text_min_size" />
+
+ <!-- Contact photo for primary call info -->
+ <ImageView android:id="@+id/photoSmall"
+ android:layout_width="@dimen/contact_context_small_photo_size"
+ android:layout_height="@dimen/contact_context_small_photo_size"
+ android:layout_centerVertical="true"
+ android:layout_alignParentEnd="true"
+ android:scaleType="centerCrop"
+ android:importantForAccessibility="no"
+ android:src="@drawable/img_no_image_automirrored" />
+ </RelativeLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:clipChildren="false"
+ android:clipToPadding="false">
+
+ <ImageView android:id="@+id/hdAudioIcon"
+ android:src="@drawable/ic_hd_24dp"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="8dp"
+ android:tint="@color/incall_call_banner_subtext_color"
+ android:scaleType="fitCenter"
+ android:visibility="gone" />
+
+ <ImageView android:id="@+id/forwardIcon"
+ android:src="@drawable/ic_forward_white_24dp"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:layout_marginEnd="8dp"
+ android:tint="@color/incall_call_banner_subtext_color"
+ android:scaleType="fitCenter"
+ android:visibility="gone" />
+
+ <!-- Label (like "Mobile" or "Work", if present) and phone number, side by side -->
+ <LinearLayout android:id="@+id/labelAndNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="horizontal">
+
+ <TextView android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_subtext_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:singleLine="true"
+ android:textDirection="ltr"
+ android:visibility="gone" />
+
+ <TextView android:id="@+id/phoneNumber"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginStart="6dp"
+ android:textAlignment="viewStart"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_subtext_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:singleLine="false"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <!-- Elapsed time indication for a call in progress. -->
+ <TextView android:id="@+id/elapsedTime"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:textAlignment="viewEnd"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_subtext_color"
+ android:textSize="@dimen/call_label_text_size"
+ android:singleLine="true"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <!-- Call type indication: a special label and/or branding
+ for certain kinds of calls (like "SIP call" for a SIP call.) -->
+ <TextView android:id="@+id/callTypeLabel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="@color/incall_call_banner_text_color"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:visibility="gone" />
+
+</LinearLayout> <!-- End of call_banner -->
diff --git a/InCallUI/res/layout/secondary_call_info.xml b/InCallUI/res/layout/secondary_call_info.xml
new file mode 100644
index 000000000..e866795a6
--- /dev/null
+++ b/InCallUI/res/layout/secondary_call_info.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- XML resource file for secondary call info, which will be used by CallCard. -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/secondary_call_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:background="@color/incall_banner_secondary_background_color"
+ android:visibility="gone">
+
+ <Space android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="@color/secondary_call_info_divider_highlight_color" />
+
+ <!-- This LinearLayout nested immediately in a FrameLayout is necessary to apply both a
+ background color and ripple to the button. -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:paddingStart="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingEnd="@dimen/secondary_call_info_horizontal_padding"
+ android:paddingTop="@dimen/secondary_call_info_vertical_padding"
+ android:paddingBottom="@dimen/secondary_call_info_vertical_padding"
+ android:background="?android:attr/selectableItemBackground">
+
+ <ImageView android:id="@+id/secondaryCallVideoCallIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_toolbar_video"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"/>
+
+ <ImageView android:id="@+id/secondaryCallConferenceCallIcon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_group_white_24dp"
+ android:tint="@color/incall_banner_secondary_text_color"
+ android:paddingEnd="16dp"/>
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical">
+
+ <!-- Name (or the phone number, if we don't have a name to display). -->
+ <TextView android:id="@+id/secondaryCallName"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:textAlignment="viewStart"
+ android:ellipsize="marquee"
+ android:singleLine="true"/>
+
+ <!-- Provider, e.g. AT&T, that a call is associated with -->
+ <LinearLayout android:id="@+id/secondary_call_provider_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:visibility="gone" >
+
+ <TextView android:id="@+id/secondaryCallProviderLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:textAlignment="viewStart"
+ android:singleLine="true"/>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <!-- Call status of the background call, usually the string "On hold". -->
+ <TextView android:id="@+id/secondaryCallStatus"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:paddingEnd="18dp"
+ android:text="@string/onHold"
+ android:textColor="@color/incall_banner_secondary_text_color"
+ android:textSize="@dimen/secondary_call_info_text_size"
+ android:singleLine="true" />
+
+ </LinearLayout>
+
+</FrameLayout>
diff --git a/InCallUI/res/layout/video_call_fragment.xml b/InCallUI/res/layout/video_call_fragment.xml
new file mode 100644
index 000000000..d5e11ef4a
--- /dev/null
+++ b/InCallUI/res/layout/video_call_fragment.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <ViewStub
+ android:id="@+id/videoCallViewsStub"
+ android:inflatedId="@+id/videoCallViews"
+ android:layout="@layout/video_call_views"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+</FrameLayout> \ No newline at end of file
diff --git a/InCallUI/res/layout/video_call_views.xml b/InCallUI/res/layout/video_call_views.xml
new file mode 100644
index 000000000..d514f6df1
--- /dev/null
+++ b/InCallUI/res/layout/video_call_views.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <TextureView
+ android:id="@+id/incomingVideo"
+ android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ <!-- The width and height are replaced at runtime based on the selected camera. -->
+ <FrameLayout
+ android:id="@+id/previewVideoContainer"
+ android:layout_width="70dp"
+ android:layout_height="0dp"
+ android:layout_gravity="bottom|right"
+ android:layout_margin="@dimen/video_preview_margin" >
+
+ <!-- The video preview surface, where the user's outgoing video is shown. -->
+ <TextureView
+ android:id="@+id/previewVideo"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- The user's profile photo, shown when the user's camera is shut off. -->
+ <ImageView
+ android:id="@+id/previewProfilePhoto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:adjustViewBounds="false"
+ android:contentDescription="@string/profile_photo_description"
+ android:background="@android:color/black"
+ android:visibility="gone" />
+
+ <!-- The "camera off" icon, shown when the user's camera is shut off. -->
+ <ImageView
+ android:id="@+id/previewCameraOff"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|right"
+ android:layout_marginEnd="10dp"
+ android:layout_marginBottom="10dp"
+ android:scaleType="centerCrop"
+ android:contentDescription="@string/camera_off_description"
+ android:src="@drawable/ic_toolbar_video_off"
+ android:visibility="gone" />
+ </FrameLayout>
+</FrameLayout>
diff --git a/InCallUI/res/menu/incall_audio_mode_menu.xml b/InCallUI/res/menu/incall_audio_mode_menu.xml
new file mode 100644
index 000000000..070c1813a
--- /dev/null
+++ b/InCallUI/res/menu/incall_audio_mode_menu.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 Google Inc.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- "Audio mode" popup menu for the in-call UI. -->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- TODO: Need final icon assets. Also, PopupMenu currently ignores the
+ android:icon attribute anyway(!) -->
+ <item android:id="@+id/audio_mode_speaker"
+ android:icon="@drawable/ic_toolbar_speaker_on"
+ android:title="@string/audio_mode_speaker" />
+
+ <!-- We display *either* "earpiece" or "wired headset", never both,
+ depending on whether a wired headset is physically plugged in
+ (see InCallTouchUi.showAudioModePopup().) -->
+ <item android:id="@+id/audio_mode_earpiece"
+ android:icon="@drawable/ic_toolbar_audio_phone"
+ android:title="@string/audio_mode_earpiece" />
+
+ <item android:id="@+id/audio_mode_wired_headset"
+ android:icon="@drawable/ic_toolbar_audio_headphones"
+ android:title="@string/audio_mode_wired_headset" />
+
+ <item android:id="@+id/audio_mode_bluetooth"
+ android:icon="@drawable/ic_toolbar_audio_bluetooth"
+ android:title="@string/audio_mode_bluetooth" />
+</menu>
diff --git a/InCallUI/res/values-af/strings.xml b/InCallUI/res/values-af/strings.xml
new file mode 100644
index 000000000..0dc182840
--- /dev/null
+++ b/InCallUI/res/values-af/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Foon"</string>
+ <string name="onHold" msgid="527593602772521700">"Hou aan"</string>
+ <string name="unknown" msgid="3646075119047488748">"Onbekend"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privaat nommer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefoonhokkie"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferensie-oproep"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Oproep is ontkoppel"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Luidspreker"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Selfoonoorfoon"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Bedraade kopfoon"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Stuur die volgende luitone?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Stuur luitone\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Stuur"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ja"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nee"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Vervang die plekhouerkarakter met"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferensie-oproep <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Stemboodskapnommer"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Bel"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Bel tans weer"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferensie-oproep"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Inkomende oproep"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Inkomende werkoproep"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Oproep beëindig"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Hou aan"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Lui af"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"In oproep"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"My nommer is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Koppel tans video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video-oproep"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Versoek tans video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Kan nie video-oproep koppel nie"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videoversoek is verwerp"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Jou terugbelnommer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Jou noodterugbelnommer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Bel"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Gemiste oproep"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Gemiste oproepe"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepe"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Gemiste oproep vanaf <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Voortdurende oproep"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Voortdurende werkoproep"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Voortdurende Wi-Fi-oproep"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Voortdurende Wi-Fi-werkoproep"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Hou aan"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Inkomende oproep"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Inkomende werkoproep"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Inkomende Wi-Fi-oproep"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Inkomende Wi-Fi-werkoproep"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Inkomende video-oproep"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Inkomende videoversoek"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nuwe stemboodskap"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nuwe stemboodskap (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Bel <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Stemboodskapnommer is onbekend"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Geen diens nie"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Gekose netwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) is nie beskikbaar nie"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Antwoord"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Lui af"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Stem"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aanvaar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Maak toe"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Bel terug"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Boodskap"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Skakel vliegtuigmodus eers af om \'n oproep te maak."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nie geregistreer op netwerk nie."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Sellulêre netwerk is nie beskikbaar nie."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Voer \'n geldige nommer in om \'n oproep te maak."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Kan nie bel nie."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Begin tans MMI-volgorde …"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Diens word nie gesteun nie."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Kan nie oproepe wissel nie."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Kan nie oproep skei nie."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Kan nie deurskakel nie."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Kan nie konferensie-oproep maak nie."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Kan nie oproep weier nie."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Kan nie oproep(e) vrystel nie."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-oproep"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Noodoproep"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Skakel tans radio aan …"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Geen sein nie. Probeer tans weer …"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Kan nie bel nie. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is nie \'n noodnommer nie."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Kan nie bel nie. Bel \'n noodnommer."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Gebruik sleutelbord om te bel"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Hou oproep"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Hervat oproep"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Beëindig oproep"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Wys belblad"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Versteek belblad"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Demp"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Ontdemp"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Voeg oproep by"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Smelt oproepe saam"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Ruil"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Bestuur oproepe"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Bestuur konferensie-oproep"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferensie-oproep"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Bestuur"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Oudio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video-oproep"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Verander na stemoproep"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Wissel kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Laat video wag"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Nog opsies"</string>
+ <string name="player_started" msgid="3478865572468310331">"Speler het begin"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Speler het gestop"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera is nie gereed nie"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera is gereed"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Onbekende oproepsessiegebeurtenis"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Diens"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Opstelling"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nie gestel nie&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Ander oproepinstellings"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Bel via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Inkomend via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontakfoto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"gaan privaat"</string>
+ <string name="selectContact" msgid="92191462970821951">"kies kontak"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Skryf jou eie …"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Kanselleer"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Stuur"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Antwoord"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Stuur SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Weier"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Antwoord as video-oproep"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Antwoord as oudio-oproep"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Aanvaar videoversoek"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Weier videoversoek"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Aanvaar videoversendversoek"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Weier videoversendversoek"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Aanvaar video-ontvangversoek"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Weier video-ontvangversoek"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Gly op vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Gly links vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Gly regs vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Gly af vir <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibreer"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibreer"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Klank"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Verstekklank (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Foonluitoon"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibreer wanneer dit lui"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Luitoon en vibreer"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Bestuur konferensie-oproep"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Noodnommer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekondes</item>
+ <item quantity="one">1 sekonde</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="one">1 minuut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> uur</item>
+ <item quantity="one">1 uur</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profielfoto"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera is af"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota is gestuur"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Onlangse boodskappe"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Besigheidinligting"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> myl ver"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km ver"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Maak môre om <xliff:g id="OPEN_TIME">%s</xliff:g> oop"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Maak vandag om <xliff:g id="OPEN_TIME">%s</xliff:g> oop"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Maak om <xliff:g id="CLOSE_TIME">%s</xliff:g> toe"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Het vandag om <xliff:g id="CLOSE_TIME">%s</xliff:g> toegemaak"</string>
+ <string name="open_now" msgid="4615706338669555999">"Nou oop"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Nou gesluit"</string>
+</resources>
diff --git a/InCallUI/res/values-am/strings.xml b/InCallUI/res/values-am/strings.xml
new file mode 100644
index 000000000..5306c9c97
--- /dev/null
+++ b/InCallUI/res/values-am/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ስልክ"</string>
+ <string name="onHold" msgid="527593602772521700">"ያዝና ቆይ"</string>
+ <string name="unknown" msgid="3646075119047488748">"ያልታወቀ"</string>
+ <string name="private_num" msgid="6081418498487514686">"የግል ቁጥር"</string>
+ <string name="payphone" msgid="5743050584468748607">"የሕዝብ ስልክ"</string>
+ <string name="confCall" msgid="3181961445236675173">"የስብሰባ ጥሪ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ጥሪው ተቋርጧል"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ድምፅ ማጉያ"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"የስልክ ጆሮ ማዳመጫ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"ባለ ገመድ የጆሮ ማዳመጫ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ብሉቱዝ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"የሚከተሉትን የጥሪ ድምፆች ላክ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"የጥሪ ድምፆች በመላክ ላይ \n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ላክ"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"አዎ"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"አይ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"የልቅ ምልክት ተካ በ"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"የስብሰባ ጥሪ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"የድምፅ መልእክት ቁጥር"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"በመደወል ላይ"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ዳግም በመደወል ላይ"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"የስብሰባ ጥሪ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ገቢ ጥሪ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ገቢ የሥራ ጥሪ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ጥሪ አብቅቷል"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ያዝና ቆይ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"በመዝጋት ላይ"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"ጥሪ ላይ"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"ቁጥሬ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ነው"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ቪድዮ በማገናኘት ላይ"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"የቪዲዮ ጥሪ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ቪድዮ በመጠየቅ ላይ"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"የቪዲዮ ጥሪን ማገናኘት አይቻልም"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"የቪዲዮ ጥያቄ ውድቅ ተደርጓል"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"የእርስዎ የመልሶ መደወያ ቁጥር\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"የእርስዎ የድንገተኛ አደጋ መልሶ መደወያ ቁጥር\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"በመደወል ላይ"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"ያመለጠ ጥሪ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"ያመለጡ ጥሪዎች"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ያመለጡ ጥሪዎች"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"ያልተመለሰ ጥሪ ከ<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"በሂደት ላይ ያለ ጥሪ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"በሂደት ላይ ያለ የሥራ ጥሪ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"በሂደት ላይ ያለ የWi-Fi ጥሪ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"በሂደት ላይ ያለ የWi-Fi የሥራ ጥሪ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ያዝና ቆይ"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ገቢ ጥሪ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ገቢ የሥራ ጥሪ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ገቢ የWi-Fi ጥሪ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ገቢ የWi-Fi የሥራ ጥሪ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ገቢ የቪዲዮ ጥሪ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ገቢ የቪዲዮ ጥያቄ"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"አዲስ የድምፅ መልእክት"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"አዲስ የድምፅ መልእክት (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"ደውል <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"የማይታወቅ የድምፅ መልእክት ቁጥር"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"ምንም አገልግሎት የለም"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"የተመረጠ አውታረመረብ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) አይገኝም"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"መልስ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"ዝጋ"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ቪዲዮ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ድምፅ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ተቀበል"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"አስወግድ"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"መልሰህ ደውል"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"መልእክት"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ለመደወል፣ መጀመሪያ የአውሮፕላኑን ሁኔታ ያጥፉ።"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"በአውታረ መረቡ ላይ አልተመዘገበም።"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"የተንቀሳቃሽ ስልክ አውታረ መረብ አይገኝም።"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"አንድ ጥሪ ለማድረግ የሚሠራ ቁጥር ያስገቡ።"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"መደወል አይቻልም።"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"የMMI ቅደመ ተከተል በማስጀመር ላይ…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"አገልግሎት አይደገፍም።"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ጥሪዎችን መቀያየር አይቻልም።"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ጥሪን መለየት አይቻልም።"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ማስተላለፍ አይቻልም።"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"የጉባዔ ጥሪ ማድረግ አይቻልም።"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ጥሪውን መዝጋት አይቻልም።"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ጥሪ(ዎች)ን መልቀቅ አይቻልም።"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"የSIP ጥሪ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"የአስቸኳይ ጊዜ ጥሪ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ሬዲዮ በማብራት ላይ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"ምንም አገልግሎት የለም። ዳግም በመሞከር ላይ…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"መደወል አይቻልም። <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> የአስቸኳይ አደጋ ቁጥር አይደለም።"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"መደወል አይቻልም። ወደ የአስቸኳይ አደጋ ቁጥር ይደውሉ።"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ለመደወል የሰሌዳ ቁልፍ ተጠቀም"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"ጥሪ አቆይ"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ጥሪ ቀጥል"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ጥሪ ጨርስ"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"የመደወያ ሰሌዳ አሳይ"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"የመደወያ ሰሌዳ ደብቅ"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ድምፅ-ከል አድርግ"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ድምፅ አታጥፋ"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ጥሪ ያክሉ"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ጥሪዎችን አዋህድ"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"በውዝ"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ጥሪዎችን አደራጅ"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"የስብሰባ ስልክ ጥሪ አደራጅ"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"የስብሰባ ጥሪ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"ያስተዳድሩ"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ኦዲዮ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"የቪዲዮ ጥሪ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ወደ ድምፅ ጥሪ ይለውጡ"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ካሜራ ቀይር"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ቪድዮ ለአፍታ አቁም"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"ተጨማሪ አማራጮች"</string>
+ <string name="player_started" msgid="3478865572468310331">"አጫዋች ጀምሯል"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"አጫዋች ቆሟል"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ካሜራ ዝግጁ አይደለም"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ካሜራ ዝግጁ ነው"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"ያልታወቀ የጥሪ ክፍለጊዜ ክስተት"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"አገልግሎት"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"አዋቅር"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;አልተዘጋጀም&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"ሌሎች የጥሪ ቅንብሮች"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"በ<xliff:g id="PROVIDER_NAME">%s</xliff:g> በኩል በመደወል ላይ"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"በ<xliff:g id="PROVIDER_NAME">%s</xliff:g> በኩል የመጣ"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"የዕውቂያ ፎቶ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ወደ ግላዊነት ሂድ"</string>
+ <string name="selectContact" msgid="92191462970821951">"ዕውቂያ ይምረጡ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"የእራስዎን ይጻፉ..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"ተወው"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ላክ"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"መልስ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"ኤስኤምኤስ ላክ"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ውድቅ አድርግ"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"እንደ ቪድዮ ጥሪ ይመልሱ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"እንደ ድምፅ ጥሪ ይመልሱ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"የቪዲዮ ጥያቄ ተቀበል"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"የቪዲዮ ጥያቄ ውድቅ አድርግ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"የቪዲዮ አስተላልፍ ጥያቄን ተቀበል"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"የቪዲዮ አስተላልፍ ጥያቄን ውድቅ አድርግ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"የቪዲዮ ተቀበል ጥያቄን ተቀበል"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"የቪዲዮ ተቀበል ጥያቄን ውድቅ አድርግ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ላይ ያንሸራትቱ።"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ግራ ያንሸራትቱ።"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ቀኝ ያንሸራትቱ።"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"ለ<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ወደ ታች ያንሸራትቱ።"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ንዘር"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ንዘር"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ድምፅ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ነባሪ ድምፅ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"የስልክ ጥሪ ቅላጼ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"በሚደወልበት ጊዜ ንዘር"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"የጥሪ ቅላጼ እና ንዘረት"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"የስብሰባ ስልክ ጥሪ አደራጅ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"የአደጋ ጊዜ ቁጥር"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ሰከንዶች</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ሰከንዶች</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ደቂቃዎች</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ደቂቃዎች</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ሰዓቶች</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ሰዓቶች</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"የመገለጫ ፎቶ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ካሜራ ጠፍቷል"</string>
+ <string name="child_number" msgid="4469090994612105532">"በ<xliff:g id="CHILD_NUMBER">%s</xliff:g> በኩል"</string>
+ <string name="note_sent" msgid="7623014827902758398">"ማስታወሻ ተልኳል"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"የቅርብ ጊዜ መልእክቶች"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"የንግድ መረጃ"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> ማይል ርቀት ላይ"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> ኪሜ ርቀት ላይ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>፣ <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>፣ <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"ነገ <xliff:g id="OPEN_TIME">%s</xliff:g> ላይ ይከፈታል"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ዛሬ <xliff:g id="OPEN_TIME">%s</xliff:g> ላይ ይከፈታል"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ላይ ይዘጋል"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ዛሬ <xliff:g id="CLOSE_TIME">%s</xliff:g> ላይ ተዘግቷል"</string>
+ <string name="open_now" msgid="4615706338669555999">"አሁን ክፍት ነው"</string>
+ <string name="closed_now" msgid="2635314668145282080">"አሁን ዝግ ነው"</string>
+</resources>
diff --git a/InCallUI/res/values-ar/strings.xml b/InCallUI/res/values-ar/strings.xml
new file mode 100644
index 000000000..a9b4b1d6b
--- /dev/null
+++ b/InCallUI/res/values-ar/strings.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"الهاتف"</string>
+ <string name="onHold" msgid="527593602772521700">"معلقة"</string>
+ <string name="unknown" msgid="3646075119047488748">"غير معروف"</string>
+ <string name="private_num" msgid="6081418498487514686">"رقم خاص"</string>
+ <string name="payphone" msgid="5743050584468748607">"هاتف بالعملة"</string>
+ <string name="confCall" msgid="3181961445236675173">"مكالمة جماعية"</string>
+ <string name="call_lost" msgid="8208184291640961172">"تم قطع المكالمة"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"السماعة"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"سماعة الأذن للهاتف"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"سماعة رأس سلكية"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"بلوتوث"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"هل تريد إرسال النغمات التالية؟\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"إرسال النغمات\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"إرسال"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"نعم"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"لا"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"استبدال حرف البدل بـ"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"مكالمة جماعية <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"رقم البريد الصوتي"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"جارٍ الطلب"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"جارٍ إعادة الطلب"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"مكالمة جماعية"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"مكالمة واردة"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"مكالمة عمل واردة"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"تم إنهاء الاتصال"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"معلقة"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"جارٍ وقف المكالمة"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"بصدد مكالمة"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"رقمي <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"جارٍ الاتصال بالفيديو"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"مكالمة فيديو"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"جارٍ طلب الفيديو"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"يتعذر الاتصال بمكالمة فيديو"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"تم رفض طلب الفيديو"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"رقم معاودة الاتصال\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"رقم معاودة اتصال الطوارئ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"جارٍ الطلب"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"مكالمة فائتة"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"المكالمات الفائتة"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> من المكالمات الفائتة"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"مكالمة فائتة من <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"مكالمة حالية"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"مكالمة عمل جارية"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"‏مكالمة جارية عبر Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"‏مكالمة عمل جارية عبر Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"معلقة"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"مكالمة واردة"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"مكالمة عمل واردة"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"‏مكالمة واردة عبر Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"‏مكالمة عمل واردة عبر اتصال Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"مكالمة فيديو واردة"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"طلب فيديو وارد"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"بريد صوتي جديد"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"بريد صوتي جديد (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"طلب <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"رقم البريد الصوتي غير معروف"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"لا تتوفر خدمة"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"الشبكة المحددة (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) غير متاحة"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"رد"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"قطع الاتصال"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"فيديو"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"صوت"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"قبول"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"تجاهل"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"معاودة الاتصال"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"رسالة"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"لإجراء مكالمة، أوقف تشغيل وضع الطائرة أولاً."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"غير مسجل على الشبكة."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"شبكة الجوّال غير متاحة."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"لإجراء مكالمة، أدخل رقمًا صالحًا."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"يتعذر الاتصال."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"‏جارٍ بدء تسلسل MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"الخدمة ليست متوفرة."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"يتعذر تبديل المكالمات."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"يتعذر فصل المكالمة."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"يتعذر النقل."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"يتعذر إجراء مكالمة جماعية."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"يتعذر رفض المكالمة."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"يتعذر تحرير المكالمات."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"‏مكالمة SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"مكالمة طوارئ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"جارٍ تشغيل اللاسلكي..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"لا تتوفر خدمة. جارٍ إعادة المحاولة…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"يتعذر الاتصال. لا يعد <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> رقم طوارئ."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"يتعذر الاتصال. يمكنك طلب رقم طوارئ"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"استخدام لوحة المفاتيح للطلب"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"تعليق المكالمة"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"استئناف المكالمة"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"إنهاء المكالمة"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"عرض لوحة الاتصال"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"إخفاء لوحة الاتصال"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"تجاهل"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"إلغاء التجاهل"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"إضافة مكالمة"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"دمج المكالمات"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"تبديل"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"إدارة المكالمات"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"إدارة مكالمة جماعية"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"مكالمة جماعية"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"إدارة"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"صوت"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"مكالمة فيديو"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"التغيير إلى مكالمة صوتية"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"تبديل الكاميرا"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"إيقاف الفيديو مؤقتًا"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"خيارات أخرى"</string>
+ <string name="player_started" msgid="3478865572468310331">"تم بدء المشغّل"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"تم إيقاف المشغّل"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"الكاميرا غير جاهزة"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"الكاميرا جاهزة"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"حدث جلسة اتصال غير معروف"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"الخدمة"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"الإعداد"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"‏&lt;لم يتم التعيين&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"إعدادات الاتصال الأخرى"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"الاتصال عبر <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"واردة عبر <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"صورة جهة الاتصال"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"انتقال إلى مكالمة خاصة"</string>
+ <string name="selectContact" msgid="92191462970821951">"تحديد جهة اتصال"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"اكتب ردك…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"إلغاء"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"إرسال"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"الرد"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"‏إرسال رسالة قصيرة SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"الرفض"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"الرد بمكالمة فيديو"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"الرد بمكالمة صوتية"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"قبول طلب الفيديو"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"رفض طلب الفيديو"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"قبول طلب بث الفيديو"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"رفض طلب بث الفيديو"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"قبول طلب استلام مكالمة الفيديو"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"رفض طلب استلام مكالمة الفيديو"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"تمرير لأعلى لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"تمرير لليسار لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"تمرير لليمين لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"تمرير لأسفل لـ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"اهتزاز"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"اهتزاز"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"الصوت"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"الصوت الافتراضي (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"نغمة رنين الهاتف"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"اهتزاز عند الرنين"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"نغمة الرنين والاهتزاز"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"إدارة مكالمة جماعية"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"رقم الطوارئ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> ثانية</item>
+ <item quantity="two">ثانيتان (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ثوانٍ</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> ثانية</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ثانية</item>
+ <item quantity="one">ثانية واحدة</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> دقيقة</item>
+ <item quantity="two">دقيقتان (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> دقائق</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> دقيقة</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> دقيقة</item>
+ <item quantity="one">دقيقة واحدة</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> ساعة</item>
+ <item quantity="two">ساعتان (<xliff:g id="COUNT">%d</xliff:g>)</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ساعات</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> ساعة</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ساعة</item>
+ <item quantity="one">ساعة واحدة</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"صورة الملف الشخصي"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"تم إيقاف الكاميرا"</string>
+ <string name="child_number" msgid="4469090994612105532">"عبر <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"تم إرسال الملاحظة"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"الرسائل الأخيرة"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"معلومات النشاط التجاري"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"على بُعد <xliff:g id="DISTANCE">%.1f</xliff:g> ميل"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"على بُعد <xliff:g id="DISTANCE">%.1f</xliff:g> كم"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>، <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>، <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"مفتوح غدًا في <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"مفتوح اليوم في <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"مغلق في <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"مغلق اليوم في <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"مفتوح الآن"</string>
+ <string name="closed_now" msgid="2635314668145282080">"مغلق الآن"</string>
+</resources>
diff --git a/InCallUI/res/values-az-rAZ/strings.xml b/InCallUI/res/values-az-rAZ/strings.xml
new file mode 100644
index 000000000..3ce629fc8
--- /dev/null
+++ b/InCallUI/res/values-az-rAZ/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Gözləmə mövqeyində"</string>
+ <string name="unknown" msgid="3646075119047488748">"Naməlum"</string>
+ <string name="private_num" msgid="6081418498487514686">"Şəxsi nömrə"</string>
+ <string name="payphone" msgid="5743050584468748607">"Taksofon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konfrans zəngi"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Zəng bitdi"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Dinamik"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Dəstək qulaqlığı"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Simli qulaqlıq"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Aşağıdakı tonlar göndərilsin?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Tonlar göndərilir\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Göndər"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Bəli"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Xeyr"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Joker simvolları əvəz edin"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konfrans zəngi <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Səsli poçt nömrəsi"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Nömrə yığılır"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Yenidən yığır"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konfrans zəngi"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Gələn zəng"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Daxil olan iş çağrısı"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Zəng sona çatdı"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Gözləmə mövqeyində"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Dəstək asılır"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Çağrıda"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mənim nömrəm <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Video qoşulur"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video zəng"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Video sorğusu göndərilir"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Video zəngə qoşulmaq mümkün deyil"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video sorğusu rədd edildi"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Cavab zəngi nömrəniz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Təcili cavab zəngi nömrəniz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Nömrə yığılır"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Buraxılmış zəng"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Buraxılmış zənglər"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> buraxılmış zənglər"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> tərəfindən zəng buraxılıb"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Davam edən çağrı"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Davam edən iş çağrısı"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Davam edən Wi-Fi zəngi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Davam edən Wi-Fi iş çağrısı"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Gözləmə mövqeyində"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Gələn zəng"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Daxil olan iş çağrısı"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Gələn Wi-Fi zəngi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Daxil olan Wi-Fi iş çağrısı"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Gələn video zəng"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Gələn video çağrı"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Yeni səsli poçt"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Yeni səsli poçt (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Yığın <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Səsli poçt nömrəsi naməlumdur"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Xidmət yoxdur"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Seçilmiş (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) şəbəkə əlçatmazdır"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Cavab"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Dəstəyi qoyun"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videolar"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Səs"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Qəbul edin"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Rədd edin"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Geriyə zəng"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mesaj"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Zəng etmək üçün ilk olaraq Uçuş Rejimini söndürün."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Şəbəkədə qeydə alınmayıb."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobil şəbəkə əlçatan deyil"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Zəngi yerləşdirmək üçün düzgün nömrə daxil edin."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Zəng etmək mümkün deyil."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI başlanma ardıcıllığı…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Xidmət dəstəklənmir."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Zəngləri keçirmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Zəngi ayırmaq mümkün deyil."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Ötürmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konfrans keçirmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Zəngi rədd etmək mümkün deyil."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Zəngləri buraxmaq mümkün deyil."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP çağrısıs"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Təcili zəng"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Radio yandırılır ..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Xidmət yoxdur. Yenidən cəhd edilir…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Zəng etmək mümkün deyil. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> fövqəladə nömrə deyil."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Zəng etmək mümkün deyil. Fövqəladə nömrəni yı"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Nömrə yığmaq üçün klaviaturadan istifadə ediin"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Zəngi gözlədin"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Zəngə davam edin"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Zəngi bitirin"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Yığım düymələrini göstərin"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Yığım düymələrini gizlədin"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Susdurun"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Susdurmayın"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Zəng əlavə edin"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Zəngləri birləşdirin"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Dəyişdirin"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Zəngləri idarə edin"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Konfrans çağrısını idarə edin"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konfrans zəngi"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"İdarə edin"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video zəng"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Səsli çağrıya dəyişin"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Kameraya keçin"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Videonu durdurun"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Daha çox seçim"</string>
+ <string name="player_started" msgid="3478865572468310331">"Pleyer Başladıldı"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Pleyer Dayandırıldı"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera hazır deyil"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera hazırdır"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Naməlum zəng sessiyası"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Xidmət"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Quraşdırma"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Təyin edilməyib&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Digər zəng parametrləri"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> vasitəsi ilə zəng edilir"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> vasitəsilə gələn"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontakt fotosu"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"şəxsi rejimə keçin"</string>
+ <string name="selectContact" msgid="92191462970821951">"kontakt seçin"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Özünüzünkünü yazın"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Ləğv edin"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Göndər"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Cavab"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS göndərin"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"İmtina edin"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Video çağrı olaraq cavab verin"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Audio çağrı olaraq cavab verin"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Video sorğusunu qəbul edin"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Video sorğusunu ləğv edin"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Video ötürmə sorğusunu qəbul edin"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Video ötürmə sorğusunu ləğv edin"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Video qəbuletmə sorğusunu qəbul edin"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Video qəbuletmə sorğusunu ləğv edin"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün yuxarı sürüşdürün."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sola sürüşdürün."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün sağa sürüşdürün."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> üçün aşağı sürüşdürün."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrasiya"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrasiya"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Səs"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Defolt səs (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefon zəng səsi"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Zəng çalanda vibrasiya olsun"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Zəng səsi &amp; Vibrasiya"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Konfrans çağrısını idarə edin"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Təcili nömrə"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saniyə</item>
+ <item quantity="one">1 saniyə</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> dəqiqə</item>
+ <item quantity="one">1 dəqiqə</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saat</item>
+ <item quantity="one">1 saat</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profil fotosu"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera deaktivdir"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> vasitəsilə"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Qeyd göndərildi"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Son mesajlar"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Biznes məlumatı"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil uzaqlıqda"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km uzaqlıqda"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Sabah saat <xliff:g id="OPEN_TIME">%s</xliff:g> açılır"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Bu gün saat <xliff:g id="OPEN_TIME">%s</xliff:g> açılır"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Saat <xliff:g id="CLOSE_TIME">%s</xliff:g> bağlanır"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Bu gün saat <xliff:g id="CLOSE_TIME">%s</xliff:g> bağlanıb"</string>
+ <string name="open_now" msgid="4615706338669555999">"İndi açın"</string>
+ <string name="closed_now" msgid="2635314668145282080">"İndi bağlandı"</string>
+</resources>
diff --git a/InCallUI/res/values-b+sr+Latn/strings.xml b/InCallUI/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..20445ab55
--- /dev/null
+++ b/InCallUI/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Na čekanju"</string>
+ <string name="unknown" msgid="3646075119047488748">"Nepoznat"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privatan broj"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefonska govornica"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferencijski poziv"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Poziv je prekinut"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Zvučnik"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Slušalica telefona"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Žičane naglavne slušalice"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Želite li da pošaljete sledeće tonove?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Tonovi se šalju\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Pošalji"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Da"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ne"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Zamenite džoker znak sa"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferencijski poziv <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Broj govorne pošte"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Poziva se"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ponovo se bira"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferencijski poziv"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Dolazni poziv"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Dolazni poziv za Work"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Poziv je završen"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Na čekanju"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Veza se prekida"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Poziv je u toku"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Moj broj je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Povezuje se video poziv"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video poziv"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Zahteva se video poziv"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Povezivanje video poziva nije uspelo"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Zahtev za video poziv je odbijen"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Broj za povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Broj za hitan povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Poziva se"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Propušten poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Broj propuštenih poziva: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Propušten poziv od: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Tekući poziv"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Tekući poziv za Work"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Tekući Wi-Fi poziv"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Tekući poziv za Work preko Wi-Fi-ja"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Na čekanju"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Dolazni poziv"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Dolazni poziv za Work"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Dolazni Wi-Fi poziv"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Dolazni poziv za Work preko Wi-Fi-ja"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Dolazni video poziv"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Zahtev za dolazni video poziv"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nova poruka govorne pošte"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nova poruka govorne pošte (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Pozovi <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nepoznat broj govorne pošte"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Mobilna mreža nije dostupna"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Izabrana mreža (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nije dostupna"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Odgovori"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Prekini vezu"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Glasovni"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Prihvatam"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Odbaci"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Uzvrati poziv"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Pošalji SMS"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Da biste uputili poziv, prvo isključite režim rada u avionu."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nije registrovano na mreži."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilna mreža nije dostupna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Da biste uputili poziv, unesite važeći broj."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Poziv nije uspeo."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Pokreće se MMI sekvenca..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Usluga nije podržana."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Zamena poziva nije uspela."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Razdvajanje poziva nije uspelo."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Prebacivanje nije uspelo."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferencijski poziv nije uspeo."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Odbijanje poziva nije uspelo."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Uspostavljanje poziva nije uspelo."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP poziv"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Hitni poziv"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Uključuje se radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Mobilna mreža nije dostupna. Pokušavamo ponovo…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Poziv nije uspeo. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nije broj za hitne slučajeve."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Poziv nije uspeo. Pozovite broj za hitne slučajeve."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Koristite tastaturu za pozivanje"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Stavi poziv na čekanje"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Nastavi poziv"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Završi poziv"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Prikaži numeričku tastaturu"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Sakrij numeričku tastaturu"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Isključi zvuk"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Uključi zvuk"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Dodaj poziv"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Objedini pozive"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Zameni"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Upravljaj pozivima"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Upravljaj konferencijskim pozivom"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferencijski poziv"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Upravljaj"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video poziv"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Promeni u glasovni poziv"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Promeni kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pauziraj video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Još opcija"</string>
+ <string name="player_started" msgid="3478865572468310331">"Plejer je pokrenut"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Plejer je zaustavljen"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera nije spremna"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera je spremna"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Nepoznat događaj sesije poziva"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Usluga"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Podešavanje"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nije podešeno&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Druga podešavanja poziva"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Poziva se preko dobavljača <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Dolazni poziv preko <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"slika kontakta"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"idi na privatno"</string>
+ <string name="selectContact" msgid="92191462970821951">"izaberite kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napišite sami…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Otkaži"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Pošalji"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Odgovori"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Pošalji SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Odbij"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Odgovori video pozivom"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Odgovori audio-pozivom"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Prihvati zahtev za video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Odbij zahtev za video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Prihvati zahtev za odlazni video poziv"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Odbij zahtev za odlazni video poziv"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Prihvati zahtev za dolazni video poziv"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Odbij zahtev za dolazni video poziv"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Prevucite nagore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Prevucite ulevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Prevucite udesno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Prevucite nadole za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibracija"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibracija"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Zvuk"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Podrazumevani zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Melodija zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibriraj kada zvoni"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Melodija zvona i vibracija"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Upravljaj konferencijskim pozivom"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Broj za hitne slučajeve"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sat</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sata</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sati</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Slika profila"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera je isključena"</string>
+ <string name="child_number" msgid="4469090994612105532">"na <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Beleška je poslata"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nedavne poruke"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informacije o preduzeću"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Udaljenost je <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Udaljenost je <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Otvara se sutra u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Otvara se danas u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zatvara se u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Zatvorilo se danas u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Trenutno otvoreno"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Trenutno zatvoreno"</string>
+</resources>
diff --git a/InCallUI/res/values-be-rBY/strings.xml b/InCallUI/res/values-be-rBY/strings.xml
new file mode 100644
index 000000000..b4b5a0251
--- /dev/null
+++ b/InCallUI/res/values-be-rBY/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Тэлефон"</string>
+ <string name="onHold" msgid="527593602772521700">"На ўтрыманні"</string>
+ <string name="unknown" msgid="3646075119047488748">"Невядомы"</string>
+ <string name="private_num" msgid="6081418498487514686">"Прыватны нумар"</string>
+ <string name="payphone" msgid="5743050584468748607">"Таксафон"</string>
+ <string name="confCall" msgid="3181961445236675173">"Канферэнц-выклік"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Выклік абарваўся"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Дынамік"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Навушнік гарнітуры"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Правадная гарнітура"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Адправіць гэтыя тоны?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Адпраўка тонаў\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Адправiць"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Так"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Не"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Замяніце знак падстаноўкі на"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Канферэнц-выклік у <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Нумар галасавой пошты"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Набор нумара"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Паўторны набор"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Канферэнц-выклік"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Уваходны выклік"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Уваходны выклік па працы"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Выклік скончаны"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"На ўтрыманні"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Завяршэнне выкліку"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"У выкліку"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Мой нумар - <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Падлучэнне відэа"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Відэавыклік"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Запыт на відэа"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Немагчыма падлучыць відэавыклік"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Запыт на відэа адхілены"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Ваш нумар зваротнага выкліку\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Ваш нумар экстраннага зваротнага выкліку\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Набор нумара"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Прапушчаны выклік"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Прапушчаныя выклікі"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Прапушчаных выклікаў: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Прапушчаны выклiк ад <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Бягучы выклік"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Бягучы выклік па працы"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Бягучы выклік праз Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Бягучы выклік па працы праз Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"На ўтрыманні"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Уваходны выклік"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Уваходны выклік па працы"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Уваходны выклік праз Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Уваходны выклік па працы праз Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Уваходны відэавыклік"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Уваходны запыт на відэавыклік"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Новая галасавая пошта"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Новыя паведамленнi галасавой пошты (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Набраць <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Невядомы нумар галасавой пошты"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Не абслугоўваецца"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Выбраная сетка (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) недаступная"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Адказ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Сконч. разм."</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Відэа"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Галасавы"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Прыняць"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Адхіліць"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Звар. выклік"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Паведамленне"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Каб зрабіць выклік, спачатку выключыце рэжым палёту."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Не зарэгістраваны ў сетцы."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Мабільная сетка недаступная."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Каб зрабіць выклік, увядзіце сапраўдны нумар."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Выклік немагчымы."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Пачатак паслядоўнасці MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Служба не падтрымліваецца."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Немагчыма пераключыць выклікі."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Немагчыма аддзяліць выклік."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Немагчыма перадаць выклік."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Немагчыма зрабіць канферэнц-выклік."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Немагчыма адхіліць выклік."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Немагчыма скончыць выклік(і)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-выклік"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Экстранны выклік"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Уключэнне радыё…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Не абслугоўваецца. Паўтор спробы…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Выклік немагчымы. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не з\'яўляецца нумарам экстраннай службы."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Выклік немагчымы. Набярыце нумар экстраннай службы."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Набраць нумар з клавіятуры"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Паставіць выклік на ўтрыманне"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Узнавіць выклік"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Завяршыць выклік"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Паказаць панэль набору"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Схаваць панэль набору"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Адключыць мікрафон"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Уключыць мікрафон"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Дадаць выклік"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Аб\'яднаць выклікі"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Пераключыць"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Кіраваць выклікамі"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Кіраванне канферэнц-выклікам"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Канферэнц-выклік"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Кіраванне"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аўдыя"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Відэавыклік"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Змяніць на галасавы выклік"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Пераключыць камеру"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Прыпыніць прайграванне відэа"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Дадатковыя параметры"</string>
+ <string name="player_started" msgid="3478865572468310331">"Прайгравальнік запушчаны"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Прайгравальнік спынены"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камера не гатовая"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камера гатовая"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Невядомая падзея сеансу выкліку"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Сэрвіс"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Наладка"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Не зададзены&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Іншыя налады выклікаў"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Выклікі праз правайдара <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Уваходны выклік праз <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"фаіаграфія кантакту"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"перайсці да прыватнай гаворкі"</string>
+ <string name="selectContact" msgid="92191462970821951">"выбраць кантакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Напiшыце сваё…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Скасаваць"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Адправiць"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Адказ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Адправiць SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Адхіліць"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Адказаць відэавыклікам"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Адказаць аўдыявыклікам"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Прыняць запыт на відэа"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Адхіліць запыт на відэа"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Прыняць запыт на перадачу відэа"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Адхіліць запыт на перадачу відэа"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Прыняць запыт на атрыманне відэа"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Адхіліць запыт на атрыманне відэа"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Правядзіце пальцам уверх, каб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Правядзіце пальцам улева, каб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Правядзіце пальцам управа, каб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Правядзіце пальцам уніз, каб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Вібрацыя"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Вібрацыя"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Гук"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Стандартны гук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Рынгтон тэлефона"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Вібрацыя падчас званка"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Рынгтон і вiбрацыя"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Кіраванне канферэнц-выклікам"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Нумар экстраннай службы"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунды</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунды</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> хвіліна</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> хвіліны</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> хвілін</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> хвіліны</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> гадзіна</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> гадзіны</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> гадзін</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> гадзіны</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Фота профілю"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камера адключана"</string>
+ <string name="child_number" msgid="4469090994612105532">"праз <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Нататка адпраўлена"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Апошнія паведамленні"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Бізнес-інфармацыя"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Адлеглаць у мілях: <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Адлегласць <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Адкрываецца заўтра ў <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Адкрываецца сёння ў <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Закрываецца ў <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Закрыта сёння ў <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Адкрыць зараз"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Зараз закрыта"</string>
+</resources>
diff --git a/InCallUI/res/values-bg/strings.xml b/InCallUI/res/values-bg/strings.xml
new file mode 100644
index 000000000..92baee56e
--- /dev/null
+++ b/InCallUI/res/values-bg/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Телефон"</string>
+ <string name="onHold" msgid="527593602772521700">"Задържано"</string>
+ <string name="unknown" msgid="3646075119047488748">"Неизвестно лице"</string>
+ <string name="private_num" msgid="6081418498487514686">"Частен номер"</string>
+ <string name="payphone" msgid="5743050584468748607">"Обществен телефон"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конферентно обаждане"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Обаждането бе прекъснато"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Високоговорител"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Телефонна слушалка"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Слушалки с кабел"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Да се изпратят ли следните мелодии? \n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Мелодиите се изпращат\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Изпращане"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Да"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Не"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Замяна на заместващия символ със:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Конферентно обаждане – <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Номер за гласова поща"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Набира се"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Набира се отново"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конферентно обаждане"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Входящо обаждане"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Входящо служебно обаждане"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Обаждането завърши"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Задържано"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Разговорът се приключва"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Извършва се обаждане"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Номерът ми е <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Установява се видеовръзка"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Видеообаждане"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Заявява се видеовръзка"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Видеообаждането не може да се осъществи"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Заявката за видеовръзка е отхвърлена"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Номерът ви за обратно обаждане\n– <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Номерът ви за спешно обратно обаждане\n– <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Набиране"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Пропуснато обаждане"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Пропуснати обаждания"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> пропуснати обаждания"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Пропуснато обаждане от <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Текущо обаждане"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Текущо служебно обаждане"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Текущо обаждане през Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Текущо служебно обаждане през Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Задържано"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Входящо обаждане"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Входящо служебно обаждане"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Входящо обаждане през Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Входящо служебно обаждане през Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Входящо видеообаждане"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Заявка за входящо видеообаждане"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Нова гласова поща"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Нова гласова поща (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Набиране на <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Неизвестен номер за гласова поща"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Няма покритие"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Избраната мрежа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) не е налице"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Приемане"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Затваряне"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Видеообажд."</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Гл. обаждане"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Приемане"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Отхвърляне"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Обр. обажд."</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Съобщение"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"За да осъществите обаждане, първо изключете самолетния режим."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Няма регистрация в мрежата."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Няма достъп до клетъчната мрежа."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"За да извършите обаждане, въведете валиден номер."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Не може да се извърши обаждане."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Стартира се последователността MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Услугата не се поддържа."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Обажданията не могат да се превключат."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Обаждането не може да се отдели."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Не може да се прехвърли."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Не може да се извърши конферентно обаждане."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Обаждането не може да се отхвърли."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Обаждането или съответно обажданията не могат да се освободят."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Обаждане чрез SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Спешно обаждане"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Радиомодулът се включва…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Няма услуга. Извършва се нов опит…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Не може да се извърши обаждане. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не е номер за спешни случаи."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Не може да се извърши обаждане. Наберете номер за спешни случаи."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Използвайте клавиатурата за набиране"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Задържане на обаждането"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Възобновяване на обаждането"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Край на обаждането"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Показване на клавиатурата за набиране"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Скриване на клавиатурата за набиране"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Заглушаване"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Пускане"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Добавяне на обаждане"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Обединяване на обаждания"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Размяна"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Управление на обажданията"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Управление на конф. обаждане"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конферентно обаждане"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Управление"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Видеообажд."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Преминаване към гласово обаждане"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Превключване на камерата"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Поставяне на видеовръзката на пауза"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Още опции"</string>
+ <string name="player_started" msgid="3478865572468310331">"Плейърът е стартиран"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Плейърът е спрян"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камерата не е в готовност"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камерата е в готовност"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Неизвестно събитие в сесията на обаждане"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Услуга"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Настройване"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Не е зададено&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Други настройки за обаждане"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Обаждане чрез <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Входящо обаждане чрез <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"снимка на контакта"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"превключване към частно обаждане"</string>
+ <string name="selectContact" msgid="92191462970821951">"избиране на контакта"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Напишете свой собствен..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Отказ"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Изпращане"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Приемане"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Изпращане на SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Отхвърляне"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Приемане като видеообаждане"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Приемане като аудиообаждане"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Приемане на заявката за видеовръзка"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Отхвърляне на заявката за видеовръзка"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Приемане на заявката за предаване на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Отхвърляне на заявката за предаване на видео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Приемане на заявката за получаване на видеообаждане"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Отхвърляне на заявката за получаване на видео"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Плъзнете нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Плъзнете наляво за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Плъзнете надясно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Плъзнете надолу за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Вибриране"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Вибриране"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Звук"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Стандартен звук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Мелодия на телефона"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Вибриране при звънене"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Мелодия и вибриране"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Управление на конферентното обаждане"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Спешен номер"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ <item quantity="one">1 секунда</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минути</item>
+ <item quantity="one">1 минута</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ <item quantity="one">1 час</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Снимка на потребителския профил"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камерата е изключена"</string>
+ <string name="child_number" msgid="4469090994612105532">"чрез <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Бележката е изпратена"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Скорошни съобщения"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Бизнес информация"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"На <xliff:g id="DISTANCE">%.1f</xliff:g> мили"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"На <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>; <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Отваря утре в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Отваря днес в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Затваря в <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Затворено днес в <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"В момента работи"</string>
+ <string name="closed_now" msgid="2635314668145282080">"В момента не работи"</string>
+</resources>
diff --git a/InCallUI/res/values-bn-rBD/strings.xml b/InCallUI/res/values-bn-rBD/strings.xml
new file mode 100644
index 000000000..56400c3af
--- /dev/null
+++ b/InCallUI/res/values-bn-rBD/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ফোন"</string>
+ <string name="onHold" msgid="527593602772521700">"হোল্ডে রয়েছে"</string>
+ <string name="unknown" msgid="3646075119047488748">"অজানা"</string>
+ <string name="private_num" msgid="6081418498487514686">"ব্যক্তিগত নম্বর"</string>
+ <string name="payphone" msgid="5743050584468748607">"অর্থের বিনিময়ে কল করার ফোন"</string>
+ <string name="confCall" msgid="3181961445236675173">"কনফারেন্স কল"</string>
+ <string name="call_lost" msgid="8208184291640961172">"কল সমাপ্ত হয়েছে"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"স্পিকার"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"হ্যান্ডসেট ইয়ারপিস"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"তারযুক্ত হেডসেট"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ব্লুটুথ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"নিম্নলিখিত টোনগুলি পাঠাবেন?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"টোনগুলি পাঠানো হচ্ছে\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"পাঠান"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"হ্যাঁ"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"না"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ওয়াইল্ড অক্ষরগুলিকে এর মাধ্যমে প্রতিস্থাপিত করুন"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"কনফারেন্স কল <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"ভয়েসমেল নম্বর"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ডায়াল করা হচ্ছে"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"পুনরায় ডায়াল করা হচ্ছে"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"কনফারেন্স কল"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"আগত কল"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"আগত কাজের কল"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"কল সমাপ্ত হয়েছে"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"হোল্ডে রয়েছে"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"কল নামিয়ে রাখা হচ্ছে"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"কলের সময়ে"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"আমার নম্বর হল <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ভিডিও সংযুক্ত করছে"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ভিডিও কল"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ভিডিওর অনুরোধ করছে"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ভিডিও কলে সংযোগ করা যাচ্ছে না"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ভিডিওর অনুরোধ প্রত্যাখ্যান করা হয়েছে"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"আপনার কলব্যাক নম্বর\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"আপনার জরুরী কলব্যাক নম্বর\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ডায়াল করা হচ্ছে"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"মিসড কল"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"মিসড কলগুলি"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>টি মিসড কল"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> এর থেকে মিসড কল"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"চলমান কল"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"চলমান কাজের কল"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"চলমান ওয়াই-ফাই কল"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"চলমান ওয়াই-ফাই কাজের কল"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"হোল্ডে রয়েছে"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"আগত কল"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"আগত কাজের কল"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"আগত ওয়াই-ফাই কল"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"আগত ওয়াই-ফাই কাজের কল"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"আগত ভিডিও কল"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"আগত ভিডিও অনুরোধ"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"নতুন ভয়েসমেল"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"নতুন ভয়েসমেল (<xliff:g id="COUNT">%d</xliff:g>টি)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ডায়াল করুন"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ভয়েসমেল নম্বর অজানা"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"কোনো পরিষেবা নেই"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"নির্বাচিত নেটওয়ার্ক (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) অনুপলব্ধ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"উত্তর"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"কল নামিয়ে রাখুন"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ভিডিও"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ভয়েস"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"স্বীকার করুন"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"খারিজ করুন"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"ঘুরিয়ে কল করুন"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"বার্তা"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"একটি কল করতে, প্রথমে বিমানমোড বন্ধ করুন৷"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"নেটওয়ার্কে নিবন্ধিত নয়৷"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"সেলুলার নেটওয়ার্ক উপলব্ধ নয়।"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"কোনো কল স্থাপন করতে, একটি বৈধ নম্বর লিখুন৷"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"কল করা যাবে না৷"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI ক্রম চালু হচ্ছে…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"পরিষেবা সমর্থিত নয়৷"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"কলগুলি স্যুইচ করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"কল আলাদা করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"হস্তান্তর করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"কনফারেন্স করা যাবে না৷"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"কল প্রত্যাখ্যান কলা যাবে না৷"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"কল(গুলি) কাটা যাবে না৷"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP কল"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"জরুরি কল"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"রেডিও চালু করা হচ্ছে…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"কোন পরিষেবা নেই৷ আবার চেষ্টা করা হচ্ছে..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"কল করা যাবে না৷ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> কোনো জরুরী নম্বর নয়৷"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"কল করা যাবে না৷ কোনো জরুরী নম্বর ডায়াল করুন৷"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ডায়াল করতে কীবোর্ড ব্যবহার করুন"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"কল হোল্ডে রাখুন"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"কল পুনরায় শুরু করুন"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"কল শেষ করুন"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ডায়ালপ্যাড দেখান"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ডায়ালপ্যাড লুকান"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"নিঃশব্দ করুন"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"সশব্দ করুন"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"কল যোগ করুন"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"কলগুলি মার্জ করুন"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"সোয়াপ করুন"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"কলগুলি পরিচালনা করুন"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"কনফারেন্স কল পরিচালনা করুন"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"কনফারেন্স কল"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"পরিচালনা করুন"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"অডিও"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ভিডিও কল"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ভয়েস কলে পরিবর্তন করুন"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ক্যামেরা স্যুইচ করুন"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ভিডিও বিরাম দিন"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"আরো বিকল্প"</string>
+ <string name="player_started" msgid="3478865572468310331">"প্লেয়ার শুরু হয়েছে"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"প্লেয়ার বন্ধ হয়ে গেছে"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ক্যামেরা রেডি নয়"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ক্যামেরা রেডি"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"অজানা কল অধিবেশনের ইভেন্ট"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"পরিষেবা"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"সেটআপ"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;সেট করা নেই&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"অন্যান্য কল সেটিংস"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> এর মাধ্যমে কল করা হচ্ছে"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> এর মাধ্যমে ইনকামিং কল"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"পরিচিতির ফটো"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ব্যক্তিগতভাবে কাজ করুন"</string>
+ <string name="selectContact" msgid="92191462970821951">"পরিচিতি নির্বাচন করুন"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"আপনার নিজের পছন্দ মতো লিখুন…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"বাতিল করুন"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"পাঠান"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"উত্তর"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS পাঠান"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"অস্বীকার করুন"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ভিডিও কল হিসেবে উত্তর দিন"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"অডিও কল হিসেবে উত্তর দিন"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ভিডিওর অনুরোধ গ্রহণ করুন"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ভিডিওর অনুরোধ প্রত্যাখ্যান করুন"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ভিডিও প্রেরণ করার অনুরোধ স্বীকার করুন"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ভিডিও প্রেরণ করার অনুরোধ প্রত্যাখ্যান করুন"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ভিডিও গ্রহণ করার অনুরোধ স্বীকার করুন"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ভিডিও গ্রহণ করার অনুরোধ প্রত্যাখ্যান করুন"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাম দিকে স্লাইড করুন৷"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য ডান দিকে স্লাইড করুন৷"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য নীচের দিকে স্লাইড করুন৷"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"কম্পন"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"কম্পন"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"শব্দ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ডিফল্ট শব্দ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ফোন রিংটোন"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"রিং হওয়ার সময় কম্পন হবে"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"রিংটোন ও কম্পন"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"কনফারেন্স কল পরিচালনা করুন"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"জরুরি নম্বর"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ড</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> সেকেন্ড</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> মিনিট</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> মিনিট</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ঘণ্টা</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ঘণ্টা</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"প্রোফাইল ফটো"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ক্যামেরা বন্ধ"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> এর মাধ্যমে"</string>
+ <string name="note_sent" msgid="7623014827902758398">"নোট পাঠানো হয়েছে"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"সাম্প্রতিক বার্তাগুলি"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ব্যবসার তথ্য"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> মাইল দূরে"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> কিলোমিটার দূরে"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"আগামীকাল <xliff:g id="OPEN_TIME">%s</xliff:g>\'টায় খুলবে"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"আজ <xliff:g id="OPEN_TIME">%s</xliff:g>\'টায় খুলবে"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>\'টায় বন্ধ হয়"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"আজ <xliff:g id="CLOSE_TIME">%s</xliff:g>\'টায় বন্ধ হয়েছে"</string>
+ <string name="open_now" msgid="4615706338669555999">"এখন খোলা রয়েছে"</string>
+ <string name="closed_now" msgid="2635314668145282080">"এখন বন্ধ রয়েছে"</string>
+</resources>
diff --git a/InCallUI/res/values-bs-rBA/strings.xml b/InCallUI/res/values-bs-rBA/strings.xml
new file mode 100644
index 000000000..df8259468
--- /dev/null
+++ b/InCallUI/res/values-bs-rBA/strings.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Na čekanju"</string>
+ <string name="unknown" msgid="3646075119047488748">"Nepoznato"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privatni broj"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefonska govornica"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferencijski poziv"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Poziv je prekinut"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Zvučnik"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Slušalice telefona"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Žičane slušalice"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Poslati sljedeće tonove?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Slanje tonova\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Pošalji"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Da"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ne"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Zamijeni zamjenski znak sa"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferencijski poziv <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Broj govorne pošte"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Poziva se"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ponovno pozivanje"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferencijski poziv"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Dolazni poziv"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Dolazni poslovni poziv"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Poziv je završen"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Na čekanju"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Prekid veze"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Poziv u toku"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Moj broj je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Uspostavljanje videopoziva"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videopoziv"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Zahtijevanje videopoziva"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Nije moguće uspostaviti videopoziv"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Zahtjev za videopoziv je odbijen"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Vaš broj za povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Vaš broj za hitni povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Poziva se"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Propušteni poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Propušteni pozivi: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Propušteni poziv od kontakta <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Poziv u toku"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Poslovni poziv u toku"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Wi-Fi poziv u toku"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Wi-Fi poslovni poziv u toku"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Na čekanju"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Dolazni poziv"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Dolazni poslovni poziv"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Dolazni Wi-Fi poziv"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Dolazni Wi-Fi poslovni poziv"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Dolazni videopoziv"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Zahtjev za dolazni videopoziv"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nova govorna pošta"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nova govorna pošta (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Pozovi <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nepoznat broj govorne pošte"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nema mreže"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Odabrana mreža (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) je nedostupna"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Odgovori"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Prekini vezu"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videopoziv"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Glasovni poziv"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Prihvati"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Odbaci"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Povr. poziv"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Poruka"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Da uputite poziv, isključite Način rada u avionu."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nije registrirano na mreži."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilna mreža nije dostupna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Da uputite poziv, upišite važeći broj."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Nije moguće pozvati."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Pokretanje MMI sekvence u toku…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Usluga nije podržana."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Nije moguće prebacivanje poziva."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Nije moguće odvojiti poziv."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Prijenos nije moguć."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferencijski poziv nije uspio."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Nije moguće odbiti poziv."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Nije moguće uputiti poziv(e)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP poziv"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Hitni poziv"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Uključivanje radija u toku…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nema mreže. Ponovni pokušaj u toku…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Nije moguće pozvati. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nije broj za htine slučajeve."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Nije moguće pozvati. Pozovite broj za hitne slučajeve."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Koristi tastaturu za biranje"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Stavi poziv na čekanje"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Nastavi poziv"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Prekini poziv"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Prikaži telefonsku tipkovnicu"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Sakrij telefonsku tipkovnicu"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Isključi zvuk"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Uključi zvuk"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Dodaj poziv"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Spoji pozive"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Zamijeni"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Upravljaj pozivima"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Upravljaj konf. pozivom"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferencijski poziv"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Upravljaj"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Zvuk"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videopoziv"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Promijeni na glasovni poziv"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Promijeni kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pauziraj videopoziv"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Više opcija"</string>
+ <string name="player_started" msgid="3478865572468310331">"Plejer je pokrenut"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Plejer je zaustavljen"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera nije spremna"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera je spremna"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Nepoznati događaj sesije poziva"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Usluga"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Postavljanje"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nije postavljeno&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Ostale postavke poziva"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Pozivanje putem <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Dolazni poziv putem <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotografija kontakta"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"idi na privatno"</string>
+ <string name="selectContact" msgid="92191462970821951">"odaberi kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napišite svoj..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Otkaži"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Pošalji"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Odgovori"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Pošalji SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Odbij"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Odgovori videopozivom"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Prihvati kao audiopoziv"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Prihvati zahtjev za videopoziv"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Odbij zahtjev za videopoziv"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Prihvati zahtjev za slanje videopoziva"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Odbij zahtjev za slanje videopoziva"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Prihvati zahtjev za primanje videopoziva"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Odbij zahtjev za primanje videopoziva"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Kliznite nagore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Kliznite nadesno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Kliznite nadolje za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibracija"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibracija"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Zvuk"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Zadani zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Melodija zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibriraj kada zvoni"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Melodija zvona i vibracija"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Upravljaj konferencijskim pozivom"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Broj za hitne slučajeve"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sat</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sata</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sati</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Fotografija profila"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera je isključena"</string>
+ <string name="child_number" msgid="4469090994612105532">"putem <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Bilješka je poslana"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nedavne poruke"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informacije o preduzeću"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Udaljenost u miljama: <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Udaljenost u km: <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Otvara se sutra u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Otvara se danas u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zatvara se u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Zatvoreno danas u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Otvori sad"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Zatvoreno sada"</string>
+</resources>
diff --git a/InCallUI/res/values-ca/strings.xml b/InCallUI/res/values-ca/strings.xml
new file mode 100644
index 000000000..c1702032d
--- /dev/null
+++ b/InCallUI/res/values-ca/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telèfon"</string>
+ <string name="onHold" msgid="527593602772521700">"En espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Desconegut"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privat"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telèfon públic"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conferència"</string>
+ <string name="call_lost" msgid="8208184291640961172">"La trucada s\'ha interromput"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altaveu"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auricular"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Auricular amb cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Vols enviar els tons següents?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"S\'estan enviant els tons\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Envia"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sí"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"No"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Substitueix el caràcter comodí per"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conferència, <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número del missatge de veu"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"S\'està marcant"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"S\'està tornant a marcar"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conferència"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Trucada entrant"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Trucada de feina entrant"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Ha finalitzat la trucada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"S\'està penjant"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"En una trucada"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"El meu número és <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"S\'està connectant el vídeo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videotrucada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"S\'està sol·licitant el vídeo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"No es pot connectar la videotrucada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"S\'ha rebutjat la sol·licitud de vídeo"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Número de devolució de trucada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Número de devolució de trucada d\'emergència\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"S\'està marcant"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Trucada perduda"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Trucades perdudes"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> trucades perdudes"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Trucada perduda de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Trucada en curs"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Trucada de feina en curs"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Trucada per Wi-Fi en curs"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Trucada de feina per Wi-Fi en curs"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"En espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Trucada entrant"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Trucada de feina entrant"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Trucada per Wi-Fi entrant"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Trucada de feina per Wi-Fi entrant"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videotrucada entrant"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Sol·licitud de vídeo entrant"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Missatge de veu nou"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Missatges de veu nous (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Marca <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número del missatge de veu desconegut"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sense servei"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"La xarxa seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no està disponible"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Respon"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Penja"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Veu"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accepta"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ignora"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Torna trucada"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Missatge"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Per fer una trucada, primer desactiva el mode d\'avió."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"No s\'ha registrat a la xarxa."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"La xarxa mòbil no està disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Introdueix un número vàlid per fer una trucada."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"No es pot trucar."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"S\'està iniciant la seqüència MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"El servei no és compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"No es pot canviar de trucada."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"No es pot separar la trucada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"No es poden transferir trucades."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"No es pot establir la conferència."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"No es pot rebutjar la trucada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"No es poden alliberar trucades."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Trucada de SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Trucada d\'emergència"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"S\'està activant el senyal mòbil…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"No hi ha servei. S\'està tornant a provar…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"No es pot trucar. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no és un número d\'emergència."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"No es pot trucar. Marca un número d\'emergència."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Utilitza el teclat per marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Posa la trucada en espera"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Reprèn la trucada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Finalitza la trucada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostra el teclat"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Amaga el teclat"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Silencia"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Activa el so"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Afegeix una trucada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Combina les trucades"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Canvia"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gestiona les trucades"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gestiona la conferència"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"conferència"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gestiona"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Àudio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videotrucada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Canvia a trucada de veu"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Canvia la càmera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Posa en pausa el vídeo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Més opcions"</string>
+ <string name="player_started" msgid="3478865572468310331">"S\'ha iniciat el reproductor"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"S\'ha aturat el reproductor"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"La càmera no està preparada"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"La càmera està preparada"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Esdeveniment de sessió de trucada desconeguda"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Servei"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configura"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;No definit&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Altres opcions de configuració de les trucades"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"S\'està trucant amb <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Trucada entrant mitjançant <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto de contacte"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"conferència privada"</string>
+ <string name="selectContact" msgid="92191462970821951">"selecciona el contacte"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escriu la teva…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancel·la"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Envia"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Respon"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Envia SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Rebutja"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Respon amb una videotrucada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Respon amb una trucada d\'àudio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accepta la sol·licitud de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Rebutja la sol·licitud de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accepta la sol·licitud per transmetre vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Rebutja la sol·licitud per transmetre vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accepta la sol·licitud per rebre vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Rebutja la sol·licitud per rebre vídeo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Fes lliscar el dit cap amunt per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Fes lliscar el dit cap a l\'esquerra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Fes lliscar el dit cap a la dreta per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Fes lliscar el dit cap avall per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibració"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibració"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"So"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"So predeterminat (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"So de trucada"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar en sonar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"So de trucada i vibració"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gestiona la conferència"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número d\'emergència"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segons</item>
+ <item quantity="one">1 segon</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuts</item>
+ <item quantity="one">1 minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hores</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"La càmera està desactivada"</string>
+ <string name="child_number" msgid="4469090994612105532">"mitjançant <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"S\'ha enviat la nota"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Missatges recents"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informació de l\'empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi de distància"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km de distància"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Obre demà a les <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Obre avui a les <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Tanca a les <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Avui ha tancat a les <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Obert ara"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Ara és tancat"</string>
+</resources>
diff --git a/InCallUI/res/values-cs/strings.xml b/InCallUI/res/values-cs/strings.xml
new file mode 100644
index 000000000..9f869f231
--- /dev/null
+++ b/InCallUI/res/values-cs/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Přidržený hovor"</string>
+ <string name="unknown" msgid="3646075119047488748">"Neznámý volající"</string>
+ <string name="private_num" msgid="6081418498487514686">"Soukromé číslo"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefonní automat"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferenční hovor"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Volání zrušeno"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Reproduktor"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Sluchátko telefonu"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Kabelová náhlavní soupr."</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Odeslat následující tóny?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Odesílání tónů\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Odeslat"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ano"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ne"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Nahradit zástupné znaky jinými znaky"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferenční hovor <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Číslo hlasové schránky"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Vytáčení"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Opakované vytáčení"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferenční hovor"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Příchozí hovor"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Příchozí pracovní hovor"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Hovor ukončen"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Přidržený hovor"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Ukončování hovoru"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Probíhá hovor"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Moje číslo je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Navazování spojení pro video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videohovor"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Požadování videa"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videohovor nelze zahájit"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Žádost o video byla zamítnuta"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Vaše číslo pro zpětné volání\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Vaše číslo pro tísňové zpětné volání\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Vytáčení"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Zmeškaný hovor"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Zmeškané hovory"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Zmeškaný hovor od volajícího <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Probíhající hovor"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Probíhající pracovní hovor"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Probíhající hovor přes Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Probíhající pracovní hovor přes Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Přidržený hovor"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Příchozí hovor"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Příchozí pracovní hovor"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Příchozí hovor přes Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Příchozí pracovní hovor přes Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Příchozí videohovor"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Příchozí žádost o videohovor"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nová hlasová zpráva"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nové hlasové zprávy (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Volat hlasovou schránku <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Číslo hlasové schránky není známé"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Žádný signál"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Vybraná síť (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) není k dispozici"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Přijmout"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Zavěsit"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videohovor"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Hlas. hovor"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Přijmout"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Odmítnout"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Zavolat zpět"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Posl. zprávu"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Chcete-li telefonovat, nejprve vypněte režim Letadlo."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Přihlášení k síti nebylo úspěšné."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilní síť je nedostupná."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Chcete-li uskutečnit hovor, zadejte platné telefonní číslo."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Hovor nelze uskutečnit."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Spouštění sekvence MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Služba není podporována."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Hovory nelze přepnout."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Hovor nelze rozdělit."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Hovor nelze předat."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferenční hovor nelze uskutečnit."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Hovor nelze odmítnout."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Hovor nelze ukončit."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Volání SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Tísňové volání"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Zapínání bezdrátového modulu..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Žádný signál. Probíhá další pokus…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Hovor nelze uskutečnit. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> není číslo tísňového volání."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Hovor nelze uskutečnit. Vytočte číslo tísňového volání."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Vytočte číslo pomocí klávesnice"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Podržet hovor"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Obnovit hovor"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Ukončit hovor"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Zobrazit číselník"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Skrýt číselník"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Vypnout zvuk"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Zapnout zvuk"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Přidat hovor"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Spojit hovory"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Zaměnit"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Spravovat hovory"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Spravovat konferenční hovor"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferenční hovor"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Spravovat"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Zvuk"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videohovor"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Změnit na hlasové volání"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Přepnout kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pozastavit video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Další možnosti"</string>
+ <string name="player_started" msgid="3478865572468310331">"Přehrávač spuštěn"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Přehrávač zastaven"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Fotoaparát není připraven"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Fotoaparát je připraven"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Neznámá událost relace volání"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Služba"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Nastavení"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nenastaveno&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Další nastavení hovorů"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Volání prostřednictvím poskytovatele <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Příchozí hovor přes poskytovatele <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotografie kontaktu"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"přepnout na soukromé"</string>
+ <string name="selectContact" msgid="92191462970821951">"vybrat kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napsat vlastní odpověď..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Zrušit"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Odeslat"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Přijmout"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Odeslat SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Odmítnout"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Přijmout jako videohovor"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Přijmout jako hlasový hovor"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Přijmout žádost o videhovor"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Odmítnout žádost o videohovor"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Přijmout žádost o odesílání videa"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Odmítnout žádost o odesílání videa"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Přijmout žádost o příjem videa"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Odmítnout žádost o příjem videa"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – přejeďte prstem nahoru"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – přejeďte prstem doleva"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – přejeďte prstem doprava"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> – přejeďte prstem dolů"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrace"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrace"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Zvuk"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Výchozí zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Vyzváněcí tón telefonu"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrace při vyzvánění"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Vyzvánění a vibrace"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Správa konferenčního hovoru"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Číslo tísňové linky"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ <item quantity="one">1 sekunda</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="one">1 minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hodin</item>
+ <item quantity="one">1 hodina</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilová fotka"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Fotoaparát je vypnutý"</string>
+ <string name="child_number" msgid="4469090994612105532">"pomocí čísla <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Poznámka byla odeslána"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nejnovější zprávy"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informace o firmě"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Vzdálenost: <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Vzdálenost: <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Zítra otevírá v <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Dnes otevírá v <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zavírá v <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Dnes zavřeno od <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Otevřeno"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Nyní zavřeno"</string>
+</resources>
diff --git a/InCallUI/res/values-da/strings.xml b/InCallUI/res/values-da/strings.xml
new file mode 100644
index 000000000..01167cbbb
--- /dev/null
+++ b/InCallUI/res/values-da/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Afventer"</string>
+ <string name="unknown" msgid="3646075119047488748">"Ukendt"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privat nummer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Mønttelefon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Telefonmøde"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Opkaldet blev afbrudt."</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Højttaler"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Ørestykke til håndsæt"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Headset med ledning"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Vil du sende følgende toner?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sender toner\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Send"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ja"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nej"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Erstat jokertegnet med"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Telefonmøde <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Telefonsvarernummer"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Ringer op"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ringer op igen"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Telefonmøde"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Indgående opkald"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Indgående arbejdsopkald"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Opkaldet er afsluttet"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Afventer"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Lægger på"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Opkald i gang"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mit nummer er <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Opretter videoforbindelse"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videoopkald"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Anmoder om video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Kan ikke forbinde videoopkald"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videoanmodningen blev afvist"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Dit tilbagekaldsnummer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Dit tilbagekaldsnummer til nødopkald\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Ringer op"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Ubesvaret opkald"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Ubesvarede opkald"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ubesvarede opkald"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Ubesvaret opkald fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Igangværende opkald"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Igangværende opkald i forbindelse med arbejde"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Igangværende opkald via Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Igangværende Wi-Fi-opkald i forbindelse med arbejde"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Afventer"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Indgående opkald"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Indgående arbejdsopkald"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Indgående Wi-Fi-opkald"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Indgående Wi-Fi-opkald i forbindelse med arbejde"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Indgående videoopkald"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Indgående videoanmodning"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Ny telefonsvarerbesked"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nye telefonsvarerbeskeder (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Ring til <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Telefonsvarernummeret er ukendt"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ingen dækning"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Det valgte netværk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ikke tilgængeligt"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Svar"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Læg på"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Tale"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Acceptér"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Afvis"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Ring tilbage"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Besked"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Slå Flytilstand fra først for at foretage et opkald."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ikke registreret på netværket."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilnetværket er ikke tilgængeligt."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Indtast et gyldigt nummer for at foretage et opkald."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Der kan ikke ringes op."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Starter MMI-sekvens…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Tjenesten er ikke understøttet."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Der kan ikke skiftes opkald."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Opkaldet kan ikke adskilles."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Der kan ikke viderestilles."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Der kan ikke oprettes telefonmøde."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Opkaldet kan ikke afvises."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Et eller flere opkald kan ikke frigives."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-opkald"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Nødopkald"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Tænder for radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ingen tjeneste. Prøver igen…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Der kan ikke ringes op. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et alarmnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Der kan ikke ringes op. Ring til et alarmnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Brug tastaturet til at ringe op"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Sæt opkald i venteposition"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Genoptag opkald"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Afslut opkald"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Vis numerisk tastatur"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Skjul numerisk tastatur"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Slå lyden fra"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Slå lyden til"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Tilføj opkald"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Slå opkald sammen"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Skift"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Administrer opkald"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Administrer telefonmøde"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Telefonmøde"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Administrer"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Lyd"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videoopkald"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Skift til taleopkald"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Skift kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Sæt video på pause"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Flere valgmuligheder"</string>
+ <string name="player_started" msgid="3478865572468310331">"Afspilleren er startet"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Afspilleren er stoppet"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kameraet er ikke klar"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kameraet er klar"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Ukendt opkaldsbegivenhed"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Tjeneste"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Konfiguration"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ikke angivet&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Andre indstillinger for opkald"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Opkald via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Indgående opkald via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"billede af kontaktperson"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"gør privat"</string>
+ <string name="selectContact" msgid="92191462970821951">"vælg kontaktperson"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Skriv dit eget svar…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Annuller"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Send"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Svar"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Send sms"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Afvis"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Besvar som videoopkald"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Besvar som lydopkald"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Acceptér anmodning om video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Afvis videoanmodning"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Acceptér anmodning om udgående video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Afvis anmodning om udgående video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Acceptér anmodning om indgående video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Afvis anmodning om indgående video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Skub op for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Skub til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Skub til højre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Skub ned for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibration"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibration"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Lyd"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Standardlyd (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ringetone ved opkald"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrer ved opringning"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringetone og vibration"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Administrer telefonmøde"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Alarmnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutter</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> time</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> timer</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilbillede"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kameraet er slukket"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Noten er sendt"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Seneste beskeder"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Virksomhedsoplysninger"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil væk"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km væk"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>-<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Åbner i morgen kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Åbner i dag kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Lukker kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Lukkede i dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Åbent nu"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Lukket for i dag"</string>
+</resources>
diff --git a/InCallUI/res/values-de/strings.xml b/InCallUI/res/values-de/strings.xml
new file mode 100644
index 000000000..dd9f9b84d
--- /dev/null
+++ b/InCallUI/res/values-de/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Gehaltener Anruf"</string>
+ <string name="unknown" msgid="3646075119047488748">"Unbekannt"</string>
+ <string name="private_num" msgid="6081418498487514686">"Private Nummer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Münztelefon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Telefonkonferenz"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Verbindung unterbrochen"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Lautsprecher"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Mobilgerät-Kopfhörer"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Kabelgebundenes Headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Folgende Töne senden?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Töne werden gesendet\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Senden"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ja"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nein"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Platzhalter ersetzen durch"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Telefonkonferenz <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Mailboxnummer"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Rufaufbau"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Wahlwiederholung"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Telefonkonferenz"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Eingehender Anruf"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Eingeh. geschäftl. Anruf"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Anruf beendet"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Gehaltener Anruf"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Auflegen"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Im Gespräch"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Meine Nummer lautet <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Videoverbindung wird hergestellt"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videoanruf"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Videoanfrage wird gesendet"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videoanruf kann nicht verbunden werden"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videoanfrage abgelehnt"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Deine Rückrufnummer lautet:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Deine Notrufnummer lautet:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Rufaufbau"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Verpasster Anruf"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Verpasste Anrufe"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> verpasste Anrufe"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Verpasster Anruf von <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Aktiver Anruf"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Aktiver geschäftlicher Anruf"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Aktiver WLAN-Anruf"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Aktiver geschäftlicher WLAN-Anruf"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Gehaltener Anruf"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Eingehender Anruf"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Eingehender geschäftlicher Anruf"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Eingehender WLAN-Anruf"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Eingehender geschäftlicher WLAN-Anruf"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Eingehender Videoanruf"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Eingehende Videoanfrage"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Neue Mailbox-Nachricht"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Neue Mailbox-Nachricht (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> wählen"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Mailboxnummer unbekannt"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Kein Service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Ausgewähltes Netzwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nicht verfügbar"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Annehmen"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Beenden"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videoanruf"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Sprachanruf"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Akzeptieren"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ablehnen"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Zurückrufen"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Nachricht"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Deaktiviere zunächst den Flugmodus, um einen Anruf zu tätigen."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nicht in Netzwerk registriert."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilfunknetz nicht verfügbar."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Gib eine gültige Nummer ein, um einen Anruf zu tätigen."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Anruf nicht möglich."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI-Sequenz wird gestartet…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Dienst wird nicht unterstützt."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Anruf kann nicht gewechselt werden."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Anruf kann nicht getrennt werden."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Anruf kann nicht übergeben werden."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferenzschaltung nicht möglich."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Anruf kann nicht abgelehnt werden."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Anrufe können nicht freigegeben werden."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-Anruf"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Notruf"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Mobilfunkverbindung wird aktiviert…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Kein Service. Neuer Versuch…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Anruf nicht möglich. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ist keine Notrufnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Anruf nicht möglich. Wähle eine Notrufnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Zum Wählen Tastatur verwenden"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Anruf halten"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Anruf fortsetzen"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Anruf beenden"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Wähltasten einblenden"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Wähltasten ausblenden"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Stummschalten"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Stummschaltung aufheben"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Anruf hinzufügen"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Anrufe verbinden"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Wechseln"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Anrufe verwalten"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Telefonkonferenz verwalten"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Telefonkonferenz"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Verwalten"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videoanruf"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Zu Sprachanruf wechseln"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Kamera wechseln"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Video pausieren"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Weitere Optionen"</string>
+ <string name="player_started" msgid="3478865572468310331">"Videoübertragung gestartet"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Videoübertragung gestoppt"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera nicht bereit"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera bereit"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Unbekanntes Ereignis während eines Anrufs"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Dienst"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Einrichtung"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nicht festgelegt&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Sonstige Anrufeinstellungen"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Anruf über <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Eingehender Anruf über <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"Kontaktbild"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"privat sprechen"</string>
+ <string name="selectContact" msgid="92191462970821951">"Kontakt auswählen"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Eigene Antwort schreiben…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Abbrechen"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Senden"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Annehmen"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS senden"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Ablehnen"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Als Videoanruf annehmen"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Als normalen Anruf annehmen"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Videoanfrage akzeptieren"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Videoanfrage ablehnen"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Anfrage für ausgehenden Videoanruf akzeptieren"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Anfrage für ausgehenden Videoanruf ablehnen"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Anfrage für eingehenden Videoanruf akzeptieren"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Anfrage für eingehenden Videoanruf ablehnen"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach rechts schieben."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach unten schieben."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrieren"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrieren"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ton"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Standardklingelton (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Klingelton"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Beim Klingeln vibrieren"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Klingelton &amp; Vibration"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Telefonkonferenz verwalten"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Notrufnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> Sekunden</item>
+ <item quantity="one">1 Sekunde</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> Minuten</item>
+ <item quantity="one">1 Minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> Stunden</item>
+ <item quantity="one">1 Stunde</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilbild"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera aus"</string>
+ <string name="child_number" msgid="4469090994612105532">"über <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Notiz gesendet"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Zuletzt eingegangene Nachrichten"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Geschäftsinformationen"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> Meilen entfernt"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> Kilometer entfernt"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> bis <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Öffnet morgen um <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Öffnet heute um <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Schließt um <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Hat heute um <xliff:g id="CLOSE_TIME">%s</xliff:g> geschlossen"</string>
+ <string name="open_now" msgid="4615706338669555999">"Jetzt geöffnet"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Jetzt geschlossen"</string>
+</resources>
diff --git a/InCallUI/res/values-el/strings.xml b/InCallUI/res/values-el/strings.xml
new file mode 100644
index 000000000..bdec7d0b2
--- /dev/null
+++ b/InCallUI/res/values-el/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Τηλέφωνο"</string>
+ <string name="onHold" msgid="527593602772521700">"Σε αναμονή"</string>
+ <string name="unknown" msgid="3646075119047488748">"Άγνωστος"</string>
+ <string name="private_num" msgid="6081418498487514686">"Απόκρυψη αριθμού"</string>
+ <string name="payphone" msgid="5743050584468748607">"Τηλέφωνο με χρέωση"</string>
+ <string name="confCall" msgid="3181961445236675173">"Κλήση συνδιάσκεψης"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Η κλήση απορρίφθηκε"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Ηχείο"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Ακουστικό"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Ενσύρματο ακουστικό"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Αποστολή των παρακάτω ήχων;\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Ήχοι αποστολής\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Αποστολή"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ναι"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Όχι"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Αντικατάσταση του χαρακτήρα μπαλαντέρ με"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Κλήση συνδιάσκεψης <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Αριθμός αυτόματου τηλεφωνητή"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Κλήση"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Επανάκληση"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Κλήση συνδιάσκεψης"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Εισερχόμενη κλήση"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Εισερχόμ. κλήση εργασίας"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Η κλήση τερματίστηκε"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Σε αναμονή"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Κλείσιμο γραμμής"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Σε κλήση"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Ο αριθμός μου είναι <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Σύνδεση βίντεο"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Βιντεοκλήση"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Αίτημα βίντεο"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Δεν είναι δυνατή η σύνδεση βιντεοκλήσης"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Το αίτημα βίντεο απορρίφθηκε"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Αριθμός επανάκλησης\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Αριθμός επανάκλησης έκτακτης ανάγκης\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Κλήση"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Αναπάντητη κλήση"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Αναπάντητες κλήσεις"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> αναπάντητες κλήσεις"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Αναπάντητη κλήση από <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Κλήση σε εξέλιξη"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Κλήση εργασίας σε εξέλιξη"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Κλήση Wi-Fi σε εξέλιξη"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Κλήση εργασίας μέσω Wi-Fi σε εξέλιξη"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Σε αναμονή"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Εισερχόμενη κλήση"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Εισερχόμενη κλήση εργασίας"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Εισερχόμενη κλήση μέσω Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Εισερχόμενη κλήση εργασίας μέσω Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Εισερχόμενη βιντεοκλήση"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Αίτημα εισερχόμενου βίντεο"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Νέο μήνυμα στον αυτόματο τηλεφωνητή"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Νέο μήνυμα στον αυτόματο τηλεφωνητή (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Καλέστε στο <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Άγνωστος αριθμός αυτόματου τηλεφωνητή"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Δίκτυο μη διαθέσιμο"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Το επιλεγμένο δίκτυο (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) δεν είναι διαθέσιμο"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Απάντηση"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Τερμ. κλήσης"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Βίντεο"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Φωνή"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Αποδοχή"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Παράβλεψη"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Επανάκληση"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Μήνυμα"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Για να πραγματοποιήσετε μια κλήση, απενεργοποιήστε πρώτα τη λειτουργία πτήσης."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Δεν έχετε εγγραφεί στο δίκτυο."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Το δίκτυο κινητής τηλεφωνίας δεν είναι διαθέσιμο."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Για να πραγματοποιήσετε κλήση, εισαγάγετε έναν έγκυρο αριθμό."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Δεν είναι δυνατή η κλήση."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Έναρξη ακολουθίας MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Η υπηρεσία δεν υποστηρίζεται."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Δεν είναι δυνατή η εναλλαγή κλήσεων."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Δεν είναι δυνατός ο διαχωρισμός της κλήσης."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Δεν είναι δυνατή η μεταφορά."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Δεν είναι δυνατή η συνδιάσκεψη."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Δεν είναι δυνατή η απόρριψη της κλήσης."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Δεν είναι δυνατή η πραγματοποίηση κλήσεων."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Κλήση SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Κλήση έκτακτης ανάγκης"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Ενεργοποίηση πομπού…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Δεν υπάρχει υπηρεσία. Νέα προσπάθεια…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Δεν είναι δυνατή η κλήση. Το <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> δεν είναι αριθμός έκτακτης ανάγκης."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Δεν είναι δυνατή η κλήση. Πληκτρολογήστε έναν αριθμό έκτακτης ανάγκης."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Χρησιμοποιήστε το πληκτρολόγιο για να πραγματοποιήσετε μια κλήση"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Αναμονή κλήσης"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Συνέχιση κλήσης"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Τερματισμός κλήσης"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Εμφάνιση πληκτρολογίου κλήσης"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Απόκρυψη πληκτρολογίου κλήσης"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Σίγαση"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Κατάργηση σίγασης"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Προσθήκη κλήσης"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Συγχώνευση κλήσεων"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Ανταλλαγή"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Διαχείριση κλήσεων"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Διαχείριση κλήσης συνδιάσκεψης"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Κλήση διάσκεψης"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Διαχείριση"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Ήχος"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Βιντεοκλ."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Αλλαγή σε φωνητική κλήση"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Αλλαγή κάμερας"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Παύση βίντεο"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Περισσότερες επιλογές"</string>
+ <string name="player_started" msgid="3478865572468310331">"Το πρόγραμμα αναπαραγωγής βίντεο ξεκίνησε"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Το πρόγραμμα αναπαραγωγής βίντεο διακόπηκε"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Η κάμερα δεν είναι έτοιμη"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Η κάμερα είναι έτοιμη"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Άγνωστο συμβάν περιόδου σύνδεσης κλήσης"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Υπηρεσία"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Ρύθμιση"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Δεν έχει οριστεί&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Άλλες ρυθμίσεις κλήσης"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Κλήση μέσω <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Εισερχόμενη κλήση μέσω <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"φωτογραφία επαφής"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ιδιωτική χρήση"</string>
+ <string name="selectContact" msgid="92191462970821951">"επιλογή επαφής"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Συντάξτε τη δική σας…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Ακύρωση"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Αποστολή"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Απάντηση"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Αποστολή SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Απόρριψη"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Απάντηση ως βιντεοκλήση"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Απάντηση ως κλήση ήχου"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Αποδοχή αιτήματος βίντεο"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Απόρριψη αιτήματος βίντεο"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Αποδοχή αιτήματος μετάδοσης βίντεο"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Απόρριψη αιτήματος μετάδοσης βίντεο"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Αποδοχή αιτήματος λήψης βίντεο"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Απόρριψη αιτήματος λήψης βίντεο"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Κύλιση προς τα επάνω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Κύλιση προς τα αριστερά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Κύλιση προς τα δεξιά για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Κύλιση προς τα κάτω για <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Δόνηση"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Δόνηση"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ήχος"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Προεπιλεγμένος ήχος (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ήχος κλήσης τηλεφώνου"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Δόνηση κατά το κουδούνισμα"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ήχος κλήσης και δόνηση"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Διαχείριση κλήσης συνδιάσκεψης"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Αριθμός έκτακτης ανάγκης"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα</item>
+ <item quantity="one">1 δευτερόλεπτο</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> λεπτά</item>
+ <item quantity="one">1 λεπτό</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ώρες</item>
+ <item quantity="one">1 ώρα</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Φωτογραφία προφίλ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Απενεργοποίηση κάμερας"</string>
+ <string name="child_number" msgid="4469090994612105532">"μέσω <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Η σημείωση εστάλη"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Πρόσφατα μηνύματα"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Πληροφορίες επιχείρησης"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> μίλια μακριά"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> χιλιόμετρα μακριά"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Ανοίγει αύριο στις <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Ανοίγει σήμερα στις <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Κλείνει στις <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Έκλεισε σήμερα στις <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Ανοιχτό τώρα"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Κλειστό τώρα"</string>
+</resources>
diff --git a/InCallUI/res/values-en-rAU/strings.xml b/InCallUI/res/values-en-rAU/strings.xml
new file mode 100644
index 000000000..0cf51f41f
--- /dev/null
+++ b/InCallUI/res/values-en-rAU/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Phone"</string>
+ <string name="onHold" msgid="527593602772521700">"On hold"</string>
+ <string name="unknown" msgid="3646075119047488748">"unknown"</string>
+ <string name="private_num" msgid="6081418498487514686">"Private number"</string>
+ <string name="payphone" msgid="5743050584468748607">"Payphone"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conference call"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Call cut off"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Wired headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Send the following tones?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sending tones\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Send"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"yes"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"no"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Replace wild character with"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Voicemail number"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Dialling"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Redialling"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Incoming call"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Incoming work call"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Call ended"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"On hold"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Hanging up"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"In call"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"My number is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Connecting video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Requesting video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Can\'t connect video call"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video request rejected"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Your callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Your emergency callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Dialling"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Missed call"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Missed call from <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"On-going call"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Ongoing work call"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Ongoing Wi-Fi call"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Ongoing Wi-Fi work call"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"On hold"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Incoming call"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Incoming work call"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Incoming Wi-Fi call"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Incoming Wi-Fi work call"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Incoming video call"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Incoming video request"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"New voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"New voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Dial <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Voicemail number unknown"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"No service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Selected network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) unavailable"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Answer"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Hang up"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"In-stream video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voice"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accept"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Message"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"To place a call, first turn off Aeroplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Not registered on network."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobile network not available."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"To place a call, enter a valid number."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Can\'t call."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Starting MMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service not supported."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Can\'t switch calls."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Can\'t separate call."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Can\'t transfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Can\'t conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Can\'t reject call."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Can\'t release call(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP call"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Emergency call"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Turning on radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"No network. Trying again…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Can\'t call. Dial an emergency number."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Use keyboard to dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Hold Call"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Resume Call"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"End Call"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Show dial pad"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Hide dial pad"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Mute"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Unmute"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Add call"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Merge calls"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Swap"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Manage calls"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Manage conference call"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conference call"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Manage"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Change to voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Switch camera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pause video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"More options"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player Started"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player Stopped"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Camera not ready"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Camera ready"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Unknown call session event"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Service"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Set up"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Not set&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Other call settings"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Calling via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Incoming via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"contact photo"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"go private"</string>
+ <string name="selectContact" msgid="92191462970821951">"select contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Write your own..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"cancel"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Send"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Answer"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Send SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Decline"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Answer as video call"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Answer as audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accept video transmit request"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Decline video transmit request"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accept video receive request"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Decline video receive request"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sound"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Default sound (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Phone ringtone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrate when ringing"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringtone &amp; Vibrate"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Manage conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Emergency number"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">1 second</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ <item quantity="one">1 minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hours</item>
+ <item quantity="one">1 hour</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profile photo"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Camera off"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Note sent"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Recent messages"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Business info"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi away"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km away"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Opens tomorrow at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Opens today at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Closes at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Closed today at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Open now"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Closed now"</string>
+</resources>
diff --git a/InCallUI/res/values-en-rGB/strings.xml b/InCallUI/res/values-en-rGB/strings.xml
new file mode 100644
index 000000000..0cf51f41f
--- /dev/null
+++ b/InCallUI/res/values-en-rGB/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Phone"</string>
+ <string name="onHold" msgid="527593602772521700">"On hold"</string>
+ <string name="unknown" msgid="3646075119047488748">"unknown"</string>
+ <string name="private_num" msgid="6081418498487514686">"Private number"</string>
+ <string name="payphone" msgid="5743050584468748607">"Payphone"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conference call"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Call cut off"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Wired headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Send the following tones?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sending tones\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Send"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"yes"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"no"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Replace wild character with"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Voicemail number"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Dialling"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Redialling"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Incoming call"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Incoming work call"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Call ended"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"On hold"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Hanging up"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"In call"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"My number is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Connecting video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Requesting video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Can\'t connect video call"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video request rejected"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Your callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Your emergency callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Dialling"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Missed call"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Missed call from <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"On-going call"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Ongoing work call"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Ongoing Wi-Fi call"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Ongoing Wi-Fi work call"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"On hold"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Incoming call"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Incoming work call"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Incoming Wi-Fi call"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Incoming Wi-Fi work call"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Incoming video call"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Incoming video request"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"New voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"New voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Dial <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Voicemail number unknown"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"No service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Selected network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) unavailable"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Answer"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Hang up"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"In-stream video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voice"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accept"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Message"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"To place a call, first turn off Aeroplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Not registered on network."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobile network not available."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"To place a call, enter a valid number."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Can\'t call."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Starting MMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service not supported."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Can\'t switch calls."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Can\'t separate call."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Can\'t transfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Can\'t conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Can\'t reject call."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Can\'t release call(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP call"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Emergency call"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Turning on radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"No network. Trying again…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Can\'t call. Dial an emergency number."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Use keyboard to dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Hold Call"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Resume Call"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"End Call"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Show dial pad"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Hide dial pad"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Mute"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Unmute"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Add call"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Merge calls"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Swap"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Manage calls"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Manage conference call"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conference call"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Manage"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Change to voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Switch camera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pause video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"More options"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player Started"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player Stopped"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Camera not ready"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Camera ready"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Unknown call session event"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Service"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Set up"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Not set&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Other call settings"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Calling via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Incoming via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"contact photo"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"go private"</string>
+ <string name="selectContact" msgid="92191462970821951">"select contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Write your own..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"cancel"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Send"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Answer"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Send SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Decline"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Answer as video call"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Answer as audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accept video transmit request"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Decline video transmit request"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accept video receive request"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Decline video receive request"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sound"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Default sound (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Phone ringtone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrate when ringing"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringtone &amp; Vibrate"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Manage conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Emergency number"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">1 second</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ <item quantity="one">1 minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hours</item>
+ <item quantity="one">1 hour</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profile photo"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Camera off"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Note sent"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Recent messages"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Business info"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi away"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km away"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Opens tomorrow at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Opens today at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Closes at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Closed today at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Open now"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Closed now"</string>
+</resources>
diff --git a/InCallUI/res/values-en-rIN/strings.xml b/InCallUI/res/values-en-rIN/strings.xml
new file mode 100644
index 000000000..0cf51f41f
--- /dev/null
+++ b/InCallUI/res/values-en-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Phone"</string>
+ <string name="onHold" msgid="527593602772521700">"On hold"</string>
+ <string name="unknown" msgid="3646075119047488748">"unknown"</string>
+ <string name="private_num" msgid="6081418498487514686">"Private number"</string>
+ <string name="payphone" msgid="5743050584468748607">"Payphone"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conference call"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Call cut off"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Wired headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Send the following tones?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sending tones\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Send"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"yes"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"no"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Replace wild character with"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Voicemail number"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Dialling"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Redialling"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Incoming call"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Incoming work call"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Call ended"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"On hold"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Hanging up"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"In call"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"My number is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Connecting video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Requesting video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Can\'t connect video call"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video request rejected"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Your callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Your emergency callback number\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Dialling"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Missed call"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Missed call from <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"On-going call"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Ongoing work call"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Ongoing Wi-Fi call"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Ongoing Wi-Fi work call"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"On hold"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Incoming call"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Incoming work call"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Incoming Wi-Fi call"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Incoming Wi-Fi work call"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Incoming video call"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Incoming video request"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"New voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"New voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Dial <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Voicemail number unknown"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"No service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Selected network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) unavailable"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Answer"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Hang up"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"In-stream video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voice"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accept"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Message"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"To place a call, first turn off Aeroplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Not registered on network."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobile network not available."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"To place a call, enter a valid number."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Can\'t call."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Starting MMI sequence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service not supported."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Can\'t switch calls."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Can\'t separate call."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Can\'t transfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Can\'t conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Can\'t reject call."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Can\'t release call(s)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP call"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Emergency call"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Turning on radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"No network. Trying again…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Can\'t call. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is not an emergency number."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Can\'t call. Dial an emergency number."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Use keyboard to dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Hold Call"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Resume Call"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"End Call"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Show dial pad"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Hide dial pad"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Mute"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Unmute"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Add call"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Merge calls"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Swap"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Manage calls"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Manage conference call"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conference call"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Manage"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Change to voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Switch camera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pause video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"More options"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player Started"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player Stopped"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Camera not ready"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Camera ready"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Unknown call session event"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Service"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Set up"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Not set&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Other call settings"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Calling via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Incoming via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"contact photo"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"go private"</string>
+ <string name="selectContact" msgid="92191462970821951">"select contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Write your own..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"cancel"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Send"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Answer"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Send SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Decline"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Answer as video call"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Answer as audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accept video request"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Decline video request"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accept video transmit request"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Decline video transmit request"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accept video receive request"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Decline video receive request"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Slide up for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Slide left for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Slide right for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Slide down for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sound"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Default sound (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Phone ringtone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrate when ringing"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringtone &amp; Vibrate"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Manage conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Emergency number"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconds</item>
+ <item quantity="one">1 second</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ <item quantity="one">1 minute</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hours</item>
+ <item quantity="one">1 hour</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profile photo"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Camera off"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Note sent"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Recent messages"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Business info"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi away"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km away"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Opens tomorrow at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Opens today at <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Closes at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Closed today at <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Open now"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Closed now"</string>
+</resources>
diff --git a/InCallUI/res/values-es-rUS/strings.xml b/InCallUI/res/values-es-rUS/strings.xml
new file mode 100644
index 000000000..ab9540721
--- /dev/null
+++ b/InCallUI/res/values-es-rUS/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Teléfono"</string>
+ <string name="onHold" msgid="527593602772521700">"En espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Desconocido"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privado"</string>
+ <string name="payphone" msgid="5743050584468748607">"Teléfono pago"</string>
+ <string name="confCall" msgid="3181961445236675173">"Llamada en conferencia"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Se interrumpió la llamada"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altavoz"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auricular del dispositivo"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Auriculares con cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"¿Deseas enviar los siguientes tonos?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Enviando tonos\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sí"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"No"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Reemplazar el carácter comodín con"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Llamada en conferencia: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número de buzón de voz"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Marcando"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Volviendo a marcar"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Llamada en conferencia"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Llamada entrante"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Llamada entrante: trabajo"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Llamada finalizada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Colgando"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"En llamada"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mi número es <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Conectando video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videollamada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Solicitando video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"No se puede conectar la videollamada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Se rechazó la solicitud de videollamada"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Número de devolución de llamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Número de devolución de llamada de emergencia\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Marcando"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Llamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Llamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Llamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Llamada en curso"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Llamada en curso: trabajo"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Llamada Wi-Fi en curso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Llamada Wi-Fi en curso: trabajo"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"En espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Llamada entrante"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Llamada entrante: trabajo"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Llamada Wi-Fi entrante"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Llamada Wi-Fi entrante: trabajo"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videollamada entrante"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Solicitud de videollamada entrante"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nuevo mensaje de buzón de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Buzón de voz nuevo (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número de buzón de voz desconocido"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sin servicio"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Responder"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Colgar"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voz"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aceptar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Descartar"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Llamar"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensaje"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Para realizar una llamada, primero debes desactivar el modo de avión."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"No está registrado en la red."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"La red móvil no está disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Para realizar una llamada, ingresa un número válido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"No se puede realizar la llamada."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Iniciando la secuencia de MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"El servicio no es compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"No se pueden cambiar las llamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"No se puede desviar la llamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"No se puede transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"No se puede realizar la conferencia."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"No se puede rechazar la llamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"No se pueden liberar las llamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Llamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Llamada de emergencia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Encendiendo radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"No hay servicio. Vuelve a intentarlo…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"No se puede realizar la llamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"No se puede realizar la llamada. Marca un número de emergencia."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Usar teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Retener llamada"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Reanudar llamada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Finalizar llamada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostrar teclado"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ocultar teclado"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Silenciar"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Dejar de silenciar"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Agregar llamada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Combinar llamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Cambiar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Administrar llamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Administrar conferencia"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Llamada en conferencia"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Administrar"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Cambiar a llamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Cambiar cámara"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausar video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Más opciones"</string>
+ <string name="player_started" msgid="3478865572468310331">"Se inició el reproductor"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Se detuvo el reproductor"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"La cámara no está lista"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Cámara lista"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento de sesión de llamada desconocido"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Servicio"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuración"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Sin configurar&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Otras opciones de llamada"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Llamada por medio de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Entrantes por medio de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto de contacto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"pasar a modo privado"</string>
+ <string name="selectContact" msgid="92191462970821951">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escribe tu propia respuesta…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancelar"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Enviar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Responder"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Rechazar"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Responder como videollamada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Responder como llamada de audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Aceptar solicitud de videollamada"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Rechazar solicitud de videollamada"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Aceptar solicitud de transmisión de videollamada"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Rechazar solicitud de transmisión de videollamada"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Aceptar solicitud de recepción de videollamada"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Rechazar solicitud de recepción de videollamada"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Desliza el dedo hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Desliza el dedo hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sonido"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Sonido predeterminado (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Tono del teléfono"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar al sonar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Tono y vibración"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Administrar llamada en conferencia"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número de emergencia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Cámara desactivada"</string>
+ <string name="child_number" msgid="4469090994612105532">"del <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Se envió la nota"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mensajes recientes"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Información de la empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"De <xliff:g id="OPEN_TIME">%1$s</xliff:g> a <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g> y <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Abre mañana a la hora <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Abre hoy a la hora <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Cierra a la hora <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Cerró hoy a la hora <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Abierto ahora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Cerrado ahora"</string>
+</resources>
diff --git a/InCallUI/res/values-es/strings.xml b/InCallUI/res/values-es/strings.xml
new file mode 100644
index 000000000..518cf72a9
--- /dev/null
+++ b/InCallUI/res/values-es/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Teléfono"</string>
+ <string name="onHold" msgid="527593602772521700">"En espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Desconocida"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privado"</string>
+ <string name="payphone" msgid="5743050584468748607">"Teléfono público"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conferencia"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Llamada perdida"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altavoz"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auricular"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Auriculares con cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"¿Quieres enviar los siguientes tonos?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Enviando tonos\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sí"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"No"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Sustituir el carácter comodín por"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conferencia <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número del mensaje de voz"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Llamando"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Llamando otra vez"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conferencia"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Llamada entrante"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Llamada trabajo entrante"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Llamada finalizada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Colgando"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Llamada entrante"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mi número es el <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Conectando videollamada"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videollamada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Solicitando videollamada"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"No se puede establecer la videollamada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Solicitud de videollamada rechazada"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Tu número de devolución de llamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Tu número de devolución de llamada de emergencia\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Llamando"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Llamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Llamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Llamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Llamada en curso"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Llamada de trabajo en curso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Llamada Wi-Fi en curso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Llamada Wi-Fi de trabajo en curso"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"En espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Llamada entrante"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Llamada de trabajo entrante"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Llamada Wi-Fi entrante"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Llamada Wi-Fi de trabajo entrante"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videollamada entrante"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Solicitud de videollamada entrante"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nuevo mensaje de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nuevo mensaje de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número del mensaje de voz desconocido"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sin servicio"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"La red seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) no está disponible"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Responder"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Colgar"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videollamada"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voz"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aceptar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Rechazar"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Llamar"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensaje"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Para realizar una llamada, primero debes desactivar el modo avión."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"No estás registrado en la red."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"La red móvil no está disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Para realizar una llamada, introduce un número válido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"No se puede establecer la llamada."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Iniciando secuencia MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Servicio no admitido."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"No se pueden intercambiar llamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"No se pueden separar llamadas."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"No se puede transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"No se puede establecer la conferencia."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"No se puede rechazar la llamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"No se pueden hacer llamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Llamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Llamada de emergencia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Activando señal móvil…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Sin servicio. Reintentado…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"No se puede establecer la llamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> no es un número de emergencia."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"No se puede establecer la llamada. Marca un número de emergencia."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Usa el teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Retener llamada"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Seguir con la llamada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Finalizar llamada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostrar teclado"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ocultar teclado"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Silenciar"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Activar sonido"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Añadir llamada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Llamada a tres"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Cambiar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Administrar llamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Administrar conferencia"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Teleconferencia"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gestionar"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videollamada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Cambiar a llamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Cambiar cámara"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Más opciones"</string>
+ <string name="player_started" msgid="3478865572468310331">"Reproductor iniciado"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Reproductor detenido"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Cámara no preparada"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Cámara preparada"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento de sesión de llamada desconocido"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Servicio"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuración"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;No definido&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Otra configuración de llamada"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Llamada a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Recibidas a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto de contacto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"llamada privada"</string>
+ <string name="selectContact" msgid="92191462970821951">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escribe tu propia respuesta..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancelar"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Enviar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Responder"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Rechazar"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Responder como videollamada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Responder como llamada de audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Aceptar solicitud de videollamada"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Rechazar solicitud de videollamada"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Aceptar solicitud de transmisión de videollamada"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Rechazar solicitud de transmisión de videollamada"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Aceptar solicitud de recepción de videollamada"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Rechazar solicitud de recepción de videollamada"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Desliza el dedo hacia arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Desliza el dedo hacia la izquierda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Desliza el dedo hacia la derecha para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Desliza el dedo hacia abajo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sonido"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Sonido predeterminado (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Tono de llamada del teléfono"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar al sonar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Tono de llamada y vibración"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Administrar videollamada"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número de emergencia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto de perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Cámara apagada"</string>
+ <string name="child_number" msgid="4469090994612105532">"a través de <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mensajes recientes"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Información de la empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Abre mañana a las <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Abre hoy a las <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Cierra a las <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Cerrado hoy a las <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Abierto ahora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Cerrado ahora"</string>
+</resources>
diff --git a/InCallUI/res/values-et-rEE/strings.xml b/InCallUI/res/values-et-rEE/strings.xml
new file mode 100644
index 000000000..9d67a7b45
--- /dev/null
+++ b/InCallUI/res/values-et-rEE/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Ootel"</string>
+ <string name="unknown" msgid="3646075119047488748">"Tundmatu"</string>
+ <string name="private_num" msgid="6081418498487514686">"Eranumber"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefoniautomaat"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konverentskõne"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Kõne katkes"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Kõlar"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Käsitelefoni kuular"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Juhtmega peakomplekt"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Kas saata järgmised toonid?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Toonide saatmine\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Saada"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Jah"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ei"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Asenda metamärk üksusega"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konverentskõne <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Kõneposti number"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Valimine"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Uuesti valimine"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konverentskõne"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Sissetulev kõne"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Sissetulev töökõne"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Kõne lõpetati"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Ootel"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Lõpetamine"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Kõne on pooleli"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Minu number on <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Video ühendamine"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videokõne"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Video taotlemine"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videokõnet ei õnnestu ühendada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videokõne taotlus lükati tagasi"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Teie tagasihelistamise number\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Teie hädaabikõne tagasihelistamise number\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Valimine"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Vastamata kõne"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Vastamata kõned"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> vastamata kõnet"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Vastamata kõne helistajalt <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Käimasolev kõne"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Käimasolev töökõne"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Käimasolev WiFi-kõne"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Käimasolev töökõne WiFi kaudu"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Ootel"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Sissetulev kõne"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Sissetulev töökõne"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Sissetulev WiFi-kõne"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Sissetulev töökõne WiFi kaudu"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Sissetulev videokõne"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Sissetulev videokõne taotlus"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Uus kõnepostisõnum"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Uus kõnepostisõnum (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Valige <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Kõnepostinumber on tundmatu"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Levi puudub"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Valitud võrk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) pole saadaval"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Vasta"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Lõpeta kõne"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videokõne"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Häälkõne"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Nõustu"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Loobu"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Helista tagasi"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Saada sõnum"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Helistamiseks lülitage esmalt lennukirežiim välja."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ei ole võrgus registreeritud."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobiilsidevõrk pole saadaval."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Helistamiseks sisestage kehtiv number."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Ei saa helistada."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI-jada alustamine …"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Teenust ei toetata."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Kõnesid ei saa vahetada."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Kõnet ei saa eraldada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Ei saa üle kanda."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konverentskõnet ei saa pidada."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Kõnet ei saa tagasi lükata."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Kõnesid ei saa vabastada."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-kõne"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Hädaabikõne"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Raadioside sisselülitamine …"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Levi puudub. Uuesti proovimine …"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Ei saa helistada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ei ole hädaabinumber."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Ei saa helistada. Valige hädaabinumber."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Kasutage valimiseks klaviatuuri"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Kõne ootele"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Jätka kõnet"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Lõpeta kõne"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Kuva valimisklahvistik"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Peida valimisklahvistik"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Vaigista"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Tühista vaigistus"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Lisa kõne"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Ühenda kõned"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Vaheta"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Halda kõnesid"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Halda konverentskõnet"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konverentskõne"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Halda"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Heli"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videokõne"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Mine üle häälkõnele"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Vaheta kaamerat"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Peata video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Rohkem valikuid"</string>
+ <string name="player_started" msgid="3478865572468310331">"Pleier käivitati"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Pleier peatati"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kaamera pole valmis"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kaamera on valmis"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Tundmatu kõneseansisündmus"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Teenus"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Seadistamine"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Määramata&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Muud kõneseaded"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Kõne edastab <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Sissetulev kõne teenusepakkuja <xliff:g id="PROVIDER_NAME">%s</xliff:g> kaudu"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontakti foto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"aktiveeri privaatne kõne"</string>
+ <string name="selectContact" msgid="92191462970821951">"vali kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Kirjutage ise …"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Tühista"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Saada"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Vastamine"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Saada SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Tagasilükkamine"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Vastamine videokõnena"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Vastamine helikõnena"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Video taotluse aktsepteerimine"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Video taotluse tagasilükkamine"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Video edastamise taotluse aktsepteerimine"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Video edastamise taotluse tagasilükkamine"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Video vastuvõtmise taotluse aktsepteerimine"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Video vastuvõtmise taotluse tagasilükkamine"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Lohistage üles: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Lohistage vasakule: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Lohistage paremale: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Lohistage alla: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibreerimine"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibreerimine"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Heli"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Vaikeheli (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefonihelin"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibreerimine helina ajal"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Helin ja vibratsioon"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Konverentskõne haldamine"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Hädaabinumber"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundit</item>
+ <item quantity="one">1 sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutit</item>
+ <item quantity="one">1 minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> tundi</item>
+ <item quantity="one">1 tund</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profiilifoto"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kaamera on välja lülitatud"</string>
+ <string name="child_number" msgid="4469090994612105532">"numbri <xliff:g id="CHILD_NUMBER">%s</xliff:g> kaudu"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Märkus on saadetud"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Hiljutised sõnumid"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Ettevõtte teave"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> miili kaugusel"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km kaugusel"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> kuni <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Avatakse homme kell <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Avatakse täna kell <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Suletakse kell <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Suleti täna kell <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Praegu avatud"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Praegu suletud"</string>
+</resources>
diff --git a/InCallUI/res/values-eu-rES/strings.xml b/InCallUI/res/values-eu-rES/strings.xml
new file mode 100644
index 000000000..66860076b
--- /dev/null
+++ b/InCallUI/res/values-eu-rES/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefonoa"</string>
+ <string name="onHold" msgid="527593602772521700">"Zain"</string>
+ <string name="unknown" msgid="3646075119047488748">"Ezezaguna"</string>
+ <string name="private_num" msgid="6081418498487514686">"Zenbaki pribatua"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefono publikoa"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferentzia-deia"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Eten egin da deia"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Bozgorailua"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Aurikularrak"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Kabledun entzungailua"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth konexioa"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Tonu hauek bidali nahi dituzu?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Tonuak bidaltzen\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Bidali"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Bai"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ez"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Ordeztu komodina honekin:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferentzia-deiaren ordua: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Erantzungailuaren zenbakia"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Deitzen"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Berriro markatzen"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferentzia-deia"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Dei bat jaso duzu"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Laneko dei bat jaso duzu"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Amaitu da deia"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Zain"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Deia amaitzen"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Deia abian"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Nire zenbakia <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> da"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Bideoa konektatzen"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Bideo-deia"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Bideo-deia eskatzen"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Ezin da konektatu bideo-deia"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Baztertu egin da bideo-deia egiteko eskaera"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Deiak itzultzeko zenbakia:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Larrialdi-deiak itzultzeko zenbakia:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Deitzen"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Dei bat galdu duzu"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Dei batzuk galdu dituzu"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> dei galdu dituzu"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Deitzaile honen dei bat galdu duzu: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Deia abian da"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Laneko dei bat abian da"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Wi-Fi bidezko deia abian da"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Wi-Fi bidezko laneko dei bat abian da"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Zain"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Dei bat jaso duzu"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Laneko dei bat jaso duzu"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Wi-Fi bidezko dei bat jaso duzu"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Wi-Fi bidezko laneko dei bat jaso duzu"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Bideo-dei bat jaso duzu"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Bideo-dei bat egiteko eskaera bat jaso duzu"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Ahots-mezu berria"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Ahots-mezu berriak (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Markatu <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Erantzungailuaren zenbakia ezezaguna da"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ez dago zerbitzurik"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Hautatutako sarea (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ez dago erabilgarri"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Erantzun"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Amaitu deia"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Bideo-deia"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Ahots-deia"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Onartu"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Baztertu"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Itzuli deia"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Bidali SMSa"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Deitzeko, desaktibatu hegaldi modua."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ez dago sarean erregistratuta."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Sare mugikorra ez dago erabilgarri."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Deitzeko, idatzi balio duen zenbaki bat."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Ezin da deitu."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI sekuentzia hasten…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Ez da onartzen zerbitzua."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Ezin aldatu beste dei batera."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Ezin da bereizi deia."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Ezin da transferitu."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Ezin da egin konferentzia-deia."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Ezin da baztertu deia."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Ezin dira amaitu deiak."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP deia"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Larrialdi-deia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Irratia pizten…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ez dago zerbitzurik. Berriro saiatzen…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Ezin da deitu. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ez da larrialdietarako zenbakia."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Ezin da deitu. Markatu larrialdietarako zenbakia."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Erabili teklatua markatzeko"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Utzi deia zain"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Berrekin deiari"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Amaitu deia"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Erakutsi markagailua"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ezkutatu markagailua"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Desaktibatu audioa"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Aktibatu audioa"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Gehitu deia"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Bateratu deiak"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Aldatu"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Kudeatu deiak"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Kudeatu konferentzia-deia"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferentzia-deia"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Kudeatu"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audioa"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Bideo-deia"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Aldatu ahots-deira"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Aldatu kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausatu bideoa"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Aukera gehiago"</string>
+ <string name="player_started" msgid="3478865572468310331">"Abian da erreproduzigailua"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Gelditu da erreproduzigailua"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Ez dago prest kamera"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Prest dago kamera"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Dei-saioko gertaera ezezaguna"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Zerbitzua"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Konfigurazioa"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ezarri gabe&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Deien beste ezarpen batzuk"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> bidez deitzen"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> bidez jasotzen"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontaktuaren argazkia"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"bihurtu pribatu"</string>
+ <string name="selectContact" msgid="92191462970821951">"hautatu kontaktua"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Idatzi zeure erantzuna…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Utzi"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Bidali"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Erantzun"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Bidali SMS mezua"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Baztertu"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Erantzun bideo-dei moduan"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Erantzun audio-dei moduan"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Onartu bideo-deia egiteko eskaera"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Baztertu bideo-deia egiteko eskaera"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Onartu bideoa transmititzeko eskaera"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Baztertu bideoa transmititzeko eskaera"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Onartu bideo-deia jasotzeko eskaera"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Baztertu bideo-deia jasotzeko eskaera"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Lerratu gora hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Lerratu ezkerrera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Lerratu eskuinera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Lerratu behera hau egiteko: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Dardara"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Dardara"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Soinua"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Soinu lehenetsia (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefonoaren tonua"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Egin dar-dar tonuak jotzean"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Tonua eta dardara"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Kudeatu konferentzia-deia"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Larrialdietarako zenbakia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundo</item>
+ <item quantity="one">Segundo bat</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutu</item>
+ <item quantity="one">Minutu bat</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ordu</item>
+ <item quantity="one">Ordubete</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profileko argazkia"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Desaktibatuta dago kamera"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> zenbakitik"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Bidali da oharra"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Azken mezuak"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Enpresaren informazioa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Hemendik <xliff:g id="DISTANCE">%.1f</xliff:g> miliara"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Hemendik <xliff:g id="DISTANCE">%.1f</xliff:g> km-ra"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"<xliff:g id="OPEN_TIME">%s</xliff:g> da biharko irekitze-ordua"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"<xliff:g id="OPEN_TIME">%s</xliff:g> da gaurko irekitze-ordua"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> da itxiera-ordua"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"<xliff:g id="CLOSE_TIME">%s</xliff:g> da gaurko itxiera-ordua"</string>
+ <string name="open_now" msgid="4615706338669555999">"Irekita dago"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Itxita dago"</string>
+</resources>
diff --git a/InCallUI/res/values-fa/strings.xml b/InCallUI/res/values-fa/strings.xml
new file mode 100644
index 000000000..5c96a2e13
--- /dev/null
+++ b/InCallUI/res/values-fa/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"تلفن"</string>
+ <string name="onHold" msgid="527593602772521700">"در انتظار"</string>
+ <string name="unknown" msgid="3646075119047488748">"نامشخص"</string>
+ <string name="private_num" msgid="6081418498487514686">"شماره خصوصی"</string>
+ <string name="payphone" msgid="5743050584468748607">"تلفن عمومی"</string>
+ <string name="confCall" msgid="3181961445236675173">"تماس کنفرانسی"</string>
+ <string name="call_lost" msgid="8208184291640961172">"تماس قطع شد"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"بلندگو"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"گوشی"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"هدست سیمی"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"بلوتوث"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"شماره‌های بعدی ارسال شود؟\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"تون‌های ارسالی\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ارسال"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"بله"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"نه"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"جایگزینی نویسه عمومی با"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"تماس کنفرانسی <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"شماره پست صوتی"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"شماره‌گیری"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"درحال شماره‌گیری مجدد"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"تماس کنفرانسی"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"تماس ورودی"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"تماس کاری ورودی"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"تماس پایان یافت"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"در انتظار"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"قطع تماس"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"درحال تماس"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"شماره من <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> است"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"درحال برقراری تماس ویدیویی"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"تماس ویدیویی"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"درحال درخواست تماس ویدیویی"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"برقراری تماس ویدیویی ممکن نیست"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"درخواست تماس ویدیویی رد شد"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"شماره پاسخ تماس شما\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"شماره پاسخ تماس اضطراری شما\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"شماره‌گیری"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"تماس بی‌پاسخ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"تماس بی‌پاسخ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> تماس بی‌پاسخ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"تماس بی‌پاسخ از <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"تماس درحال انجام"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"تماس کاری درحال انجام"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"‏تماس درحال انجام ازطریق Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"‏تماس کاری Wi-Fi درحال انجام"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"در انتظار"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"تماس ورودی"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"تماس کاری ورودی"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"‏تماس Wi-Fi ورودی"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"‏تماس کاری Wi-Fi ورودی"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"تماس ویدیویی ورودی"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"درخواست تماس ویدیویی ورودی"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"پست صوتی جدید"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"پست صوتی جدید (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"شماره‌گیری <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"شماره پست صوتی ناشناس"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"بدون سرویس"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"شبکه انتخابی (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) قابل دسترس نیست"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"پاسخ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"پایان تماس"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ویدیو"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"صدا"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"پذیرفتن"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"نپذیرفتن"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"پاسخ تماس"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"پیام"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"برای برقراری تماس، ابتدا حالت هواپیما را خاموش کنید."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"در شبکه ثبت نشده است."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"شبکه تلفن همراه در دسترس نیست."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"برای برقراری تماس، شماره معتبری وارد کنید."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"تماس ممکن نیست."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"‏شروع ترتیب MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"سرویس پشتیبانی نمی‌شود."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"جابه‌جایی بین تماس‌ها ممکن نیست."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"جدا کردن تماس ممکن نیست."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"انتقال ممکن نیست."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"تماس کنفرانسی ممکن نیست."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"رد کردن تماس ممکن نیست."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"آزاد کردن تماس(ها) ممکن نیست."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"‏تماس SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"تماس اضطراری"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"درحال روشن کردن رادیو…‏"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"سرویسی در دسترس نیست. درحال تلاش مجدد…‏"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"تماس ممکن نیست. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> شماره اضطراری نیست."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"تماس ممکن نیست. فقط شماره اضطراری."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"استفاده از صفحه‌کلید برای شماره‌گیری"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"در انتظار گذاشتن تماس"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ازسرگیری تماس"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"پایان تماس"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"نمایش صفحه شماره‌گیری"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"پنهان کردن صفحه شماره‌گیری"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"بی‌صدا کردن"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"لغو نادیده گرفتن"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"افزودن تماس"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ادغام تماس‌ها"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"تعویض"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"مدیریت تماس‌ها"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"مدیریت تماس کنفرانسی"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"تماس کنفرانسی"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"مدیریت"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"صوتی"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"تماس ویدیویی"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"تغییر به تماس صوتی"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"تعویض دوربین"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"توقف موقت ویدیو"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"گزینه‌های بیشتر"</string>
+ <string name="player_started" msgid="3478865572468310331">"پخش‌کننده راه‌اندازی شد"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"پخش‌کننده متوقف شد"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"دوربین آماده نیست"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"دوربین آماده است"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"رویداد جلسه تماس ناشناس"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"سرویس"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"راه‌اندازی"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"‏&lt;تنظیم نشده&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"سایر تنظیمات تماس"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"تماس با <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"تماس‌های ورودی ازطریق <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"عکس مخاطب"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"رفتن به حالت خصوصی"</string>
+ <string name="selectContact" msgid="92191462970821951">"انتخاب مخاطب"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"پیام خودتان را بنویسید..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"لغو"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ارسال"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"پاسخ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"ارسال پیامک"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"رد کردن"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"پاسخ به‌صورت تماس ویدیویی"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"پاسخ به‌صورت تماس صوتی"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"پذیرفتن درخواست تماس ویدیویی"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"نپذیرفتن درخواست تماس ویدیویی"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"پذیرفتن درخواست مخابره ویدیویی"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"نپذیرفتن درخواست مخابره ویدیویی"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"پذیرفتن درخواست دریافت ویدیویی"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"نپذیرفتن درخواست دریافت ویدیویی"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به بالا بلغزانید."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به چپ بلغزانید."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به راست بلغزانید."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> به پایین بلغزانید."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"لرزش"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"لرزش"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"صدا"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"صدای پیش‌فرض (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"آهنگ زنگ تلفن"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"لرزش هنگام زنگ زدن"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"آهنگ‌ زنگ و لرزش"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"مدیریت تماس کنفرانسی"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"شماره اضطراری"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ثانیه</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ثانیه</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> دقیقه</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> دقیقه</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one">‏<xliff:g id="COUNT">%d</xliff:g> ساعت</item>
+ <item quantity="other">‏<xliff:g id="COUNT">%d</xliff:g> ساعت</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"عکس نمایه"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"دوربین خاموش"</string>
+ <string name="child_number" msgid="4469090994612105532">"ازطریق <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"یادداشت ارسال شد"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"پیام‌های جدید"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"اطلاعات کسب و کار"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> مایل فاصله"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> کیلومتر فاصله"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>،‏ <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> تا <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>،‏ <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"فردا ساعت <xliff:g id="OPEN_TIME">%s</xliff:g> باز می‌شود"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"امروز ساعت <xliff:g id="OPEN_TIME">%s</xliff:g> باز می‌شود"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"ساعت <xliff:g id="CLOSE_TIME">%s</xliff:g> بسته می‌شود"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"امروز ساعت <xliff:g id="CLOSE_TIME">%s</xliff:g> بسته شد"</string>
+ <string name="open_now" msgid="4615706338669555999">"اکنون باز است"</string>
+ <string name="closed_now" msgid="2635314668145282080">"اکنون بسته است"</string>
+</resources>
diff --git a/InCallUI/res/values-fi/strings.xml b/InCallUI/res/values-fi/strings.xml
new file mode 100644
index 000000000..084c69662
--- /dev/null
+++ b/InCallUI/res/values-fi/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Puhelin"</string>
+ <string name="onHold" msgid="527593602772521700">"Pidossa"</string>
+ <string name="unknown" msgid="3646075119047488748">"Tuntematon"</string>
+ <string name="private_num" msgid="6081418498487514686">"Yksityinen numero"</string>
+ <string name="payphone" msgid="5743050584468748607">"Maksupuhelin"</string>
+ <string name="confCall" msgid="3181961445236675173">"Puhelinneuvottelu"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Puhelu katkaistiin."</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Kaiutin"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Puhelimen kaiutin"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Kuulokemikrofoni"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Lähetetäänkö seuraavat äänet?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Lähetetään ääniä\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Lähetä"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Kyllä"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ei"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Muuta jokerimerkiksi"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Puhelinneuvottelu <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Puhelinvastaajan numero"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Soitetaan"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Soitetaan uudelleen"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Puhelinneuvottelu"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Saapuva puhelu"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Saapuva työpuhelu"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Puhelu päättyi"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Pidossa"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Katkaistaan"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Puhelu käynnissä"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Numeroni on <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Avataan videoyhteys"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videopuhelu"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Videota pyydetään"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videopuhelua ei voi soittaa"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videopyyntö hylättiin"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Takaisinsoittonumero:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Hätäpuhelujen takaisinsoittonumero:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Soitetaan"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Vastaamaton puhelu"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Vastaamattomia puheluita"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> vastaamatonta puhelua"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Vastaamaton puhelu: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Käynnissä oleva puhelu"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Käynnissä oleva työpuhelu"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Käynnissä oleva Wi-Fi-puhelu"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Käynnissä oleva Wi-Fi-työpuhelu"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Pidossa"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Saapuva puhelu"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Saapuva työpuhelu"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Saapuva Wi-Fi-puhelu"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Saapuva Wi-Fi-työpuhelu"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Saapuva videopuhelu"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Saapuva videopyyntö"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Uusi vastaajaviesti"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Uusia vastaajaviestejä (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Soita: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Puhelinvastaajan numero on tuntematon."</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ei yhteyttä"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Valittu verkko (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ei ole käytettävissä."</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Vastaa"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Katkaise"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videopuhelu"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Äänipuhelu"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Hyväksy"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Hylkää"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Soita"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Viesti"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Poista lentokonetila käytöstä ennen puhelun soittamista."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ei rekisteröity verkkoon"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Matkapuhelinverkko ei ole käytettävissä."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Soita antamalla kelvollinen numero."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Puhelua ei voi soittaa."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Aloitetaan MMI-koodisekvenssiä…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Yhteyttä ei tueta."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Puhelua ei voi vaihtaa."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Puhelua ei voi erottaa."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Puhelua ei voi siirtää."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Puheluja ei voi yhdistää."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Puhelua ei voi hylätä."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Puheluja ei voi katkaista."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-puhelu"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Hätäpuhelu"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Käynnistetään radiota…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ei yhteyttä. Yritetään uudelleen…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Puhelua ei voi soittaa. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ei ole hätänumero."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Puhelua ei voi soittaa. Valitse hätänumero."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Valitse numero näppäimistöllä."</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Aseta puhelu pitoon"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Jatka puhelua"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Lopeta puhelu"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Avaa näppäimistö"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Piilota näppäimistö"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Mykistä"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Poista mykistys"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Lisää puhelu"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Yhdistä puhelut"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Vaihda"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Hallinnoi puheluja"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Hallinnoi puhelinneuvottelua"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Puhelinneuvottelu"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Hallinnoi"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Ääni"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Muuta äänipuheluksi"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Vaihda kameraa"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Keskeytä video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Lisäasetukset"</string>
+ <string name="player_started" msgid="3478865572468310331">"Soitin käynnistettiin."</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Soitin pysäytettiin."</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera ei ole valmis."</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera on valmis."</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Tuntematon puheluistunnon tapahtuma"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Palveluntarjoaja"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Määritys"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ei määritetty&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Muut puheluasetukset"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Käytetään operaattoria <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Saapuva puhelu (<xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"Yhteystiedon kuva"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"Muuta yksityiseksi."</string>
+ <string name="selectContact" msgid="92191462970821951">"Valitse yhteystieto."</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Kirjoita oma…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Peruuta"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Lähetä"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Vastaa."</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Lähetä tekstiviesti."</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Hylkää."</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Vastaa ja aloita videopuhelu."</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Vastaa ja aloita äänipuhelu."</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Hyväksy videopyyntö."</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Hylkää videopyyntö."</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Hyväksy videon lähetyspyyntö."</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Hylkää videon lähetyspyyntö."</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Hyväksy videon vastaanottopyyntö."</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Hylkää videon vastaanottopyyntö."</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla ylös."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla vasemmalle."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla oikealle."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Valitse <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> liu\'uttamalla alas."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Värinä"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Värinä"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ääni"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Oletusääni (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Puhelimen soittoääni"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Käytä värinää, kun puhelin soi"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Soittoääni ja värinä"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Hallinnoi puhelinneuvottelua"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Hätänumero"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekuntia</item>
+ <item quantity="one">1 sekunti</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuuttia</item>
+ <item quantity="one">1 minuutti</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> tuntia</item>
+ <item quantity="one">1 tunti</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profiilikuva"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera on pois käytöstä."</string>
+ <string name="child_number" msgid="4469090994612105532">"nron <xliff:g id="CHILD_NUMBER">%s</xliff:g> kautta"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Muistiinpano lähetettiin."</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Viimeisimmät viestit"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Yrityksen tiedot"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Etäisyys: <xliff:g id="DISTANCE">%.1f</xliff:g> mailia"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Etäisyys: <xliff:g id="DISTANCE">%.1f</xliff:g> kilometriä"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Avataan huomenna kello <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Avataan tänään kello <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Suljetaan tänään kello <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Suljettiin tänään kello <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Avoinna nyt"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Suljettu nyt"</string>
+</resources>
diff --git a/InCallUI/res/values-fr-rCA/strings.xml b/InCallUI/res/values-fr-rCA/strings.xml
new file mode 100644
index 000000000..2218e78c8
--- /dev/null
+++ b/InCallUI/res/values-fr-rCA/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Téléphone"</string>
+ <string name="onHold" msgid="527593602772521700">"En attente"</string>
+ <string name="unknown" msgid="3646075119047488748">"Inconnue"</string>
+ <string name="private_num" msgid="6081418498487514686">"Numéro privé"</string>
+ <string name="payphone" msgid="5743050584468748607">"Cabine téléphonique"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conférence téléphonique"</string>
+ <string name="call_lost" msgid="8208184291640961172">"L\'appel a été interrompu"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Haut-parleur"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Écouteur du combiné"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Écouteurs à fil"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Envoyer les tonalités suivantes?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Envoi des tonalités\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Envoyer"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Oui"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Non"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Remplacer le caractère générique par"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conférence téléphonique <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Numéro de messagerie vocale"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Composition..."</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Recomposition en cours..."</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conférence téléphonique"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Appel entrant"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Appel entrant - travail"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Appel terminé"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"En attente"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Fin de l\'appel"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"En cours d\'appel"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mon numéro est le <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Connexion de la vidéo en cours…"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Appel vidéo"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Demande de vidéo en cours"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Impossible de connecter l\'appel vidéo"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Demande vidéo refusée"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Votre numéro de rappel :\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Votre numéro de rappel d\'urgence :\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Composition en cours..."</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Appel manqué"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Appels manqués"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Appel manqué de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Appel en cours"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Appel en cours - travail"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Appel Wi-Fi en cours"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Appel Wi-Fi en cours - travail"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"En attente"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Appel entrant"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Appel entrant - travail"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Appel Wi-Fi entrant"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Appel Wi-Fi entrant - travail"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Appel vidéo entrant"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Demande de vidéo reçue"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nouveau message vocal"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nouveaux messages vocaux (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Composer le <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Numéro de messagerie vocale inconnu"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Aucun service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Réseau sélectionné (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponible"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Répondre"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Raccrocher"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vidéo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voix"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accepter"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Fermer"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Rappeler"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Message"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Pour faire un appel, d\'abord désactiver le mode Avion."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Non enregistré sur le réseau."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Réseau cellulaire non disponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Pour faire un appel, entrez un numéro valide."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Impossible d\'appeler."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Lancement de la séquence IHM en cours…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service non pris en charge."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Impossible de faire des appels."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Impossible de séparer les appels."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Impossible de transférer."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Impossible de créer la conférence."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Impossible de refuser l\'appel."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Impossible de libérer l\'appel ou les appels."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Appel SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Appel d\'urgence"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Activation du signal radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Aucun service. Nouvel essai en cours..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Appel impossible. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> n\'est pas un numéro d\'urgence."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Appel impossible. Composez un numéro d\'urgence."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Utilisez le clavier pour composer un numéro"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Mettre l\'appel en attente"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Reprendre l\'appel"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Mettre fin à l\'appel"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Afficher le clavier numérique"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Masquer le clavier numérique"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Désactiver le son"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Réactiver le son"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Ajouter un appel"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Fusionner les appels"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Permuter"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gérer les appels"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gérer la conférence"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conférence téléphonique"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gérer"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Appel vidéo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Passer à un appel vocal"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Changer d\'appareil photo"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Interrompre la vidéo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Plus d\'options"</string>
+ <string name="player_started" msgid="3478865572468310331">"Le lecteur a démarré"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Le lecteur a arrêté"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"L\'appareil photo n\'est pas prêt"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"L\'appareil photo est prêt"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Événement inconnu de séance d\'appel"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Service"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuration"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Non défini&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Autres paramètres d\'appel"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Appel par <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Appel entrant par <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"photo du contact"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"mode privé"</string>
+ <string name="selectContact" msgid="92191462970821951">"sélectionner un contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Réponse personnalisée..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Annuler"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Envoyer"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Répondre"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Envoyer un texto"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Refuser"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Répondre comme appel vidéo"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Répondre comme appel audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accepter la demande vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Refuser la demande vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accepter la demande de transmission vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Refuser la demande de transmission vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accepter la demande de réception vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Refuser la demande de réception vidéo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Faites glisser votre doigt vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Faites glisser votre doigt vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Faites glisser votre doigt vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Faire glisser le doigt vers le bas : <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibration"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibration"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Son"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Son par défaut (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Sonnerie du téléphone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrer lorsque téléphone sonne"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Sonnerie et vibreur"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gérer la conférence"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Numéro d\'urgence"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> seconde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> secondes</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> heure</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> heures</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Photo de profil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Appareil photo désactivé"</string>
+ <string name="child_number" msgid="4469090994612105532">"au moyen du <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Note envoyée"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Messages récents"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Renseignements sur l\'entreprise"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"À <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"À <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"De <xliff:g id="OPEN_TIME">%1$s</xliff:g> à <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Ouvre demain à <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Ouvre aujourd\'hui à <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Ferme à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"A fermé aujourd\'hui à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Ouvert"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Fermé"</string>
+</resources>
diff --git a/InCallUI/res/values-fr/strings.xml b/InCallUI/res/values-fr/strings.xml
new file mode 100644
index 000000000..3dbf8c108
--- /dev/null
+++ b/InCallUI/res/values-fr/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Téléphone"</string>
+ <string name="onHold" msgid="527593602772521700">"En attente"</string>
+ <string name="unknown" msgid="3646075119047488748">"Inconnu"</string>
+ <string name="private_num" msgid="6081418498487514686">"Numéro privé"</string>
+ <string name="payphone" msgid="5743050584468748607">"Cabine téléphonique"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conférence téléphonique"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Appel interrompu"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Haut-parleur"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Écouteur du combiné"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Casque filaire"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Envoyer les tonalités suivantes ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Envoi des tonalités…\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Envoyer"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Oui"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Non"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Remplacer le caractère générique par"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conférence téléphonique à <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"N° de la messagerie vocale"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Appel…"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Rappel…"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conférence téléphonique"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Appel entrant"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Appel profession. entrant"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Appel terminé"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"En attente"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Fin de l\'appel…"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Appel en cours"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mon numéro est le <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Connexion de la vidéo…"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Appel vidéo"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Demande de vidéo…"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Impossible d\'établir la connexion de l\'appel vidéo."</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Demande d\'appel vidéo refusée"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Votre numéro de rappel\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Votre numéro de rappel d\'urgence\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Appel…"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Appel manqué"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Appels manqués"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Appel manqué de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Appel en cours"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Appel professionnel en cours"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Appel Wi-Fi en cours"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Appel Wi-Fi professionnel en cours"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"En attente"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Appel entrant"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Appel professionnel entrant"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Appel Wi-Fi entrant"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Appel Wi-Fi professionnel entrant"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Appel vidéo entrant"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Demande de vidéo reçue"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nouveau message vocal"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nouveaux messages vocaux (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Composer le <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Numéro de messagerie vocale inconnu"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Aucun service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Réseau sélectionné (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponible"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Répondre"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Raccrocher"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vidéo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Appel vocal"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accepter"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Fermer"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Rappeler"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Envoyer SMS"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Veuillez désactiver le mode Avion avant de passer un appel."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Non enregistré sur le réseau."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Réseau mobile indisponible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Pour émettre un appel, veuillez saisir un numéro valide."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Impossible d\'émettre l\'appel."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Lancement de la séquence IHM…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service non compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Impossible de changer d\'appel."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Impossible d\'isoler l\'appel."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Transfert impossible."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Impossible de lancer une conférence téléphonique."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Impossible de refuser l\'appel."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Impossible de lancer les appels."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Appel SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Appel d\'urgence"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Activation du signal radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Aucun service disponible. Nouvelle tentative…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Impossible d\'émettre l\'appel. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> n\'est pas un numéro d\'urgence."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Impossible d\'émettre l\'appel. Veuillez composer un numéro d\'urgence."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Utilisez le clavier pour composer un numéro."</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Mettre l\'appel en attente"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Reprendre l\'appel"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Mettre fin à l\'appel"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Afficher le clavier"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Masquer le clavier"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Couper le son"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Réactiver le son"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Ajouter un appel"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Fusionner les appels"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Permuter"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gérer les appels"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gérer conférence téléphonique"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conférence téléphonique"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gérer"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Appel vidéo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Passer à un appel vocal"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Changer de caméra"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Suspendre la vidéo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Plus d\'options"</string>
+ <string name="player_started" msgid="3478865572468310331">"Le lecteur a démarré."</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Le lecteur s\'est arrêté."</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"La caméra n\'est pas prête"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"La caméra est prête"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Événement de session d\'appel inconnu"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Service"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuration"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Non défini&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Autres paramètres d\'appel"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Appel via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Appel entrant via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"photo du contact"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"mode privé"</string>
+ <string name="selectContact" msgid="92191462970821951">"sélectionner un contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Réponse personnalisée…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Annuler"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Envoyer"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Répondre"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Envoyer un SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Refuser"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Répondre via un appel vidéo"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Répondre via un appel audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accepter la demande d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Refuser la demande d\'appel vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accepter la demande de transmission d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Refuser la demande de transmission d\'appel vidéo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accepter la demande de réception d\'appel vidéo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Refuser la demande de réception d\'appel vidéo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Faites glisser vers le haut pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Faites glisser vers la gauche pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Faites glisser vers la droite pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Faites glisser vers le bas pour <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibreur"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibreur"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sonnerie"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Sonnerie par défaut (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Sonnerie du téléphone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibreur lorsque le tél. sonne"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Sonnerie et vibreur"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gérer la conférence téléphonique"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Numéro d\'urgence"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> seconde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> secondes</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutes</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> heure</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> heures</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Photo du profil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Caméra désactivée"</string>
+ <string name="child_number" msgid="4469090994612105532">"via le <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"La note a bien été envoyée."</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Messages récents"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informations sur l\'établissement"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"À <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"À <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Ouvre demain à <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Ouvre aujourd\'hui à <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Ferme à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Fermé aujourd\'hui à <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Ouvert"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Fermé"</string>
+</resources>
diff --git a/InCallUI/res/values-gl-rES/strings.xml b/InCallUI/res/values-gl-rES/strings.xml
new file mode 100644
index 000000000..7a3725fca
--- /dev/null
+++ b/InCallUI/res/values-gl-rES/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Teléfono"</string>
+ <string name="onHold" msgid="527593602772521700">"En espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Descoñecido"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privado"</string>
+ <string name="payphone" msgid="5743050584468748607">"Teléfono público"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conferencia telefónica"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Chamada interrompida"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altofalante"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auricular do teléfono"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Auriculares con cable"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Queres enviar os seguintes tons?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Enviando tons\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Si"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Non"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Substituír carácter comodín por"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conferencia telefónica ás <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número de correo de voz"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Marcando"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Marcando de novo"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conferencia telefónica"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Chamada entrante"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Chamada traballo entrante"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Chamada finalizada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"En espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Desconectando"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Chamada entrante"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"O meu número é o <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Conectando vídeo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Solicitando vídeo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Non se pode conectar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Rexeitouse a solicitude de vídeo"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"O teu número de devolución de chamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"O teu número de devolución de chamada de emerxencia\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Marcando"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Chamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Chamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Chamada en curso"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Chamada de traballo saínte"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Chamada por wifi saínte"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Chamada por wifi de traballo saínte"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"En espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Chamada entrante"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Chamada de traballo entrante"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Chamada por wifi entrante"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Chamada wifi de traballo entrante"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videochamada entrante"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Solicitude de vídeo entrante"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Correo de voz novo"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Correo de voz novo (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Marcar o <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número de correo de voz descoñecido"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sen servizo"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"A rede seleccionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non está dispoñible"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Responder"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Colgar"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voz"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aceptar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ignorar"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Dev. chamada"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensaxe"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Para realizar unha chamada, primeiro desactiva o modo avión."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Sen rexistro na rede."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rede móbil non dispoñible."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Para realizar unha chamada, introduce un número válido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Non se pode realizar a chamada."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Iniciando secuencia MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Servizo non compatible."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Non se poden cambiar as chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Non se pode separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Non se pode transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Non se pode realizar a conferencia."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Non se pode rexeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Non se poden desconectar as chamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Chamada de emerxencia"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Activando radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Sen servizo. Tentándoo de novo…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Non se pode realizar a chamada. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> non é un número de emerxencia."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Non se pode realizar a chamada. Marca un número de emerxencia."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Utiliza o teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Poñer a chamada en espera"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Retomar chamada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Finalizar chamada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostrar teclado de marcación"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ocultar teclado de marcación"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Silenciar"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Activar o son"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Engadir chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Combinar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Cambiar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Xestionar chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Xestionar confer. telefónica"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conferencia telefónica"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Xestionar"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videocham."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Cambiar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Cambiar cámara"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Máis opcións"</string>
+ <string name="player_started" msgid="3478865572468310331">"Iniciouse o reprodutor"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Detívose o reprodutor"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"A cámara non está preparada"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"A cámara está preparada"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento de sesión de chamada descoñecido"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Servizo"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuración"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Sen configurar&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Outras configuracións de chamada"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Chamando a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Chamadas entrantes a través de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto do contacto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"activar o modo privado"</string>
+ <string name="selectContact" msgid="92191462970821951">"seleccionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escribe a túa propia..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancelar"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Enviar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Responder"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Rexeitar"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Responde como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Responde como chamada de audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Acepta a solicitude de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Rexeita a solicitude de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Acepta a solicitude de transmisión de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Rexeita a solicitude de transmisión de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Acepta a solicitude de recepción de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Rexeita a solicitude de recepción de vídeo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Pasa o dedo cara a arriba para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Pasa o dedo cara a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Pasa o dedo cara a dereita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Pasa o dedo cara a abaixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Son"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Son predeterminado (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ton de chamada do teléfono"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar ao soar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ton de chamada e vibración"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Xestionar conferencia telefónica"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número de emerxencia"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto do perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"A cámara está desactivada"</string>
+ <string name="child_number" msgid="4469090994612105532">"a través do <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Enviouse a nota"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mensaxes recentes"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Información da empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"A <xliff:g id="DISTANCE">%.1f</xliff:g> mi de distancia"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km de distancia"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Abre mañá ás <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Abre hoxe ás <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Pecha ás <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Pechou hoxe ás <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Aberto agora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Pechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-gu-rIN/strings.xml b/InCallUI/res/values-gu-rIN/strings.xml
new file mode 100644
index 000000000..30dfb8822
--- /dev/null
+++ b/InCallUI/res/values-gu-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ફોન"</string>
+ <string name="onHold" msgid="527593602772521700">"હોલ્ડ પર"</string>
+ <string name="unknown" msgid="3646075119047488748">"અજાણ્યો"</string>
+ <string name="private_num" msgid="6081418498487514686">"ખાનગી નંબર"</string>
+ <string name="payphone" msgid="5743050584468748607">"પેફોન"</string>
+ <string name="confCall" msgid="3181961445236675173">"કોન્ફરન્સ કૉલ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"કૉલ કપાઇ ગયો"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"સ્પીકર"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"હેન્ડસેટ ઇયરપીસ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"વાયર્ડ હેડસેટ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"નીચે આપેલ ટોન્સ મોકલીએ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ટોન્સ મોકલી રહ્યાં છે\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"મોકલો"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"હા"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"નહીં"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"વાઇલ્ડ અક્ષરને આની સાથે બદલો"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"કોન્ફરન્સ કૉલ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"વૉઇસમેઇલ નંબર"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ડાયલ કરી રહ્યાં છે"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ફરી ડાયલ કરી રહ્યાં છે"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"કોન્ફરન્સ કૉલ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ઇનકમિંગ કૉલ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ઇનકમિંગ કાર્ય કૉલ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"કૉલ સમાપ્ત થયો"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"હોલ્ડ પર"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"સમાપ્ત કરી રહ્યાં છે"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"કૉલમાં"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"મારો નંબર <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> છે"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"વિડિઓ કનેક્ટ કરી રહ્યાં છે"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"વિડિઓ કૉલ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"વિડિઓની વિનંતી કરી રહ્યાં છે"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"વિડિઓ કૉલ કનેક્ટ કરી શકાતો નથી"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"વિડિઓ વિનંતી નકારી"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"તમારો કૉલબેક નંબર\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"તમારો કટોકટીનો કૉલબેક નંબર\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ડાયલ કરી રહ્યાં છે"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"છૂટેલો કૉલ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"છૂટેલા કૉલ્સ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> છૂટેલા કૉલ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> નો કૉલ ચૂકી ગયાં"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"ચાલી રહેલ કૉલ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"ચાલી રહેલ કાર્ય કૉલ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"ચાલી રહેલ Wi-Fi કૉલ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"ચાલી રહેલ Wi-Fi કાર્ય કૉલ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"હોલ્ડ પર"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ઇનકમિંગ કૉલ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ઇનકમિંગ કાર્ય કૉલ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ઇનકમિંગ Wi-Fi કૉલ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ઇનકમિંગ Wi-Fi કાર્ય કૉલ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ઇનકમિંગ વિડિઓ કૉલ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ઇનકમિંગ વિડિઓ વિનંતી"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"નવો વૉઇસમેઇલ"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"નવો વૉઇસમેઇલ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ડાયલ કરો"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"વૉઇસમેઇલ નંબર અજાણ"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"કોઈ સેવા નથી"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"પસંદ કરેલ નેટવર્ક (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) અનુપલબ્ધ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"જવાબ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"સમાપ્ત કરો"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"વિડિઓ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"વૉઇસ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"સ્વીકારો"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"છોડી દો"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"કૉલ બૅક કરો"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"સંદેશ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"કૉલ કરવા માટે, પહેલા એરપ્લેન મોડને બંધ કરો."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"નેટવર્ક પર નોંધણી કરાયેલ નથી."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"સેલ્યુલર નેટવર્ક ઉપલબ્ધ નથી."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"કૉલ કરવા માટે, માન્ય નંબર દાખલ કરો."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"કૉલ કરી શકાતો નથી."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI અનુક્રમ પ્રારંભ કરી રહ્યાં છે…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"સેવા સમર્થિત નથી."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"કૉલ્સ સ્વિચ કરી શકાતાં નથી."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"અલગ કૉલ કરી શકાતો નથી."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ટ્રાંસ્ફર કરી શકાતો નથી."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"કોન્ફરન્સ કરી શકાતી નથી."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"કૉલ નકારી શકાતો નથી."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"કૉલ(કૉલ્સ) રિલીઝ કરી શકતાં નથી."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP કૉલ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"કટોકટીનો કૉલ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"રેડિઓ ચાલુ કરી રહ્યાં છે…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"કોઈ સેવા નથી. ફરી પ્રયાસ કરી રહ્યાં છે…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"કૉલ કરી શકાતો નથી. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> એ કટોકટીનો નંબર નથી."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"કૉલ કરી શકાતો નથી. કટોકટીનો નંબર ડાયલ કરો."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ડાયલ કરવા માટે કીબોર્ડનો ઉપયોગ કરો"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"કૉલ હોલ્ડ કરો"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"કૉલ ફરી શરૂ કરો"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"કૉલ સમાપ્ત કરો"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ડાયલપેડ બતાવો"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ડાયલપેડ છુપાવો"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"મ્યૂટ કરો"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"અનમ્યૂટ કરો"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"કૉલ ઉમેરો"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"કૉલ્સ મર્જ કરો"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"સ્વેપ કરો"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"કૉલ્સ સંચાલિત કરો"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"કોન્ફરન્સ કૉલ સંચાલિત કરો"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"કોન્ફરન્સ કૉલ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"સંચાલિત કરો"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ઑડિઓ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"વિડિઓ કૉલ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"વૉઇસ કૉલ પર બદલો"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"કૅમેરા પર સ્વિચ કરો"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"વિડિઓ થોભાવો"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"વધુ વિકલ્પો"</string>
+ <string name="player_started" msgid="3478865572468310331">"પ્લેયર પ્રારંભ કર્યું"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"પ્લેયર બંધ કર્યું"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"કૅમેરો તૈયાર નથી"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"કૅમેરો તૈયાર"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"અજાણી કૉલ સત્ર ઇવેન્ટ"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"સેવા"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"સેટઅપ"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;સેટ કરેલ નથી&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"અન્ય કૉલ સેટિંગ્સ"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> મારફતે કૉલ કરે છે"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> મારફતે ઇનકમિંગ"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"સંપર્ક ફોટો"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ખાનગી થાઓ"</string>
+ <string name="selectContact" msgid="92191462970821951">"સંપર્ક પસંદ કરો"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"તમારો પોતાનો લખો…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"રદ કરો"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"મોકલો"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"જવાબ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS મોકલો"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"નકારો"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"વિડિઓ કૉલ તરીકે જવાબ આપો"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ઑડિઓ કૉલ તરીકે જવાબ આપો"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"વિડિઓ વિનંતી સ્વીકારો"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"વિડિઓ વિનંતી નકારો"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"વિડિઓ ટ્રાંસ્મિટ વિનંતી સ્વીકારો"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"વિડિઓ ટ્રાંસ્મિટ વિનંતી નકારો"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"વિડિઓ પ્રાપ્તિ વિનંતી સ્વીકારો"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"વિડિઓ પ્રાપ્તિ વિનંતી નકારો"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ઉપર સ્લાઇડ કરો."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે ડાબે સ્લાઇડ કરો."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે જમણે સ્લાઇડ કરો."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> માટે નીચે સ્લાઇડ કરો."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"વાઇબ્રેટ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"વાઇબ્રેટ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ધ્વનિ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ડિફોલ્ટ ધ્વનિ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ફોન રિંગટોન"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"જ્યારે રિંગ કરે ત્યારે વાઇબ્રેટ કરો"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"રિંગટોન અને વાઇબ્રેટ"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"કોન્ફરન્સ કૉલ સંચાલિત કરો"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"કટોકટીનો નંબર"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> સેકંડ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> સેકંડ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> મિનિટ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> મિનિટ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> કલાક</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> કલાક</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"પ્રોફાઇલ ફોટો"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"કૅમેરો બંધ"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> મારફતે"</string>
+ <string name="note_sent" msgid="7623014827902758398">"નોંધ મોકલી"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"તાજેતરનાં સંદેશા"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"વ્યવસાયની માહિતી"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> માઇલ દૂર"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> કિમી દૂર"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"આવતીકાલે <xliff:g id="OPEN_TIME">%s</xliff:g> વાગ્યે ખુલશે"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"આજે <xliff:g id="OPEN_TIME">%s</xliff:g> વાગ્યે ખુલશે"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> વાગ્યે બંધ થશે"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"આજે <xliff:g id="CLOSE_TIME">%s</xliff:g> વાગ્યે બંધ થયેલું"</string>
+ <string name="open_now" msgid="4615706338669555999">"હમણાં ખુલ્લું"</string>
+ <string name="closed_now" msgid="2635314668145282080">"હમણાં બંધ છે"</string>
+</resources>
diff --git a/InCallUI/res/values-h400dp/dimens.xml b/InCallUI/res/values-h400dp/dimens.xml
new file mode 100644
index 000000000..dda755a3e
--- /dev/null
+++ b/InCallUI/res/values-h400dp/dimens.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2016 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Whether or not this layout displays a large photo. -->
+ <bool name="has_large_photo">true</bool>
+
+ <dimen name="call_banner_height">90dp</dimen>
+
+ <dimen name="end_call_button_margin_bottom">15dp</dimen>
+
+ <dimen name="floating_action_button_vertical_offset">-24dp</dimen>
+
+ <dimen name="dialpad_elevation">2dp</dimen>
+
+ <dimen name="video_preview_margin">20dp</dimen>
+</resources>
diff --git a/InCallUI/res/values-hi/strings.xml b/InCallUI/res/values-hi/strings.xml
new file mode 100644
index 000000000..6d4e8ae9a
--- /dev/null
+++ b/InCallUI/res/values-hi/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"फ़ोन"</string>
+ <string name="onHold" msgid="527593602772521700">"होल्ड पर"</string>
+ <string name="unknown" msgid="3646075119047488748">"अज्ञात"</string>
+ <string name="private_num" msgid="6081418498487514686">"निजी नंबर"</string>
+ <string name="payphone" msgid="5743050584468748607">"पे-फ़ोन"</string>
+ <string name="confCall" msgid="3181961445236675173">"कॉन्फ़्रेंस कॉल"</string>
+ <string name="call_lost" msgid="8208184291640961172">"कॉल कट गया"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"स्पीकर"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"हैंडसेट इयरपीस"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"वायर वाला हैडसेट"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ब्लूटूथ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"निम्न टोन भेजें?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"भेजने वाली टोन\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"भेजें"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"हां"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"नहीं"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"वाइल्ड वर्ण को इससे बदलें:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"कॉन्फ़्रेंस कॉल <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"वॉइसमेल नबंर"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"डायल किया जा रहा है"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"पुन: डायल हो रहा है"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"कॉन्फ़्रेंस कॉल"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"इनकमिंग कॉल"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"कार्यस्थल का इनकमिंग कॉल"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"कॉल समाप्त"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"होल्ड पर"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"कॉल समाप्त हो रहा है"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"कॉल में"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"मेरा नंबर <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> है"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"वीडियो कनेक्ट हो रहा है"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"वीडियो कॉल"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"वीडियो का अनुरोध किया जा रहा है"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"वीडियो कॉल कनेक्ट नहीं किया जा सकता"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"वीडियो अनुरोध अस्वीकार किया गया"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"आपका कॉलबैक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"आपका आपातकालीन कॉलबैक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"डायल किया जा रहा है"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"छूटा कॉल"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"छूटे कॉल"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> छूटे कॉल"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> के छूटे कॉल"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"चल रहा कॉल"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"कार्यस्थल का जारी कॉल"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"चल रहा वाई-फ़ाई कॉल"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"कार्यस्थल का जारी वाई-फ़ाई कॉल"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"होल्ड पर"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"इनकमिंग कॉल"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"कार्यस्थल का इनकमिंग कॉल"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"इनकमिंग वाई-फ़ाई कॉल"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"कार्यस्थल का वाई-फ़ाई इनकमिंग कॉल"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"इनकमिंग वीडियो कॉल"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"इनकमिंग वीडियो अनुरोध"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"नया वॉइसमेल"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"नया वॉइसमेल (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> डायल करें"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"वॉइसमेल नंबर अज्ञात"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"कोई सेवा नहीं"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"चयनित नेटवर्क (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) अनुपलब्ध"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"उत्तर दें"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"समाप्त करें"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"वीडियो"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ध्वनि"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"स्वीकार करें"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ख़ारिज करें"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"कॉल बैक करें"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"संदेश"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"कॉल करने के लिए, पहले हवाई जहाज़ मोड बंद करें."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"नेटवर्क पर पंजीकृत नहीं."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"सेल्युलर नेटवर्क उपलब्ध नहीं."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"कॉल करने के लिए, मान्य नंबर डालें."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"कॉल नहीं किया जा सकता."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI अनुक्रम प्रारंभ हो रहा है…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"सेवा समर्थित नहीं है."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"कॉल स्विच नहीं किए जा सकते."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"कॉल अलग नहीं किया जा सकता."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"स्थानान्तरित नहीं किया जा सकता."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"कॉन्फ़्रेंस नहीं की जा सकती."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"कॉल अस्वीकार नहीं किया जा सकता."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"कॉल रिलीज़ नहीं किया जा सकता (किए जा सकते)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP कॉल"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"आपातकालीन कॉल"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"रेडियो चालू कर रहा है..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"कोई सेवा नहीं. पुन: प्रयास किया जा रहा है…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"कॉल नहीं किया जा सकता. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> एक आपातकालीन नंबर नहीं है."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"कॉल नहीं किया जा सकता. आपातकालीन नबर डायल करें."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"डायल करने के लिए कीबोर्ड का उपयोग करें"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"कॉल होल्ड करें"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"कॉल फिर से शुरू करें"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"कॉल समाप्त करें"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"डायलपैड दिखाएं"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"डायलपैड छिपाएं"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"म्यूट करें"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"अनम्यूट करें"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"कॉल जोड़ें"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"कॉल मर्ज करें"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"स्वैप करें"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"कॉल प्रबंधित करें"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"कॉन्फ़्रेंस कॉल प्रबंधित करें"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"कॉन्फ़्रेंस कॉल"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"प्रबंधित करें"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ऑडियो"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"वीडियो कॉल"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"वॉइस कॉल में बदलें"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"कैमरा स्विच करें"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"वीडियो रोकें"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"अधिक विकल्प"</string>
+ <string name="player_started" msgid="3478865572468310331">"प्लेयर प्रारंभ हो गया"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"प्लेयर रुक गया"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"कैमरा तैयार नहीं है"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"कैमरा तैयार है"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"अज्ञात कॉल सत्र ईवेंट"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"सेवा"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"सेटअप"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;सेट नहीं है&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"अन्य कॉल सेटिंग"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> के माध्यम से कॉल किया जा रहा है"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> की ओर से इनकमिंग"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"संपर्क का फ़ोटो"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"निजी हो जाएं"</string>
+ <string name="selectContact" msgid="92191462970821951">"संपर्क को चुनें"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"अपना स्वयं का लिखें..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"अभी नहीं"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"भेजें"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"उत्तर दें"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS भेजें"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"अस्वीकार करें"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"वीडियो कॉल के रूप में उत्तर दें"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ऑडियो कॉल के रूप में उत्तर दें"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"वीडियो अनुरोध स्वीकार करें"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"वीडियो अनुरोध अस्वीकार करें"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"वीडियो प्रसारण अनुरोध स्वीकार करें"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"वीडियो प्रसारण अनुरोध अस्वीकार करें"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"वीडियो प्राप्ति अनुरोध स्वीकार करें"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"वीडियो प्राप्ति अनुरोध अस्वीकार करें"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> करने के लिए ऊपर स्लाइड करें."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> करने के लिए बाएं स्लाइड करें."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> करने के लिए दाएं स्लाइड करें."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> करने के लिए नीचे स्लाइड करें."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"कंपन"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"कंपन"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ध्वनि"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"डिफ़ॉल्ट ध्वनि (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"फ़ोन रिंगटोन"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"रिंग आने पर कंपन करें"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"रिंगटोन और कंपन"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"कॉन्फ़्रेंस कॉल प्रबंधित करें"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"आपातकालीन नंबर"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> सेकंड</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंड</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> मिनट</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> मिनट</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> घंटे</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> घंटे</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"प्रोफ़ाइल फ़ोटो"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"कैमरा बंद है"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> के द्वारा"</string>
+ <string name="note_sent" msgid="7623014827902758398">"नोट भेज दिया गया है"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"हाल ही के संदेश"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"व्यवसाय जानकारी"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> मील दूर"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> किमी दूर"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"कल <xliff:g id="OPEN_TIME">%s</xliff:g> बजे खुलेगा"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"आज <xliff:g id="OPEN_TIME">%s</xliff:g> बजे खुलता है"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> बजे बंद होता है"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> बजे बंद हो गया"</string>
+ <string name="open_now" msgid="4615706338669555999">"अभी खुला है"</string>
+ <string name="closed_now" msgid="2635314668145282080">"अभी बंद है"</string>
+</resources>
diff --git a/InCallUI/res/values-hr/strings.xml b/InCallUI/res/values-hr/strings.xml
new file mode 100644
index 000000000..f870af148
--- /dev/null
+++ b/InCallUI/res/values-hr/strings.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Na čekanju"</string>
+ <string name="unknown" msgid="3646075119047488748">"Nepoznato"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privatni broj"</string>
+ <string name="payphone" msgid="5743050584468748607">"Javna telefonska govornica"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferencijski poziv"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Poziv je prekinut"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Zvučnik"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Slušalice"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Žičane slušalice"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Poslati sljedeće tonove?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Slanje tonova\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Pošalji"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Da"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ne"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Zamijeni zamjenski znak znakom"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferencijski poziv <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Broj govorne pošte"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Biranje broja"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ponovno biranje"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferencijski poziv"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Dolazni poziv"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Dolazni poslovni poziv"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Poziv je završio"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Na čekanju"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Prekidanje veze"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Poziv u tijeku"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Moj je broj <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Uspostavljanje videopoziva"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videopoziv"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Zahtijevanje videopoziva"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videopoziv nije uspostavljen"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Zahtjev za videopoziv odbijen"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Vaš broj za povratni poziv\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Vaš broj za povratni poziv za hitne službe\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Biranje broja"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Propušteni poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Propušteni pozivi (<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>)"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Propušten poziv kontakta <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Poziv u tijeku"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Poslovni poziv u tijeku"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Wi-Fi poziv u tijeku"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Poslovni Wi-Fi poziv u tijeku"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Na čekanju"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Dolazni poziv"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Dolazni poslovni poziv"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Dolazni Wi-Fi poziv"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Dolazni poslovni Wi-Fi poziv"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Dolazni videopoziv"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Dolazni zahtjev za videopoziv"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nova govorna pošta"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nova govorna pošta (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Biraj <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nepoznat broj govorne pošte"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nema usluge"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Odabrana mreža (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nije dostupna"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Odgovori"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Prekini vezu"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videopoziv"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Glasovni poziv"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Prihvati"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Odbaci"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Uzvrati"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Poruka"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Da biste uspostavili poziv, isključite način rada u zrakoplovu."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nije registrirano na mreži."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilna mreža nije dostupna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Unesite važeći broj da biste uspostavili poziv."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Pozivanje nije moguće."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Pokretanje MMI sekvence…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Usluga nije podržana."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Prebacivanje poziva nije moguće."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Odvajanje poziva nije moguće."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Prijenos nije moguć."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferencijski poziv nije moguć."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Odbijanje poziva nije moguće."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Prekidanje poziva nije moguće."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP poziv"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Hitni poziv"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Uključivanje radija…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nema usluge. Pokušavamo ponovo…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Pozivanje nije moguće. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nije broj hitne službe."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Pozivanje nije moguće. Nazovite broj hitne službe."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Upotrijebite tipkovnicu"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Stavi poziv na čekanje"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Nastavi poziv"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Završi poziv"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Prikaži površinu za biranje brojeva"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Sakrij površinu za biranje brojeva"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Zanemari"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Prestani zanemarivati"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Dodaj poziv"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Spoji pozive"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Zamijeni"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Upravljaj pozivima"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Upravljaj konf. pozivom"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferencijski poziv"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Upravljanje"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videopoziv"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Prijeđi na glasovni poziv"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Promijeni kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pauziraj videopoziv"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Više opcija"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player je pokrenut"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player je prekinut"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Fotoaparat nije spreman"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Fotoaparat je spreman"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Nepoznati događaj sesije poziva"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Usluga"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Postavljanje"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nije postavljeno&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Ostale postavke poziva"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Pozivanje putem operatera <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Dolazni pozivi putem usluge <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotografija kontakta"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"uputi na privatno"</string>
+ <string name="selectContact" msgid="92191462970821951">"odabir kontakta"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napišite odgovor..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Odustani"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Pošalji"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Odgovori"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Pošalji SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Odbij"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Prihvati kao videopoziv"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Prihvati kao audiopoziv"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Prihvati zahtjev za videopoziv"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Odbij zahtjev za videopoziv"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Prihvati zahtjev za slanje videopoziva"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Odbij zahtjev za slanje videopoziva"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Prihvati zahtjev za primanje videopoziva"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Odbij zahtjev za primanje videopoziva"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Kliznite prema gore za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Kliznite lijevo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Kliznite desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Kliznite prema dolje za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibriranje"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibriranje"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Zvuk"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Zadani zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Melodija zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibracija tijekom zvonjenja"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Melodija zvona i vibracija"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Upravljaj konferencijskim pozivom"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Broj hitne službe"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sat</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sata</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sati</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Fotografija profila"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Fotoaparat je isključen"</string>
+ <string name="child_number" msgid="4469090994612105532">"putem broja <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Bilješka je poslana"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nedavne poruke"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informacije o tvrtki"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi udaljenosti"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km udaljenosti"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Otvara se sutra u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Otvara se danas u <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zatvara se u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Zatvoreno danas u <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Trenutačno otvoreno"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Trenutačno zatvoreno"</string>
+</resources>
diff --git a/InCallUI/res/values-hu/strings.xml b/InCallUI/res/values-hu/strings.xml
new file mode 100644
index 000000000..9cac188dd
--- /dev/null
+++ b/InCallUI/res/values-hu/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Tartásban"</string>
+ <string name="unknown" msgid="3646075119047488748">"Ismeretlen"</string>
+ <string name="private_num" msgid="6081418498487514686">"Magántelefonszám"</string>
+ <string name="payphone" msgid="5743050584468748607">"Nyilvános telefon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferenciahívás"</string>
+ <string name="call_lost" msgid="8208184291640961172">"A hívás megszakadt"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Hangszóró"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Kézibeszélő fülhallgatója"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Vezetékes fülhallgató"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Elküldi a következő hangjelzéseket?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Hangjelzések küldése\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Küldés"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Igen"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nem"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Helyettesítő karakter lecserélése a következőre:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferenciahívás – <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Hangposta száma"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Tárcsázás"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Újratárcsázás"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferenciahívás"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Bejövő hívás"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Bejövő munkahelyi hívás"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"A hívás befejeződött"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Tartásban"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Megszakítás"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Hívásban"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"A számom: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Videókapcsolat létrehozása"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videóhívás"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Videóhívást kér"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"A videóhívás létesítése sikertelen"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videókérelem elutasítva"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Visszahívható telefonszáma:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Vészhelyzet esetén visszahívható telefonszáma:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Tárcsázás"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Nem fogadott hívás"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Nem fogadott hívások"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> nem fogadott hívás"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Nem fogadott hívás: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Hívás folyamatban"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Folyamatban lévő munkahelyi hívás"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Folyamatban lévő Wi-Fi-hívás"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Folyamatban lévő munkahelyi hívás Wi-Fi-hálózaton keresztül"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Tartásban"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Bejövő hívás"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Bejövő munkahelyi hívás"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Bejövő Wi-Fi-hívás"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Bejövő munkahelyi hívás Wi-Fi-hálózaton keresztül"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Bejövő videóhívás"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Bejövő videókérés"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Új hangpostaüzenet"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Új hangpostaüzenet (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> tárcsázása"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"A hangposta száma ismeretlen"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nincs szolgáltatás"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"A kiválasztott hálózat (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nem áll rendelkezésre"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Fogadás"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Hívás bontása"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Videó"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Hang"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Elfogadás"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Elvetés"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Visszahívás"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Üzenet"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Hívásindításhoz kapcsolja ki a Repülős üzemmódot."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nincs regisztrálva a hálózaton."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"A mobilhálózat nem áll rendelkezésre."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Hívásindításhoz adjon meg egy érvényes számot."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"A hívás sikertelen."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI-sorozat indítása…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"A szolgáltatás nem támogatott."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"A hívások közötti váltás sikertelen."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"A híváselkülönítés sikertelen."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Az átirányítás sikertelen."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"A konferenciahívás sikertelen."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"A híváselutasítás sikertelen."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"A tartásban lévő hívás(ok) folytatása sikertelen."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-hívás"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Segélyhívás"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Rádió bekapcsolása…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nincs szolgáltatás. Újrapróbálkozás folyamatban…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"A hívás sikertelen. A(z) <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> szám nem segélyhívószám."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"A hívás sikertelen. Tárcsázzon segélyhívószámot."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"A tárcsázáshoz használja a billentyűzetet"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Hívás tartása"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Hívás folytatása"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Hívás befejezése"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Tárcsázó megjelenítése"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Tárcsázó elrejtése"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Némítás"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Némítás feloldása"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Hívás hozzáadása"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Hívások egyesítése"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Csere"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Hívások kezelése"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Konferenciahívás kezelése"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferenciahívás"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Kezelés"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Hang"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videóhívás"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Váltás hanghívásra"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Váltás a kamerák között"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Videó szüneteltetése"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"További lehetőségek"</string>
+ <string name="player_started" msgid="3478865572468310331">"A lejátszó elindult"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"A lejátszó leállt"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"A kamera nem áll készen"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"A kamera készen áll"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Ismeretlen hívási esemény"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Szolgáltatás"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Beállítás"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nincs megadva&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Egyéb hívásbeállítások"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Hívás a(z) <xliff:g id="PROVIDER_NAME">%s</xliff:g> szolgáltatón keresztül"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Bejövő hívás a következőn keresztül: <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotó a névjegyhez"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"magánbeszélgetés"</string>
+ <string name="selectContact" msgid="92191462970821951">"névjegy kiválasztása"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Saját válasz írása…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Mégse"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Küldés"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Fogadás"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS küldése"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Elutasítás"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Fogadás videóhívásként"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Fogadás hanghívásként"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Videó kérésének elfogadása"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Videó kérésének elutasítása"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Videóküldési kérés elfogadása"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Videóküldési kérés elutasítása"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Videófogadási kérés elfogadása"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Videófogadási kérés elutasítása"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa felfelé."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa balra."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa jobbra."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"A(z) <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> művelethez csúsztassa lefelé."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Rezgés"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Rezgés"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Hang"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Alapértelmezett hang (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefon csengőhangja"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Csörgéskor rezegjen"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Csengőhang és rezgés"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Konferenciahívás kezelése"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Segélyhívó szám"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> másodperc</item>
+ <item quantity="one">1 másodperc</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> perc</item>
+ <item quantity="one">1 perc</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> óra</item>
+ <item quantity="one">1 óra</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilfotó"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera ki"</string>
+ <string name="child_number" msgid="4469090994612105532">"a következő számon keresztül: <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Üzenet elküldve"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Legutóbbi üzenetek"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Cég adatai"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mérföldre"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> kilométerre"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="LOCALITY">%2$s</xliff:g>, <xliff:g id="STREET_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Holnap ekkor nyit: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Ma ekkor nyit: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Ekkor zár: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Ma ekkor zárt: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Jelenleg nyitva van"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Jelenleg zárva van"</string>
+</resources>
diff --git a/InCallUI/res/values-hy-rAM/strings.xml b/InCallUI/res/values-hy-rAM/strings.xml
new file mode 100644
index 000000000..a4a4b745e
--- /dev/null
+++ b/InCallUI/res/values-hy-rAM/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Հեռախոս"</string>
+ <string name="onHold" msgid="527593602772521700">"Սպասում"</string>
+ <string name="unknown" msgid="3646075119047488748">"Անհայտ"</string>
+ <string name="private_num" msgid="6081418498487514686">"Գաղտնի համար"</string>
+ <string name="payphone" msgid="5743050584468748607">"Հանրային հեռախոս"</string>
+ <string name="confCall" msgid="3181961445236675173">"Կոնֆերանս զանգ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Զանգն ընդհատվեց"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Բարձրախոս"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Հեռախոսի ականջակալ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Լարային ականջակալ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Ուղարկե՞լ հետևյալ ձայներանգները:\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Ձայներանգների ուղարկում\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Ուղարկել"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Այո"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ոչ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Փոխարինել կոպիտ գրանշանը"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Կոնֆերանս զանգ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Ձայնային փոստի համարը"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Համարարկում"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Վերահամարարկում"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Կոնֆերանս զանգ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Մուտքային զանգ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Մուտքային աշխատանքային զանգ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Զանգն ավարտվեց"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Սպասում"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Անջատում"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Զանգը միացված է"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Իմ համարը՝ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Տեսակապը միանում է"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Տեսազանգ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Տեսակապի հայցում"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Հնարավոր չէ միացնել տեսազանգը"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Տեսազանգի հարցումը մերժվել է"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Հետադարձ զանգի համարը՝\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Արտակարգ իրավիճակների հետադարձ զանգի համարը՝\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Համարարկում է"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Բաց թողնված զանգ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Բաց թողնված զանգեր"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> բաց թողնված զանգ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Բաց թողնված զանգ <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>-ից"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Ընթացիկ զանգ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Ընթացիկ աշխատանքային զանգ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Ընթացիկ Wi-Fi զանգ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Ընթացիկ աշխատանքային Wi-Fi զանգ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Սպասում"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Մուտքային զանգ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Մուտքային աշխատանքային զանգ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Մուտքային Wi-Fi զանգ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Մուտքային աշխատանքային Wi-Fi զանգ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Մուտքային տեսազանգ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Մուտքային տեսազանգի հայցում"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Նոր ձայնային հաղորդագրություն"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Նոր ձայնային հաղորդագրություն (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Զանգել <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> համարին"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Ձայնային փոստի համարն անհայտ է"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ծառայություն չկա"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Ընտրված ցանցը (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) անհասանելի է"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Պատասխանել"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Անջատել"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Տեսազանգ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Ձայնային"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Ընդունել"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Մերժել"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Հետ զանգել"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Հաղորդագրություն"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Զանգ կատարելու համար նախ անջատեք Ինքնաթիռի ռեժիմը:"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ցանցում գրանցված չէ:"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Բջջային ցանցն անհասանելի է:"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Զանգ կատարելու համար մուտքագրեք ճիշտ համար:"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Հնարավոր չէ զանգել:"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Մեկնարկում է MMI հաջորդականությունը…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Ծառայությունը չի աջակցվում:"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Հնարավոր չէ փոխարկել զանգերը:"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Հնարավոր չէ առանձնացնել զանգը:"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Հնարավոր չէ փոխանցել:"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Հնարավոր չէ կոնֆերանս զանգ կատարել:"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Հնարավոր չէ մերժել զանգը:"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Հնարավոր չէ անջատել զանգ(եր)ը:"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP զանգ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Շտապ կանչ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Ռադիոն միացվում է…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ծառայությունը մատչելի չէ: Փորձը կրկնվում է…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Հնարավոր չէ զանգել: <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> համարը արտակարգ իրավիճակի համար չէ:"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Հնարավոր չէ զանգել: Հավաքեք արտակարգ իրավիճակի որևէ համար:"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Օգտագործել ստեղնաշարը համար հավաքելու համար"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Հետաձգել զանգը"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Վերսկսել զանգը"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Ավարտել զանգը"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Ցուցադրել թվաշարը"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Թաքցնել թվաշարը"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Անջատել ձայնը"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Չանտեսել"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Ավելացնել զանգ"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Միացնել զանգերը"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Փոխանակել"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Կառավարել զանգերը"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Կառավարել կոնֆերանս զանգը"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Կոնֆերանս զանգ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Կառավարել"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Ձայնային"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Տեսազանգ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Փոխարկել ձայնային կանչի"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Փոխարկել խցիկը"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Դադարեցնել տեսազանգը"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Այլ ընտրանքներ"</string>
+ <string name="player_started" msgid="3478865572468310331">"Նվագարկիչը մեկնարկել է"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Նվագարկիչը դադարեցվել է"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Տեսախցիկը պատրաստ չէ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Տեսախցիկը պատրաստ է"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Զանգի աշխատաշրջանի անհայտ իրադարձություն"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Ծառայություն"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Կարգավորում"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Կարգավորված չէ&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Զանգերի այլ կարգավորումներ"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Զանգում է <xliff:g id="PROVIDER_NAME">%s</xliff:g>-ի միջոցով"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Մուտքային զանգ <xliff:g id="PROVIDER_NAME">%s</xliff:g>-ի միջոցով"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"կոնտակտի լուսանկարը"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"անցնել անձնականի"</string>
+ <string name="selectContact" msgid="92191462970821951">"ընտրել կոնտակտ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Գրեք ձեր սեփականը…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Չեղարկել"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Ուղարկել"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Պատասխանել"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Ուղարկել SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Մերժել"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Պատասխանել տեսազանգով"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Պատասխանել ձայնային զանգով"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Ընդունել տեսազանգի հարցումը"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Մերժել տեսազանգի հարցումը"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Ընդունել տեսափոխանցման հարցումը"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Մերժել տեսափոխանցման հարցումը"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Ընդունել տեսազանգ ստանալու հարցումը"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Մերժել տեսազանգ ստանալու հարցումը"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Սահեցրեք վերև` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> գործառույթի համար:"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Սահեցրեք ձախ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> գործառույթի համար:"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Սահեցրեք աջ` <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> գործառույթի համար:"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Սահեցրեք ցած՝ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> գործառույթի համար:"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Թրթռոց"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Թրթռոց"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ձայն"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Կանխադրված ձայնը (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Հեռախոսի զանգերանգ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Թրթռալ զանգի ժամանակ"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ձայներանգ և թրթռոց"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Կառավարել կոնֆերանս զանգը"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Արտակարգ իրավիճակի համար"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> վայրկյան</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> վայրկյան</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> րոպե</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> րոպե</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ժամ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ժամ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Պրոֆիլի լուսանկար"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Տեսախցիկն անջատված"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>-ի միջոցով"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Գրառումն ուղարկվեց"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Վերջին հաղորդագրությունները"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Բիզնես տեղեկատվություն"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> մղոն հեռու"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> կմ հեռու"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Բացվում է վաղը ժամը <xliff:g id="OPEN_TIME">%s</xliff:g>-ին"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Բացվում է այսօր ժամը <xliff:g id="OPEN_TIME">%s</xliff:g>-ին"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Փակվում է ժամը <xliff:g id="CLOSE_TIME">%s</xliff:g>-ին"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Փակվել է այսօր ժամը <xliff:g id="CLOSE_TIME">%s</xliff:g>-ին"</string>
+ <string name="open_now" msgid="4615706338669555999">"Հիմա բաց է"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Հիմա փակ է"</string>
+</resources>
diff --git a/InCallUI/res/values-in/strings.xml b/InCallUI/res/values-in/strings.xml
new file mode 100644
index 000000000..ba1a2feb6
--- /dev/null
+++ b/InCallUI/res/values-in/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telepon"</string>
+ <string name="onHold" msgid="527593602772521700">"Ditahan"</string>
+ <string name="unknown" msgid="3646075119047488748">"Tidak dikenal"</string>
+ <string name="private_num" msgid="6081418498487514686">"Nomor pribadi"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telepon Umum"</string>
+ <string name="confCall" msgid="3181961445236675173">"Telewicara"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Panggilan terputus"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Pengeras suara"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Earpiece handset"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Headset berkabel"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Kirim nada berikut?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Mengirim nada\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Kirim"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ya"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Tidak"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Ganti karakter acak dengan"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Telewicara <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Nomor pesan suara"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Memanggil"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Memanggil ulang"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Telewicara"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Panggilan masuk"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Panggilan masuk di telepon kerja"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Panggilan diakhiri"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Ditahan"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Menutup panggilan"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Sedang dalam panggilan"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Nomor saya <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Menyambungkan video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video call"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Meminta video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Tidak dapat menyambungkan video call"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Permintaan video ditolak"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Nomor panggilan balik Anda\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Nomor panggilan balik darurat Anda\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Memanggil"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Panggilan tak terjawab"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Panggilan tak terjawab"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> panggilan tak terjawab"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Panggilan tak terjawab dari <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Panggilan yang berlangsung"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Panggilan telepon kerja yang sedang berlangsung"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Panggilan Wi-Fi keluar"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Panggilan Wi-Fi kerja yang sedang berlangsung"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Ditahan"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Panggilan masuk"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Panggilan masuk di telepon kerja"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Panggilan Wi-Fi masuk"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Panggilan Wi-Fi masuk di telepon kerja"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Video call masuk"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Permintaan video masuk"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Pesan suara baru"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Pesan suara baru (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Telepon <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nomor pesan suara tidak dikenal"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Tidak ada layanan"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Jaringan yang dipilih (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) tidak tersedia"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Jawab"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Akhiri"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Suara"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Terima"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Tutup"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Telepon balik"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Pesan"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Untuk melakukan panggilan, terlebih dahulu nonaktifkan mode Pesawat."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Tidak terdaftar pada jaringan."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Jaringan seluler tidak tersedia."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Untuk melakukan panggilan telepon, masukkan nomor yang valid."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Tidak dapat menelepon."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Memulai urutan MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Layanan tidak didukung."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Tidak dapat beralih panggilan."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Tidak dapat memisahkan panggilan."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Tidak dapat mentransfer."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Tidak dapat melakukan telewicara."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Tidak dapat menolak panggilan."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Tidak dapat melepas panggilan."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Panggilan SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Panggilan darurat"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Menghidupkan radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Tidak ada layanan. Mencoba lagi…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Tidak dapat menelepon. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bukan nomor darurat."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Tidak dapat menelepon. Panggil nomor darurat."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Gunakan keyboard untuk memanggil"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Tahan Panggilan"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Mulai Kembali Panggilan"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Akhiri Panggilan"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Tampilkan tombol nomor"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Sembunyikan tombol nomor"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Bisukan"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Suarakan"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Tambahkan panggilan"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Gabungkan panggilan"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Tukar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Kelola panggilan"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Kelola telewicara"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferensi telepon"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Kelola"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Ubah ke panggilan suara"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Beralih kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Jeda video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Opsi lainnya"</string>
+ <string name="player_started" msgid="3478865572468310331">"Pemutar Dimulai"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Pemutar Dihentikan"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera tidak siap"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera siap"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Sesi panggilan tidak dikenal"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Layanan"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Siapkan"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Tidak disetel&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Setelan panggilan lainnya"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Memanggil via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Masuk melalui <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto kontak"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"aktifkan pribadi"</string>
+ <string name="selectContact" msgid="92191462970821951">"pilih kontak"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Tulis respons Anda sendiri…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Batal"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Kirim"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Jawab"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Kirim SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Tolak"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Jawab sebagai video call"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Jawab sebagai panggilan audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Terima permintaan video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Tolak permintaan video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Terima permintaan transmisi video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Tolak permintaan transmisi video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Terima permintaan menerima video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Tolak permintaan menerima video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Geser ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Geser ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Getar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Getar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Suara"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Suara default (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Nada dering ponsel"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Bergetar saat berdering"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Nada dering &amp; Getar"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Kelola telewicara"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Nomor darurat"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> detik</item>
+ <item quantity="one">1 detik</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> menit</item>
+ <item quantity="one">1 menit</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> jam</item>
+ <item quantity="one">1 jam</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto profil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera tidak aktif"</string>
+ <string name="child_number" msgid="4469090994612105532">"melalui <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Catatan telah dikirim"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Pesan terbaru"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Info bisnis"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Buka pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Hari ini buka pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Tutup pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Hari ini tutup pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Buka sekarang"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Sekarang tutup"</string>
+</resources>
diff --git a/InCallUI/res/values-is-rIS/strings.xml b/InCallUI/res/values-is-rIS/strings.xml
new file mode 100644
index 000000000..e749b1758
--- /dev/null
+++ b/InCallUI/res/values-is-rIS/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Sími"</string>
+ <string name="onHold" msgid="527593602772521700">"Í bið"</string>
+ <string name="unknown" msgid="3646075119047488748">"Óþekkt"</string>
+ <string name="private_num" msgid="6081418498487514686">"Óþekkt númer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Símasjálfsali"</string>
+ <string name="confCall" msgid="3181961445236675173">"Símafundur"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Símtali slitið"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Hátalari"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Símahátalari"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Höfuðtól með snúru"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Senda eftirfarandi tóna?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sendir tóna\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Senda"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Já"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nei"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Skipta algildisstaf út fyrir"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Símafundur <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Talhólfsnúmer"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Hringir"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Hringir aftur"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Símafundur"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Móttekið símtal"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Vinnusímtal berst"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Lagt á"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Í bið"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Leggur"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Í símtali"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Númerið mitt er <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Tengir myndskeið"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Myndsímtal"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Biður um myndskeið"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Ekki tókst að tengja myndsímtal"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Myndsímtalsbeiðni hafnað"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Svarhringingarnúmer þitt\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Svarhringingarnúmer þitt í neyðartilvikum\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Hringir"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Ósvarað símtal"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Ósvöruð símtöl"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ósvöruð símtöl"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Ósvarað símtal frá <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Samtal í gangi"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Vinnusímtal í gangi"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Wi-Fi símtal stendur yfir"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Vinnusímtal í gangi um Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Í bið"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Móttekið símtal"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Vinnusímtal berst"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Wi-Fi símtal berst"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Vinnusímtal berst um Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Myndsímtal berst"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Myndbeiðni berst"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Ný skilaboð í talhólfinu"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Ný skilaboð í talhólfinu (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Hringja í <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Talhólfsnúmer ekki þekkt"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ekkert símasamband"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Valið símkerfi (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ekki tiltækt"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Svara"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Leggja á"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Myndskeið"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Tal"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Samþykkja"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Hunsa"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Hringja til baka"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Skilaboð"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Til að hringja símtal þarftu fyrst að slökkva á flugstillingu."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ekki skráð á símkerfi."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Farsímakerfi ekki til staðar."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Sláðu inn gilt númer til að hringja símtal."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Ekki hægt að hringja."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Ræsir MMI-runu…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Þjónustan er ekki studd."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Ekki hægt að skipta milli símtala."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Ekki hægt að aðskilja símtal."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Ekki hægt að flytja."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Ekki hægt að halda símafund."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Ekki hægt að hafna símtali."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Ekki hægt að leggja á."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-símtal"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Neyðarsímtal"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Kveikir á loftneti…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ekkert samband. Reynir aftur…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Getur ekki hringt. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ekki neyðarsímanúmer."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Ekki hægt að hringja. Hringdu í neyðarnúmer"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Notaðu lyklaborðið til að hringja"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Setja símtal í bið"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Halda símtali áfram"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Leggja á"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Sýna símatakkaborð"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Fela símatakkaborð"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Slökkva á hljóði"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Kveikja á hljóði"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Bæta við símtali"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Sameina símtöl"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Skipta milli"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Stjórna símtölum"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Stjórna símafundi"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Símafundur"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Stjórna"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Hljóð"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Myndsímtal"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Breyta í símtal"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Skipta um myndavél"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Gera hlé á myndskeiði"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Fleiri valkostir"</string>
+ <string name="player_started" msgid="3478865572468310331">"Spilari ræstur"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Spilari stöðvaður"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Myndavél ekki tilbúin"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Myndavél tilbúin"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Óþekkt atvik símtalslotu"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Þjónusta"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Uppsetning"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ekki valið&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Aðrar símtalsstillingar"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Hringt í gegnum <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Berst í gegnum <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"mynd tengiliðar"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"tala í einrúmi"</string>
+ <string name="selectContact" msgid="92191462970821951">"velja tengilið"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Skrifaðu eigið svar…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Hætta við"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Senda"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Svara"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Senda SMS-skilaboð"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Hafna"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Svara sem myndsímtali"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Svara sem símtali"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Samþykkja beiðni um myndsímtal"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Hafna beiðni um myndsímtal"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Samþykkja beiðni um sendingu myndsímtals"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Hafna beiðni um sendingu myndsímtals"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Samþykkja beiðni um móttöku myndsímtals"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Hafna beiðni um móttöku myndsímtals"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Strjúktu upp til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Strjúktu til vinstri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Strjúktu til hægri til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Strjúktu niður til að <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Titra"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Titra"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Hljóð"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Sjálfgefið hljóð (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Hringitónn síma"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Titra við hringingu"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Hringitónn og titringur"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Stjórna símafundi"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Neyðarnúmer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekúnda</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekúndur</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> mínúta</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> mínútur</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> klukkustund</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> klukkustundir</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Prófílmynd"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Slökkt á myndavél"</string>
+ <string name="child_number" msgid="4469090994612105532">"úr <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Glósa send"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nýleg skilaboð"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Fyrirtækjaupplýsingar"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"í <xliff:g id="DISTANCE">%.1f</xliff:g> míl. fjarlægð"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"í <xliff:g id="DISTANCE">%.1f</xliff:g> km fjarlægð"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Opið á morgun frá kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Opið í dag frá kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Lokað kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Var lokað í dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Opið núna"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Lokað núna"</string>
+</resources>
diff --git a/InCallUI/res/values-it/strings.xml b/InCallUI/res/values-it/strings.xml
new file mode 100644
index 000000000..72a8db82f
--- /dev/null
+++ b/InCallUI/res/values-it/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefono"</string>
+ <string name="onHold" msgid="527593602772521700">"In attesa"</string>
+ <string name="unknown" msgid="3646075119047488748">"Sconosciuto"</string>
+ <string name="private_num" msgid="6081418498487514686">"Numero privato"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefono pubblico"</string>
+ <string name="confCall" msgid="3181961445236675173">"Audioconferenza"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Chiamata persa"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altoparlante"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auricolare telefono"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Auricolare con cavo"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Inviare i numeri successivi?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Invio toni\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Invia"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sì"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"No"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Sostituisci carattere jolly con"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Audioconferenza: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Numero segreteria"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Chiamata in corso"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ricomposizione"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Audioconferenza"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Chiamata in arrivo"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Chiamata lavoro in arrivo"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Chiamata terminata"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"In attesa"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"In fase di chiusura"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Chiamata in corso"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Il mio numero è: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Collegamento video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videochiamata"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Richiesta video in corso"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Impossibile effettuare una videochiamata"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Richiesta video rifiutata"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Numero da richiamare:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Numero da richiamare in caso di emergenza:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Composizione in corso"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Chiamata senza risposta"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Chiamate senza risposta"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chiamate senza risposta"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Chiamata senza risposta da <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Chiamata in corso"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Chiamata di lavoro in corso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Chiamata Wi-Fi in corso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Chiamata di lavoro tramite Wi-Fi in corso"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"In attesa"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Chiamata in arrivo"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Chiamata di lavoro in arrivo"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Chiamata Wi-Fi in arrivo"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Chiamata di lavoro in arrivo tramite Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videochiamata in arrivo"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Richiesta video in arrivo"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nuovo messaggio vocale"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nuovo messaggio vocale (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Componi <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Numero segreteria sconosciuto"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nessun servizio"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Rete selezionata (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) non disponibile"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Rispondi"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Riaggancia"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voce"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accetta"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ignora"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Richiama"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Messaggio"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Per fare una chiamata, disattiva la modalità aereo."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Non registrato sulla rete."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rete dati non disponibile."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Per fare una chiamata, inserisci un numero valido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Impossibile chiamare."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Avvio sequenza MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Servizio non supportato."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Impossibile cambiare chiamata."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Impossibile separare la chiamata."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Impossibile trasferire."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Impossibile fare una chiamata in conferenza."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Impossibile rifiutare la chiamata."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Impossibile riagganciare."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Chiamata SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Chiamata di emergenza"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Attivazione segnale cellulare..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nessun servizio. Nuovo tentativo…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Impossibile chiamare. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> non è un numero di emergenza."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Impossibile chiamare. Componi un numero di emergenza."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Usa tastiera"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Metti in attesa la chiamata"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Riprendi chiamata"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Termina chiamata"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostra tastierino"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Nascondi tastierino"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Disattiva audio"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Riattiva audio"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Aggiungi chiamata"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Unisci chiamate"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Scambia"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gestisci chiamate"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gestisci audioconferenza"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Audioconferenza"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gestisci"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videochiam"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Passa a chiamata vocale"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Cambia fotocamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Metti in pausa video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Altre opzioni"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player avviato"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player interrotto"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"La fotocamera non è pronta"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Fotocamera pronta"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento sessione chiamata sconosciuto"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Servizio"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configura"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Non impostato&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Altre impostazioni di chiamata"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Chiamate tramite <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"In arrivo tramite <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto contatto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"Privato"</string>
+ <string name="selectContact" msgid="92191462970821951">"seleziona contatto"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Scrivi risposta personale..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Annulla"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Invia"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Rispondi"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Invia SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Rifiuta"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Rispondi con videochiamata"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Rispondi con chiamata audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Accetta richiesta video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Rifiuta richiesta video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Accetta richiesta di trasmissione video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Rifiuta richiesta di trasmissione video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Accetta richiesta di ricevimento video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Rifiuta richiesta di ricevimento video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Scorri verso l\'alto per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Scorri verso sinistra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Scorri verso destra per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Scorri verso il basso per <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrazione"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrazione"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Suono"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Suono predefinito (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Suoneria telefono"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrazione quando squilla"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Suoneria e vibrazione"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gestisci audioconferenza"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Numero di emergenza"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> secondi</item>
+ <item quantity="one">1 secondo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuti</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ore</item>
+ <item quantity="one">1 ora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto del profilo"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Fotocamera disattivata"</string>
+ <string name="child_number" msgid="4469090994612105532">"tramite <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota inviata"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Messaggi recenti"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informazioni sull\'attività"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Distante <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Distante <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Apre domani alle ore <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Apre oggi alle ore <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Chiude alle ore <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Ha chiuso oggi alle ore <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Aperto ora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Ora chiuso"</string>
+</resources>
diff --git a/InCallUI/res/values-iw/strings.xml b/InCallUI/res/values-iw/strings.xml
new file mode 100644
index 000000000..7fdc1c2ec
--- /dev/null
+++ b/InCallUI/res/values-iw/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"טלפון"</string>
+ <string name="onHold" msgid="527593602772521700">"בהמתנה"</string>
+ <string name="unknown" msgid="3646075119047488748">"לא ידוע"</string>
+ <string name="private_num" msgid="6081418498487514686">"מספר פרטי"</string>
+ <string name="payphone" msgid="5743050584468748607">"טלפון ציבורי"</string>
+ <string name="confCall" msgid="3181961445236675173">"שיחת ועידה"</string>
+ <string name="call_lost" msgid="8208184291640961172">"השיחה נותקה"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"רמקול"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"אוזנייה"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"אוזניות עם חיבור חוטי"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"האם לשלוח את הצלילים הבאים?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"שולח צלילים\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"שלח"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"כן"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"לא"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"החלף את התו הכללי ב"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"שיחת ועידה <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"המספר של הדואר הקולי"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"מחייג"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"מחייג שוב"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"שיחת ועידה"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"שיחה נכנסת"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"שיחת עבודה נכנסת"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"השיחה הסתיימה"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"בהמתנה"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"מנתק"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"בשיחה"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"המספר שלי הוא <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"מחבר וידאו"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"שיחת וידאו"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"מבקש וידאו"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"לא ניתן לחבר שיחת וידאו"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"בקשת וידאו נדחתה"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"המספר שלך להתקשרות חזרה\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"המספר שלך להתקשרות חזרה במצב חירום\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"מחייג"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"שיחה שלא נענתה"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"שיחות שלא נענו"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> שיחות שלא נענו"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"שיחה שלא נענתה מאת <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"שיחה פעילה"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"שיחת עבודה פעילה"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"‏שיחת Wi-Fi פעילה"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"‏שיחת עבודה פעילה ברשת WiFi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"בהמתנה"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"שיחה נכנסת"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"שיחת עבודה נכנסת"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"‏שיחת Wi-Fi נכנסת"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"‏שיחת עבודה נכנסת ברשת WiFi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"שיחת וידאו נכנסת"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"בקשת וידאו נכנסת"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"דואר קולי חדש"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"דואר קולי חדש (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"‏חייג ‎<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>‎"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"המספר של הדואר הקולי אינו ידוע"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"אין שירות"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"הרשת שנבחרה (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) לא זמינה"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"ענה"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"נתק"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"וידאו"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"קול"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"אשר"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"בטל"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"התקשר חזרה"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"שלח הודעה"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"כדי להתקשר, כבה תחילה את מצב טיסה."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"לא רשום ברשת."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"רשת סלולרית אינה זמינה."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"כדי להתקשר, הזן מספר טלפון חוקי."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"לא ניתן להתקשר."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"‏מתחיל רצף MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"שירות לא נתמך."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"לא ניתן לעבור בין שיחות."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"לא ניתן להפריד שיחה."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"לא ניתן להעביר."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"לא ניתן לבצע שיחת ועידה."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"לא ניתן לדחות שיחה."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"לא ניתן להתקשר."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"‏שיחת SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"שיחת חירום"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"מפעיל את הרדיו…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"אין שירות. מנסה שוב..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"לא ניתן להתקשר. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> אינו מספר חירום."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"לא ניתן להתקשר. חייג למספר חירום."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"השתמש במקלדת כדי לחייג"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"החזק שיחה"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"המשך בשיחה"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"סיים שיחה"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"הצגת לוח החיוג"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"הסתרת לוח החיוג"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"השתקה"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ביטול ההשתקה"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"הוסף שיחה"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"מזג שיחות"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"החלף"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"נהל שיחות"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"נהל שיחת ועידה"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"שיחת ועידה"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"ניהול"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"אודיו"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"שיחת וידאו"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"שנה לשיחה קולית"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"החלף מצלמה"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"השהה וידאו"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"אפשרויות נוספות"</string>
+ <string name="player_started" msgid="3478865572468310331">"הנגן הופעל"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"הנגן הפסיק"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"המצלמה לא מוכנה"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"המצלמה מוכנה"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"אירוע הפעלת שיחה לא ידוע"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"שירות"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"הגדרות"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;לא הוגדר&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"הגדרות אחרות של שיחה"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"שיחה באמצעות <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"שיחה נכנסת באמצעות <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"תמונה של איש קשר"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"עבור לשיחה פרטית"</string>
+ <string name="selectContact" msgid="92191462970821951">"בחר איש קשר"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"כתוב תגובה משלך..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"בטל"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"שלח"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"ענה"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"‏שלח SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"דחה"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ענה כשיחת וידאו"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ענה כשיחת אודיו"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"קבל בקשת וידאו"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"דחה בקשת וידאו"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"אשר את הבקשה לשידור וידאו"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"דחה את הבקשה לשידור וידאו"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"אשר את הבקשה לקבלת וידאו"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"דחה את הבקשה לקבלת וידאו"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"הסט למעלה כדי <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"הסט שמאלה כדי <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"הסט ימינה כדי <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"הסט למטה כדי <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"רטט"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"רטט"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"צליל"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"צליל ברירת מחדל (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"רינגטון של טלפון"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"רטט בעת צלצול"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"רינגטון ורטט"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"נהל שיחת ועידה"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"מספר חירום"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> שניות</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> שניות</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> שניות</item>
+ <item quantity="one">שנייה אחת</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> דקות</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> דקות</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> דקות</item>
+ <item quantity="one">דקה אחת</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> שעות</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> שעות</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> שעות</item>
+ <item quantity="one">שעה אחת</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"תמונת פרופיל"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"המצלמה כבויה"</string>
+ <string name="child_number" msgid="4469090994612105532">"באמצעות <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"ההערה נשלחה"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"הודעות אחרונות"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"פרטי עסק"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"במרחק <xliff:g id="DISTANCE">%.1f</xliff:g> מייל"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"במרחק <xliff:g id="DISTANCE">%.1f</xliff:g> ק\"מ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"ייפתח מחר ב-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"נפתח היום ב-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"נסגר ב-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"נסגר היום ב-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"פתוח עכשיו"</string>
+ <string name="closed_now" msgid="2635314668145282080">"סגור עכשיו"</string>
+</resources>
diff --git a/InCallUI/res/values-ja/strings.xml b/InCallUI/res/values-ja/strings.xml
new file mode 100644
index 000000000..7aa375b16
--- /dev/null
+++ b/InCallUI/res/values-ja/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"電話"</string>
+ <string name="onHold" msgid="527593602772521700">"保留中"</string>
+ <string name="unknown" msgid="3646075119047488748">"不明"</string>
+ <string name="private_num" msgid="6081418498487514686">"非通知"</string>
+ <string name="payphone" msgid="5743050584468748607">"公衆電話"</string>
+ <string name="confCall" msgid="3181961445236675173">"グループ通話"</string>
+ <string name="call_lost" msgid="8208184291640961172">"通話が遮断されました"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"スピーカー"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"モバイル端末のイヤホン"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"有線ヘッドセット"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"次の番号を送信しますか?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"番号を送信中\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"送信"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"はい"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"いいえ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ワイルド文字を置換:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"グループ通話 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"ボイスメールの番号"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"発信中"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"リダイヤル中"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"グループ通話"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"着信中"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"仕事の通話が着信中"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"通話終了"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"保留中"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"通話終了"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"通話中"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"この電話の番号: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ビデオハングアウトに接続中"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ビデオハングアウト"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ビデオハングアウトをリクエスト中"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ビデオハングアウトの接続エラー"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ビデオハングアウトのリクエスト不承認"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"コールバック先\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"緊急通報コールバック先\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"発信中"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"不在着信"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"不在着信"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"不在着信 <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 件"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> さんからの不在着信"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"通話中"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"仕事の通話中"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Wi-Fi 通話中"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"仕事の Wi-Fi 通話中"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"保留中"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"着信中"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"仕事の通話が着信中"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Wi-Fi 通話が着信中"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"仕事の Wi-Fi 通話が着信中"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ビデオハングアウトが着信中"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ビデオハングアウト リクエストが着信中"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"新着のボイスメール"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"新着のボイスメール(<xliff:g id="COUNT">%d</xliff:g> 件)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> に発信"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ボイスメールの番号が不明です"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"通信サービスはありません"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"選択したネットワーク(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)が利用できません"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"電話に出る"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"通話終了"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ビデオ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"音声"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"受ける"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"拒否する"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"コールバック"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"メッセージ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"機内モードを OFF にしてから発信してください。"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ご加入の通信サービスがありません。"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"モバイル ネットワークが利用できません。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"発信するには、有効な番号を入力してください。"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"発信できません。"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI シーケンスを開始しています..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"サービスはサポートされていません。"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"通話を切り替えられません。"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"通話を分割できません。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"転送できません。"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"グループ通話できません。"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"着信を拒否できません。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"通話を解放できません。"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP 通話"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"緊急通報"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"無線通信を ON にしています..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"通信サービスはありません。もう一度お試しください…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"発信できません。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> は緊急通報番号ではありません。"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"発信できません。緊急通報番号におかけください。"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"キーボードで番号を入力してください"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"通話を保留"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"通話を再開"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"通話を終了"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ダイヤルパッドを表示"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ダイヤルパッドを非表示"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ミュート"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ミュートを解除"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"通話を追加"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"グループ通話"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"切り替え"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"通話を管理"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"グループ通話オプション"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"グループ通話"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"管理"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"音声"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ビデオ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"音声通話に変更"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"カメラを切り替え"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ビデオハングアウトを一時停止"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"その他のオプション"</string>
+ <string name="player_started" msgid="3478865572468310331">"プレーヤーを開始しました"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"プレーヤーを停止しました"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"カメラが準備できていません"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"カメラが準備できました"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"不明な通話セッション イベントです"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"サービス"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"セットアップ"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;未設定&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"その他の通話設定"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> で発信中"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> で着信中"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"連絡先の写真"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"個別通話に切り替え"</string>
+ <string name="selectContact" msgid="92191462970821951">"連絡先を選択"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"カスタム返信を作成..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"キャンセル"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"送信"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"電話に出る"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS を送信する"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"拒否"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ビデオハングアウトで電話に出る"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"音声通話で電話に出る"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ビデオハングアウト リクエストを承認する"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ビデオハングアウト リクエストを拒否する"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ビデオハングアウト送信リクエストを承認する"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ビデオハングアウト送信リクエストを拒否する"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ビデオハングアウト受信リクエストを承認する"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ビデオハングアウト受信リクエストを拒否する"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"上にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"左にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"右にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"下にスライドして<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>を行います。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"バイブレーション"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"バイブレーション"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"着信音"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"デフォルトの通知音(<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"着信音"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"着信時のバイブレーション"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"着信音とバイブレーション"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"グループ通話オプション"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"緊急通報番号"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>秒</item>
+ <item quantity="one">1秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>分</item>
+ <item quantity="one">1分</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>時間</item>
+ <item quantity="one">1時間</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"プロフィール写真"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"カメラ OFF"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> に着信"</string>
+ <string name="note_sent" msgid="7623014827902758398">"メモを送信しました"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"最近のメッセージ"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ビジネス情報"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> マイル内"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km 内"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>、<xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>~<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>、<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"明日 <xliff:g id="OPEN_TIME">%s</xliff:g>に営業開始"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"本日 <xliff:g id="OPEN_TIME">%s</xliff:g>に営業開始"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>に営業終了"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"本日 <xliff:g id="CLOSE_TIME">%s</xliff:g>に営業終了"</string>
+ <string name="open_now" msgid="4615706338669555999">"現在営業中"</string>
+ <string name="closed_now" msgid="2635314668145282080">"営業終了"</string>
+</resources>
diff --git a/InCallUI/res/values-ka-rGE/strings.xml b/InCallUI/res/values-ka-rGE/strings.xml
new file mode 100644
index 000000000..d732a8e2d
--- /dev/null
+++ b/InCallUI/res/values-ka-rGE/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ტელეფონი"</string>
+ <string name="onHold" msgid="527593602772521700">"მოცდის რეჟიმში"</string>
+ <string name="unknown" msgid="3646075119047488748">"უცნობი"</string>
+ <string name="private_num" msgid="6081418498487514686">"დაფარული ნომერი"</string>
+ <string name="payphone" msgid="5743050584468748607">"ტელეფონ-ავტომატი"</string>
+ <string name="confCall" msgid="3181961445236675173">"საკონფერენციო ზარი"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ზარი შეწყდა"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"დინამიკი"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ყურსაცვამის საყურისი"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"სადენიანი ყურსაცვამი"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"გსურთ შემდეგი ტონების გაგზავნა?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ტონების გაგზავნა\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"გაგზავნა"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"დიახ"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"არა"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ჩანაცვლების სიმბოლო ჩანაცვლდეს შემდეგით:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"საკონფერენციო ზარი: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"ხმოვანი ფოსტის ნომერი"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"მიმდინარეობს აკრეფა"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"იკრიფება ხელახლა"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"საკონფერენციო ზარი"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"შემომავალი ზარი"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"შემომავალი ზარი (სამსახური)"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ზარი დასრულდა"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"მოცდის რეჟიმში"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"მიმდინარეობს გათიშვა"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"საუბრის რეჟიმში"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"ჩემი ნომერია <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"მიმდინარეობს ვიდეოს დაკავშირება"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ვიდეო ზარი"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"მიმდინარეობს ვიდეოს მოთხოვნა"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ვიდეო ზარის დაკავშირება ვერ მოხერხდა"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ვიდეოს მოთხოვნა უარყოფილია"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"თქვენი ნომერი გადმორეკვისთვის\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"თქვენი ნომერი გადაუდებელი გადმორეკვისთვის\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"მიმდინარეობს აკრეფა"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"გამოტოვებული ზარი"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"გამოტოვებული ზარები"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> გამოტოვებული ზარი"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"გამოტოვებული ზარი <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>-ისგან"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"მიმდინარე ზარი"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"მიმდინარე ზარი (სამსახური)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"მიმდინარე Wi-Fi ზარი"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"მიმდინარე Wi-Fi ზარი (სამსახური)"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"მოცდის რეჟიმში"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"შემომავალი ზარი"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"შემომავალი ზარი (სამსახური)"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"შემომავალი Wi-Fi ზარი"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"შემომავალი Wi-Fi ზარი (სამსახური)"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"შემომავალი ვიდეო ზარი"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"შემომავალი ვიდეოს მოთხოვნა"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"ახალი ხმოვანი შეტყობინება"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"ახალი ხმოვანი შეტყობინება (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>-ზე დარეკვა"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ხმოვანი ფოსტის ნომერი უცნობია"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"სერვისი არ არის"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"არჩეული ქსელი (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) მიუწვდომელია"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"პასუხი"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"გათიშვა"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ვიდეო"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ხმოვანი"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"მიღება"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"დახურვა"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"გადარეკვა"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"შეტყობინება"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ზარის განსახორციელებლად, ჯერ გამორთეთ თვითმფრინავის რეჟიმი."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"არ არის რეგისტრირებული ქსელში."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"ფიჭური ქსელი მიუწვდომელია."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ზარის განსახორციელებლად, შეიყვანეთ სწორი ნომერი."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"დარეკვა ვერ ხერხდება."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI თანმიმდევრობის დაწყება…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"სერვისი არ არის მხარდაჭერილი."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ზარების გადართვა ვერ ხერხდება."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ზარის განცალკევება ვერ ხერხდება."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"გადამისამართება ვერ ხერხდება."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"საკონფერენციო ზარის განხორციელება ვერ ხერხდება."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ზარის უარყოფა ვერ ხერხდება."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ზარ(ებ)ის გათიშვა ვერ ხერხდება."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP ზარი"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"გადაუდებელი ზარი"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"მიმდინარეობს რადიოს ჩართვა…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"სერვისი არ არის. მიმდინარეობს ხელახლა ცდა…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"დარეკვა ვერ ხერხდება. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> არ არის გადაუდებელი დახმარების ნომერი."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"დარეკვა ვერ ხერხდება. აკრიფეთ გადაუდებელი დახმარების ნომერი."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ნომრის ასაკრეფად გამოიყენეთ კლავიატურა"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"მოცდის რეჟიმზე გადაყვანა"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ზარის განახლება"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ზარის დასრულება"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ციფერბლატის ჩვენება"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ციფერბლატის დამალვა"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"დადუმება"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"დადუმების გაუქმება"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ზარის დამატება"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ზარების გაერთიანება"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"ჩანაცვლება"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ზარების მართვა"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"საკონფერენციო ზარის მართვა"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"საკონფერენციო ზარი"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"მართვა"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"აუდიო"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ვიდეო ზარი"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ხმოვან ზარზე გადართვა"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"კამერის გადართვა"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ვიდეოს დაპაუზება"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"სხვა ვარიანტები"</string>
+ <string name="player_started" msgid="3478865572468310331">"დამკვრელი ჩაირთო"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"დამკვრელი გამოირთო"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"კამერა არ არის მზად"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"კამერა მზადაა"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"ზარის სესიის უცნობი მოვლენა"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"სერვისი"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"დაყენება"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;არ არის დაყენებული&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"ზარის სხვა პარამეტრები"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"მიმდინარეობს დარეკვა <xliff:g id="PROVIDER_NAME">%s</xliff:g>-ის მეშვეობით"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"შემომავალი ზარი <xliff:g id="PROVIDER_NAME">%s</xliff:g>-დან"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"კონტაქტის ფოტო"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"პირადი რეჟიმი"</string>
+ <string name="selectContact" msgid="92191462970821951">"კონტაქტის არჩევა"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"საკუთარის შექმნა..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"გაუქმება"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"გაგზავნა"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"პასუხი"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS-ის გაგზავნა"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"უარყოფა"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"პასუხი ვიდეო ზარის სახით"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"პასუხი ხმოვანი ზარის სახით"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ვიდეოს მოთხოვნის მიღება"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ვიდეოს მოთხოვნის უარყოფა"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ვიდეოს გადაცემის მოთხოვნის მიღება"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ვიდეოს გადაცემის მოთხოვნის უარყოფა"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ვიდეოს მიღების მოთხოვნაზე დათანხმება"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ვიდეოს მიღების მოთხოვნის უარყოფა"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"გაასრიალეთ ზემოთ, რათა შესრულდეს <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"გაასრიალეთ მარცხნივ, რათა შესრულდეს <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"გაასრიალეთ მარჯვნივ, რათა შესრულდეს <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"გაასრიალეთ ქვემოთ, რათა შესრულდეს <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ვიბრაცია"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ვიბრაცია"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ხმა"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ნაგულისხმები ხმა (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ტელეფონის ზარი"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"ვიბრაცია დარეკვისას"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"ზარის მელოდია და ვიბრაცია"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"საკონფერენციო ზარის მართვა"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"გადაუდებელი დახმარების ნომერი"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> წამი</item>
+ <item quantity="one">1 წამი</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> წუთი</item>
+ <item quantity="one">1 წუთი</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> საათი</item>
+ <item quantity="one">1 საათი</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"პროფილის ფოტო"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"კამერა გამორთულია"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>-დან"</string>
+ <string name="note_sent" msgid="7623014827902758398">"შენიშვნა გაიგზავნა"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ბოლო შეტყობინებები"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ბიზნეს-ინფორმაცია"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> მილში"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> კმ-ში"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> — <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"იხსნება ხვალ <xliff:g id="OPEN_TIME">%s</xliff:g>-ზე"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"იხსნება დღეს <xliff:g id="OPEN_TIME">%s</xliff:g>-ზე"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"იკეტება <xliff:g id="CLOSE_TIME">%s</xliff:g>-ზე"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"დაიკეტა დღეს <xliff:g id="CLOSE_TIME">%s</xliff:g>-ზე"</string>
+ <string name="open_now" msgid="4615706338669555999">"ახლა ღიაა"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ახლა დაკეტილია"</string>
+</resources>
diff --git a/InCallUI/res/values-kk-rKZ/strings.xml b/InCallUI/res/values-kk-rKZ/strings.xml
new file mode 100644
index 000000000..c6f208927
--- /dev/null
+++ b/InCallUI/res/values-kk-rKZ/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Телефон"</string>
+ <string name="onHold" msgid="527593602772521700">"Күтуде"</string>
+ <string name="unknown" msgid="3646075119047488748">"Белгісіз"</string>
+ <string name="private_num" msgid="6081418498487514686">"Жеке нөмір"</string>
+ <string name="payphone" msgid="5743050584468748607">"Автомат-телефон"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конференциялық қоңырау"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Қоңырау үзілді"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Динамик"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Телефон құлаққабы"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Сымды құлақаспап жинағы"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Келесі әуендер жіберілсін бе?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Жіберу әуендері\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Жіберу"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Иә"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Жоқ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Қойылмалы таңбаны келесі таңбамен алмастыру"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"<xliff:g id="CONF_CALL_TIME">%s</xliff:g> конференциялық қоңырауы"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Дауыстық пошта нөмірі"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Терілуде"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Қайта терілуде"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конференциялық қоңырау"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Кіріс қоңырау"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Кіріс жұмыс қоңырауы"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Қоңырау аяқталды"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Күтуде"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Қоңырау аяқталуда"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Қоңырауда"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mенің нөмірім — <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Бейне қосылуда"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Бейне қоңырау"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Бейне сұралуда"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Бейне қоңырауға қосылу мүмкін емес"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Бейне сұрауы қабылданбады"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Кері қоңырау шалу нөміріңіз\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Төтенше кері қоңырау шалу нөміріңіз\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Терілуде"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Өткізіп алған қоңырау"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Өткізіп алған қоңыраулар"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> өткізіп алған қоңырау"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> қоңырауы өткізіп алынған"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Ағымдағы қоңырау"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Ағымдағы жұмыс қоңырауы"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Ағымдағы Wi-Fi қоңырауы"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Ағымдағы Wi-Fi жұмыс қоңырауы"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Күтуде"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Кіріс қоңырау"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Кіріс жұмыс қоңырауы"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Кіріс Wi-Fi қоңырауы"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Кіріс Wi-Fi жұмыс қоңырауы"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Кіріс бейне қоңырау"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Кіріс бейне сұрау"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Жаңа дауыстық хабар"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Жаңа дауыстық хабар (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> нөмірін теру"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Дауыстық пошта нөмірі белгісіз"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Қызмет жоқ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Таңдалған (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) желісі қол жетімді емес"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Жауап"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Қоңырауды аяқтау"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Бейне"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Дауыс"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Қабылдау"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Қабылдамау"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Кері қоңырау шалу"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Хабар"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Қоңырау шалу үшін алдымен ұшақ режимін өшіріңіз."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Желіде тіркелмеген."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Ұялы желі қол жетімді емес."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Қоңырау шалу үшін жарамды нөмірді енгізіңіз."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Қоңырау шалу мүмкін емес."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI қатарын бастау…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Қызметке қолдау көрсетілмейді."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Қоңырауларды ауыстыру мүмкін емес."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Қоңырауды бөлу мүмкін емес."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Тасымалдау мүмкін емес."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Конференция мүмкін емес."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Қоңырауды қабылдамау мүмкін емес."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Қоңырау(лар)ды босату мүмкін емес."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP қоңырауы"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Төтенше қоңырау"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Радио қосылуда…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Қызмет жоқ. Әрекет қайталануда…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Қоңырау шалу мүмкін емес. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> төтенше нөмір емес."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Қоңырау шалу мүмкін емес. Төтенше нөмірді теріңіз."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Теру үшін пернетақтаны пайдалану"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Қоңырауды ұстап тұру"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Қоңырауды жалғастыру"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Қоңырауды аяқтау"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Теру тақтасын көрсету"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Теру тақтасын жасыру"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Дыбысты өшіру"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Дыбысын қосу"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Қоңырау қосу"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Қоңырауларды біріктіру"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Алмастыру"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Қоңырауларды басқару"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Конференциялық қоңырауды басқару"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конференциялық қоңырау"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Басқару"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Aудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Бейне қоңырау"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Дауыстық қоңырауға өзгерту"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Камераны ауыстыру"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Бейнені кідірту"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Қосымша опциялар"</string>
+ <string name="player_started" msgid="3478865572468310331">"Ойнатқыш іске қосылды"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Ойнатқыш тоқтатылды"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камера дайын емес"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камера дайын"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Белгісіз қоңырау сеансы оқиғасы"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Қызмет"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Реттеу"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Орнатылмаған&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Басқа қоңырау параметрлері"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> арқылы қоңырау шалу"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> арқылы кіріс"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"контакт фотосуреті"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"жеке қоңырауға ауысу"</string>
+ <string name="selectContact" msgid="92191462970821951">"контакт таңдау"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Өзіңіздікін жазыңыз..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Бас тарту"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Жіберу"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Жауап"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS жіберу"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Қабылдамау"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Бейне қоңырауға жауап беру"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Аудио қоңырауға жауап беру"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Бейне сұрауды қабылдау"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Бейне сұрауды қабылдамау"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Бейне тасымалдау сұрауын қабылдау"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Бейне тасымалдау сұрауын қабылдамау"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Бейне алу сұрауын қабылдау"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Бейне алу сұрауын қабылдамау"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін жоғары сырғытыңыз."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін сол жаққа сырғытыңыз."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін оң жаққа сырғытыңыз."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін төмен сырғытыңыз."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Діріл"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Діріл"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Дыбыс"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Әдепкі дыбыс (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Телефонның қоңырау әуені"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Шылдырлағанда дірілдеу"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Қоңырау әуені және діріл"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Конференциялық қоңырауды басқару"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Төтенше нөмір"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="one">1 секунд</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="one">1 минут</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> сағат</item>
+ <item quantity="one">1 сағат</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Профиль фотосуреті"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камераны өшіру"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> арқылы"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Ескертпе жіберілді"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Жақындағы хабарлар"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Іскери ақпарат"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> миля қашықтықта"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> км қашықтықта"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Ертең <xliff:g id="OPEN_TIME">%s</xliff:g> уақытында ашылады"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Бүгін <xliff:g id="OPEN_TIME">%s</xliff:g> уақытында ашылады"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> уақытында жабылады"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Бүгін <xliff:g id="CLOSE_TIME">%s</xliff:g> уақытында жабық"</string>
+ <string name="open_now" msgid="4615706338669555999">"Қазір ашық"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Қазір жабық"</string>
+</resources>
diff --git a/InCallUI/res/values-km-rKH/strings.xml b/InCallUI/res/values-km-rKH/strings.xml
new file mode 100644
index 000000000..d0a0dfc93
--- /dev/null
+++ b/InCallUI/res/values-km-rKH/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ទូរស័ព្ទ"</string>
+ <string name="onHold" msgid="527593602772521700">"រង់ចាំ"</string>
+ <string name="unknown" msgid="3646075119047488748">"មិនស្គាល់"</string>
+ <string name="private_num" msgid="6081418498487514686">"លេខ​ឯកជន"</string>
+ <string name="payphone" msgid="5743050584468748607">"ទូរស័ព្ទសាធារណៈ"</string>
+ <string name="confCall" msgid="3181961445236675173">"ការហៅជាក្រុម"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ការហៅទូរស័ព្ទបានដាក់ចុះ"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ឧបករណ៍បំពងសម្លេង"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"អូប៉ាល័រសំឡេងទូរស័ព្ទ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"កាសមានខ្សែ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ប៊្លូធូស"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"ផ្ញើសំឡេងដូចខាងក្រោមឬ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ផ្ញើ​សំឡេង \n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ផ្ញើ"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"បាទ/ចាស"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"ទេ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ជំនួស​តួ​អក្សរ​ជំនួស​ដោយ"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"ការហៅជាក្រុម <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"លេខ​សារ​ជា​សំឡេង"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"កំពុងហៅ"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ការចុចហៅឡើងវិញ"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"ការហៅជាក្រុម"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ការហៅចូល"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"កំពុងហៅចូលពីកន្លែងការងារ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"បាន​បញ្ចប់​ការ​ហៅ"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"រង់ចាំ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"បញ្ចប់​ការ​សន្ទនា"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"កំពុង​ហៅ"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"លេខ​របស់​ខ្ញុំ​គឺ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ភ្ជាប់​វីដេអូ"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ហៅជាវីដេអូ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ស្នើ​វីដេអូ"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"មិនអាចភ្ជាប់ការហៅជាវីដេអូបានទេ"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"បានបដិសេធសំណើហៅជាវីដេអូ"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"លេខហៅទៅវិញរបស់អ្នក\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"លេខហៅទៅវិញពេលអាសន្នរបស់អ្នក\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"កំពុង​ហៅ"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"ខកខាន​ទទួល"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"ខកខាន​ទទួល"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"ខកខានទទួល <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ដង"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"ខកខាន​ទទួល​ពី <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"កំពុង​បន្ត​ការ​ហៅ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"ការហៅពីកន្លែងការងារកំពុងដំណើរការ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"ការហៅតាម Wi-Fi កំពុងបន្ត"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"ការហៅតាម Wi-Fi ពីកន្លែងការងារកំពុងដំណើរការ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"រង់ចាំ"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ការហៅចូល"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"កំពុងហៅចូលពីកន្លែងការងារ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"មានការហៅចូលតាម Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"កំពុងហៅចូលពីកន្លែងការងារតាម Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ការ​ហៅចូលជា​វីដេអូ​"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"សំណើ​ការ​ហៅ​ជា​វីដេអូ​ចូល"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"សារ​ជា​សំឡេង​ថ្មី"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"សារ​ជា​សំឡេង​ថ្មី (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"ហៅ <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"លេខសារជាសំឡេងមិនស្គាល់"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"គ្មានសេវាទេ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"បណ្ដាញ​ដែល​បាន​ជ្រើស ( <xliff:g id="OPERATOR_NAME">%s</xliff:g> ) មិន​អាច​ប្រើ​បាន​ទេ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"ឆ្លើយតប"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"បញ្ចប់​ការ​សន្ទនា"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"វីដេអូ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"សំឡេង"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ព្រម​ទទួល"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"បដិសេធ"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"ហៅ​ទៅ​វិញ"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"សារ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ដើម្បីកំណត់ការហៅ សូមបិទរបៀបពេលជិះយន្តហោះជាមុនសិន"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"មិនបានចុះឈ្មោះនៅលើបណ្ដាញទេ"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"បណ្ដាញចល័តមិនអាចប្រើបានទេ"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ដើម្បីធ្វើការហៅ សូមបញ្ចូលលេខដែលត្រឹមត្រូវ"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"មិនអាចហៅបានទេ"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"កំពុងចាប់ផ្តើមលំដាប់ MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"សេវាកម្មមិនត្រូវបានគាំទ្រទេ"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"មិនអាចប្តូរការហៅបានទេ"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"មិនអាចបំបែកការហៅបានទេ"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"មិនអាចផ្ទេរបានទេ"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"មិនអាចធ្វើការហៅជាក្រុមបានទេ"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"មិនអាចបដិសេធការហៅបានទេ"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"មិនអាចធ្វើការហៅបានទេ"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"ការ​ហៅ SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"ការ​ហៅ​ពេល​អាសន្ន"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"កំពុងបើកវិទ្យុ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"គ្មានសេវាទេ សូមព្យាយាមម្តង…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"មិនអាចហៅបានទេ។ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> មិនមែនជាលេខអាសន្នទេ"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"មិនអាចហៅបានទេ សូមចុចហៅលេខអាសន្ន"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ប្រើ​ក្ដារ​ចុច ​ដើម្បី​ចុច​លេខ"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"រង់ចាំការហៅ"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"បន្តការហៅ"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"បញ្ចប់ការហៅ"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"បង្ហាញ​បន្ទះ​លេខ"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"លាក់​បន្ទះ​លេខ"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"បិទ"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"បើក​សំឡេង"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"បន្ថែម​ការ​ហៅ"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"បញ្ចូល​ការ​ហៅ​ចូល​គ្នា"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"ប្ដូរ"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"គ្រប់គ្រង​ការ​ហៅ"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"គ្រប់គ្រងការហៅជាក្រុម"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"ការហៅជា​សន្និសិទ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"គ្រប់គ្រង"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"សំឡេង"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ហៅជាវីដេអូ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ប្ដូរ​ទៅ​ការ​ហៅ​ជា​សំឡេង"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ប្ដូរកាមេរ៉ា"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ផ្អាក​វីដេអូ"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"ជម្រើសច្រើនទៀត"</string>
+ <string name="player_started" msgid="3478865572468310331">"អ្នកលេងបានចាប់ផ្តើម"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"អ្នកលេងបានឈប់"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"កាមេរ៉ាមិនទាន់ត្រៀមរួចរាល់ទេ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"កាមេរ៉ាត្រៀមរួចរាល់ហើយ"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"ព្រឹត្តិការណ៍វេននៃការហៅមិនស្គាល់"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"សេវាកម្ម"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"ដំឡើង"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;មិន​បាន​កំណត់&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"​កំណត់​ការ​​ហៅ​ផ្សេងទៀត"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"ហៅតាមរយៈ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"ចូល​តាមរយៈ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"រូបថត​ទំនាក់ទំនង"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ចូលជាលក្ខណៈឯកជន"</string>
+ <string name="selectContact" msgid="92191462970821951">"ជ្រើសទំនាក់ទំនង"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"សរសេរដោយខ្លួនអ្នកផ្ទាល់..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"បោះបង់"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ផ្ញើ"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"ឆ្លើយតប"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"ផ្ញើសារ SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"បដិសេធ"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ឆ្លើយតប​ជា​ការ​ហៅ​ជា​​វីដេអូ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ឆ្លើយតប​ជា​ការ​ហៅ​ជា​សំឡេង"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ទទួលយក​សំណើ​វីដេអូ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ទទួលយក​សំណើ​វីដេអូ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ទទួលយកសំណើបញ្ជូនជាវីដេអូ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"បដិសេធសំណើបញ្ជូនជាវីដេអូ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ទទួលយកសំណើទទួលជាវីដេអូ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"បដិសេធសំណើទទួលជាវីដេអូ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"រុញឡើងលើដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"រុញទៅឆ្វេងដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"រុញទៅស្ដាំដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"រុញចុះក្រោមដើម្បី <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ញ័រ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ញ័រ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"សំឡេង"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"សំឡេង​លំនាំដើម (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"សំឡេងរោទ៍ទូរស័ព្ទ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"ញ័រពេលរោទ៍"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"សំឡេងរោទ៍ និងញ័រ"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"គ្រប់គ្រងការហៅជាក្រុម"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"លេខអាសន្ន"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> វិនាទី</item>
+ <item quantity="one">1 វិនាទី</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> នាទី</item>
+ <item quantity="one">1 នាទី</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ម៉ោង</item>
+ <item quantity="one">1 ម៉ោង</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"រូបថត​ប្រវត្តិរូប"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"បិទកាមេរ៉ា"</string>
+ <string name="child_number" msgid="4469090994612105532">"តាមរយៈ <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"បានផ្ញើចំណាំ"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"សារថ្មីៗ"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ព័ត៌មានធុរកិច្ច"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"ចម្ងាយ <xliff:g id="DISTANCE">%.1f</xliff:g> ម៉ាយល៍"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"ចម្ងាយ <xliff:g id="DISTANCE">%.1f</xliff:g> គម"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"បើកថ្ងៃស្អែកនៅម៉ោង <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"បើកថ្ងៃនេះនៅម៉ោង <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"បិទនៅម៉ោង <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"បានបិទថ្ងៃនេះនៅម៉ោង <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"បើកឥឡូវនេះ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"បិទឥឡូវនេះ"</string>
+</resources>
diff --git a/InCallUI/res/values-kn-rIN/strings.xml b/InCallUI/res/values-kn-rIN/strings.xml
new file mode 100644
index 000000000..a763d1d8d
--- /dev/null
+++ b/InCallUI/res/values-kn-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ಫೋನ್"</string>
+ <string name="onHold" msgid="527593602772521700">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+ <string name="unknown" msgid="3646075119047488748">"ಅಪರಿಚಿತ"</string>
+ <string name="private_num" msgid="6081418498487514686">"ಖಾಸಗಿ ಸಂಖ್ಯೆ"</string>
+ <string name="payphone" msgid="5743050584468748607">"ಪೇಫೋನ್"</string>
+ <string name="confCall" msgid="3181961445236675173">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ಕರೆಯನ್ನು ಬಿಡಲಾಗಿದೆ"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ಸ್ಪೀಕರ್‌"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ಹ್ಯಾಂಡ್‌ಸೆಟ್ ಇಯರ್‌ಪೀಸ್"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"ವೈರ್ಡ್ ಹೆಡ್‌ಸೆಟ್‌"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ಬ್ಲೂಟೂತ್"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"ಕೆಳಗಿನ ಟೋನ್‌ಗಳನ್ನು ಕಳುಹಿಸುವುದೇ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ಟೋನ್‌ಗಳನ್ನು ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ಕಳುಹಿಸು"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ಹೌದು"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"ಇಲ್ಲ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ಇದರೊಂದಿಗೆ ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಸ್ಥಳಾಂತರಿಸು"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"ಧ್ವನಿಮೇಲ್‌ ಸಂಖ್ಯೆ"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ಡಯಲ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ಮರು ಡಯಲ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ಒಳಬರುವ ಕರೆ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ಒಳಬರುವ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ಕರೆ ಅಂತ್ಯಗೊಂಡಿದೆ"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"ಹ್ಯಾಂಗ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"ಕರೆಯಲ್ಲಿ"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"ನನ್ನ ಸಂಖ್ಯೆ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ವೀಡಿಯೊ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ವೀಡಿಯೊ ಕರೆ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ವೀಡಿಯೊ ವಿನಂತಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ವೀಡಿಯೊ ಕರೆಯನ್ನು ಸಂಪರ್ಕಪಡಿಸಲಾಗುವುದಿಲ್ಲ"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ವೀಡಿಯೊ ವಿನಂತಿಯನ್ನು ತಿರಸ್ಕರಿಸಲಾಗಿದೆ"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"ನಿಮ್ಮ ಮರಳಿಕರೆ ಮಾಡುವ ಸಂಖ್ಯೆ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"ನಿಮ್ಮ ತುರ್ತು ಮರಳಿಕರೆ ಮಾಡುವ ಸಂಖ್ಯೆ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ಡಯಲ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"ಮಿಸ್ಡ್‌ ಕಾಲ್‌"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"ಮಿಸ್ಡ್ ಕಾಲ್‌ಗಳು"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ಮಿಸ್ಡ್ ಕಾಲ್‌ಗಳು"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> ಅವರಿಂದ ಮಿಸ್ಡ್ ಕಾಲ್"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ವೈ-ಫೈ ಕರೆ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"ಚಾಲ್ತಿಯಲ್ಲಿರುವ ವೈ-ಫೈ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ಒಳಬರುವ ಕರೆ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ಒಳಬರುವ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ಒಳಬರುವ ವೈ-ಫೈ ಕರೆ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ಒಳಬರುವ ವೈ-ಫೈ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ಒಳಬರುವ ವೀಡಿಯೊ ಕರೆ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ಒಳಬರುವ ವೀಡಿಯೊ ವಿನಂತಿ"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"ಹೊಸ ಧ್ವನಿಮೇಲ್‌"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"ಹೊಸ ಧ್ವನಿಮೇಲ್‌‌ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ಗೆ ಡಯಲ್‌‌ ಮಾಡು"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ಅಪರಿಚಿತ ಧ್ವನಿಮೇಲ್‌ ಸಂಖ್ಯೆ"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"ಸೇವೆ ಇಲ್ಲ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"ಆಯ್ಕೆಮಾಡಿದ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ನೆಟ್‌ವರ್ಕ್‌ ಲಭ್ಯವಿಲ್ಲ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"ಉತ್ತರ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"ಹ್ಯಾಂಗ್ ಅಪ್"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ವೀಡಿಯೊ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ಧ್ವನಿ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ಸಮ್ಮತಿಸು"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ವಜಾಗೊಳಿಸಿ"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"ಮರಳಿ ಕರೆ"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"ಸಂದೇಶ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ಕರೆ ಮಾಡಲು, ಮೊದಲು ಏರ್‌ಪ್ಲೇನ್‌‌ ಮೋಡ್‌‌ ಆಫ್‌ ಮಾಡಿ."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಇನ್ನೂ ನೋಂದಣಿಯಾಗಿಲ್ಲ."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"ಸೆಲ್ಯುಲಾರ್ ನೆಟ್‌ವರ್ಕ್‌ ಲಭ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ಕರೆಯನ್ನು ಮಾಡಲು, ಮಾನ್ಯವಾದ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI ಅನುಕ್ರಮ ಪ್ರಾರಂಭವಾಗುತ್ತಿದೆ…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"ಸೇವೆ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ಕರೆಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ಕರೆಯನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ವರ್ಗಾಯಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"ಕಾನ್ಫರೆನ್ಸ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ಕರೆ ತಿರಸ್ಕರಿಸಲಾಗುವುದಿಲ್ಲ."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ಕರೆ(ಗಳು) ಬಿಡುಗಡೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP ಕರೆ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"ತುರ್ತು ಕರೆ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ರೇಡಿಯೋ ಆನ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"ಯಾವುದೇ ಸೇವೆ ಇಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ತುರ್ತು ಸಂಖ್ಯೆಯಲ್ಲ."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ತುರ್ತು ಸಂಖ್ಯೆಯನ್ನು ಡಯಲ್ ಮಾಡಿ."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ಡಯಲ್‌ ಮಾಡಲು ಕೀಬೋರ್ಡ್‌ ಬಳಸಿ"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"ಕರೆಯನ್ನು ಹೋಲ್ಡ್‌‌ ಮಾಡು"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ಕರೆಯನ್ನು ಮುಂದುವರಿಸಿ"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ಕರೆ ಅಂತ್ಯಗೊಳಿಸಿ"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ಡಯಲ್‌ಪ್ಯಾಡ್ ತೋರಿಸು"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ಡಯಲ್‌ಪ್ಯಾಡ್ ಮರೆಮಾಡು"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ಮ್ಯೂಟ್"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ಅನ್‌ಮ್ಯೂಟ್"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ಕರೆಯನ್ನು ಸೇರಿಸು"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ಕರೆಗಳನ್ನು ವಿಲೀನಗೊಳಿಸು"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"ಸ್ವ್ಯಾಪ್‌ ಮಾಡು"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ಕರೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"ನಿರ್ವಹಿಸು"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ಆಡಿಯೊ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ವೀಡಿಯೊ ಕರೆ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ಧ್ವನಿ ಕರೆಗೆ ಬದಲಾಯಿಸಿ"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ಕ್ಯಾಮರಾ ಬದಲಿಸಿ"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ವೀಡಿಯೊ ವಿರಾಮಗೊಳಿಸು"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string>
+ <string name="player_started" msgid="3478865572468310331">"ಪ್ಲೇಯರ್‌ ಪ್ರಾರಂಭವಾಗಿದೆ"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"ಪ್ಲೇಯರ್‌ ನಿಲ್ಲಿಸಲಾಗಿದೆ"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ಕ್ಯಾಮರಾ ಸಿದ್ಧವಾಗಿಲ್ಲ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ಕ್ಯಾಮರಾ ಸಿದ್ಧವಾಗಿದೆ"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"ಅಜ್ಞಾತ ಕರೆಯ ಸೆಶನ್‌ ಈವೆಂಟ್‌"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"ಸೇವೆ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"ಸೆಟಪ್"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;ಹೊಂದಿಸಿಲ್ಲ&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"ಇತರ ಕರೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ಮೂಲಕ ಕರೆ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ಮೂಲಕ ಒಳಬರುತ್ತಿರುವ ಕರೆ"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"ಸಂಪರ್ಕ ಫೋಟೋ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ಖಾಸಗಿಯಾಗಿ ಹೋಗಿ"</string>
+ <string name="selectContact" msgid="92191462970821951">"ಸಂಪರ್ಕವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"ನಿಮ್ಮ ಸ್ವಂತದ್ದನ್ನು ಬರೆಯಿರಿ..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"ರದ್ದುಮಾಡು"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ಕಳುಹಿಸು"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"ಉತ್ತರ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS ಕಳುಹಿಸಿ"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ನಿರಾಕರಿಸು"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ವೀಡಿಯೊ ಕರೆ ರೂಪದಲ್ಲಿ ಉತ್ತರಿಸಿ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ಆಡಿಯೊ ಕರೆಯಂತೆ ಉತ್ತರಿಸಿ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ವೀಡಿಯೊ ವಿನಂತಿ ಒಪ್ಪಿಕೊಳ್ಳು"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ವೀಡಿಯೊ ವಿನಂತಿ ತಿರಸ್ಕರಿಸು"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ವೀಡಿಯೊ ಪ್ರಸಾರ ವಿನಂತಿ ಸಮ್ಮತಿಸಿ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ವೀಡಿಯೊ ಪ್ರಸಾರ ವಿನಂತಿ ತಿರಸ್ಕರಿಸಿ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ವೀಡಿಯೊ ಸ್ವೀಕರಿಸುವಿಕೆ ವಿನಂತಿ ಸಮ್ಮತಿಸಿ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ವೀಡಿಯೊ ಸ್ವೀಕರಿಸುವಿಕೆ ವಿನಂತಿ ತಿರಸ್ಕರಿಸಿ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗೆ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗೆ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗೆ ಬಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗೆ ಕೆಳಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ವೈಬ್ರೇಟ್‌"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ವೈಬ್ರೇಟ್‌"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ಶಬ್ದ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ಡಿಫಾಲ್ಟ್‌ ಧ್ವನಿ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ಫೋನ್ ರಿಂಗ್‌ಟೋನ್"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"ರಿಂಗ್ ಆಗುವಾಗ ವೈಬ್ರೇಟ್‌ ಆಗು"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"ರಿಂಗ್‌ಟೋನ್‌‌ ಮತ್ತು ವೈಬ್ರೇಟ್‌"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"ಕಾನ್ಫರೆನ್ಸ್ ಕರೆಯನ್ನು ನಿರ್ವಹಿಸಿ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"ತುರ್ತು ಸಂಖ್ಯೆ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ಸೆಕೆಂಡುಗಳು</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ನಿಮಿಷಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ನಿಮಿಷಗಳು</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ಗಂಟೆಗಳು</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ಗಂಟೆಗಳು</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"ಪ್ರೊಫೈಲ್ ಫೋಟೋ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ಕ್ಯಾಮರಾ ಆಫ್‌"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ಮೂಲಕ"</string>
+ <string name="note_sent" msgid="7623014827902758398">"ಟಿಪ್ಪಣಿ ಕಳುಹಿಸಲಾಗಿದೆ"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ವ್ಯಾಪಾರ ಮಾಹಿತಿ"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> ಮೈಲು ದೂರ"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> ಕಿಮೀ ದೂರ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"ನಾಳೆ <xliff:g id="OPEN_TIME">%s</xliff:g> ಗಂಟೆಗೆ ತೆರೆಯುತ್ತದೆ"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ಇಂದು <xliff:g id="OPEN_TIME">%s</xliff:g> ಗಂಟೆಗೆ ತೆರೆಯುತ್ತದೆ"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ಗಂಟೆಗೆ ಮುಚ್ಚಲಾಗಿದೆ"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ಇಂದು <xliff:g id="CLOSE_TIME">%s</xliff:g> ಗಂಟೆಗೆ ಮುಚ್ಚಲಾಗಿದೆ"</string>
+ <string name="open_now" msgid="4615706338669555999">"ಇದೀಗ ತೆರೆಯಲಾಗಿದೆ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ಇದೀಗ ಮುಚ್ಚಲಾಗಿದೆ"</string>
+</resources>
diff --git a/InCallUI/res/values-ko/strings.xml b/InCallUI/res/values-ko/strings.xml
new file mode 100644
index 000000000..0100643e5
--- /dev/null
+++ b/InCallUI/res/values-ko/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"전화"</string>
+ <string name="onHold" msgid="527593602772521700">"대기 중"</string>
+ <string name="unknown" msgid="3646075119047488748">"알 수 없음"</string>
+ <string name="private_num" msgid="6081418498487514686">"비공개 번호"</string>
+ <string name="payphone" msgid="5743050584468748607">"공중전화"</string>
+ <string name="confCall" msgid="3181961445236675173">"다자간 통화"</string>
+ <string name="call_lost" msgid="8208184291640961172">"연락되지 않음"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"스피커"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"핸드셋 수화부"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"유선 헤드셋"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"블루투스"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"다음 톤을 보내시겠습니까?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"신호음 보내기\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"전송"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"예"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"아니요"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"와일드 문자를 다음으로 바꿈:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"다자간 통화 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"음성사서함 번호"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"전화 거는 중"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"재다이얼 중"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"다자간 통화"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"수신 전화"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"수신 업무 전화"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"통화 종료됨"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"대기 중"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"전화 끊는 중"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"통화 중"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"내 전화번호는 <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>입니다."</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"화상 통화 연결 중"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"화상 통화"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"화상 통화 요청 중"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"화상 통화를 연결할 수 없습니다."</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"화상 통화 요청이 거부되었습니다."</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"콜백 번호\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"긴급 콜백 번호\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"전화 거는 중"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"부재중 전화"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"부재중 전화"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"부재중 전화 <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>통"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>의 부재중 전화"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"발신 전화"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"발신 업무 전화"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"발신 Wi-Fi 전화"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"발신 Wi-Fi 업무 전화"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"대기 중"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"수신 전화"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"수신 업무 전화"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Wi-Fi 수신 전화"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"수신 Wi-Fi 업무 전화"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"수신 화상 통화"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"수신 화상 통화 요청"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"새로운 음성사서함"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"새 음성사서함(<xliff:g id="COUNT">%d</xliff:g>개)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>(으)로 전화 걸기"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"알 수 없는 음성사서함 번호"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"서비스 불가"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"선택한 네트워크(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)를 사용할 수 없음"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"전화 받기"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"전화 끊기"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"화상"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"음성"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"수락"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"해제"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"전화 걸기"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"메시지"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"전화를 걸려면 먼저 비행기 모드를 해제하세요."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"네트워크에서 등록되지 않았습니다."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"사용 가능한 이동통신망이 없습니다."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"전화를 걸려면 올바른 번호를 입력하세요."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"전화를 걸 수 없습니다."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI 시퀀스 시작 중..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"서비스가 지원되지 않습니다."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"통화를 전환할 수 없습니다."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"통화를 분리할 수 없습니다."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"통화를 전환할 수 없습니다."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"다자간 통화를 이용할 수 없습니다."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"통화를 거부할 수 없습니다."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"통화를 끊을 수 없습니다."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP 통화"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"긴급 전화"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"무선을 켜는 중..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"서비스를 사용할 수 없습니다. 다시 시도 중..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"전화를 걸 수 없습니다. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g>은(는) 긴급 번호가 아닙니다."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"전화를 걸 수 없습니다. 긴급 번호를 사용하세요."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"키보드를 사용하여 전화 걸기"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"통화 대기"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"통화 재개"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"통화 종료"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"다이얼패드 표시"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"다이얼패드 숨기기"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"음소거"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"음소거 해제"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"통화 추가"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"통화 병합"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"전환"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"통화 관리"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"다자간 통화 관리"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"다자간 통화"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"관리"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"오디오"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"화상 통화"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"음성 통화로 변경"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"카메라 전환"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"동영상 일지중지"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"옵션 더보기"</string>
+ <string name="player_started" msgid="3478865572468310331">"플레이어가 시작되었습니다."</string>
+ <string name="player_stopped" msgid="1278611664986561535">"플레이어가 중지되었습니다."</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"카메라가 준비되지 않았습니다."</string>
+ <string name="camera_ready" msgid="2614541247814590887">"카메라가 준비되었습니다."</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"알 수 없는 통화 세션 이벤트"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"서비스"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"설정"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;설정 안됨&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"기타 통화 설정"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>을(를) 통해 걸려온 전화"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>을(를) 통해 걸려온 전화"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"연락처 사진"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"비공개로 실행"</string>
+ <string name="selectContact" msgid="92191462970821951">"연락처 선택"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"나만의 응답 작성…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"취소"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"전송"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"전화 받기"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS 보내기"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"거부"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"화상 통화로 받기"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"음성 통화로 받기"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"화상 통화 요청 수락"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"화상 통화 요청 거부"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"화상 통화 전송 요청 허용"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"화상 통화 전송 요청 거부"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"화상 통화 수신 요청 허용"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"화상 통화 수신 요청 거부"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 위로 슬라이드합니다."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 왼쪽으로 슬라이드합니다."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 오른쪽으로 슬라이드합니다."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>하려면 아래로 슬라이드합니다."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"진동"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"진동"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"소리"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"기본 알림음(<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"전화 벨소리"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"전화 수신 시 진동"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"벨소리 및 진동"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"다자간 통화 관리"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"비상 전화번호"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>초</item>
+ <item quantity="one">1초</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>분</item>
+ <item quantity="one">1분</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g>시간</item>
+ <item quantity="one">1시간</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"프로필 사진"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"카메라 꺼짐"</string>
+ <string name="child_number" msgid="4469090994612105532">"수신 번호: <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"메모가 전송되었습니다."</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"최근 메시지"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"비즈니스 정보"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g>mi 거리"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g>km 거리"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>~<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"내일 <xliff:g id="OPEN_TIME">%s</xliff:g>에 영업 시작"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"오늘 <xliff:g id="OPEN_TIME">%s</xliff:g>에 영업 시작"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>에 영업 종료"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"오늘 <xliff:g id="CLOSE_TIME">%s</xliff:g>에 영업 종료됨"</string>
+ <string name="open_now" msgid="4615706338669555999">"영업 중"</string>
+ <string name="closed_now" msgid="2635314668145282080">"영업 종료"</string>
+</resources>
diff --git a/InCallUI/res/values-ky-rKG/strings.xml b/InCallUI/res/values-ky-rKG/strings.xml
new file mode 100644
index 000000000..250fdca6c
--- /dev/null
+++ b/InCallUI/res/values-ky-rKG/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Телефон"</string>
+ <string name="onHold" msgid="527593602772521700">"Күтүлүүдө"</string>
+ <string name="unknown" msgid="3646075119047488748">"Белгисиз"</string>
+ <string name="private_num" msgid="6081418498487514686">"Купуя номер"</string>
+ <string name="payphone" msgid="5743050584468748607">"Таксофон"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конференц-чалуу"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Чалуу үзүлдү"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Катуу сүйлөткүч"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Гарнитура"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Зымдуу гарнитура"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Төмөнкү номер жөнөтүлсүнбү?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Обондор жөнөтүлүүдө\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Жөнөтүү"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ооба"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Жок"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Атайын белгини төмөнкүгө алмаштыруу"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Конференц-чалуу <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Үн почтасынын номери"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Терилүүдө"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Кайра терилүүдө"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конференц-чалуу"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Кирүүчү чалуу"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Жумуш боюнча чалуу"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Чалуу аяктады"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Күтүлүүдө"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Чалуу аяктоодо"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Чалууда"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Менин номерим <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Видео туташтырылууда"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Видео чалуу"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Видео суралууда"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Видео чалууга туташуу мүмкүн болбой жатат"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Видео сурам четке кагылды"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Кайра чалына турган номер\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Өзгөчө кырдаалда кайра чалына турган номер\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Терилүүдө"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Кабыл алынбаган чалуу"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Кабыл алынбаган чалуулар"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> кабыл алынбаган чалуу"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> дегенден кабыл алынбаган чалуу"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Учурдагы чалуу"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Учурдагы чалуу (жумуш боюнча)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Учурдагы Wi-Fi чалуу"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Учурдагы Wi-Fi чалуу (жумуш боюнча)"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Күтүлүүдө"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Кирүүчү чалуу"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Жумуш боюнча чалуу"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Кирүүчү Wi-Fi чалуу"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Жумуш боюнча келип жаткан Wi-Fi чалуу"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Кирүүчү видео чалуу"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Кирүүчү видео сурамы"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Жаңы үн почтасы"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Жаңы үн почтасы (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> номерин терүү"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Үн почтасынын номери белгисиз"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Байланыш жок"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Тандалган тармак (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) жеткиликсиз"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Жооп берүү"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Чалууну бүтүрүү"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Үн"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Кабыл алуу"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Этибарга албоо"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Кайра чалуу"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Билдирүү"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Учак режимин өчүрүп туруп чалыңыз."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Тармакта катталган эмес."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Мобилдик тармак жеткиликтүү эмес."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Чалуу үчүн, жарактуу номер киргизиңиз."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Чалынбай жатат."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI кезеги башталууда…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Кызмат колдоого алынбайт."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Чалуулар которуштурулбай жатат."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Чалуу бөлүнбөй жатат."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Өткөрүлбөй жатат."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Конференц-чалуу түзүлбөй жатат."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Чалуу четке кагылбай жатат."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Чалуу (-лар) ажыратылбай жатат."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP чалуу"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Өзгөчө кырдаалда чалуу"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Радио күйгүзүлүүдө…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Кызмат жок. Кайра аракет кылууда…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Чалынбай жатат. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> өзгөчө кырдаал номери эмес."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Чалынбай жатат. Өзгөчө кырдаал номерин териңиз."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Баскычтоп менен териңиз"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Чалууну кармап туруу"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Чалууну улантуу"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Чалууну бүтүрүү"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Номер тергичти көрсөтүү"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Номер тергичти жашыруу"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Үнсүз"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Үндү чыгаруу"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Чалуу кошуу"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Чалууларды бириктирүү"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Алмаштыруу"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Чалууларды башкаруу"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Конференц-чалууну башкаруу"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конференц чалуу"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Башкаруу"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Видео чалуу"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Үн чалууга өзгөртүү"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Камераны которуштуруу"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Видеону тындыруу"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Дагы параметрлер"</string>
+ <string name="player_started" msgid="3478865572468310331">"Ойноткуч башталды"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Ойноткуч токтотулду"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камера даяр эмес"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камера даяр"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Чалуу сеансынын окуясы белгисиз"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Кызмат"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Орнотуу"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Коюлган эмес&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Башка чалуу жөндөөлөрү"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> аркылуу чалуу"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> аркылуу келүүдө"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"байланыштын сүрөтү"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"купуя режимине өтүү"</string>
+ <string name="selectContact" msgid="92191462970821951">"байланыш тандоо"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Сиздин жообуңуз…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Жокко чыгаруу"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Жөнөтүү"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Жооп берүү"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS жөнөтүү"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Четке кагуу"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Видео чалуу түрүндө жооп берүү"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Аудио чалуу түрүндө жооп берүү"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Видео сурамын кабыл алуу"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Видео сурамын четке кагуу"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Видео өткөрүү сурамын кабыл алуу"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Видео өткөрүү сурамын четке кагуу"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Видео алуу сурамын кабыл алуу"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Видео алуу сурамын четке кагуу"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн жогору жылмыштырыңыз."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн солго жылмыштырыңыз."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн оңго жылмыштырыңыз."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үчүн төмөн жылмыштырыңыз."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Дирилдөө"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Дирилдөө"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Үн"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Демейки үнү (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Телефондун рингтону"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Дирилдеп шыңгырасын"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Рингтон жана дирилдөө"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Конференц-чалууну башкаруу"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Өзгөчө кырдаал номери"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="one">1 секунд</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> мүнөт</item>
+ <item quantity="one">1 мүнөт</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> саат</item>
+ <item quantity="one">1 саат</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Профилдин сүрөтү"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камера өчүк"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> аркылуу"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Билдирүү жөнөтүлдү"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Акыркы билдирүүлөр"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Компания тууралуу маалымат"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> миля алыста"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> км алыста"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Эртең саат <xliff:g id="OPEN_TIME">%s</xliff:g> ачылат"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Бүгүн саат <xliff:g id="OPEN_TIME">%s</xliff:g> ачылат"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Саат <xliff:g id="CLOSE_TIME">%s</xliff:g> жабылат"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Бүгүн саат <xliff:g id="CLOSE_TIME">%s</xliff:g> жабылды"</string>
+ <string name="open_now" msgid="4615706338669555999">"Азыр ачык"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Эми жабылды"</string>
+</resources>
diff --git a/InCallUI/res/values-lo-rLA/strings.xml b/InCallUI/res/values-lo-rLA/strings.xml
new file mode 100644
index 000000000..afdd104a2
--- /dev/null
+++ b/InCallUI/res/values-lo-rLA/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ໂທລະສັບ"</string>
+ <string name="onHold" msgid="527593602772521700">"ຖືສາຍລໍຖ້າ"</string>
+ <string name="unknown" msgid="3646075119047488748">"ບໍ່ຮູ້ຈັກ"</string>
+ <string name="private_num" msgid="6081418498487514686">"ເບີສ່ວນຕົວ"</string>
+ <string name="payphone" msgid="5743050584468748607">"ຕູ້​ໂທ​ລະ​ສັບ​ສາ​ທາ​ລະ​ນະ"</string>
+ <string name="confCall" msgid="3181961445236675173">"ການປະຊຸມທາງໂທລະສັບ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ສາຍ​ຫຼຸດ​ແລ້ວ"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ລຳໂພງ"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ຊຸດຫູຟັງ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"ຊຸດຫູຟັງແບບມີສາຍ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"ສົ່ງໂທນສຽງຕໍ່ໄປນີ້ບໍ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ກຳລັງສົ່ງໂທນສຽງ\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ສົ່ງ"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ແມ່ນ"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"ບໍ່"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ປ່ຽນແທນ \"ອັກຂະລະຕົວແທນ\" ດ້ວຍ"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"ການປະຊຸມທາງໂທລະສັບ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"ເບີຂໍ້ຄວາມສຽງ"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ກຳລັງໂທ"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ກຳ​ລັງ​ໂທ​ຄືນ"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"ການປະຊຸມທາງໂທລະສັບ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"​ສາຍ​ໂທ​ເຂົ້າ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ສາຍໂທເຂົ້າຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ວາງສາຍແລ້ວ"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ຖືສາຍລໍຖ້າ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"ກຳລັງວາງສາຍ"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"ຢູ່ໃນສາຍ"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"ເບີໂທຂອງຂ້ອຍແມ່ນ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"​ກຳ​ລັງ​ເຊື່ອມ​ຕໍ່​ວິ​ດີ​ໂອ"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"​ການໂທ​​ວິ​ດີ​ໂອ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"​ກຳ​ລັງ​ຮ້ອງ​ຂໍການໂທ​ວິ​ດີ​ໂອ"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ບໍ່​ສາ​ມາດ​ເຊື່ອມ​ຕໍ່​ການ​ໂທວິດີໂອ​ໄດ້"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ປະ​ຕິ​ເສດ​ການຮ້ອງ​ຂໍການ​ໂທວິ​ດີ​ໂອ​ແລ້ວ"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"ເບີໂທກັບຂອງທ່ານ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"ເບີ​ໂທ​ກັບ​ສຸກ​ເສີນ​ຂອງ​ທ່ານ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ກຳລັງໂທ"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"ສາຍບໍ່ໄດ້ຮັບ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"ສາຍບໍ່ໄດ້ຮັບ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ສາຍບໍ່ໄດ້ຮັບ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"ສາຍບໍ່ໄດ້ຮັບຈາກ <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"ສາຍກຳລັງໂທ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"ສາຍກຳລັງໂທຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"ສາຍກຳລັງໂທຜ່ານ Wi​-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"ສາຍກຳລັງໂທຜ່ານ Wi-Fi ຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ຖືສາຍລໍຖ້າ"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"​ສາຍ​ໂທ​ເຂົ້າ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ສາຍໂທເຂົ້າຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ສາຍໂທເຂົ້າຜ່ານ Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ສາຍໂທເຂົ້າຜ່ານ Wi-Fi ຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ສາຍໂທ​ວິດີໂອ​ເຂົ້າ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"​ຄຳ​ຮ້ອງ​ຂໍ​ວິ​ດີ​ໂອທີ່​ເຂົ້າ​ມາ"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"ຂໍ້ຄວາມສຽງໃໝ່"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"ຂໍ້ຄວາມສຽງໃໝ່ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"ໂທຫາ <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ເບີຂໍ້ຄວາມສຽງບໍ່ຮູ້ຈັກ"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"ບໍ່ມີການບໍລິການ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"ເຄືອຂ່າຍທີ່ເລືອກ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ບໍ່ສາມາດໃຊ້ໄດ້"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"ຮັບສາຍ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"ວາງສາຍ"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ວິດີໂອ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ສຽງ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ຍອມຮັບ"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ປິດໄວ້"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"ໂທກັບ"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"ຂໍ້ຄວາມ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ເພື່ອເຮັດການໂທ, ໃຫ້ປິດໂໝດເຮືອບິນກ່ອນ"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ບໍ່ໄດ້ລົງທະບຽນໃນເຄືອຂ່າຍ."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"ບໍ່​ມີ​ເຄືອ​ຂ່າຍ​ມື​ຖື​ທີ່​​ໃຊ້​ໄດ້."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ເພື່ອເຮັດການ​ໂທ, ປ້ອນ​ເບີ​ໂທ​ທີ່​ໃຊ້​ໄດ້​."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"ບໍ່​ສາ​ມາດ​ໂທ​ໄດ້."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"ກຳລັງເລີ່ມຕົ້ນລຳດັບ MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"ບໍ່ຮອງຮັບການ​ບໍ​ລິ​ການ."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ບໍ່​ສາ​ມາດ​ສະ​ຫຼັບ​ສາ​ຍ​ໂທ​ໄດ້."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ບໍ່​ສາ​ມາດ​ແຍກ​ສາຍ​ໂທ​ໄດ້."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ບໍ່​ສາ​ມາດ​ໂອນສາຍ​ໄດ້."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"ບໍ່​ສາ​ມາດ​ປະ​ຊຸມ​ໄດ້."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ບໍ່​ສາ​ມາດ​ປະ​ຕິ​ເສດ​ສາຍ​ໂທ​ໄດ້."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ບໍ່​ສາ​ມາດ​ປ່ອຍ​ສາຍ​ໂທ​ໄດ້."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"ການໂທ SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"ການໂທສຸກເສີນ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ກຳລັງເປີດວິທະຍຸ"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"ບໍ່​ມີ​ການ​ບໍ​ລິ​ການ. ກຳ​ລັງ​ລອງ​ໃໝ່​ອີກ…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"ບໍ່ສາມາດໂທໄດ້. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ບໍ່ແມ່ນເບີໂທສຸກເສີນ."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"ບໍ່​ສາ​ມາດ​ໂທ​ໄດ້. ກົດ​ເບີ​ໂທ​ສຸກ​ເສີນ."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ໃຊ້ແປ້ນພິມເພື່ອກົດໂທ"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"ຖືສາຍ"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"​ສືບ​ຕໍ່​ສາຍ"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ວາງສາຍ"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ສະແດງປຸ່ມກົດ"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ເຊື່ອງປຸ່ມກົດ"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ປິດສຽງ"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ເຊົາປິດສຽງ"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ເພີ່ມການໂທ"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ລວມສາຍ"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"ສະຫຼັບ"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ຈັດການການໂທ"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"ຈັດ​ການ​ການ​ປະ​ຊຸມ​ທາງໂທລະສັບ"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"ການປະຊຸມທາງໂທລະສັບ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"ຈັດການ"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ສຽງ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"​ການໂທ​​ວິ​ດີ​ໂອ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ປ່ຽນ​ເປັນ​ການ​ໂທ​ດ້ວຍ​ສຽງ"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ສັບປ່ຽນກ້ອງ"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ຢຸດວິດີໂອຊົ່ວຄາວ"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"ຕົວເລືອກ​ເພີ່ມ​ເຕີມ"</string>
+ <string name="player_started" msgid="3478865572468310331">"ເຄື່ອງ​ຫຼິ້ນ​ເລີ່ມ​ຕົ້ນ​ແລ້ວ"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"ເຄື່ອງ​ຫຼິ້ນ​ຢຸດ​ແລ້ວ"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ກ້ອງ​ຖ່າຍ​ຮູບ​ບໍ່​ພ້ອມ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ກ້ອງ​ຖ່າຍ​ຮູບ​ພ້ອມ​ແລ້ວ"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"ເຫດ​ການ​ເຊ​ສ​ຊັນ​ການ​ໂທ​ບໍ່​ຮູ້​ຈັກ"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"ການບໍລິການ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"ຕັ້ງຄ່າ"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;ບໍ່ໄດ້ຕັ້ງ&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"ການຕັ້ງຄ່າການໂທອື່ນ"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"ກຳລັງໂທຜ່ານ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"ສາຍໂທເຂົ້າ​ຈາກ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"ຮູບລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ໃຊ້ແບບສ່ວນຕົວ"</string>
+ <string name="selectContact" msgid="92191462970821951">"ເລືອກລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"ຂຽນ...ຂອງທ່ານເອງ"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"ຍົກເລີກ"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ສົ່ງ"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"ຮັບສາຍ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"ສົ່ງ SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ປະຕິເສດ"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ຮັບສາຍໂທວິດີໂອ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ຮັບສາຍໂທແບບສຽງ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ຍອມຮັບການຂໍວິດີໂອ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ປະຕິເສດການຂໍວິດີໂອ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ຍອມ​ຮັບ​ການ​ຂໍ​ສົ່ງ​ວິ​ດີ​ໂອ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ປະ​ຕິ​ເສດ​ການ​ຂໍ​ສົ່ງ​ວິ​ດີ​ໂອ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ຍອມ​ຮັບ​ການ​ຂໍ​ຮັບ​ວິ​ດີ​ໂອ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ປະ​ຕິ​ເສດ​ການ​ຂໍ​ຮັບ​ວິ​ດີ​ໂອ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"ເລື່ອນຂຶ້ນເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"ເລື່ອນໄປຊ້າຍເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"ເລື່ອນໄປຂວາເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"ເລື່ອນລົງເພື່ອ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ສັ່ນເຕືອນ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ສັ່ນເຕືອນ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ສຽງ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ສຽງເລີ່ມຕົ້ນ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ຣິງໂທນໂທລະສັບ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"ສັ່ນເຕືອນເມື່ອດັງ"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"ຣິງໂທນ ແລະ ການສັ່ນເຕືອນ"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"ຈັດ​ການ​ການ​ປະ​ຊຸມ​ທາງໂທລະສັບ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"ເບີໂທສຸກເສີນ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ວິນາທີ</item>
+ <item quantity="one">1 ວິນາທີ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ນາທີ</item>
+ <item quantity="one">1 ນາທີ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ຊົ່ວໂມງ</item>
+ <item quantity="one">1 ຊົ່ວໂມງ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"ຮູບໂປຣໄຟລ໌"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ກ້ອງ​ຖ່າຍ​ຮູບ​ປິດຢູ່"</string>
+ <string name="child_number" msgid="4469090994612105532">"ຜ່ານ <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"ສົ່ງ​ບັນ​ທຶກ​ແລ້ວ"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ຂໍ້​ຄວາມ​ບໍ່​ດົນ​ມາ​ນີ້"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ຂໍ້​ມູນ​ທຸ​ລະ​ກິດ"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"ຫ່າງອອກໄປ <xliff:g id="DISTANCE">%.1f</xliff:g> ໄມ​ລ໌​"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"ຫ່າງອອກໄປ <xliff:g id="DISTANCE">%.1f</xliff:g> ກມ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"ເປີດມື້ອື່ນເວລາ <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ເປີດມື້ນີ້ເວລາ <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"ປິດເວລາ <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ປິດແລ້ວມື້ນີ້ເວລາ <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"ດຽວ​ນີ້​ເປີດ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"​ປິດ​ແລ້ວດຽວນີ້"</string>
+</resources>
diff --git a/InCallUI/res/values-lt/strings.xml b/InCallUI/res/values-lt/strings.xml
new file mode 100644
index 000000000..9b888c1bf
--- /dev/null
+++ b/InCallUI/res/values-lt/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefonas"</string>
+ <string name="onHold" msgid="527593602772521700">"Sulaikyta"</string>
+ <string name="unknown" msgid="3646075119047488748">"Nežinoma"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privatus numeris"</string>
+ <string name="payphone" msgid="5743050584468748607">"Taksofonas"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferencinis skambutis"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Skambutis atmestas"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Garsiakalbis"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Tel. su gars. prie ausies"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Laidinės ausinės"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Siųsti šiuo tonus?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Siunčiami tonai\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Siųsti"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Taip"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ne"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Pakaitos simbolį pakeisti"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferencinis skambutis <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Balso pašto numeris"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Renkamas numeris"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Numeris renkamas pakartotinai"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferencinis skambutis"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Gaunamasis skambutis"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Gaunamasis darbo skambutis"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Skambutis baigtas"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Sulaikyta"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Baigiamas pokalbis"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Dalyvauju skambutyje"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mano numeris: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Prisijungiama prie vaizdo skambučio"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Vaizdo skambutis"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Pateikiama vaizdo skambučio užklausa"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Nepavyko prijungti vaizdo įrašo skambučio"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Vaizdo įrašo užklausa atmesta"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Atskambinimo numeris\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Atskambinimo numeris, kuriuos skambina pagalbos tarnyba\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Renkamas numeris"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Praleistas skambutis"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Praleisti skambučiai"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Praleistų skambučių: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Praleistas skambutis nuo <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Vykstantis pokalbis"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Vykstantis darbo skambutis"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Vykstantis „Wi-Fi“ skambutis"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Vykstantis „Wi-Fi“ darbo skambutis"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Sulaikyta"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Gaunamasis skambutis"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Gaunamasis darbo skambutis"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Gaunamasis „Wi-Fi“ skambutis"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Gaunamasis „Wi-Fi“ darbo skambutis"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Gaunamas vaizdo skambutis"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Gaunama vaizdo skambučio užklausa"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Naujas balso pašto pranešimas"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Naujas balso pašto pranešimas (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Rinkti <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nežinomas balso pašto numeris"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nėra paslaugos"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Pasirinktas tinklas (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) negalimas"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Atsiliepti"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Padėti ragelį"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vaizdo įrašas"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Balsas"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Priimti"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Atsisakyti"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Perskambinti"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Siųsti pranešimą"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Jei norite skambinti, išjunkite lėktuvo režimą."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Neregistruota tinkle."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Korinis tinklas nepasiekiamas"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Kad galėtumėte paskambinti, įveskite tinkamą numerį."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Nepavyko paskambinti."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Paleidžiama MMI seka..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Paslauga nepalaikoma."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Nepavyko perjungti skambučių."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Nepavyko atskirti skambučio."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Nepavyko peradresuoti."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Nepavyko sukurti konferencijos."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Nepavyko atmesti skambučio."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Nepavyko atjungti skamb."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP skambutis"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Skambutis pagalbos numeriu"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Įjungiamas radijas…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nėra ryšio. Bandoma dar kartą…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Nepavyko paskambinti. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nėra pagalbos numeris."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Nepavyko paskambinti. Surinkite pagalbos tarnybos numerį."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Naudokite klaviatūrą ir rinkite numerius"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Sulaikyti skambutį"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Tęsti skambutį"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Baigti skambutį"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Rodyti skambinimo skydelį"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Slėpti skambinimo skydelį"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Nutildyti"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Įjungti garsą"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Pridėti skambutį"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Sujungti skambučius"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Apkeisti"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Valdyti skambučius"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Tvarkyti konferencinį skambutį"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferencinis skambutis"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Tvarkyti"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Garsas"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Vaizdo skambutis"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Pakeisti į balso skambutį"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Perjungti fotoaparatą"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pristabdyti vaizdo įrašą"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Daugiau parinkčių"</string>
+ <string name="player_started" msgid="3478865572468310331">"Leistuvė paleista"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Leistuvė sustabdyta"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Fotoaparatas neparuoštas"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Fotoaparatas paruoštas"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Nežinomas skambučio sesijos įvykis"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Paslaugos teikėjas"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Sąranka"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nenustatyta&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Kiti skambučio nustatymai"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Skambinama naudojantis „<xliff:g id="PROVIDER_NAME">%s</xliff:g>“ paslaugomis"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Gaunama per „<xliff:g id="PROVIDER_NAME">%s</xliff:g>“"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontakto nuotrauka"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"naudoti privatų režimą"</string>
+ <string name="selectContact" msgid="92191462970821951">"pasirinkti kontaktą"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Sukurkite patys..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Atšaukti"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Siųsti"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Atsiliepti"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Siųsti SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Atmesti"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Atsiliepti kaip į vaizdo skambutį"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Atsiliepti kaip į garso skambutį"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Priimti vaizdo įrašo užkl"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Atmesti vaizdo įrašo užklausą"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Priimti vaizdo įrašo perdavimo užklausą"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Atmesti vaizdo įrašo perdavimo užklausą"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Priimti vaizdo įrašo gavimo užklausą"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Atmesti vaizdo įrašo gavimo užklausą"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Slyskite aukštyn link parinkties „<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>“."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Slyskite į kairę link parinkties „<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>“."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Slyskite į dešinę link parinkties „<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>“."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Slyskite žemyn link <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibruoti"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibruoti"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Garsas"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Numatytasis garsas (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefono skambėjimo tonas"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibruoti, kai skambina"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Skambėjimo tonas ir vibracija"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Tvarkyti konferencinį skambutį"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Pagalbos numeris"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekundė</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundės</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekundės</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundžių</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minutė</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minutės</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minutės</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minučių</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> valanda</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> valandos</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> valandos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> valandų</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilio nuotrauka"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Fotoaparatas išjungtas"</string>
+ <string name="child_number" msgid="4469090994612105532">"naudojant <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Užrašas išsiųstas"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Naujausi pranešimai"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Įmonės informacija"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Už <xliff:g id="DISTANCE">%.1f</xliff:g> myl."</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Už <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Rytoj atidaroma <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Šiandien atidaroma <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Uždaroma <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Šiandien uždaryta <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Dabar atidaryta"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Dabar uždaryta"</string>
+</resources>
diff --git a/InCallUI/res/values-lv/strings.xml b/InCallUI/res/values-lv/strings.xml
new file mode 100644
index 000000000..07fb1ba41
--- /dev/null
+++ b/InCallUI/res/values-lv/strings.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Tālrunis"</string>
+ <string name="onHold" msgid="527593602772521700">"Aizturēts"</string>
+ <string name="unknown" msgid="3646075119047488748">"Nezināms"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privāts numurs"</string>
+ <string name="payphone" msgid="5743050584468748607">"Maksas tālrunis"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferences zvans"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Zvans tika pārtraukts."</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Skaļrunis"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auss skaļrunis"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Austiņas ar vadu"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Vai sūtīt tālāk norādītos signālus?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sūtīšanas signāli\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Sūtīt"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Jā"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nē"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Aizstāt aizstājējzīmi ar:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferences zvans: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Balss pasta numurs"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Notiek numura sastādīšana"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Notiek atkārtota zvanīšana"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferences zvans"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Ienākošs zvans"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Ienākošs darba zvans"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Zvans ir pabeigts"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Aizturēts"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Notiek klausules nolikšana"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Notiek zvans"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mans tālruņa numurs: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Notiek video savienojuma izveide"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videozvans"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Notiek video pieprasīšana"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Nevar veikt videozvanu"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video pieprasījums noraidīts"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Jūsu atzvana numurs\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Jūsu ārkārtas atzvana numurs\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Notiek numura sastādīšana"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Neatbildēts zvans"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Neatbildēti zvani"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> neatbildēti zvani"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Neatbildēts zvans no: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Notiekošs zvans"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Notiekošs darba zvans"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Notiekošs Wi-Fi zvans"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Notiekošs darba Wi-Fi zvans"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Aizturēts"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Ienākošs zvans"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Ienākošs darba zvans"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Ienākošs Wi-Fi zvans"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Ienākošs darba Wi-Fi zvans"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Ienākošs videozvans"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Ienākošs video pieprasījums"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Jauns balss pasta ziņojums"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Jauns balss pasts (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Sastādiet šādu numuru: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Balss pasta numurs nav zināms."</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nav pakalpojuma"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Atlasītais tīkls (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nav pieejams."</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Atbildēt"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Beigt zvanu"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Balss"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Pieņemt"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Noraidīt"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Atzvanīt"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Sūtīt īsziņu"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Lai veiktu zvanu, vispirms izslēdziet lidojuma režīmu."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nav reģistrēts tīklā."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilais tīkls nav pieejams."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Lai veiktu zvanu, ievadiet derīgu numuru."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Nevar veikt zvanu."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Notiek MMI secības startēšana…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Pakalpojums netiek atbalstīts."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Nevar pārslēgt zvanus."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Nevar nošķirt zvanu."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Nevar pārsūtīt."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Nevar veikt konferences zvanu."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Nevar noraidīt zvanu."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Nevar pārtraukt zvanu(-us)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP zvans"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Ārkārtas izsaukums"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Notiek radio ieslēgšana…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nav pakalpojuma. Notiek atkārtots mēģinājums…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Nevar veikt zvanu. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nav ārkārtas numurs."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Nevar veikt zvanu. Zvaniet ārkārtas numuram."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Izmantojiet tastatūru, lai sastādītu numuru"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Aizturēt zvanu"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Atsākt zvanu"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Beigt zvanu"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Rādīt numura sastādīšanas tastatūru"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Slēpt numura sastādīšanas tastatūru"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Izslēgt skaņu"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Ieslēgt skaņu"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Pievienot zvanu"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Apvienot zvanus"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Mainīt"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Pārvaldīt zvanus"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Pārvaldīt konferences zvanu"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferences zvans"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Pārvaldīt"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videozvans"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Mainīt uz balss zvanu"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Pārslēgt kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pārtraukt video plūsmu"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Citas iespējas"</string>
+ <string name="player_started" msgid="3478865572468310331">"Atskaņošana sākta"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Atskaņošana apturēta"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera nav gatava"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera ir gatava"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Nezināms zvana sesijas notikums"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Pakalpojums"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Iestatīšana"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nav iestatīts&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Citi zvanu iestatījumi"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Zvans, ko nodrošina <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Ienākošie zvani, ko nodrošina <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontaktpersonas fotoattēls"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"pārslēgt uz privāto režīmu"</string>
+ <string name="selectContact" msgid="92191462970821951">"atlasīt kontaktpersonu"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Rakstīt savu…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Atcelt"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Sūtīt"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Atbildēt"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Sūtīt īsziņu"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Noraidīt"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Atbildēt videozvanā"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Atbildēt audiozvanā"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Apstiprināt video pieprasījumu"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Noraidīt video pieprasījumu"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Apstiprināt video pārsūtīšanas pieprasījumu"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Noraidīt video pārsūtīšanas pieprasījumu"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Apstiprināt video saņemšanas pieprasījumu"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Noraidīt video saņemšanas pieprasījumu"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Velciet uz augšu, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Velciet pa kreisi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Velciet pa labi, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Velciet uz leju, lai veiktu šādu darbību: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrācija"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrācija"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Signāls"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Noklusējuma signāls (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Tālruņa zvana signāls"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrācija zvana laikā"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Zvana signāls un vibrācija"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Konferences zvana pārvaldība"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Ārkārtas numurs"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> sekunžu</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundes</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> minūšu</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minūte</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minūtes</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="zero"><xliff:g id="COUNT">%d</xliff:g> stundu</item>
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> stunda</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> stundas</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profila fotoattēls"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera ir izslēgta"</string>
+ <string name="child_number" msgid="4469090994612105532">"no numura <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Piezīme nosūtīta"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Pēdējie ziņojumi"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informācija par uzņēmumu"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> jūdzes(-džu) attālumā"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km attālumā"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Tiks atvērts rīt plkst. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Tiks atvērts šodien plkst. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Tiks slēgts plkst. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Tika slēgts šodien plkst. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Atvērts"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Slēgts"</string>
+</resources>
diff --git a/InCallUI/res/values-mk-rMK/strings.xml b/InCallUI/res/values-mk-rMK/strings.xml
new file mode 100644
index 000000000..a11be9efe
--- /dev/null
+++ b/InCallUI/res/values-mk-rMK/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Телефон"</string>
+ <string name="onHold" msgid="527593602772521700">"На чекање"</string>
+ <string name="unknown" msgid="3646075119047488748">"Непознат"</string>
+ <string name="private_num" msgid="6081418498487514686">"Приватен број"</string>
+ <string name="payphone" msgid="5743050584468748607">"Говорница"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конференциски повик"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Повикот е прекинат"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Звучник"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Слушалка"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Жичени слушалки"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Испратете ги следниве тонови?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Се испраќаат тонови\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Испрати"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Да"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Не"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Заменете го резервниот знак со"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Конференциски повик <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Број на говорна пошта"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Бирање"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Повторно бирање"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конференциски повик"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Дојдовен повик"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Дојдовен работен повик"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Повикот заврши"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"На чекање"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Повикот се прекинува"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Повик во тек"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Мојот број е <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Се поврзува видео"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Видеоповик"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Се бара видео"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Не може да се поврзе видеоповик"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Барањето за видео е одбиено"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Вашиот број за повратен повик\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Вашиот број за итен повик\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Бирање"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Пропуштен повик"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Пропуштени повици"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> пропуштени повици"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Пропуштен повик од <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Тековен повик"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Тековен работен повик"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Појдовен повик преку Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Тековен работен повик преку Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"На чекање"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Дојдовен повик"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Дојдовен работен повик"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Дојдовен повик преку Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Дојдовен работен повик преку Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Дојдовен видеоповик"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Дојдовно барање за видео"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Нова говорна пошта"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Нова говорна пошта (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Бирај <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Непознат број на говорна пошта"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Нема услуга"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Избраната мрежа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) е недостапна"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Одговори"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Спушти"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Гласовен"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Прифати"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Отфрли"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Врати повик"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Порака"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"За да остварите повик, прво исклучете го авионскиот режим."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Не е регистриран на мрежа."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Не е достапна мобилна мрежа."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"За да остварите повик, внесете важечки број."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Не може да се повика."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Започнува ММИ низа..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Услугата не е поддржана."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Не може да се префрлат повици."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Не може да се оддели повик."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Не може да се пренесе."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Не може да се оствари конференциски повик."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Не може да се отфрли повик."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Не може да се оствари повик."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Повик преку SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Повик за итни случаи"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Се вклучува радиото..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Нема услуга. Се обидува повторно…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Не може да се повика. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не е број за итни повици."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Не може да се повика. Бирајте го бројот за итни повици."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Користете ја тастатурата за бирање"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Стави на чекање"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Продолжи го повикот"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Заврши го повикот"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Прикажи копчиња за бирање"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Сокриј копчиња за бирање"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Исклучи звук"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Вклучи звук"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Додај повик"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Спои повици"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Замени"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Управувај со повици"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Управувај со конференциски повик"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конференциски повик"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Управувај"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Видеоповик"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Промени во гласовен повик"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Промени ја камерата"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Паузирај видео"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Повеќе опции"</string>
+ <string name="player_started" msgid="3478865572468310331">"Плеерот се вклучи"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Плеерот запре"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камерата не е подготвена"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камерата е подготвена"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Непознат настан при сесија повици"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Услуга"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Поставување"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Нема поставка&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Други поставки за повик"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Повикување преку <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Дојдовни повици преку <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"фотографија на контакт"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"префли на приватно"</string>
+ <string name="selectContact" msgid="92191462970821951">"избери контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Напиши сопствена..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Откажи"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Испрати"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Одговори"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Испрати SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Одбиј"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Одговори со видеоповик"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Одговори со аудиоповик"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Прифати барање за видео"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Одбиј барање за видео"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Прифати барање за пренос на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Одбиј барање за пренос на видео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Прифати барање за прием на видео"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Одбиј барање за прием на видео"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Лизгај нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Лизгај налево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Лизгај надесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Лизгај надолу за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Вибрации"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Вибрации"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Звук"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Стандарден звук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Мелодија на телефонот"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Вибрации при ѕвонење"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Мелодија и вибрации"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Управувај со конференциски повик"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Број за итни случаи"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минути</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> час</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Фотографија на профилот"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камерата е исклучена"</string>
+ <string name="child_number" msgid="4469090994612105532">"преку <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Испратена е белешка"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Неодамнешни пораки"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Деловни информации"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Оддалечено <xliff:g id="DISTANCE">%.1f</xliff:g> милји"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Оддалечено <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Отвора утре во <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Отвора денес во <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Затвора во <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Денес затвори во <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Сега е отворено"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Сега е затворено"</string>
+</resources>
diff --git a/InCallUI/res/values-ml-rIN/strings.xml b/InCallUI/res/values-ml-rIN/strings.xml
new file mode 100644
index 000000000..2635df4cb
--- /dev/null
+++ b/InCallUI/res/values-ml-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ഫോൺ"</string>
+ <string name="onHold" msgid="527593602772521700">"ഹോൾഡിലാണ്"</string>
+ <string name="unknown" msgid="3646075119047488748">"അജ്ഞാതം"</string>
+ <string name="private_num" msgid="6081418498487514686">"സ്വകാര്യ നമ്പർ"</string>
+ <string name="payphone" msgid="5743050584468748607">"പണം നൽകി ഉപയോഗിക്കുന്ന ഫോൺ"</string>
+ <string name="confCall" msgid="3181961445236675173">"കോൺഫറൻസ് കോൾ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"കോൾ വിട്ടു"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"സ്പീക്കർ"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ഹാൻഡ്‌സെറ്റ് ഇയർപീസ്"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"വയേർഡ് ഹെഡ്സെറ്റ്"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"ഇനിപ്പറയുന്ന ടോണുകൾ അയയ്‌ക്കണോ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ടോണുകൾ അയയ്‌ക്കുന്നു\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"അയയ്‌ക്കുക"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ഉവ്വ്"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"ഇല്ല"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"വൈൽഡ് പ്രതീകം ഇതുപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുക"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"കോൺഫറൻസ് കോൾ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"വോയ്‌സ്‌മെയിൽ നമ്പർ"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ഡയൽ ചെയ്യുന്നു"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"വീണ്ടും ഡയൽചെയ്യുന്നു"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"കോൺഫറൻസ് കോൾ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ഇൻകമിംഗ് കോൾ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ഇൻകമിംഗ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"കോൾ അവസാനിച്ചു"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ഹോൾഡിലാണ്"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"ഹാംഗ് അപ്പ് ചെയ്യുന്നു"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"കോളിലാണ്"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"എന്റെ നമ്പർ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ആണ്"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"വീഡിയോ കണക്‌റ്റുചെയ്യുന്നു"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"വീഡിയോ കോൾ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"വീഡിയോ അഭ്യർത്ഥിക്കുന്നു"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"വീഡിയോ കോളുമായി കണക്‌റ്റുചെയ്യാനാവില്ല"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"വീഡിയോ അഭ്യർത്ഥന നിരസിച്ചു"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"നിങ്ങൾ തിരിച്ചുവിളിക്കേണ്ട നമ്പർ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"അടിയന്തിരമായി നിങ്ങൾ തിരിച്ചുവിളിക്കേണ്ട നമ്പർ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ഡയൽ ചെയ്യുന്നു"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"മിസ്‌ഡ് കോൾ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"മിസ്‌ഡ് കോളുകൾ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> മിസ്‌ഡ് കോളുകൾ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> എന്നതിൽ നിന്നുള്ള മിസ്‌ഡ് കോൾ"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"കോൾ സജീവമാണ്"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"ഓൺഗോയിംഗ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"ഓൺഗോയിംഗ് വൈഫൈ കോൾ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"ഓൺഗോയിംഗ് വൈഫൈ ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ഹോൾഡിലാണ്"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ഇൻകമിംഗ് കോൾ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ഇൻകമിംഗ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ഇൻകമിംഗ് വൈഫൈ കോൾ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ഇൻകമിംഗ് വൈഫൈ ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ഇൻകമിംഗ് വീഡിയോ കോൾ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ഇൻകമിംഗ് വീഡിയോ അഭ്യർത്ഥന"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"പുതിയ വോയ്‌സ്‌മെയിൽ"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"പുതിയ വോയ്‌സ്‌മെയിൽ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ഡയൽ ചെയ്യുക"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"വോയ്‌സ്‌മെയിൽ നമ്പർ അജ്ഞാതമാണ്"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"സേവനമില്ല"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"തിരഞ്ഞെടുത്ത നെറ്റ്‌വർക്ക് (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ലഭ്യമല്ല"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"മറുപടി"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"ഹാംഗ് അപ്പുചെയ്യുക"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"വീഡിയോ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"വോയ്‌സ്"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"അംഗീകരിക്കുക"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ഡിസ്മിസ്"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"തിരിച്ചുവിളിക്കുക"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"സന്ദേശം"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ഒരു കോൾ ചെയ്യാൻ, ആദ്യം ഫ്ലൈറ്റ് മോഡ് ഓഫുചെയ്യുക."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"നെറ്റ്‌വർക്കിൽ രജിസ്റ്റർ ചെയ്‌തിട്ടില്ല."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"സെല്ലുലാർ നെറ്റ്‌വർക്ക് ലഭ്യമല്ല."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ഒരു കോൾ ചെയ്യുന്നതിന്, സാധുതയുള്ള നമ്പർ നൽകുക."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"കോൾ ചെയ്യാനായില്ല."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI സീക്വൻസ് ആരംഭിക്കുന്നു…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"സേവനം പിന്തുണയ്‌ക്കുന്നില്ല."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"കോളുകൾ മാറാനാവില്ല."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"കോൾ വേർതിരിക്കാനാവില്ല."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"കൈമാറ്റം ചെയ്യാനാവില്ല."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"കോൺഫറൻസ് കോൾ ചെയ്യാനാവില്ല."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"കോൾ നിരസിക്കാനാവില്ല."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"കോൾ (കോളുകൾ) വിളിക്കാനാവില്ല."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP കോൾ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"എമർജൻസി കോൾ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"റേഡിയോ ഓൺ ചെയ്യുന്നു…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"സേവനമൊന്നുമില്ല. വീണ്ടും ശ്രമിക്കുന്നു…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"കോൾ ചെയ്യാനാവില്ല. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> എന്നത് ഒരു അടിയന്തിര നമ്പറല്ല."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"കോൾ ചെയ്യാനാവില്ല. ഒരു അടിയന്തിര കോൾ നമ്പർ ഡയൽചെയ്യുക."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ഡയൽ ചെയ്യാൻ കീബോർഡ് ഉപയോഗിക്കുക"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"കോൾ ഹോൾഡുചെയ്യുക"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"കോൾ പുനരാരംഭിക്കുക"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"കോൾ അവസാനിപ്പിക്കുക"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ഡയൽപാഡ് കാണിക്കുക"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ഡയൽപാഡ് മറയ്‌ക്കുക"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"മ്യൂട്ടുചെയ്യുക"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"അൺമ്യൂട്ടുചെയ്യുക"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"കോൾ ചേർക്കുക"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"കോളുകൾ ലയിപ്പിക്കുക"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"സ്വാപ്പുചെയ്യുക"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"കോളുകൾ നിയന്ത്രിക്കുക"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"കോൺഫറൻസ് കോൾ നിയന്ത്രിക്കുക"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"കോൺഫറൻസ് കോൾ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"മാനേജുചെയ്യുക"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ഓഡിയോ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"വീഡിയോ കോൾ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"വോയ്‌സ്‌ കോളിലേക്ക് മാറ്റുക"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ക്യാമറ സ്വിച്ചുചെയ്യുക"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"വീഡിയോ താൽക്കാലികമായി നിർത്തുക"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"കൂടുതൽ ഓ‌പ്‌ഷനുകൾ"</string>
+ <string name="player_started" msgid="3478865572468310331">"പ്ലെയർ ആരംഭിച്ചു"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"പ്ലേയർ നിർത്തി"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ക്യാമറ തയ്യാറായില്ല"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ക്യാമറ തയ്യാറായി"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"അജ്ഞാത കോൾ സെഷൻ ഇവന്റ്"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"സേവനം"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"സജ്ജമാക്കുക"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;ക്രമീകരിച്ചിട്ടില്ല&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"മറ്റ് കോൾ ക്രമീകരണം"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> മുഖേന വിളിക്കുന്നു"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> മുഖേനയുള്ള ഇൻകമിംഗ്"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"കോൺടാക്റ്റ് ഫോട്ടോ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"സ്വകാര്യം എന്നതിലേക്ക് പോകുക"</string>
+ <string name="selectContact" msgid="92191462970821951">"കോൺടാക്റ്റ് തിരഞ്ഞെടുക്കുക"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"നിങ്ങളുടെ സ്വന്തം സന്ദേശമെഴുതുക..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"റദ്ദാക്കുക"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"അയയ്‌ക്കുക"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"മറുപടി"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS അയയ്ക്കുക"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"നിരസിക്കുക"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"വീഡിയോ കോളായി മറുപടി നൽകുക"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ഓഡിയോ കോളായി മറുപടി നൽകുക"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"വീഡിയോ കോളിനുള്ള അഭ്യർത്ഥന അംഗീകരിക്കുക"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"വീഡിയോ കോൾ അഭ്യർത്ഥന നിരസിക്കുക"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"വീഡിയോ പ്രക്ഷേപണ അഭ്യർത്ഥന അംഗീകരിക്കുക"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"വീഡിയോ പ്രക്ഷേപണ അഭ്യർത്ഥന നിരസിക്കുക"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"വീഡിയോ കോൾ സ്വീകരിക്കാനുള്ള അഭ്യർത്ഥന അംഗീകരിക്കുക"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"വീഡിയോ കോൾ സ്വീകരിക്കാനുള്ള അഭ്യർത്ഥന നിരസിക്കുക"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്‌ക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്‌ക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി വലത്തേയ്‌ക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി താഴേക്ക് സ്ലൈഡുചെയ്യുക."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"വൈബ്രേറ്റുചെയ്യുക"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"വൈബ്രേറ്റുചെയ്യുക"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ശബ്‌ദം"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"സ്ഥിര ശബ്‌ദം (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ഫോൺ റിംഗ്ടോൺ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"റിംഗുചെയ്യുമ്പോൾ വൈബ്രേറ്റുചെയ്യുക"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"റിംഗ്ടോണും വൈബ്രേറ്റുചെയ്യലും"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"കോൺഫറൻസ് കോൾ നിയന്ത്രിക്കുക"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"അടിയന്തര നമ്പർ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> സെക്കൻഡ്</item>
+ <item quantity="one">ഒരു സെക്കൻഡ്</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> മിനിറ്റ്</item>
+ <item quantity="one">ഒരു മിനിറ്റ്</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> മണിക്കൂർ</item>
+ <item quantity="one">ഒരു മണിക്കൂർ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"പ്രൊഫൈൽ ഫോട്ടോ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ക്യാമറ ഓഫാക്കുക"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> വഴി"</string>
+ <string name="note_sent" msgid="7623014827902758398">"കുറിപ്പ് അയച്ചു"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ഏറ്റവും പുതിയ സന്ദേശങ്ങൾ"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ബിസിനസ്സ് വിവരം"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> മൈൽ അകലെ"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> കിലോമീറ്റർ അകലെ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"നാളെ <xliff:g id="OPEN_TIME">%s</xliff:g>-ന് തുറക്കുന്നു"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ഇന്ന് <xliff:g id="OPEN_TIME">%s</xliff:g>-ന് തുറക്കുന്നു"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>-ന് അടയ്ക്കുന്നു"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ഇന്ന് <xliff:g id="CLOSE_TIME">%s</xliff:g>-ന് അടച്ചു"</string>
+ <string name="open_now" msgid="4615706338669555999">"ഇപ്പോൾ തുറന്നിരിക്കുന്നു"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ഇപ്പോൾ അടച്ചിരിക്കുന്നു"</string>
+</resources>
diff --git a/InCallUI/res/values-mn-rMN/strings.xml b/InCallUI/res/values-mn-rMN/strings.xml
new file mode 100644
index 000000000..8a17d0f1b
--- /dev/null
+++ b/InCallUI/res/values-mn-rMN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Утас"</string>
+ <string name="onHold" msgid="527593602772521700">"Хүлээлгэнд байгаа"</string>
+ <string name="unknown" msgid="3646075119047488748">"Тодорхойгүй"</string>
+ <string name="private_num" msgid="6081418498487514686">"Нууцалсан дугаар"</string>
+ <string name="payphone" msgid="5743050584468748607">"Төлбөртэй утас"</string>
+ <string name="confCall" msgid="3181961445236675173">"Хурлын дуудлага"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Дуудлага таслагдсан"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Чанга яригч"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Утасны чихэвч"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Утастай чихэвч"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Дараах аяыг илгээх үү?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Ая илгээж байна\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Илгээх"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Тийм"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Үгүй"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Тэмдэгтийг дараахаар солих"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Хурлын дуудлага <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Дуут шуудангийн дугаар"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Залгаж байна"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Дахин залгаж байна"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Хурлын дуудлага"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Орох дуудлага"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Орох ажлын дуудлага"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Дуудлага дууссан"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Хүлээлгэнд"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Тасалж байна"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Дуудлагатай"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Миний дугаар <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Видеог холбож байна"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Видео дуудлага"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Видео хүлээж байна"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Видео дуудлагад холбогдож чадсангүй"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Бичлэг хийх хүсэлтийг зөвшөөрсөнгүй"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Таны буцаан залгах дугаар\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Таны яаралтай хулээн авах дугаар\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Залгаж байна"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Аваагүй дуудлага"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Аваагүй дуудлага"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> аваагүй дуудлага"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>-н аваагүй дуудлага"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Залгаж буй дуудлага"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Холбогдсон албаны дуудлага"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Холбогдсон Wi-Fi дуудлага"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Залгаж буй Wi-Fi албаны дуудлага"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Хүлээгдэж байна"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Орох дуудлага"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Орох ажлын дуудлага"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Орох Wi-Fi дуудлага"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Орох Wi-Fi албаны дуудлага"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Орох видео дуудлага"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Орох видео хүсэлт"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Шинэ дуут шуудан"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Шинэ дуут шуудан (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> руу залгах"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Дуут шуудангийн дугаар тодорхойгүй"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Үйлчилгээ байхгүй"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Сонгосон сүлжээг (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ашиглах боломжгүй"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Хариулт"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Таслах"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Дуу хоолой"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Зөвшөөрөх"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Алгасах"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Буцааж залгах"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Зурвас"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Залгахын тулд эхлээд Нислэгийн горимоос гарна уу."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Сүлжээнд бүртгэгдээгүй байна."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Үүрэн сүлжээ байхгүй."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Залгахын тулд хүчин төгөлдөр дугаар оруулна уу."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Залгах боломжгүй байна."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI дарааллыг эхлүүлж байна…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Дэмжигдээгүй үйлчилгээ байна."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Дуудлагыг солих боломжгүй байна."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Дуудлагыг салгаж чадахгүй байна."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Шилжүүлэх боломжгүй байна."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Хурлын дуудлага хийх боломжгүй байна."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Дуудлагыг цуцлах боломжгүй байна."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Дуудлага чөлөөлөх боломжгүй байна."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP дуудлага"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"яаралтай"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Радиог асааж байна..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ажиллагаагүй байна. Дахин оролдоно уу..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Залгах боломжгүй. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> нь яаралтай дугаар биш байна."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Залгах боломжгүй. Яаралтай дугаар луу залгана уу."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Залгахдаа гар ашиглана уу"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Дуудлага хүлээлгэх"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Дуудлагыг үргэлжлүүлэх"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Дуудлагыг дуусгах"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Залгах товчлуурыг харуулах"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Залгах товчлуурыг нуух"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Дуу хаах"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Дууг нээх"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Дуудлага нэмэх"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Дуудлага нэгтгэх"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Солих"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Дуудлага удирдах"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Хурлын дуудлага удирдах"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Хурлын дуудлага"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Удирдах"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Видео дуудлага"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Дуут дуудлага руу өөрчлөх"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Камер солих"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Видеог түр зогсоох"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Нэмэлт сонголт"</string>
+ <string name="player_started" msgid="3478865572468310331">"Тоглуулагчийг эхлүүлсэн"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Тоглуулагчийг зогсоосон"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камер бэлэн бус байна"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камер бэлэн байна"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Үл мэдэгдэх дуудлагын үе"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Үйлчилгээ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Тохируулга"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"Тохируулаагүй"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Бусад дуудлагын тохиргоо"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>-р залгаж байна"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g>-р ирж байна"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"харилцагчийн зураг"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"хувийн яриа"</string>
+ <string name="selectContact" msgid="92191462970821951">"харилцагч сонгох"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Өөрийн ...-г бичээрэй"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Цуцлах"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Илгээх"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Хариулт"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS илгээх"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Татгалзах"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Видео дуудлагаар хариулах"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Аудио дуудлагаар хариулах"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Видео хүсэлтийг хүлээн зөвшөөрөх"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Видео хүсэлтээс татгалзах"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Видео дамжуулах хүсэлтийг хүлээн зөвшөөрөх"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Видео дамжуулах хүсэлтээс татгалзах"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Видео хүлээж авах хүсэлтийг зөвшөөрөх"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Видео хүлээн авах хүсэлтээс татгалзах"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> хийх бол дээш гулсуулна уу."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г харахын тулд зүүн тийш гулсуулна уу."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> харахын тулд баруун тийш гулсуулна уу."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>-г харахын тулд доош гулсуулна уу."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Чичиргээ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Чичиргээ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Дуу"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Үндсэн дуу (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Утасны хонхны ая"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Хонх дуугарах үед чичрэх"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Хонхны ая, Чичиргээ"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Хурлын дуудлагыг удирдах"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Яаралтай дугаар"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="one">1 секунд</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="one">1 минут</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> цаг</item>
+ <item quantity="one">1 цаг</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Профайл зураг"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камер унтраалттай байна"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g>-р"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Тэмдэглэлийг илгээсэн"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Саяхны зурвас"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Бизнес мэдээлэл"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> милийн зайтай"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> км-н зайтай"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Маргааш <xliff:g id="OPEN_TIME">%s</xliff:g>-с нээгдэнэ"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Өнөөдөр <xliff:g id="OPEN_TIME">%s</xliff:g>-с нээгдэнэ"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>-с хаадаг"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Өнөөдөр <xliff:g id="CLOSE_TIME">%s</xliff:g>-с хаасан"</string>
+ <string name="open_now" msgid="4615706338669555999">"Одоо нээлттэй"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Одоо хаалттай"</string>
+</resources>
diff --git a/InCallUI/res/values-mr-rIN/strings.xml b/InCallUI/res/values-mr-rIN/strings.xml
new file mode 100644
index 000000000..9a4c8fe37
--- /dev/null
+++ b/InCallUI/res/values-mr-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"फोन"</string>
+ <string name="onHold" msgid="527593602772521700">"होल्ड वर"</string>
+ <string name="unknown" msgid="3646075119047488748">"अज्ञात"</string>
+ <string name="private_num" msgid="6081418498487514686">"खाजगी नंबर"</string>
+ <string name="payphone" msgid="5743050584468748607">"सार्वजनिक फोन"</string>
+ <string name="confCall" msgid="3181961445236675173">"परिषद कॉल"</string>
+ <string name="call_lost" msgid="8208184291640961172">"कॉल सोडला"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"स्पीकर"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"हँडसेट इअरपीस"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"वायर्ड हेडसेट"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ब्लूटुथ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"खालील टोन पाठवायचे?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"टोन पाठवित आहे\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"पाठवा"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"होय"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"नाही"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"खराब वर्णास यासह पुनर्स्थित करा"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"परिषद कॉल <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"व्हॉइसमेल नंबर"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"डायल करीत आहे"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"रीडायल करत आहे"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"परिषद कॉल"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"येणारा कॉल"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"येणारा कार्य कॉल"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"कॉल संपला"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"होल्ड वर"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"हँग अप करणेे"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"कॉल मधील"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"माझा नंबर <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> आहे"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"व्हिडिओ कनेक्ट करत आहे"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"व्हिडिओ कॉल"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"व्हिडिओ विनंती करत आहे"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"व्हिडिओ कॉल कनेक्ट करू शकत नाही"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"व्हिडिओ विनंती नाकारली"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"आपला कॉलबॅक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"आपला आणीबाणी कॉलबॅक नंबर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"डायल करीत आहे"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"सुटलेला कॉल"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"सुटलेले कॉल"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> सुटलेले कॉल"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> कडील सुटलेला कॉल"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"सुरू असलेला कॉल"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"सुरु असलेला कार्य कॉल"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"सुरु असलेला वाय-फाय कॉल"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"सुरु असलेला वाय-फाय कार्य कॉल"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"होल्ड वर"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"येणारा कॉल"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"येणारा कार्य कॉल"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"येणारा वाय-फाय कॉल"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"येणारा वाय-फाय कार्य कॉल"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"येणारा व्हिडिओ कॉल"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"येणारी व्हिडिओ विनंती"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"नवीन व्हॉइसमेल"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"नवीन व्हॉइसमेल (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> डायल करा"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"व्हॉइसमेल नंबर अज्ञात"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"सेवा नाही"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"निवडलेले नेटवर्क (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) अनुपलब्ध"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"उत्तर"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"हँग अप"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"व्हिडिओ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"व्हॉइस"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"स्वीकार करा"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"डिसमिस करा"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"पुन्हा कॉल करा"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"संदेश"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"कॉल करण्यासाठी, प्रथम विमान मोड बंद करा."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"नेटवर्कवर नोंदणीकृत नाही."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"मोबाईल नेटवर्क उपलब्ध नाही."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"कॉल करण्यासाठी, एक वैध नंबर प्रविष्ट करा."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"कॉल करू शकत नाही."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI क्रम प्रारंभ करीत आहे..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"सेवा समर्थित नाही."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"कॉल स्विच करू शकत नाही."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"कॉल विभक्त करू शकत नाही."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"हस्तांतर करू शकत नाही."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"परिषद घेऊ शकत नाही."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"कॉल नाकारू शकत नाही."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"कॉल रिलीझ करू शकत नाही."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP कॉल"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"आणीबाणी कॉल"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"रेडिओ चालू करीत आहे..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"सेवा नाही. पुन्हा प्रयत्न करत आहे…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"कॉल करू शकत नाही. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> हा आणीबाणी नंबर नाही."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"कॉल करू शकत नाही. आणीबाणी नंबर डायल करा."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"डायल करण्यासाठी कीबोर्डचा वापर करा"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"कॉल होल्ड करा"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"कॉल पुनः सुरु करा"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"कॉल समाप्त करा"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"डायलपॅड दर्शवा"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"डायलपॅड लपवा"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"नि:शब्द करा"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"सशब्द करा"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"कॉल जोडा"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"कॉल विलीन करा"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"अदलाबदल करा"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"कॉल व्यवस्थापित करा"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"परिषद कॉल व्यवस्थापित करा"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"परिषद कॉल"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"व्यवस्थापित करा"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ऑडिओ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"व्हिडिओ कॉल"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"व्हॉइस कॉल वर बदला"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"कॅमेरा स्विच करा"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"व्हिडिओला विराम द्या"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"अधिक पर्याय"</string>
+ <string name="player_started" msgid="3478865572468310331">"प्लेअर सुरु झाले"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"प्लेअर थांबले"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"कॅमेरा तयार नाही"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"कॅमेरा तयार"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"अज्ञात कॉल सत्र इव्हेंट"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"सेवा"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"सेटअप"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;सेट नाही&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"इतर कॉल सेटिंग्ज"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> द्वारे कॉल करीत आहे"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> द्वारे येणारे"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"संपर्क फोटो"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"खाजगी व्हा"</string>
+ <string name="selectContact" msgid="92191462970821951">"संपर्क निवडा"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"आपण स्वतः लिहा…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"रद्द करा"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"पाठवा"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"उत्तर"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS पाठवा"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"नकार द्या"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"व्हिडिओ कॉल म्हणून उत्तर द्या"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ऑडिओ कॉल म्हणून उत्तर द्या"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"व्हिडिओ विनंती स्वीकारा"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"व्हिडिओ विनंतीस नकार द्या"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"व्हिडिओ प्रसारण विनंती स्वीकार करा"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"व्हिडिओ प्रसारण विनंतीस नकार द्या"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"व्हिडिओ प्राप्त करा विनंती स्वीकार करा"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"व्हिडिओ प्राप्त करा विनंतीस नकार द्या"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी उजवीकडे स्लाइड करा."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी खाली स्लाइड करा."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"कंपन करा"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"कंपन करा"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ध्वनी"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"डीफॉल्ट आवाज (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"फोन रिंगटोन"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"रिंग करताना कंपन करा"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"रिंगटोन आणि कंपन"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"परिषद कॉल व्यवस्थापित करा"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"आणीबाणी नंबर"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> सेकंद</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकंद</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> मिनिट</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> मिनिटे</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> तास</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> तास</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"प्रोफाइल फोटो"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"कॅमेरा बंद"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> द्वारा"</string>
+ <string name="note_sent" msgid="7623014827902758398">"टीप पाठविली"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"अलीकडील संदेश"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"व्यवसाय माहिती"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> मैल दूर"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> किमी दूर"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"उद्या <xliff:g id="OPEN_TIME">%s</xliff:g> वाजता उघडेल"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"आज <xliff:g id="OPEN_TIME">%s</xliff:g> उघडेल"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> वाजता बंद होईल"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> वाजता बंद केले"</string>
+ <string name="open_now" msgid="4615706338669555999">"आता उघडा"</string>
+ <string name="closed_now" msgid="2635314668145282080">"आता बंद केले आहे"</string>
+</resources>
diff --git a/InCallUI/res/values-ms-rMY/strings.xml b/InCallUI/res/values-ms-rMY/strings.xml
new file mode 100644
index 000000000..b42ac149f
--- /dev/null
+++ b/InCallUI/res/values-ms-rMY/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Ditunda"</string>
+ <string name="unknown" msgid="3646075119047488748">"Tidak diketahui"</string>
+ <string name="private_num" msgid="6081418498487514686">"Nombor peribadi"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefon Awam"</string>
+ <string name="confCall" msgid="3181961445236675173">"Panggilan sidang"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Panggilan diputuskan"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Pembesar suara"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Alat dengar tel bimbit"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Set kepala berwayar"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Hantar nada berikut?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Menghantar nada\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Hantar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ya"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Tidak"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Gantikan aksara bebas dengan"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Panggilan sidang <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Nombor mel suara"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Mendail"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Mendail semula"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Panggilan sidang"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Panggilan masuk"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Pgln masuk tempat kerja"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Panggilan tamat"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Ditunda"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Menamatkan panggilan"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Dalam panggilan"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Nombor saya ialah <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Menyambungkan video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Panggilan video"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Meminta video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Tidak dapat menyambungkan panggilan video"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Permintaan video ditolak"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Nombor panggilan balik anda<xliff:g id="DARK_NUMBER">%1$s</xliff:g>\n"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Nombor panggilan balik kecemasan anda\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Mendail"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Panggilan terlepas"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Panggilan terlepas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> panggilan terlepas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Panggilan tidak dijawab daripada <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Panggilan sedang berlangsung"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Panggilan sedang berlangsung daripada tempat kerja"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Panggilan Wi-Fi sedang berlangsung"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Panggian Wi-Fi sedang berlangsung daripada tempat kerja"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Ditunda"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Panggilan masuk"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Panggilan masuk daripada tempat kerja"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Panggilan masuk melalui Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Panggilan masuk melalui Wi-Fi daripada tempat kerja"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Panggilan video masuk"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Permintaan video masuk"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Mel suara baharu"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Mel suara baharu (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Dail <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nombor mel suara tidak dikenali"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Tiada perkhidmatan"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Rangkaian pilihan (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) tidak tersedia"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Jawab"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Letakkan gagang"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Suara"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Terima"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ketepikan"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Panggil balik"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mesej"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Untuk membuat panggilan, matikan mod Pesawat terlebih dahulu."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Tidak didaftarkan pada rangkaian."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rangkaian selular tidak tersedia."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Untuk membuat panggilan, masukkan nombor yang sah."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Tidak dapat memanggil."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Memulakan jujukan MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Perkhidmatan tidak disokong."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Tidak dapat menukar panggilan."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Tidak dapat mengasingkan panggilan."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Tidak dapat memindahkan."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Tidak dapat membuat panggilan persidangan."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Tidak dapat menolak panggilan."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Tidak dapat melepaskan panggilan."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Panggilan SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Panggilan kecemasan"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Menghidupkan radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Tiada perkhidmatan. Mencuba lagi..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Tidak dapat memanggil. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bukan nombor kecemasan."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Tidak dapat memanggil. Dail nombor kecemasan."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Gunakan papan kekunci untuk mendail"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Tahan Panggilan"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Sambung Semula Panggilan"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Tamatkan Panggilan"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Tunjukkan Pad Pendail"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Sembunyikan Pad Pendail"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Redam"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Nyahredam"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Tambah panggilan"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Gabung panggilan"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Silih"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Urus panggilan"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Urus panggilan sidang"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Panggilan sidang"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Urus"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Panggilan video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Tukar ke panggilan suara"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Tukar kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Jeda video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Lagi pilihan"</string>
+ <string name="player_started" msgid="3478865572468310331">"Pemain Dimulakan"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Pemain Dihentikan"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera tidak bersedia"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera bersedia"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Acara sesi panggilan tidak diketahui"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Perkhidmatan"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Persediaan"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Tidak ditetapkan&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Tetapan panggilan lain"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Memanggil melalui <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Panggilan masuk melalui <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto kenalan"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"jadi peribadi"</string>
+ <string name="selectContact" msgid="92191462970821951">"pilih kenalan"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Tulis sendiri…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Batal"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Hantar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Jawab"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Hantar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Tolak"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Jawab sebagai panggilan video"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Jawab sebagai panggilan audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Terima permintaan video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Tolak permintaan video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Terima permintaan hantar video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Tolak permintaan hantar video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Terima permintaan terima video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Tolak permintaan terima video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Luncurkan ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Luncurkan ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Luncurkan ke kanan untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Luncurkan ke bawah untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Bergetar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Bergetar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Bunyi"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Bunyi lalai (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Nada dering telefon"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Bergetar apabila berdering"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Nada dering &amp; Bergetar"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Urus panggilan sidang"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Nombor kecemasan"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saat</item>
+ <item quantity="one">1 saat</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minit</item>
+ <item quantity="one">1 minit</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> jam</item>
+ <item quantity="one">1 jam</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto profil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera dimatikan"</string>
+ <string name="child_number" msgid="4469090994612105532">"melalui <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota dihantar"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mesej terbaharu"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Maklumat perniagaan"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> batu dari sini"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km dari sini"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Dibuka esok pada pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Dibuka hari ini pada pukul <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Tutup pada pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Ditutup hari ini pada pukul <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Dibuka sekarang"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Ditutup sekarang"</string>
+</resources>
diff --git a/InCallUI/res/values-my-rMM/strings.xml b/InCallUI/res/values-my-rMM/strings.xml
new file mode 100644
index 000000000..b3deaa39b
--- /dev/null
+++ b/InCallUI/res/values-my-rMM/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ဖုန်း"</string>
+ <string name="onHold" msgid="527593602772521700">"ခဏ ကိုင်ထားစဉ်"</string>
+ <string name="unknown" msgid="3646075119047488748">"အမျိုးအမည်မသိ"</string>
+ <string name="private_num" msgid="6081418498487514686">"ကိုယ်ပိုင်ဖုန်းနံပါတ်"</string>
+ <string name="payphone" msgid="5743050584468748607">"အများသုံးဖုန်း"</string>
+ <string name="confCall" msgid="3181961445236675173">"အစည်းအဝေးခေါ်ဆိုမှု"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ဖုန်းလိုင်းကျသွားခဲ့သည်"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"စပီကာ"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"လက်ကိုင်တယ်လီဖုန်းနားခွက်"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"ကြိုးတပ် မိုက်ခွက်ပါနားကြပ်"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ဘလူးတုသ်"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"အောက်ပါ တီးလုံးများကို ပို့မလား။\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"အသံများ ပို့နေသည်\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ပို့ပါ"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Yes"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"No"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"အစားထိုး အထူးအက္ခရာတွင် အစားထိုးရန်"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"အစည်းအဝေးခေါ်ဆိုမှု <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"အသံစာနံပါတ်"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ခေါ်ဆိုနေသည်"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ပြန်ခေါ်နေသည်"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"အစည်းအဝေးခေါ်ဆိုမှု"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"အဝင် ခေါ်ဆိုမှု"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"အလုပ်ဆိုင်ရာ အဝင် ခေါ်ဆိုမှု"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ဖုန်းခေါ်ဆိုမှု ပြီးဆုံးပါပြီ"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ခဏ ကိုင်ထားစဉ်"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"ဖုန်းချနေပါသည်"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"ဖုန်းခေါ်ဆိုနေဆဲ"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"ကျွန်ုပ်၏ နံပါတ်မှာ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ဖြစ်ပါသည်"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ဗီဒီယို ချိတ်ဆက်နေသည်"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ဗီဒီယို ခေါ်ဆိုမှု"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ဗီဒီယိုခေါ်ဆိုနေသည်"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ဗွီဒီယို ခေါ်ဆိုမှု ချိတ်ဆက်၍မရပါ။"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ဗီဒီယို ခေါ်ဆိုမှုကို ပယ်ချလိုက်ပါပြီ"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"သင့်ကိုပြန်လည်ခေါ်ဆိုရန် နံပါတ်\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"သင့်ကိုအရေးပေါ် ပြန်လည်ခေါ်ဆိုရန် နံပါတ်\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ဖုန်းခေါ်နေသည်"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"လွတ်သွားသော ခေါ်ဆိုမှု"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"လွတ်သွားသော ခေါ်ဆိုမှုများ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"လွတ်သွားသော ခေါ်ဆိုမှု <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> မှလွတ်သွားသော ခေါ်ဆိုမှု"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"လက်ရှိခေါ်ဆိုမှု"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"လက်ရှိအလုပ်ခေါ်ဆိုမှု"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"လက်ရှိ Wi-Fi ခေါ်ဆိုမှု"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"လက်ရှိအလုပ် Wi-Fi ခေါ်ဆိုမှု"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ခဏ ကိုင်ထားစဉ်"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"အဝင် ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"အလုပ်ဆိုင်ရာ အဝင်ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"အဝင် Wi-Fi ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"အလုပ်ဆိုင်ရာ အဝင် Wi-Fi ခေါ်ဆိုမှု"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"အဝင်ဗီဒီယိုခေါ်ဆိုမှု"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ဗီဒီယိုအဝင် ခေါ်ဆိုမှု"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"အသံစာအသစ်"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"အသံစာ အသစ် (<xliff:g id="COUNT">%d</xliff:g>) ခု"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ကိုခေါ်ပါ"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"အသံစာ၏နံပါတ်ကို မသိပါ"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"ဆက်သွယ်မှု ဧရိယာပြင်ပသို့ ရောက်ရှိနေသည်"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"ရွေးချယ်ထားသော ကွန်ရက် (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) မရရှိနိုင်ပါ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"ဖြေကြားပါ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"ဖုန်းချပါ"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ဗီဒီယို"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"အသံ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"လက်ခံပါ"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ပယ်ပါ"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"ပြန်ခေါ်ပါ"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"မက်ဆေ့ဂျ်"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ခေါ်ဆိုမှု ပြုလုပ်ရန်အတွက် လေယာဉ်ပျံမုဒ်ကို ဦးစွာပိတ်ပါ။"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ကွန်ယက်ပေါ်တွင် မှတ်ပုံတင်ထားခြင်း မရှိပါ။"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"ဆဲလ်လူလာ ကွန်ရက် မရှိပါ။"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ခေါ်ဆိုမှု ပြုလုပ်ရန်အတွက် မှန်ကန်သည့်နံပါတ်တစ်ခုကို ထည့်ပါ။"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"ခေါ်ဆို၍မရပါ။"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI အစီအစဉ် စတင်နေသည်..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"ဝန်ဆောင်မှုအား ပံ့ပိုးမထားပါ။"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ခေါ်ဆိုမှုများကို လှည့်ပြောင်း၍မရပါ။"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ခေါ်ဆိုမှုကို ခွဲခြား၍မရပါ။"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"မလွှဲပြောင်းနိုင်ပါ။"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"အစည်းအဝေးခေါ်ဆိုမှု ပြုလုပ်၍မရပါ။"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ခေါ်ဆိုမှုကို ငြင်းဆို၍မရပါ။"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ခေါ်ဆိုမှု(များ) ကို လွှတ်၍မရပါ။"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP ခေါ်ဆိုမှု"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"အရေးပေါ် ခေါ်ဆိုမှု"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ရေဒီယို ဖွင့်နေသည်…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"ချိတ်ဆက်မှု ဧရိယာပြင်ပရောက်နေပါသည်။ ထပ်စမ်းကြည့်ပါ..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"ခေါ်ဆို၍မရနိုင်ပါ။ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> သည်အရေးပေါ်နံပါတ်တစ်ခု မဟုတ်ပါ။"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"ခေါ်ဆို၍မရနိုင်ပါ။ အရေးပေါ်နံပါတ်တစ်ခုကို ခေါ်ဆိုပါ။"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ခေါ်ဆိုရန် ကီးဘုတ်ကိုအသုံးပြုပါ"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"ခေါ်ဆိုမှု ခေတ္တရပ်ထားပါ"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ခေါ်ဆိုမှုကို ဆက်လုပ်ပါ"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ခေါ်ဆိုမှု အပြီးသတ်ပါ"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"နံပါတ်အကွက် ပြပါ"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"နံပါတ်အကွက် ဝှက်ထားပါ"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"အသံပိတ်ပါ"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"အသံပြန်ဖွင့်ပါ"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ခေါ်ဆိုမှုထည့်ပါ"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ခေါ်ဆိုမှုများကို ပေါင်းစည်းပါ"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"ဖလှယ်ပါ"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ခေါ်ဆိုမှုများကို စီမံခန့်ခွဲပါ"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"အစည်းအဝေးခေါ်ဆိုမှုကို စီမံခန့်ခွဲပါ"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"မျက်နှာစုံညီစည်းဝေး ဖုန်းခေါ်ဆိုမှု"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"စီမံခန့်ခွဲပါ"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"အသံ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ဗီဒီယို ခေါ်ဆိုမှု"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"အသံခေါ်ဆိုမှုသို့ ပြောင်းပါ"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ကင်မရာပြောင်းပါ"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ဗီဒီယို ခေတ္တရပ်ပါ"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"နောက်ထပ် ရွေးစရာများ"</string>
+ <string name="player_started" msgid="3478865572468310331">"ပလေယာ စပါပြီ"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"ပလေယာ ရပ်တန့်သွားပါပြီ"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ကင်မရာအဆင်သင့် မဖြစ်သေးပါ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ကင်မရာအဆင်သင့်ဖြစ်ပါပြီ"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"အမျိုးအမည်မသိ ခေါ်ဆိုမှုအချိန်ကာလ"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"ဝန်ဆောင်မှု"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"စနစ်ထည့်သွင်းမှုပြုလုပ်ပါ"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;မသတ်မှတ်ထားပါ&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"အခြားခေါ်ဆိုမှုဆက်တင်များ"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> မှတစ်ဆင့် ခေါ်ဆိုခြင်း"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> မှတစ်ဆင့်အဝင်ခေါ်ဆိုမှု"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"အဆက်အသွယ်ဓာတ်ပုံ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"တသီးတသန့်ချိတ်ဆက်ရန်"</string>
+ <string name="selectContact" msgid="92191462970821951">"လိပ်စာရွေးပါ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"သင့်ကိုယ်ပိုင် စာသား ရေးပါ..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"မလုပ်တော့"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ပို့ပါ"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"ဖြေကြားပါ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS ပို့ပါ"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ငြင်းပယ်ပါ"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ဗီဒီယိုခေါ်ဆိုမှုအဖြစ် ဖြေကြားပါ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"အသံခေါ်ဆိုမှုအဖြစ် ဖြေကြားပါ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ဗီဒီယိုခေါ်ဆိုမှုကို လက်ခံပါ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ဗီဒီယိုခေါ်ဆိုမှုကို ငြင်းပယ်ပါ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ဗီဒီယိုထုတ်လွှင့်ခြင်းတောင်းဆိုမှုကို လက်ခံပါ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ဗီဒီယိုထုတ်လွှင့်ခြင်းတောင်းဆိုမှုကို ငြင်းပယ်ပါ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ဗီဒီယိုလက်ခံရရှိမှုတောင်းဆိုချက်ကို လက်ခံပါ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ဗီဒီယိုလက်ခံရရှိကြောင်းတောင်းဆိုမှုကို ငြင်းပယ်ပါ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အပေါ်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ဘယ်ဖက်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် ညာဖက်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> အတွက် အောက်ကို ပွတ်ဆွဲပါ"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"တုန်ခါပါ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"တုန်ခါပါ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"အသံ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"မူရင်း အသံ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ဖုန်းမြည်သံ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"ဖုန်းမြည်စဉ် တုန်ခါပါ"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"ဖုန်းမြည်သံ &amp; တုန်ခါသံ"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"အစည်းအဝေးခေါ်ဆိုမှုကို စီမံခန့်ခွဲပါ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"အရေးပေါ်နံပါတ်"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> စက္ကန့်</item>
+ <item quantity="one">၁ စက္ကန့်</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> မိနစ်</item>
+ <item quantity="one"> ၁ မိနစ်</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> နာရီ</item>
+ <item quantity="one">၁ နာရီ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"ပရိုဖိုင် ဓာတ်ပုံ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ကင်မရာ ပိတ်ပါ"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> မှတစ်ဆင့်"</string>
+ <string name="note_sent" msgid="7623014827902758398">"မှတ်ချက်ကို ပို့လိုက်ပါပြီ"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"မကြာသေးမီက မက်ဆေ့ဂျ်များ"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"စီးပွားရေး အချက်အလက်"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> မိုင်အကွာ"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> ကီလိုမီတာအကွာ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>၊ <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>၊ <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"မနက်ဖြန် <xliff:g id="OPEN_TIME">%s</xliff:g> ၌ဖွင့်မည်"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ယနေ့ <xliff:g id="OPEN_TIME">%s</xliff:g> ၌ဖွင့်မည်"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ၌ပိတ်ပါမည်"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ယနေ့ <xliff:g id="CLOSE_TIME">%s</xliff:g> ၌ပိတ်ခဲ့သည်"</string>
+ <string name="open_now" msgid="4615706338669555999">"ယခုဖွင့်ပါ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ယခုပိတ်ပါ"</string>
+</resources>
diff --git a/InCallUI/res/values-nb/strings.xml b/InCallUI/res/values-nb/strings.xml
new file mode 100644
index 000000000..f919105e8
--- /dev/null
+++ b/InCallUI/res/values-nb/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"På vent"</string>
+ <string name="unknown" msgid="3646075119047488748">"Ukjent"</string>
+ <string name="private_num" msgid="6081418498487514686">"Skjult nummer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefonkiosk"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferansesamtale"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Anropet ble avbrutt"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Høyttaler"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Telefonhøyttaler"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Hodetelefoner med kabel"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Vil du sende disse lydene?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Sender lydene\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Send"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ja"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nei"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Erstatt jokertegn med"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferansesamtale <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Nummeret til talepostkassen"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Ringer"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ringer på nytt"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferansesamtale"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Innkommende anrop"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Innkommende jobbanrop"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Anropet er avsluttet"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"På vent"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Legger på"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Anrop pågår"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Nummeret mitt er <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Kobler til video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videoanrop"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Ber om video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Kan ikke koble til videoanropet"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videoforespørselen er avvist"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Tilbakeringingsnummeret ditt\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Tilbakeringingsnummeret ditt for nødstilfeller\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Ringer"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Tapt anrop"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Tapte anrop"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> tapte anrop"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Tapt anrop fra <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Pågående anrop"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Pågående jobbanrop"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Pågående Wi-Fi-anrop"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Pågående jobbanrop via Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"På vent"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Innkommende anrop"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Innkommende jobbanrop"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Innkommende Wi-Fi-anrop"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Innkommende jobbanrop via Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Innkommende videoanrop"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Innkommende videoforespørsel"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Ny talepost"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Ny talepost (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nummeret til talepostkassen er ukjent"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ingen tjeneste"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Det valgte nettverket (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) er ikke tilgjengelig"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Svar"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Legg på"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Uten video"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Godta"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Avvis"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Ring tilbake"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Melding"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"For å ringe, slå av flymodus først."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ikke registrert på nettverket."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilnettverket er ikke tilgjengelig."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"For å ringe, skriv inn et gyldig nummer."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Kan ikke ringe."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Starter MMI-sekvens …"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Tjenesten støttes ikke."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Kan ikke bytte samtaler."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Kan ikke splitte opp anropet."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Kan ikke overføre."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Kan ikke opprette konferanse."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Kan ikke avvise anropet."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Kan ikke frigjøre samtale(r)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-anrop"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Nødanrop"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Slår på radioen …"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ingen tjeneste. Prøver på nytt …"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Kan ikke ringe. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> er ikke et nødnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Kan ikke ringe. Ring et nødnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Bruk tastaturet for å ringe"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Sett anropet på vent"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Gjenoppta anropet"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Avslutt anropet"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Vis tastaturet"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Skjul tastaturet"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Slå av lyden"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Slå på lyden"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Legg til anrop"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Slå sammen anrop"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Bytt"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Administrer anrop"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Administrer konferansesamtale"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferansesamtale"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Administrer"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Lyd"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videoanrop"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Bytt til taleanrop"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Bytt kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Sett videoen på pause"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Flere alternativer"</string>
+ <string name="player_started" msgid="3478865572468310331">"Avspilleren har startet"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Avspilleren har stoppet"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kameraet er ikke klart"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kameraet er klart"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Ukjent anrop"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Tjeneste"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Konfigurering"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ikke angitt&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Andre anropsinnstillinger"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Ringer via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Innkommende via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontaktbilde"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"aktivér privat samtale"</string>
+ <string name="selectContact" msgid="92191462970821951">"velg kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Skriv ditt eget"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Avbryt"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Send"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Svar"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Send SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Avslå"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Svar med video"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Svar uten video"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Godta videoforespørselen"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Avslå videoforespørselen"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Godta forespørselen om å sende video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Avslå forespørselen om å sende video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Godta forespørselen om å motta video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Avslå forespørselen om å motta video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Dra opp for <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Dra til venstre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Dra til høyre for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Dra ned for å <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrering"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrering"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Lyd"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Standardlyd (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefonringelyd"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrer når telefonen ringer"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringelyd og vibrering"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Administrer konferansesamtale"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Nødnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ <item quantity="one">1 sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutter</item>
+ <item quantity="one">1 minutt</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> timer</item>
+ <item quantity="one">1 time</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilbilde"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kameraet er slått av"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Notatet er sendt"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nylige meldinger"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informasjon om bedriften"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mile unna"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km unna"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Åpner i morgen kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Åpner i dag kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Stenger kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Stengte i dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Åpen nå"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Stengt nå"</string>
+</resources>
diff --git a/InCallUI/res/values-ne-rNP/strings.xml b/InCallUI/res/values-ne-rNP/strings.xml
new file mode 100644
index 000000000..d5eb353fa
--- /dev/null
+++ b/InCallUI/res/values-ne-rNP/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"फोन"</string>
+ <string name="onHold" msgid="527593602772521700">"होल्डमा"</string>
+ <string name="unknown" msgid="3646075119047488748">"अज्ञात"</string>
+ <string name="private_num" msgid="6081418498487514686">"निजी नम्बर"</string>
+ <string name="payphone" msgid="5743050584468748607">"पेफोन"</string>
+ <string name="confCall" msgid="3181961445236675173">"सम्मेलन कल"</string>
+ <string name="call_lost" msgid="8208184291640961172">"कल ड्रप भयो"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"स्पिकर"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"हेन्डसेट इयरपिस"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"तारसहितको हेडसेट"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ब्लुटुथ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"निम्न टोनहरू पठाउने हो?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"टोनहरू\n पठाउँदै"</string>
+ <string name="send_button" msgid="4054398309483035794">"पठाउनुहोस्"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"हो"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"होइन"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"यसलाई वाइल्ड क्यारेक्टर राखेर बदल्नुहोस्"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"सम्मेलन कल <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"भ्वाइस मेल नम्बर"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"डायल गर्दै"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"पुन: डायल गर्दै"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"सम्मेलन कल"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"आगमन कल"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"कार्यालयबाट आएको कल"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"कल अन्त्य भयो"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"होल्डमा छ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"फोन काट्दै"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"कलमा"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"मेरो नम्बर <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> हो"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"भिडियो जडान गरिँदै"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"भिडियो कल"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"भिडियोका लागि अनुरोध गर्दै"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"भिडियो कलमा जडान गर्न सक्दैन"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"भिडियो अनुरोध अस्वीकार गरियो"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"तपाईंको कलब्याक नम्बर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"तपाईंको आपतकालीन कलब्याक नम्बर\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"डायल गर्दै"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"छुटेको कल"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"छुटेका कलहरू"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> छुटेका कलहरू"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> बाट आएको छुटेको कल"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"चलिरहेको कल"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"चालु रहेको कार्यालयको कल"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"चालु रहेको WI-Fi कल"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Wi-Fi मार्फत चालु रहेको कार्यालयको कल"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"होल्डमा"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"आगमन कल"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"कार्यालयबाट आएको कल"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"आगमन Wi-Fi कल"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Wi-Fi मार्फत कार्यालयबाट आएको कल"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"आगमन भिडियो कल"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"आगमन भिडियो अनुरोध"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"नयाँ भ्वाइस मेल"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"नयाँ भ्वाइसमेल (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> मा डायल गर्नुहोस्"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"भ्वाइस मेल नम्बर अज्ञात छ"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"कुनै सेवा छैन"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"चयन गरिएको नेटवर्क (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) अनुपलब्ध छ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"जवाफ दिनुहोस्"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"राख्नुहोस्"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"भिडियो"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"आवाज"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"स्वीकार गर्नुहोस्"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"खारेज गर्नुहोस्"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"कल फर्काउने"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"सन्देश"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"कल गर्नका लागि, पहिले हवाइजहाज मोड बन्द गर्नुहोस्।"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"नेटवर्कमा दर्ता भएको छैन।"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"सेलुलर नेटवर्क उपलब्ध छैन।"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"एक कल गर्नको लागि, मान्य नम्बर प्रविष्ट गर्नुहोस्।"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"कल गर्न सकिंदैन।"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI अनुक्रम सुरु गर्दै..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"सेवा समर्थित छैन।"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"कल स्विच गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"कल अलग गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ट्रान्सफर गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"सम्मेलन गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"कल अस्वीकार गर्न सक्दैन।"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"कल (हरू) जारी गर्न सकिंदैन।"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP कल"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"आपतकालीन कल"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"रेडियो खोल्दै..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"कुनै सेवा छैन। फेरि प्रयास गर्दै..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"कल गर्न सकिंदैन। <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> आपतकालीन नम्बर होइन।"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"कल गर्न सकिंदैन। आपतकालीन नम्बर डायल गर्नुहोस्।"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"डायल गर्न किबोर्ड प्रयोग गर्नुहोस्"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"कललाई होल्ड गर्नुहोस्"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"कललाई पुन: निरन्तरता दिनुहोस्"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"कल अन्त्य गर्नुहोस्"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"डायलप्याड देखाउनुहोस्"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"डायलप्याड लुकाउनुहोस्"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"मौन"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"अनम्यूट गर्नुहोस्"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"कल थप्नुहोस्"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"कलहरू मर्ज गर्नुहोस्"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"स्वाप"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"कलहरूको प्रबन्ध मिलाउनुहोस्"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"सम्मेलन कलको प्रबन्ध मिलाउनहोस्"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"सम्मेलन कल"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"व्यवस्थापन गर्नुहोस्"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"अडियो"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"भिडियो कल"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"आवाज कलमा परिवर्तन गर्नुहोस्"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"क्यामेरा स्विच गर्नुहोस्"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"भिडियो रोक्नुहोस्"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"थप विकल्पहरू"</string>
+ <string name="player_started" msgid="3478865572468310331">"प्लेयर सुरु भयो"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"प्लेयर रोकियो"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"क्यामेरा तयार छैन"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"क्यामेरा तयार छ"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"अज्ञात कल सत्र घटना"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"सेवा"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"सेटअप"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;सेट गरिएको छैन&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"अन्य कल सेटिङहरू"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> मार्फत कल गर्दै"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> मार्फत आगमन"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"सम्पर्क तस्बिर"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"निजी कलमा जानुहोस्"</string>
+ <string name="selectContact" msgid="92191462970821951">"सम्पर्क चयन गर्नुहोस्"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"तपाईंको आफ्नै लेख्नुहोस्..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"रद्द गर्नुहोस्"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"पठाउनुहोस्"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"जवाफ दिनुहोस्"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS पठाउनुहोस्"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"अस्वीकार गर्नुहोस्"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"भिडियो कलको रूपमा जवाफ दिनुहोस्"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"अडियो कलको रूपमा जवाफ दिनुहोस्"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"भिडियो अनुरोध स्वीकार गर्नुहोस्"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"भिडियो अनुरोध अस्वीकार गर्नुहोस्"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"भिडियो प्रसारण गर्ने अनुरोध स्वीकार गर्नुहोस्"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"भिडियो प्रसारण गर्ने अनुरोध अस्वीकार गर्नुहोस्"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"भिडियो प्राप्त गर्ने अनुरोधलाई स्वीकार गर्नुहोस्"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"भिडियो प्राप्त गर्ने अनुरोध अस्वीकार गर्नुहोस्"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि माथि स्लाइड गर्नुहोस्।"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि बायाँ स्लाइड गर्नुहोस्।"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि दायाँ स्लाइड गर्नुहोस्।"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> को लागि तल स्लाइड गर्नुहोस्।"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"कम्पन हुने"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"कम्पन हुने"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"आवाज"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"पूर्वनिर्धारित ध्वनि (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"फोनको रिङटोन"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"घन्टी बज्दा कम्पन गराउनुहोस्"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"रिङटोन &amp; कम्पन"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"सम्मेलन कलको प्रबन्ध मिलाउनुहोस्"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"आपतकालीन नम्बर"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> सेकेण्ड</item>
+ <item quantity="one">१ सेकेण्ड</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> मिनेट</item>
+ <item quantity="one">१ मिनेट</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> घण्टा</item>
+ <item quantity="one">१ घण्टा</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"प्रोफाइल तस्बिर"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"क्यामेरा बन्द छ"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> बाट"</string>
+ <string name="note_sent" msgid="7623014827902758398">"नोट पठाइयो"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"भर्खरैका सन्देशहरू"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"व्यवसाय बारे जानकारी"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> माइल टाढा"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> किलोमिटर टाढा"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"भोलि <xliff:g id="OPEN_TIME">%s</xliff:g> मा खुल्छ"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"आज <xliff:g id="OPEN_TIME">%s</xliff:g> मा खुल्छ"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> मा बन्द हुन्छ"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"आज <xliff:g id="CLOSE_TIME">%s</xliff:g> मा बन्द भयो"</string>
+ <string name="open_now" msgid="4615706338669555999">"अहिले खुला छ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"अब बन्द भयो"</string>
+</resources>
diff --git a/InCallUI/res/values-nl/strings.xml b/InCallUI/res/values-nl/strings.xml
new file mode 100644
index 000000000..eeb17b6fc
--- /dev/null
+++ b/InCallUI/res/values-nl/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefoon"</string>
+ <string name="onHold" msgid="527593602772521700">"In de wacht"</string>
+ <string name="unknown" msgid="3646075119047488748">"Onbekend"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privénummer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Betaaltelefoon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Telefonische vergadering"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Oproep beëindigd"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Luidspreker"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Oortelefoon van handset"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Bedrade headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"De volgende tonen verzenden?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Nummers verzenden\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Verzenden"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ja"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nee"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Jokerteken vervangen door"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Telefonische vergadering <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Voicemailnummer"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Kiezen"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Opnieuw bellen"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Telefonische vergadering"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Inkomende oproep"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Inkom. zakelijke oproep"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Oproep beëindigd"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"In de wacht"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Ophangen"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"In gesprek"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mijn nummer is <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Verbinding maken met video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videogesprek"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Video aanvragen"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Kan geen videogesprek starten"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videoverzoek geweigerd"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Je terugbelnummer\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Je terugbelnummer bij alarm\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Kiezen"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Gemiste oproep"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Gemiste oproepen"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepen"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Gemiste oproep van <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Actieve oproep"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Actieve zakelijke oproep"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Actieve wifi-oproep"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Actieve zakelijke oproep via wifi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"In de wacht"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Inkomende oproep"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Inkomende zakelijke oproep"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Inkomende wifi-oproep"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Inkomende zakelijke oproep via wifi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Inkomend videogesprek"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Inkomend videoverzoek"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nieuwe voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nieuwe voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> bellen"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Voicemailnummer onbekend"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Geen service"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Geselecteerd netwerk (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) niet beschikbaar"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Beantwoorden"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Ophangen"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Spraak"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Accepteren"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Sluiten"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Terugbellen"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Bericht"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Als je wilt bellen, moet je eerst de vliegtuigmodus uitschakelen."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Niet geregistreerd op netwerk."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobiel netwerk niet beschikbaar."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Als je wilt bellen, moet je een geldig nummer invoeren."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Kan niet bellen."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI-reeks starten..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service wordt niet ondersteund."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Kan niet schakelen tussen oproepen."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Kan oproep niet scheiden."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Kan niet doorschakelen."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Telefonische vergadering niet mogelijk."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Kan oproep niet weigeren."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Kan oproep(en) niet vrijgeven."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-oproep"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Noodoproep"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Radio inschakelen…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Geen bereik. Opnieuw proberen…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Kan niet bellen. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> is geen alarmnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Kan niet bellen. Bel een alarmnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Toetsen gebruiken om te bellen"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Oproep in de wacht zetten"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Oproep hervatten"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Oproep beëindigen"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Toetsenblok weergeven"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Toetsenblok verbergen"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Dempen"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Dempen opheffen"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Oproep toevoegen"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Samenvoegen"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Wisselen"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Oproepen beheren"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Telef. vergadering beheren"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Telefonische vergadering"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Beheren"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Vid.gespr."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Wijzigen in spraakoproep"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Van camera wisselen"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Video onderbreken"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Meer opties"</string>
+ <string name="player_started" msgid="3478865572468310331">"Speler gestart"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Speler gestopt"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Camera niet gereed"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Camera gereed"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Onbekende oproepsessiegebeurtenis"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Service"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuratie"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Niet ingesteld&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Andere instellingen voor bellen"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Bellen via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Inkomend via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"contactfoto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"privé"</string>
+ <string name="selectContact" msgid="92191462970821951">"contact selecteren"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Eigen reactie opstellen..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Annuleren"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Verzenden"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Beantwoorden"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Sms verzenden"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Weigeren"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Beantwoorden als videogesprek"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Beantwoorden als audiogesprek"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Videoverzoek accepteren"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Videoverzoek weigeren"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Verzoek voor video-overdracht accepteren"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Verzoek voor video-overdracht weigeren"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Verzoek voor video-ontvangst accepteren"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Verzoek voor video-ontvangst weigeren"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Veeg omhoog voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Veeg naar links voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Veeg naar rechts voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Veeg omlaag voor <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Trillen"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Trillen"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Geluid"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Standaardgeluid (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Beltoon telefoon"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Trillen bij bellen"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Beltoon en trillen"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Telefonische vergadering beheren"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Alarmnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> seconden</item>
+ <item quantity="one">1 seconde</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuten</item>
+ <item quantity="one">1 minuut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> uur</item>
+ <item quantity="one">1 uur</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profielfoto"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Camera uit"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Notitie verzonden"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Recente berichten"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Bedrijfsinformatie"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mijl hiervandaan"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km hiervandaan"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Gaat morgen open om <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Gaat vandaag open om <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Sluit om <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Vandaag gesloten vanaf <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Nu geopend"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Nu gesloten"</string>
+</resources>
diff --git a/InCallUI/res/values-pa-rIN/strings.xml b/InCallUI/res/values-pa-rIN/strings.xml
new file mode 100644
index 000000000..93464c9fc
--- /dev/null
+++ b/InCallUI/res/values-pa-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ਫੋਨ"</string>
+ <string name="onHold" msgid="527593602772521700">"ਰੋਕੀ ਗਈ"</string>
+ <string name="unknown" msgid="3646075119047488748">"ਅਗਿਆਤ"</string>
+ <string name="private_num" msgid="6081418498487514686">"ਨਿੱਜੀ ਨੰਬਰ"</string>
+ <string name="payphone" msgid="5743050584468748607">"ਪੇ-ਫੋਨ"</string>
+ <string name="confCall" msgid="3181961445236675173">"ਕਾਨਫਰੰਸ ਕਾਲ"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ਕਾਲ ਡ੍ਰੌਪ ਹੋਈ"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ਸਪੀਕਰ"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ਹੈੱਡਸੈੱਟ ਈਯਰਪੀਸ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"ਵਾਇਰ ਵਾਲਾ ਹੈੱਡਸੈੱਟ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"ਬਲੂਟੁੱਥ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"ਕੀ ਅੱਗੇ ਦਿੱਤੀਆਂ ਗਈਆਂ ਧੁਨੀਆਂ ਭੇਜਣੀਆਂ ਹਨ?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ਧੁਨੀਆਂ ਭੇਜੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ਭੇਜੋ"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ਹਾਂ"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"ਨਹੀਂ"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"ਵਾਈਲਡ ਅੱਖਰ ਨੂੰ ਇਸ ਨਾਲ ਬਦਲੋ"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"ਕਾਨਫਰੰਸ ਕਾਲ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"ਵੌਇਸਮੇਲ ਨੰਬਰ"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"ਦੁਬਾਰਾ ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"ਕਾਨਫਰੰਸ ਕਾਲ"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ਆ ਰਹੀ ਕਾਲ"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ਕੰਮ ਸੰਬੰਧਿਤ ਆ ਰਹੀ ਕਾਲ"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ਕਾਲ ਸਮਾਪਤ ਹੋਈ"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ਰੋਕੀ ਗਈ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"ਰੋਕੀ ਜਾ ਰਹੀ ਹੈ"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"ਚਾਲੂ ਕਾਲ"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"ਮੇਰਾ ਨੰਬਰ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g> ਹੈ"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ਵੀਡੀਓ ਨੂੰ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ਵੀਡੀਓ ਕਾਲ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ਵੀਡੀਓ ਲਈ ਬੇਨਤੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ਵੀਡੀਓ ਕਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ਵੀਡੀਓ ਬੇਨਤੀ ਅਸਵੀਕਾਰ ਕੀਤੀ ਗਈ"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"ਤੁਹਾਡਾ ਕਾਲਬੈਕ ਨੰਬਰ \n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"ਤੁਹਾਡਾ ਐਮਰਜੈਂਸੀ ਕਾਲਬੈਕ ਨੰਬਰ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ਡਾਇਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"ਖੁੰਝੀ ਹੋਈ ਕਾਲ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"ਖੁੰਝੀਆਂ ਹੋਈਆਂ ਕਾਲਾਂ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ਖੁੰਝੀਆਂ ਹੋਈਆਂ ਕਾਲਾਂ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> ਤੋਂ ਖੁੰਝੀ ਹੋਈ ਕਾਲ"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"ਜਾਰੀ ਕਾਲ"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"ਕੰਮ ਸੰਬੰਧਿਤ ਜਾਰੀ ਕਾਲ"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"ਜਾਰੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"ਕੰਮ ਸੰਬੰਧਿਤ ਜਾਰੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ਰੋਕੀ ਗਈ"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ਆ ਰਹੀ ਕਾਲ"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ਕੰਮ ਸੰਬੰਧਿਤ ਆ ਰਹੀ ਕਾਲ"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ਆ ਰਹੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ਕੰਮ ਸੰਬੰਧਿਤ ਆ ਰਹੀ Wi-Fi ਕਾਲ"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ਆ ਰਹੀ ਵੀਡੀਓ ਕਾਲ"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ਆ ਰਹੀ ਵੀਡੀਓ ਬੇਨਤੀ"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"ਨਵੀਂ ਵੌਇਸਮੇਲ"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"ਨਵੀਂ ਵੌਇਸਮੇਲ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ਡਾਇਲ ਕਰੋ"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ਵੌਇਸਮੇਲ ਨੰਬਰ ਅਗਿਆਤ"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"ਚੁਣਿਆ ਗਿਆ ਨੈੱਟਵਰਕ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"ਜਵਾਬ ਦਿਓ"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"ਰੋਕੋ"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ਵੀਡੀਓ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"ਵੌਇਸ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ਰੱਦ ਕਰੋ"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"ਵਾਪਸ ਕਾਲ ਕਰੋ"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"ਸੁਨੇਹਾ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਜਹਾਜ਼ ਮੋਡ ਬੰਦ ਕਰੋ।"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ਨੈੱਟਵਰਕ \'ਤੇ ਰਜਿਸਟਰ ਨਹੀਂ।"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ਇੱਕ ਕਾਲ ਕਰਨ ਲਈ, ਇੱਕ ਵੈਧ ਨੰਬਰ ਦਾਖਲ ਕਰੋ।"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI ਕੜੀ ਨੂੰ ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"ਸੇਵਾ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ਕਾਲਾਂ ਸਵਿੱਚ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ।"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ਵੱਖਰੇ ਤੌਰ \'ਤੇ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ਕਾਲ ਟ੍ਰਾਂਸਫਰ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"ਕਾਨਫਰੰਸ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ਕਾਲ ਰੱਦ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ਕਾਲ(ਲਾਂ) ਰੀਲੀਜ਼ ਨਹੀਂ ਕੀਤੀਆਂ ਜਾ ਸਕਦੀਆਂ।"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP ਕਾਲ"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"ਐਮਰਜੈਂਸੀ ਕਾਲ"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ਰੇਡੀਓ ਚਾਲੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"ਕੋਈ ਸੇਵਾ ਨਹੀਂ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ਇੱਕ ਐਮਰਜੈਂਸੀ ਨੰਬਰ ਨਹੀਂ ਹੈ।"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਇੱਕ ਐਮਰਜੈਂਸੀ ਨੰਬਰ ਡਾਇਲ ਕਰੋ।"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ਡਾਇਲ ਕਰਨ ਲਈ ਕੀ-ਬੋਰਡ ਵਰਤੋ"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"ਕਾਲ ਰੋਕੋ"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ਕਾਲ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ਕਾਲ ਸਮਾਪਤ ਕਰੋ"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ਡਾਇਲਪੈਡ ਵਿਖਾਓ"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ਡਾਇਲਪੈਡ ਲੁਕਾਓ"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ਮਿਊਟ ਕਰੋ"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ਅਣਮਿਊਟ ਕਰੋ"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ਕਾਲ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ਕਾਲਾਂ ਸ਼ਾਮਲ ਕਰੋ"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"ਅਦਲਾ-ਬਦਲੀ ਕਰੋ"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ਕਾਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"ਕਾਨਫਰੰਸ ਕਾਲ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"ਕਾਨਫਰੰਸ ਕਾਲ"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ਔਡੀਓ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ਵੀਡੀਓ ਕਾਲ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"ਵੌਇਸ ਕਾਲ ਵਿੱਚ ਬਦਲੋ"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"ਕੈਮਰੇ \'ਤੇ ਬਦਲੋ"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ਵੀਡੀਓ ਰੋਕੋ"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"ਹੋਰ ਚੋਣਾਂ"</string>
+ <string name="player_started" msgid="3478865572468310331">"ਪਲੇਅਰ ਸ਼ੁਰੂ ਹੋ ਗਿਆ"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"ਪਲੇਅਰ ਰੁਕ ਗਿਆ"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"ਕੈਮਰਾ ਤਿਆਰ ਨਹੀਂ ਹੈ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"ਕੈਮਰਾ ਤਿਆਰ ਹੈ"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"ਅਗਿਆਤ ਕਾਲ ਸੈਸ਼ਨ ਵਰਤਾਰਾ"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"ਸੇਵਾ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"ਸਥਾਪਨਾ"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;ਸੈੱਟ ਨਹੀਂ&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"ਹੋਰ ਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ਰਾਹੀਂ ਕਾਲ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ਰਾਹੀਂ ਆ ਰਹੀਆਂ ਕਾਲਾਂ"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"ਸੰਪਰਕ ਫੋਟੋ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ਨਿੱਜੀ ਵਿੱਚ ਬਦਲੋ"</string>
+ <string name="selectContact" msgid="92191462970821951">"ਸੰਪਰਕ ਚੁਣੋ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"ਆਪਣੇ ਆਪ ਲਿਖੋ..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"ਰੱਦ ਕਰੋ"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ਭੇਜੋ"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"ਜਵਾਬ ਦਿਓ"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS ਭੇਜੋ"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ਵੀਡੀਓ ਕਾਲ ਵਜੋਂ ਜਵਾਬ ਦਿਓ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ਔਡੀਓ ਕਾਲ ਵਜੋਂ ਜਵਾਬ ਦਿਓ"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ਵੀਡੀਓ ਬੇਨਤੀ ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ਵੀਡੀਓ ਬੇਨਤੀ ਨੂੰ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ਵੀਡੀਓ ਟ੍ਰਾਂਸਮਿਟ ਬੇਨਤੀ ਨੂੰ ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ਵੀਡੀਓ ਟ੍ਰਾਂਸਮਿਟ ਬੇਨਤੀ ਨੂੰ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਨੂੰ ਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ਵੀਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਬੇਨਤੀ ਨੂੰ ਅਸਵੀਕਾਰ ਕਰੋ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਉੱਤੇ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਖੱਬੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਸੱਜੇ ਪਾਸੇ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ਲਈ ਹੇਠਾਂ ਸਲਾਈਡ ਕਰੋ।"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ਥਰਥਰਾਹਟ ਕਰੋ"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ਥਰਥਰਾਹਟ ਕਰੋ"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ਧੁਨੀ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਧੁਨੀ (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ਫੋਨ ਰਿੰਗਟੋਨ"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"ਘੰਟੀ ਵੱਜਣ \'ਤੇ ਥਰਥਰਾਹਟ ਕਰੋ"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"ਰਿੰਗਟੋਨ ਅਤੇ ਥਰਥਰਾਹਟ"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"ਕਾਨਫਰੰਸ ਕਾਲ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"ਐਮਰਜੈਂਸੀ ਨੰਬਰ"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਸਕਿੰਟ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਮਿੰਟ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ਘੰਟੇ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"ਪ੍ਰੋਫਾਈਲ ਫੋਟੋ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ਕੈਮਰਾ ਬੰਦ ਹੈ"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ਰਾਹੀਂ"</string>
+ <string name="note_sent" msgid="7623014827902758398">"ਨੋਟ-ਕਥਨ ਭੇਜਿਆ ਗਿਆ"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ਹਾਲੀਆ ਸੁਨੇਹੇ"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ਵਪਾਰ ਜਾਣਕਾਰੀ"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> ਮੀਲ ਦੂਰ"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> ਕਿ.ਮੀ. ਦੂਰ"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"ਕੱਲ੍ਹ <xliff:g id="OPEN_TIME">%s</xliff:g> ਵਜੇ ਖੁੱਲ੍ਹੇਗਾ"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ਅੱਜ <xliff:g id="OPEN_TIME">%s</xliff:g> ਵਜੇ ਖੁੱਲ੍ਹੇਗਾ"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> ਵਜੇ ਬੰਦ ਹੋਵੇਗਾ"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ਅੱਜ <xliff:g id="CLOSE_TIME">%s</xliff:g> ਵਜੇ ਬੰਦ ਹੋਇਆ"</string>
+ <string name="open_now" msgid="4615706338669555999">"ਹੁਣ ਖੁੱਲ੍ਹਾ ਹੈ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ਹੁਣ ਬੰਦ ਹੈ"</string>
+</resources>
diff --git a/InCallUI/res/values-pl/strings.xml b/InCallUI/res/values-pl/strings.xml
new file mode 100644
index 000000000..bdb6aba1c
--- /dev/null
+++ b/InCallUI/res/values-pl/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Wstrzymane"</string>
+ <string name="unknown" msgid="3646075119047488748">"Nieznany"</string>
+ <string name="private_num" msgid="6081418498487514686">"Numer prywatny"</string>
+ <string name="payphone" msgid="5743050584468748607">"Automat telefoniczny"</string>
+ <string name="confCall" msgid="3181961445236675173">"Połączenie konferencyjne"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Połączenie przerwane"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Głośnik"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Słuchawka telefonu"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Przewodowy zestaw słuchawkowy"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Wysłać te tony?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Wysyłanie tonów\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Wyślij"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Tak"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nie"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Zastąp symbol wieloznaczny"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Połączenie konferencyjne: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Numer poczty głosowej"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Wybieranie"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ponowne wybieranie numeru"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Połączenie konferencyjne"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Połączenie przychodzące"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Przychodzące połączenie służbowe"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Połączenie zakończone"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Wstrzymane"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Rozłączanie"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Trwa połączenie"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mój numer to <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Rozpoczynanie rozmowy wideo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Rozmowa wideo"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Wysyłanie żądania wideo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Nie można nawiązać połączenia wideo"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Żądanie wideo zostało odrzucone"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Twój numer oddzwaniania\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Twój numer oddzwaniania dla połączeń alarmowych\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Wybieranie"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Nieodebrane połączenie"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Nieodebrane połączenia"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Nieodebrane połączenia: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Nieodebrane połączenie od: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Trwa połączenie"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Trwa połączenie służbowe"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Trwa połączenie przez Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Trwa połączenie służbowe przez Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Wstrzymane"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Połączenie przychodzące"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Przychodzące połączenie służbowe"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Przychodzące połączenie przez Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Przychodzące połączenie służbowe przez Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Przychodząca rozmowa wideo"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Przychodzące żądanie wideo"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nowa poczta głosowa"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nowa poczta głosowa (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Wybierz numer <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nieznany numer poczty głosowej"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Brak usługi"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Wybrana sieć (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) jest niedostępna"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Odbierz"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Rozłącz"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Wideo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Głos"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Zaakceptuj"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Odrzuć"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Oddzwoń"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Wyślij SMS-a"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Aby rozpocząć połączenie, wyłącz najpierw tryb samolotowy."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Nie zarejestrowano w sieci."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Sieć komórkowa jest niedostępna."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Aby zadzwonić, wybierz prawidłowy numer."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Nie można dzwonić."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Rozpoczynam sekwencję MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Usługa nie jest obsługiwana."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Nie można przełączyć połączeń."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Nie można rozdzielić połączenia."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Nie można przekazać."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Nie można nawiązać połączenia konferencyjnego."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Nie można odrzucić połączenia."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Nie można zwolnić połączeń."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Połączenie SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Połączenie alarmowe"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Włączam radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Brak sieci. Próbuję ponownie…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Nie można dzwonić. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nie jest numerem alarmowym."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Nie można dzwonić. Wybierz numer alarmowy."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Aby zadzwonić, użyj klawiatury"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Wstrzymaj połączenie"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Wznów połączenie"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Zakończ połączenie"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Pokaż klawiaturę"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ukryj klawiaturę"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Wycisz"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Wyłącz wyciszenie"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Dodaj połączenie"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Scal połączenia"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Przełącz"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Zarządzaj połączeniami"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Zarządzaj połączeniem konferencyjnym"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Połączenie konferencyjne"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Zarządzaj"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Dźwięk"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Rozmowa wideo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Zmień na połączenie głosowe"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Przełącz kamerę"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Wstrzymaj wideo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Więcej opcji"</string>
+ <string name="player_started" msgid="3478865572468310331">"Odtwarzacz włączony"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Odtwarzacz zatrzymany"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera niegotowa"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera gotowa"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Nieznane zdarzenie sesji połączenia"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Usługa"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Konfiguracja"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nie ustawiono&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Inne ustawienia połączeń"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Nawiązywanie połączenia przez <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Przychodzące z sieci <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"zdjęcie kontaktu"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"przejdź do rozmowy prywatnej"</string>
+ <string name="selectContact" msgid="92191462970821951">"wybierz kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napisz własną..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Anuluj"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Wyślij"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Odbierz"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Wyślij SMS-a"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Odrzuć"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Odbierz jako rozmowę wideo"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Odbierz jako rozmowę audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Zaakceptuj żądanie wideo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Odrzuć żądanie wideo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Zaakceptuj wysyłanie obrazu wideo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Odrzuć wysyłanie obrazu wideo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Zaakceptuj odbieranie obrazu wideo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Odrzuć odbieranie obrazu wideo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Przesuń w górę: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Przesuń w lewo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Przesuń w prawo: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Przesuń w dół: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Wibracje"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Wibracje"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Dźwięk"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Domyślny dźwięk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Dzwonek telefonu"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Wibracje z dzwonkiem"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Dzwonek i wibracje"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Zarządzaj połączeniem konferencyjnym"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Numer alarmowy"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="one">1 sekunda</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuty</item>
+ <item quantity="one">1 minuta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> godziny</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> godzin</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> godziny</item>
+ <item quantity="one">1 godzina</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Zdjęcie profilowe"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera wyłączona"</string>
+ <string name="child_number" msgid="4469090994612105532">"z <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Notatka wysłana"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Ostatnie wiadomości"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informacje o firmie"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil(e) stąd"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km stąd"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>-<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Otwarte jutro od <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Otwarte dzisiaj od <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zamknięte od <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Zamknięte dzisiaj od <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Teraz otwarte"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Teraz zamknięte"</string>
+</resources>
diff --git a/InCallUI/res/values-pt-rBR/strings.xml b/InCallUI/res/values-pt-rBR/strings.xml
new file mode 100644
index 000000000..1ec7e12ef
--- /dev/null
+++ b/InCallUI/res/values-pt-rBR/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefone"</string>
+ <string name="onHold" msgid="527593602772521700">"Em espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Desconhecido"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privado"</string>
+ <string name="payphone" msgid="5743050584468748607">"Chamada a cobrar"</string>
+ <string name="confCall" msgid="3181961445236675173">"Teleconferência"</string>
+ <string name="call_lost" msgid="8208184291640961172">"A chamada caiu."</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Alto-falante"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Minifone do aparelho"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Fone de ouvido com fio"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Enviar os seguintes tons?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Enviando tons\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sim"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Não"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Substituir caractere curinga por"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Teleconferência <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número do correio de voz"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Discando"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Rediscando"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Teleconferência"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Chamada recebida"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Chamada trabalho recebida"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Chamada encerrada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Em espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Desligando"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Em chamada"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Meu número é <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Conectando vídeo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Solicitando vídeo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Não é possível conectar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Solicitação de vídeo rejeitada"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Seu número de retorno de chamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Seu número de retorno de chamada de emergência\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Discando"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Chamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Chamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Chamanda em andamento"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Chamada de trabalho em andamento"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Chamada por Wi-Fi em andamento"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Chamada de trabalho por Wi-Fi em andamento"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Em espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Chamada recebida"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Chamada de trabalho recebida"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Chamada por Wi-Fi recebida"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Chamada de trabalho recebida por Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videochamada recebida"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Solicitação de vídeo recebida"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Novo correio de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Novo correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Discar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número correio de voz desconhecido"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sem serviço"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"A rede selecionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) está indisponível"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Atender"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Desligar"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voz"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aceitar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Dispensar"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Retor. cham."</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensagem"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Para fazer uma chamada, primeiro desative o modo avião."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Não registrado na rede."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rede celular não disponível."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Para realizar uma chamada, digite um número válido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Não é possível realizar chamadas."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Iniciando sequência MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Serviço não compatível."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Não é possível alternar as chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Não é possível separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Não é possível transferir a chamada."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Não é possível fazer uma conferência."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Não é possível rejeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Não é possível liberar chamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Chamada de emergência"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Ativando o rádio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Sem serviço. Tentando novamente..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Não é possível realizar chamadas. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> não é um número de emergência."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Não é possível realizar chamadas. Disque um número de emergência."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Use o teclado para discar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Colocar chamada em espera"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Retomar chamada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Encerrar chamada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostrar teclado"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ocultar teclado"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Desativar som"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Ativar som"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Adicionar chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Juntar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Trocar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gerenciar chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gerenciar teleconferência"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Teleconferência"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gerenciar"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Áudio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videocham."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Alterar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Alternar câmera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Mais opções"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player iniciado"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player interrompido"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"A câmera não está pronta"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Câmera pronta"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento de sessão de chamada desconhecido"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Serviço"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuração"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Não definido&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Outras configurações de chamada"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Chamando via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Chamada de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto do contato"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"conversar em particular"</string>
+ <string name="selectContact" msgid="92191462970821951">"selecionar contato"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escreva sua resposta..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancelar"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Enviar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Atender"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Recusar"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Atender como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Atender como chamada de áudio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Aceitar solicitação de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Recusar solicitação de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Aceitar solicitação de transmissão de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Recusar solicitação de transmissão de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Aceitar solicitação de recebimento de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Recusar solicitação de recebimento de vídeo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a direita."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para baixo."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Som"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Som padrão (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Toque do telefone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar ao tocar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Toque e vibração"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gerenciar teleconferência"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número de emergência"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto do perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Câmera desligada"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mensagens recentes"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informações sobre a empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> milhas de distância"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km de distância"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Abre amanhã às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Abre hoje às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Fecha às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Fechou hoje às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Aberto agora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Fechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-pt-rPT/strings.xml b/InCallUI/res/values-pt-rPT/strings.xml
new file mode 100644
index 000000000..2b26efcb5
--- /dev/null
+++ b/InCallUI/res/values-pt-rPT/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefone"</string>
+ <string name="onHold" msgid="527593602772521700">"Em espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Desconhecido"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privado"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefone público"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conferência"</string>
+ <string name="call_lost" msgid="8208184291640961172">"A chamada caiu"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altifalante"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Auricular do telefone"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Auscultadores com fios"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Pretende enviar os seguintes tons?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"A enviar tons\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sim"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Não"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Substituir o caráter universal por"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conferência <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número do correio de voz"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"A marcar"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"A remarcar"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conferência"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Chamada recebida"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Chamada de trab. recebida"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Chamada terminada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Em espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"A desligar"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Numa chamada"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"O meu número é <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"A ligar vídeo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"A solicitar vídeo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Não é possível ligar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Pedido de vídeo rejeitado"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"O seu número de retorno de chamadas\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"O seu número de retorno de chamadas de emergência\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"A marcar"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Chamada não atendida"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Chamadas não atendidas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas não atendidas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Chamada não atendida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Chamada em curso"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Chamada de trabalho em curso"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Chamada Wi-Fi em curso"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Chamada de trabalho via Wi-Fi em curso"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Em espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Chamada recebida"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Chamada de trab. recebida"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Chamada Wi-Fi recebida"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Chamada de trabalho recebida via Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videochamada recebida"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Pedido de vídeo recebido"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nova mensagem de correio de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nova mensagem de correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Marcar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número do correio de voz desconhecido"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sem serviço"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Rede selecionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) indisponível"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Atender"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Desligar"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voz"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aceitar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ignorar"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Ligar de volta"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensagem"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Para efetuar uma chamada, desative primeiro o Modo de avião."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Sem registo na rede."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rede móvel não disponível."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Para efetuar uma chamada, introduza um número válido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Não é possível telefonar."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"A iniciar sequência de MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Serviço não suportado."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Não é possível alternar entre chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Não é possível separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Não é possível transferir."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Não é possível efetuar uma conferência."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Não é possível rejeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Não é possível libertar as chamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Chamada de emergência"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"A ligar o rádio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Sem serviço. A tentar novamente…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Não é possível telefonar. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> não é um número de emergência."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Não é possível telefonar. Marque um número de emergência."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Utilizar o teclado para marcar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Colocar chamada em espera"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Retomar chamada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Terminar chamada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostrar o teclado"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ocultar o teclado"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Desativar som"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Reativar o som"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Adicionar chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Intercalar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Trocar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gerir chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gerir conferência"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conferência"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gerir"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Áudio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videochamada"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Mudar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Trocar câmara"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Interromper vídeo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Mais opções"</string>
+ <string name="player_started" msgid="3478865572468310331">"Leitor iniciado"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Leitor interrompido"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"A câmara não está pronta"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Câmara pronta"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento de sessão de chamada desconhecido"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Serviço"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuração"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Não definido&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Outras definições de chamadas"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"A telefonar através de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Recebidas através de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto do contacto"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"tornar privado"</string>
+ <string name="selectContact" msgid="92191462970821951">"selecionar contacto"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escreva a sua própria..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancelar"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Enviar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Atender"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Recusar"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Atender como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Atender como chamada de áudio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Aceitar pedido de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Recusar pedido de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Aceitar pedido para transmitir vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Recusar pedido para transmitir vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Aceitar pedido para receber vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Recusar pedido para receber vídeo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Deslize lentamente para cima para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Deslize lentamente para a esquerda para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Deslize lentamente para a direita para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Deslize lentamente para baixo para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Som"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Som predefinido (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Toque do telemóvel"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar ao tocar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Tocar e vibrar"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gerir conferência"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número de emergência"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="one">1 segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="one">1 minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="one">1 hora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto do perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Câmara desligada"</string>
+ <string name="child_number" msgid="4469090994612105532">"através de <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mensagens recentes"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informações da empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"A <xliff:g id="DISTANCE">%.1f</xliff:g> milhas de distância"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"A <xliff:g id="DISTANCE">%.1f</xliff:g> km de distância"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Abre amanhã às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Abre hoje às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Fecha às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Fechou hoje às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Aberto agora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Fechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-pt/strings.xml b/InCallUI/res/values-pt/strings.xml
new file mode 100644
index 000000000..1ec7e12ef
--- /dev/null
+++ b/InCallUI/res/values-pt/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefone"</string>
+ <string name="onHold" msgid="527593602772521700">"Em espera"</string>
+ <string name="unknown" msgid="3646075119047488748">"Desconhecido"</string>
+ <string name="private_num" msgid="6081418498487514686">"Número privado"</string>
+ <string name="payphone" msgid="5743050584468748607">"Chamada a cobrar"</string>
+ <string name="confCall" msgid="3181961445236675173">"Teleconferência"</string>
+ <string name="call_lost" msgid="8208184291640961172">"A chamada caiu."</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Alto-falante"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Minifone do aparelho"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Fone de ouvido com fio"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Enviar os seguintes tons?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Enviando tons\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Enviar"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Sim"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Não"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Substituir caractere curinga por"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Teleconferência <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Número do correio de voz"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Discando"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Rediscando"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Teleconferência"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Chamada recebida"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Chamada trabalho recebida"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Chamada encerrada"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Em espera"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Desligando"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Em chamada"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Meu número é <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Conectando vídeo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videochamada"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Solicitando vídeo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Não é possível conectar a videochamada"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Solicitação de vídeo rejeitada"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Seu número de retorno de chamada\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Seu número de retorno de chamada de emergência\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Discando"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Chamada perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Chamada perdida de <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Chamanda em andamento"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Chamada de trabalho em andamento"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Chamada por Wi-Fi em andamento"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Chamada de trabalho por Wi-Fi em andamento"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Em espera"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Chamada recebida"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Chamada de trabalho recebida"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Chamada por Wi-Fi recebida"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Chamada de trabalho recebida por Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Videochamada recebida"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Solicitação de vídeo recebida"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Novo correio de voz"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Novo correio de voz (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Discar <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Número correio de voz desconhecido"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Sem serviço"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"A rede selecionada (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) está indisponível"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Atender"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Desligar"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Vídeo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Voz"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Aceitar"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Dispensar"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Retor. cham."</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensagem"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Para fazer uma chamada, primeiro desative o modo avião."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Não registrado na rede."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rede celular não disponível."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Para realizar uma chamada, digite um número válido."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Não é possível realizar chamadas."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Iniciando sequência MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Serviço não compatível."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Não é possível alternar as chamadas."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Não é possível separar a chamada."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Não é possível transferir a chamada."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Não é possível fazer uma conferência."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Não é possível rejeitar a chamada."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Não é possível liberar chamadas."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Chamada SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Chamada de emergência"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Ativando o rádio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Sem serviço. Tentando novamente..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Não é possível realizar chamadas. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> não é um número de emergência."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Não é possível realizar chamadas. Disque um número de emergência."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Use o teclado para discar"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Colocar chamada em espera"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Retomar chamada"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Encerrar chamada"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Mostrar teclado"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ocultar teclado"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Desativar som"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Ativar som"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Adicionar chamada"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Juntar chamadas"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Trocar"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gerenciar chamadas"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gerenciar teleconferência"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Teleconferência"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gerenciar"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Áudio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videocham."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Alterar para chamada de voz"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Alternar câmera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausar vídeo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Mais opções"</string>
+ <string name="player_started" msgid="3478865572468310331">"Player iniciado"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Player interrompido"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"A câmera não está pronta"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Câmera pronta"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Evento de sessão de chamada desconhecido"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Serviço"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configuração"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Não definido&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Outras configurações de chamada"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Chamando via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Chamada de <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"foto do contato"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"conversar em particular"</string>
+ <string name="selectContact" msgid="92191462970821951">"selecionar contato"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Escreva sua resposta..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Cancelar"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Enviar"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Atender"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Enviar SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Recusar"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Atender como videochamada"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Atender como chamada de áudio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Aceitar solicitação de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Recusar solicitação de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Aceitar solicitação de transmissão de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Recusar solicitação de transmissão de vídeo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Aceitar solicitação de recebimento de vídeo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Recusar solicitação de recebimento de vídeo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para cima."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a esquerda."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para a direita."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Para <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, deslize para baixo."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrar"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrar"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Som"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Som padrão (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Toque do telefone"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrar ao tocar"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Toque e vibração"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gerenciar teleconferência"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Número de emergência"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> segundos</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minutos</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> horas</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Foto do perfil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Câmera desligada"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota enviada"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mensagens recentes"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informações sobre a empresa"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> milhas de distância"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km de distância"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Abre amanhã às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Abre hoje às <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Fecha às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Fechou hoje às <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Aberto agora"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Fechado agora"</string>
+</resources>
diff --git a/InCallUI/res/values-ro/strings.xml b/InCallUI/res/values-ro/strings.xml
new file mode 100644
index 000000000..031c48a90
--- /dev/null
+++ b/InCallUI/res/values-ro/strings.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"În așteptare"</string>
+ <string name="unknown" msgid="3646075119047488748">"Necunoscut"</string>
+ <string name="private_num" msgid="6081418498487514686">"Număr privat"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefon public"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conferință telefonică"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Apelul s-a încheiat"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Difuzor"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Casca receptorului"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Set căști-microfon cu fir"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Trimiteți următoarele tonuri?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Se trimit tonuri\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Trimiteți"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Da"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nu"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Înlocuiți metacaracterul cu"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conferință telefonică <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Numărul mesageriei vocale"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Se apelează"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Se reapelează"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conferință telefonică"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Apel primit"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Apel de serviciu primit"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Apel încheiat"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"În așteptare"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Se încheie apelul"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Apel în desfășurare"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Numărul meu este <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Se conectează apelul video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Apel video"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Se solicită apel video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Nu se poate conecta apelul video"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Solicitarea pentru apel video a fost respinsă"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Numărul de apelare inversă\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Numărul de apelare inversă de urgență\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Se apelează"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Apel nepreluat"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Apeluri nepreluate"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> (de) apeluri nepreluate"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Apel nepreluat de la <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Apel în desfășurare"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Apel de serviciu în desfășurare"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Apel prin Wi-Fi în desfășurare"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Apel de serviciu prin Wi-Fi în desfășurare"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"În așteptare"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Apel primit"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Apel de serviciu primit"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Apel prin Wi-Fi primit"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Apel de serviciu prin Wi-Fi primit"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Apel video primit"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Solicitare de trecere la apel video"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Mesaj vocal nou"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Mesaj vocal nou (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Apelați <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Numărul mesageriei vocale este necunoscut"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Fără semnal"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Rețeaua selectată (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nu este disponibilă"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Răspundeți"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Încheiați apelul"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Apel video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Apel vocal"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Acceptați"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Refuzați"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Apelați înapoi"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Trimiteți mesaj"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Pentru a apela, mai întâi dezactivați modul Avion."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Neînregistrat în rețea."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rețeaua mobilă nu este disponibilă."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Pentru a apela, introduceți un număr valid."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Nu se poate apela."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Se pornește secvența MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Serviciul nu este acceptat."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Apelurile nu pot fi comutate."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Apelul nu poate fi separat."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Nu se poate transfera."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Conferința telefonică nu poate fi inițiată."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Apelul nu poate fi respins."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Apelurile nu pot fi eliberate."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Apel SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Apel de urgență"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Se activează radio…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Fără semnal. Se încearcă din nou…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Nu se poate apela. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nu este un număr de urgență."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Nu se poate apela. Formați un număr de urgență."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Folosiți tastatura pentru a apela"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Puneți apelul în așteptare"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Reluați apelul"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Încheiați apelul"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Afișează tastatura numerică"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ascunde tastatura numerică"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Dezactivează sunetul"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Activează sunetul"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Adăugați un apel"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Îmbinați apelurile"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Schimbați"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Gestionați apelurile"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Gestionați conferința telefonică"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conferință telefonică"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Gestionați"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Apel video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Treceți la apel vocal"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Comutați camera foto"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Întrerupeți apelul video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Mai multe opțiuni"</string>
+ <string name="player_started" msgid="3478865572468310331">"Playerul a pornit"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Playerul s-a oprit"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Camera foto nu este pregătită"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Camera foto este pregătită"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Eveniment necunoscut privind o sesiune de apeluri"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Furnizor de servicii"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Configurați"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nesetat&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Alte setări de apel"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Se apelează prin <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Primite prin <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotografia persoanei de contact"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"treceți în modul privat"</string>
+ <string name="selectContact" msgid="92191462970821951">"selectați o persoană de contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Scrieți propriul răspuns…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Anulați"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Trimiteți"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Răspundeți"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Trimiteți SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Refuzați"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Răspundeți ca apel video"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Răspundeți ca apel audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Acceptați solicitarea de a trece la apel video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Refuzați solicitarea de a trece la apel video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Acceptați solicitarea de a transmite conținut video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Refuzați solicitarea de a transmite conținut video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Acceptați solicitarea de a primi conținut video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Refuzați solicitarea de a primi conținut video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Glisați în sus ca să <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Glisați spre stânga ca să <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Glisați spre dreapta ca să <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Glisați în jos ca să <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrații"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrații"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Sunet"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Sunet prestabilit (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ton de sonerie pentru telefon"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrează când sună"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ton de sonerie și vibrații"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Gestionați conferința telefonică"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Număr de urgență"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> secunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> de secunde</item>
+ <item quantity="one">O secundă</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> de minute</item>
+ <item quantity="one">Un minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ore</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> de ore</item>
+ <item quantity="one">O oră</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Fotografie de profil"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Camera foto este oprită"</string>
+ <string name="child_number" msgid="4469090994612105532">"pe <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Nota a fost trimisă"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mesaje recente"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informații despre companie"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi distanță"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km distanță"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Deschide mâine la <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Deschide astăzi la <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Închide la <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"A închis astăzi la <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Acum este deschis"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Acum este închis"</string>
+</resources>
diff --git a/InCallUI/res/values-ru/strings.xml b/InCallUI/res/values-ru/strings.xml
new file mode 100644
index 000000000..fdc8f6a36
--- /dev/null
+++ b/InCallUI/res/values-ru/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Телефон"</string>
+ <string name="onHold" msgid="527593602772521700">"На удержании"</string>
+ <string name="unknown" msgid="3646075119047488748">"Неизвестный абонент"</string>
+ <string name="private_num" msgid="6081418498487514686">"Скрытый номер"</string>
+ <string name="payphone" msgid="5743050584468748607">"Телефон-автомат"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конференц-вызов"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Звонок сброшен"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Динамик"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Динамик гарнитуры"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Проводная гарнитура"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Отправить следующие тоны?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Отправка тональных сигналов\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Отправить"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Да"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Нет"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Заменить универсальный символ на"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Конференц-вызов: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Номер голосовой почты"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Набор номера…"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Повторный вызов"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конференц-вызов"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Входящий вызов"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Входящий вызов (работа)"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Вызов завершен"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"На удержании"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Завершение разговора"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Вызов"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Мой номер: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Подключение видео"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Видеовызов"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Запрос видео"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Не удалось совершить видеовызов"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Видеовызов отклонен"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Номер обратного вызова:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Номер обратного вызова для экстренных служб:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Набор номера…"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Пропущенный вызов"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Пропущенные вызовы"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Пропущенных вызовов: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Пропущенные вызовы от абонента <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Текущий вызов"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Текущий звонок (работа)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Текущий Wi-Fi-звонок"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Текущий Wi-Fi-звонок (работа)"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"На удержании"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Входящий вызов"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Входящий вызов (работа)"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Входящий Wi-Fi-звонок"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Входящий Wi-Fi-звонок (работа)"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Входящий видеовызов"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Входящий видеовызов"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Новое сообщение голосовой почты"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Новое сообщение голосовой почты (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Набрать номер <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Номер голосовой почты неизвестен"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Нет сигнала"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Выбранная сеть (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) недоступна."</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Ответить"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Завершить"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Голос"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Разрешить"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Закрыть"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Перезвонить"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Написать SMS"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Отключите режим полета."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Нет регистрации в сети."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Мобильная сеть недоступна."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Недействительный номер."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Не удалось позвонить."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Запуск последовательности MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Сервис не поддерживается."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Не удалось переключить вызов."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Не удалось разделить вызов."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Не удалось перенести."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Не удалось выполнить конференц-вызов."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Не удалось отклонить вызов."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Не удалось разъединить."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Вызов SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Экстренный вызов"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Включение радио…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Нет сигнала. Повторная попытка…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Не удалось позвонить. Номер <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не принадлежит экстренным службам."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Не удалось позвонить. Наберите номер экстренных служб."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Используйте клавиатуру для набора номера"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Удерживать вызов"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Возобновить вызов"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Завершить вызов"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Показать панель набора номера"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Скрыть панель набора номера"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Выключить звук"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Включить звук"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Добавить вызов"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Объединить вызовы"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Перевести звонок"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Управление вызовами"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Настройка конференц-связи"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конференц-вызов"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Управление"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Видеовызов"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Отключить видео"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Сменить камеру"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Приостановить видео"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Другие настройки"</string>
+ <string name="player_started" msgid="3478865572468310331">"Видеоплеер включен"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Видеоплеер отключен"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камера недоступна"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камера доступна"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Неизвестное событие сеанса связи"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Служба"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Настройка"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Не задано&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Другие настройки вызовов"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Звонок через <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Входящий вызов (оператор: <xliff:g id="PROVIDER_NAME">%s</xliff:g>)"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"фотография контакта"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"приватная конференция"</string>
+ <string name="selectContact" msgid="92191462970821951">"выбрать контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Ваш ответ…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Отмена"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Отправить"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Ответить"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Отправить SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Отклонить"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Ответить с видео"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Ответить на голосовой вызов"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Ответить на видеовызов"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Отклонить видеовызов"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Разрешить передачу видео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Отклонить передачу видео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Принять видео"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Отклонить видео"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Проведите вверх, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Проведите влево, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Проведите вправо, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Проведите вниз, чтобы <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Вибросигнал"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Вибросигнал"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Звук"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"По умолчанию (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Рингтон"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Вибросигнал и рингтон"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Мелодия звонка и вибросигнал"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Настройка конференц-связи"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Экстренная служба"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунды</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунды</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> минуты</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минуты</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> час</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> часов</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> часа</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Фото профиля"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камера отключена"</string>
+ <string name="child_number" msgid="4469090994612105532">"через <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Сообщение отправлено"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Недавние сообщения"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Информация о компании"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> мил."</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Откроется завтра в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Откроется сегодня в <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Работает до <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Сегодня не работает с <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Сейчас открыто"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Сейчас закрыто"</string>
+</resources>
diff --git a/InCallUI/res/values-si-rLK/strings.xml b/InCallUI/res/values-si-rLK/strings.xml
new file mode 100644
index 000000000..129e1815d
--- /dev/null
+++ b/InCallUI/res/values-si-rLK/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"දුරකථනය"</string>
+ <string name="onHold" msgid="527593602772521700">"රඳවා ගනිමින්"</string>
+ <string name="unknown" msgid="3646075119047488748">"නොදනී"</string>
+ <string name="private_num" msgid="6081418498487514686">"රහසිගත අංකය"</string>
+ <string name="payphone" msgid="5743050584468748607">"පේෆෝනය"</string>
+ <string name="confCall" msgid="3181961445236675173">"සම්මන්ත්‍රණ ඇමතුම"</string>
+ <string name="call_lost" msgid="8208184291640961172">"ඇමතුම නැවතුණි"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"නාදකය"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"හෑන්ඩ්සෙටයේ සවන් කඬ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"රැහැන් සහිත හෙඩ්සෙටය"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"බ්ලූටූත්"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"පහත නාද යවන්නද?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"නාද යවමින්\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"යවන්න"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ඔව්"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"නැත"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"අනුලකුණ ප්‍රතිස්ථාපනය කරන්නේ"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"සම්මන්ත්‍රණ ඇමතුම <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"හඬ තැපැල් අංකය"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ඩයල් කරමින්"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"නැවත ඩයල් කරමින්"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"සම්මන්ත්‍රණ ඇමතුම"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"එන ඇමතුම"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"එන කාර්යාල ඇමතුම"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"ඇමතුම අවසන් විය"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"රඳවා ගනිමින්"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"විසන්ධි කරමින්"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"ඇමතුමක"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"මගේ අංකය <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"වීඩියෝවකට සම්බන්ධ කරමින්"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"වීඩියෝ ඇමතුම"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"වීඩියෝවක් ඉල්ලමින්"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"වීඩියෝ ඇමතුම සම්බන්ධ කළ නොහැක"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"වීඩියෝ ඉල්ලීම ප්‍රතික්ෂේප කරන ලදී"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"ඔබේ පසුඇමතුම් අංකය\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"ඔබගේ හදිසි පසුඇමතුම් අංකය\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ඩයල් කරමින්"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"මඟ හැරුණු ඇමතුම"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"මඟ හැරුණු ඇමතුම්"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"මඟ හැරුණු ඇමතුම් <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> වෙතින් මඟ හැරුණු ඇමතුම"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"කරගෙන යන ඇමතුම"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"කරගෙන යන කාර්යාල ඇමතුම"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"දැනට කරගෙන යන Wi-Fi ඇමතුම"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"කරගෙන යන Wi-Fi කාර්යාල ඇමතුම"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"රඳවා ගනිමින්"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"එන ඇමතුම"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"එන කාර්යාල ඇමතුම"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"එන Wi-Fi ඇමතුම"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"එන Wi-Fi කාර්යාල ඇමතුම"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"එන වීඩියෝ ඇමතුම"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"එන වීඩියෝ ඉල්ලීම"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"නව හඬ තැපෑල"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"නව හඬ තැපැල් (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ඩයල් කරන්න"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"හඬ තැපැල් අංකය නොදනී"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"සේවාව නැත"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"තෝරා ඇති ජාලය (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) නොමැත"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"පිළිතුරු දෙන්න"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"විසන්ධි කරන්න"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"වීඩියෝව"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"හඬ"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"පිළිගන්න"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"අස් කරන්න"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"පසුඇමතුම"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"පණිවිඩය"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"ඇමතුමක් ගැනීමට, මුලින්ම ගුවන් යානා ප්‍රකාරය ක්‍රියාවිරහිත කරන්න."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ජාලය මත ලියාපදිංචි වී නැත."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"සෙලියුලර් ජාලය නොතිබේ."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"ඇමතුමක් ගැනීමට, වලංගු අංකයක් ඇතුළු කරන්න."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"ඇමතුම් ගැනීමට නොහැක."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI අනුපිළිවෙළ ආරම්භ කරමින්…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"සේවාවට සහාය දක්වන්නේ නැත."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ඇමතුම් මාරු කිරීම කළ නොහැක."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ඇමතුම වෙන් කිරීම කළ නොහැක."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"මාරු කිරීමට නොහැක."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"සම්මන්ත්‍රණය කළ නොහැක."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ඇමතුම ප්‍රතික්ෂේප කළ නොහැක."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ඇමතුම(ම්) මුදාහැරීම කළ නොහැක."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP ඇමතුම"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"හදිසි ඇමතුම"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"රේඩියෝව ක්‍රියාත්මක කරමින්…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"සේවාව නැත. නැවත උත්සාහ කරමින්…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"ඇමතීමට නොහැකිය. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> මෙය හදිසි ඇමතුම් අංකයක් නොවේ."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"ඇමතිය නොහැක. හදිසි අංකයක් අමතන්න."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ඩයල් කිරීමට යතුරු පුවරුව භාවිත කරන්න"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"ඇමතුම රඳවා ගන්න"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"ඇමතුම නැවත පටන් ගන්න"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"ඇමතුම අවසන් කරන්න"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ඇමතුම් පෑඩය පෙන්වන්න"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ඇමතුම් පෑඩය සඟවන්න"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"නිහඬ කරන්න"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"නිහඬ කිරීම ඉවත් කරන්න"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"ඇමතුමක් එක් කරන්න"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"ඇමතුම් ඒකාබද්ධ කරන්න"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"මාරු කරන්න"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"ඇමතුම් කළමනාකරණය කරන්න"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"සම්මන්ත්‍රණ ඇමතුම කළමනාකරණය කරන්න"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"සම්මන්ත්‍රණ ඇමතුම"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"කළමනාකරණය කරන්න"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ශ්‍රව්‍යය"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"වීඩියෝ ඇමතුම"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"හඬ ඇමතුමක් වෙත මාරු කරන්න"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"කැමරාව මාරු කරන්න"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"විඩියෝව විරාම කරන්න"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"තවත් විකල්ප"</string>
+ <string name="player_started" msgid="3478865572468310331">"ධාවකය ආරම්භ කරන ලදි"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"ධාවකය නැවතුණි"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"කැමරාව සූදානම් නැහැ"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"කැමරාව සූදානම්"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"නොදන්නා ඇමතුම් සැසි සිදුවීම"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"සේවාව"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"පිහිටුවීම"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;පිහිටුවා නැත&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"වෙනත් ඇමතුම් සැකසීම්"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> හරහා අමතමින්"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> හරහා එන"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"සම්බන්ධතා ඡායාරූපය"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"රහසිගත වන්න"</string>
+ <string name="selectContact" msgid="92191462970821951">"සම්බන්ධතාවය තෝරාගන්න"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"ඔබේම එකක් ලියන්න..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"අවලංගු කරන්න"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"යවන්න"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"පිළිතුරු දෙන්න"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS යවන්න"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ප්‍රතික්ෂේප කිරීම"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"වීඩියෝ ඇමතුමට පිළිතුරු දෙන්න"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ශ්‍රව්‍ය ඇමතුමට පිළිතුරු දෙන්න"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"වීඩියෝ ඉල්ලීම පිළිගන්න"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"වීඩියෝ ඉල්ලීම ප්‍රතික්ෂේප කරන්න"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"වීඩියෝ සම්ප්‍ර්ෂණ ඉල්ලීම පිළිගන්න"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"වීඩියෝ සම්ප්‍ර්ෂණ ඉල්ලීම ප්‍රතික්ෂේප කරන්න"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"වීඩියෝ ලැබීමේ ඉල්ලීම පිළිගන්නා ලදි"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"වීඩියෝ ලැබීමේ ඉල්ලීම ප්‍රතික්ෂේප කරන්න"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා උඩට සර්පණය කරන්න."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා වමට සර්පණය කරන්න."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා දකුණට සර්පණය කරන්න."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> සඳහා පහළට සර්පණය කරන්න."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"කම්පනය"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"කම්පනය"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"හඬ"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"පෙරනිමි ශබ්දය (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"දුරකථන රිගින්ටෝනය"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"රිගින් වන විට කම්පන වන්න"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"රිගින් ටෝන් සහ කම්පනය කරන්න"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"සම්මන්ත්‍රණ ඇමතුම කළමනාකරණය කරන්න"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"හදිසි ඇමතුම් අංකය"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one">තත්පර <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="other">තත්පර <xliff:g id="COUNT">%d</xliff:g></item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one">මිනිත්තු <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="other">මිනිත්තු <xliff:g id="COUNT">%d</xliff:g></item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one">පැය <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="other">පැය <xliff:g id="COUNT">%d</xliff:g></item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"පැතිකඩ ඡායාරූපය"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"කැමරාව ක්‍රියාවිරහිතයි"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> හරහා"</string>
+ <string name="note_sent" msgid="7623014827902758398">"සටහන යවන ලදී"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"මෑත පණිවිඩ"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ව්‍යාපාර තොරතුරු"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"සැතපුම් <xliff:g id="DISTANCE">%.1f</xliff:g>ක් ඈතින්"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"කි.මි. <xliff:g id="DISTANCE">%.1f</xliff:g>ක් ඈතින්"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"හෙට <xliff:g id="OPEN_TIME">%s</xliff:g>ට විවෘත කෙරේ"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"අද <xliff:g id="OPEN_TIME">%s</xliff:g>ට විවෘත කෙරේ"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>ට වසයි"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"අද <xliff:g id="CLOSE_TIME">%s</xliff:g>ට වසන ලදී"</string>
+ <string name="open_now" msgid="4615706338669555999">"දැන් විවෘතයි"</string>
+ <string name="closed_now" msgid="2635314668145282080">"දැන් වසා ඇත"</string>
+</resources>
diff --git a/InCallUI/res/values-sk/strings.xml b/InCallUI/res/values-sk/strings.xml
new file mode 100644
index 000000000..d55399323
--- /dev/null
+++ b/InCallUI/res/values-sk/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefón"</string>
+ <string name="onHold" msgid="527593602772521700">"Podržaný hovor"</string>
+ <string name="unknown" msgid="3646075119047488748">"Neznáme"</string>
+ <string name="private_num" msgid="6081418498487514686">"Súkromné číslo"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefónny automat"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferenčný hovor"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Hovor bol prerušený"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Reproduktor"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Slúchadlo"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Náhlavná súprava s káblom"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Odoslať nasledujúce tóny?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Odosielanie tónov\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Odoslať"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Áno"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nie"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Nahradiť zástupný znak znakom"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferenčný hovor <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Číslo hlasovej schránky"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Vytáča sa"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Znova sa vytáča"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferenčný hovor"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Prichádzajúci hovor"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Prichádzajúci prac. hovor"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Hovor bol ukončený"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Podržaný hovor"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Ukončovanie hovoru"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Prebieha hovor"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Moje číslo je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Pripája sa video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videohovor"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Žiada sa video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videohovor nie je možné pripojiť"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Žiadosť o video bola odmietnutá"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Vaše číslo na spätné volanie\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Vaše číslo na spätné tiesňové volanie\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Vytáča sa"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Zmeškaný hovor"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Zmeškané hovory"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Zmeškaný hovor od volajúceho <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Prebiehajúci hovor"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Prebiehajúci pracovný hovor"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Odchádzajúci hovor cez Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Prebiehajúci pracovný hovor cez Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Podržaný hovor"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Prichádzajúci hovor"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Prichádzajúci pracovný hovor"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Prichádzajúci hovor cez Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Prichádzajúci pracovný hovor cez Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Prichádzajúci videohovor"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Prichádzajúca žiadosť o video"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nová hlasová správa"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nová hlasová správa (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Zavolať hlasovú schránku <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Číslo hlasovej schránky je neznáme"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Žiadny signál"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Vybraná sieť (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) nie je k dispozícii"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Prijať"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Položiť"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Hlas"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Prijať"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Zatvoriť"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Zavolať späť"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Správa"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Ak chcete volať, vypnite najprv režim v lietadle."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Prihlásenie do siete nebolo úspešné."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilná sieť nie je k dispozícii."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Ak chcete volať, zadajte platné číslo."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Hovor sa nedá uskutočniť."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Prebieha spúšťanie sekvencie MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Služba nie je podporovaná."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Nedajú sa prepínať hovory."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Nedá sa rozdeliť hovor."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Nedá sa preniesť."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferenčný hovor sa nedá uskutočniť."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Nedá sa odmietnuť hovor."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Nedajú sa ukončiť hovory."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Hovor SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Tiesňové volanie"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Zapína sa rádio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Žiadny signál. Prebieha ďalší pokus…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Hovor sa nedá uskutočniť. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nie je číslo tiesňového volania."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Hovor nie je možné uskutočniť. Vytočte číslo tiesňového volania."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Číslo vytočíte pomocou klávesnice"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Podržať hovor"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Obnoviť hovor"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Ukončiť hovor"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Zobraziť číselnú klávesnicu"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Skryť číselnú klávesnicu"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Vypnúť zvuk"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Zapnúť zvuk"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Pridať hovor"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Zlúčiť hovory"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Zameniť"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Spravovať hovory"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Spravovať konferenčný hovor"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferenčný hovor"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Spravovať"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Zvuk"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videohovor"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Zmeniť na hlasový hovor"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Zapnúť kameru"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pozastaviť video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Ďalšie možnosti"</string>
+ <string name="player_started" msgid="3478865572468310331">"Prehrávač bol spustený"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Prehrávač bol zastavený"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera nie je pripravená"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera je pripravená"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Neznáma udalosť relácie volania"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Služba"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Nastavenie"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Nenastavené&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Ďalšie nastavenia hovorov"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Voláte prostredníctvom poskytovateľa <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Prichádz. hovor prostred. poskytovateľa <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotka kontaktu"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"prepnúť na súkromné"</string>
+ <string name="selectContact" msgid="92191462970821951">"vybrať kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napísať vlastnú..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Zrušiť"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Odoslať"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Prijať"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Odoslať SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Odmietnuť"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Prijať ako videohovor"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Prijať ako zvukový hovor"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Prijať žiadosť o videohovor"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Odmietnuť žiadosť o videohovor"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Prijať žiadosť o prenos videa"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Odmietnuť žiadosť o prenos videa"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Povoliť žiadosť o prijatie videa"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Odmietnuť žiadosť o prijatie videa"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Prejdite prstom nahor: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Prejdite prstom doľava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Prejdite prstom doprava: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Prejdite prstom nadol: <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrovanie"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrovanie"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Zvuk"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Predvolený zvuk (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Tón zvonenia telefónu"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibrovať pri zvonení"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Vyzváňací tón a vibrovanie"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Správa konferenčného hovoru"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Číslo tiesňového volania"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> sekundy</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekúnd</item>
+ <item quantity="one">1 sekunda</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minúty</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> minúty</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minút</item>
+ <item quantity="one">1 minúta</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> hodiny</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> hodín</item>
+ <item quantity="one">1 hodina</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilová fotka"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera je vypnutá"</string>
+ <string name="child_number" msgid="4469090994612105532">"na čísle <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Poznámka bola odoslaná"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nedávne správy"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informácie o firme"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Vzdialené <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Vzdialené <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Zajtra sa otvára o <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Dnes sa otvára o <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zatvára sa o <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Dnes bolo zatvorené o <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Otvorené"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Zatvorené"</string>
+</resources>
diff --git a/InCallUI/res/values-sl/strings.xml b/InCallUI/res/values-sl/strings.xml
new file mode 100644
index 000000000..6ed298fdd
--- /dev/null
+++ b/InCallUI/res/values-sl/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Zadržan"</string>
+ <string name="unknown" msgid="3646075119047488748">"Neznan"</string>
+ <string name="private_num" msgid="6081418498487514686">"Zasebna številka"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefonska govorilnica"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferenčni klic"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Klic je bil prekinjen"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Zvočnik"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Slušalka"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Žične slušalke"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Ali želite poslati naslednje tone?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Pošiljanje tonov\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Pošlji"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Da"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ne"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Zamenjaj nadomestni znak z"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferenčni klic: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Številka odzivnika"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Klicanje"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Vnovično klicanje"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferenčni klic"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Dohodni klic"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Dohodni delovni klic"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Klic je končan"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Zadržan"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Prekinjanje"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Klic poteka"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Moja številka je <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Povezovanje videa"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videoklic"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Zahtevanje videa"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Videoklica ni mogoče vzpostaviti"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Zavrnjena zahteva za videoklic"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Vaša številka za povratni klic:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Vaša številka za povratni klic v sili:\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Klicanje"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Neodgovorjeni klic"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Neodgovorjeni klici"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Št. neodgovorjenih klicev: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Neodgovorjeni klic od: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Aktivni klic"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Aktivni delovni klic"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Aktivni klic prek omrežja Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Aktivni delovni klic prek omrežja Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Zadržan"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Dohodni klic"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Dohodni delovni klic"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Dohodni klic Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Dohodni delovni klic prek omrežja Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Dohodni videoklic"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Zahteva za dohodni video"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Novo sporočilo v odzivniku"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Novo sporočilo v odzivniku (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Klic: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Neznana številka odzivnika"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ni signala"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Izbrano omrežje (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ni na voljo"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Odgovor"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Prekinitev"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Govor"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Sprejmem"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Opusti"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Povrat. klic"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"SMS"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Če želite poklicati, najprej izklopite način za letalo."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ni registrirano v omrežju."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mobilno omrežje ni na voljo."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Če želite opraviti klic, vnesite veljavno številko."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Klicanje ni mogoče."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Začetek zaporedja MMI ..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Storitev ni podprta."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Preklop med klici ni mogoč."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Ločitev klica ni mogoča."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Prenos ni mogoč."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferenčni klic ni mogoč."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Zavrnitev klica ni mogoča."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Prekinitev klica ni mogoča."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Klic SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Klic v sili"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Vklop radia …"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ni signala. Vnovičen poskus …"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Klicanje ni mogoče. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ni številka za klic v sili."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Klicanje ni mogoče. Opravite klic v sili."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Za izbiranje številke uporabite tipkovnico"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Zadrži klic"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Nadaljuj klic"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Končaj klic"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Prikaži tipkovnico"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Skrij tipkovnico"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Izklopi zvok"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Vklopi zvok"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Dodaj klic"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Združi klice"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Zamenjaj"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Upravljaj klice"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Upravljaj konferenčne klice"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferenčni klic"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Upravljaj"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Zvok"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videoklic"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Preklopi na glasovni klic"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Preklopi med fotoaparati"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Zaustavi video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Več možnosti"</string>
+ <string name="player_started" msgid="3478865572468310331">"Predvajanje začeto"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Predvajanje ustavljeno"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Fotoaparat ni pripravljen"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Fotoaparat je pripravljen"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Neznan dogodek seje klica"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Storitev"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Nastavitev"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ni nastavljeno&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Druge klicne nastavitve"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Klicanje prek ponudnika <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Dohodni prek <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotografija stika"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"zasebno"</string>
+ <string name="selectContact" msgid="92191462970821951">"izbira stika"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Napišite lasten odgovor …"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Prekliči"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Pošlji"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Odgovor"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Pošiljanje SMS-ja"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Zavrnitev"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Odgovor z video povezavo"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Odgovor z zvočno povezavo"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Sprejemanje zahteve za video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Zavrnitev zahteve za video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Sprejemanje zahteve za pošiljanje videa"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Zavrnitev zahteve za pošiljanje videa"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Sprejemanje zahteve za prejem videa"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Zavrnitev zahteve za prejem videa"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Povlecite navzgor za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Povlecite v levo za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Povlecite v desno za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Povlecite navzdol za <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibriranje"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibriranje"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Zvok"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Privzeti zvok (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ton zvonjenja telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Vibriranje ob zvonjenju"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Zvonjenje in vibriranje"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Upravljanje konferenčnih klicev"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Številka za klic v sili"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> sekunda</item>
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> sekundi</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> sekunde</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> minuti</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> minute</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> ura</item>
+ <item quantity="two"><xliff:g id="COUNT">%d</xliff:g> uri</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> ure</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ur</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Fotografija profila"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Fotoaparat je izklopljen"</string>
+ <string name="child_number" msgid="4469090994612105532">"prek <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Opomba poslana"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Nedavna sporočila"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Podatki o podjetju"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mi stran"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km stran"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Odpre se jutri ob <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Odpre se danes ob <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Zapre se ob <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Zaprto danes ob <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Trenutno odprto"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Trenutno zaprto"</string>
+</resources>
diff --git a/InCallUI/res/values-sq-rAL/strings.xml b/InCallUI/res/values-sq-rAL/strings.xml
new file mode 100644
index 000000000..b3a9acd23
--- /dev/null
+++ b/InCallUI/res/values-sq-rAL/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefoni"</string>
+ <string name="onHold" msgid="527593602772521700">"Në pritje"</string>
+ <string name="unknown" msgid="3646075119047488748">"I panjohur"</string>
+ <string name="private_num" msgid="6081418498487514686">"Numër privat"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefon me pagesë"</string>
+ <string name="confCall" msgid="3181961445236675173">"Telefonatë konferencë"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Telefonata ra"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Altoparlant"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Kufje për vesh"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Kufje me tel"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Dërgo tonet e mëposhtme?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Po dërgon tone\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Dërgo"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Po"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Jo"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Zëvendëso karakterin variabël me"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Telefonatë konferencë <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Numri i postës zanore"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Po formon numrin"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Po riformon numrin"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Telefonatë konferencë"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Telefonatë hyrëse"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Telefonatë pune hyrëse"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Telefonata përfundoi"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Në pritje"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Mbyllja"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Në telefonatë"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Numri im është <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Po rilidh videon"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Telefonatë me video"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Po kërkon video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Nuk mund të lidhë telefonatën me video"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Kërkesa me video u refuzua"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Numri i kthimit të telefonatës\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Numri i kthimit të telefonatës së urgjencës\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Po formon numrin"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Telefonatë e humbur"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Telefonata të humbura"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> telefonata të humbura"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Telefonatë e humbur nga <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Telefonatë në vazhdim"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Telefonatë pune dalëse"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Telefonatë me Wi-Fi në vazhdim"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Telefonatë pune dalëse me Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Në pritje"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Telefonatë hyrëse"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Telefonatë pune hyrëse"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Telefonatë hyrëse me Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Telefonatë pune hyrëse me Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Telefonatë hyrëse me video"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Kërkesë për video hyrëse"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Postë e re zanore"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Postë e re zanore (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Formo numrin <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Numri i postës zanore është i panjohur"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Nuk ka shërbim"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Rrjeti i zgjedhur (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) i padisponueshëm"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Përgjigju"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Mbyll"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Zanore"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Prano"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Largoje"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Ri-telefono"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mesazh"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Për të kryer telefonatë, së pari çaktivizo modalitetin e aeroplanit."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"I paregjistruar në rrjet."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Rrjeti celular nuk mundësohet."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Për të kryer një telefonatë, fut një numër të vlefshëm."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Nuk mund të telefonojë."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Po fillon sekuencën MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Shërbimi nuk mbështetet."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Nuk mund të ndryshojë telefonatat."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Nuk mund të ndajë telefonatën."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Nuk mund të transferojë."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Nuk mund të kryejë telefonatë konference."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Nuk mund të refuzojë telefonatën."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Nuk mund të lëshojë telefonatën(at)."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Telefonatë SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Telefonata e urgjencës"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Po aktivizon radion…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Nuk ka shërbim. Po provon sërish…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Nuk mund të telefonohet. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> nuk është një numër urgjence."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Nuk mund të telefonohet. Formo një numër urgjence."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Përdor tastierën për të formuar numrin"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Vendose në pritje telefonatën"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Rifillo telefonatën"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Mbylle telefonatën"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Shfaq bllokun e formimit të numrit"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Fshih bllokun e formimit të numrit"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Çaktivizo audion"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Aktivizo audion"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Shto telefonatë"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Shkri telefonatat"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Shkëmbe"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Menaxho telefonatat"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Menaxho telefonatën konferencë"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Telefonatë konferencë"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Menaxho"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audioja"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Telefonatë me video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Ndërro në telefonatë me video"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Ndërro kamerën"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Vendose në pauzë videon"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Opsione të tjera"</string>
+ <string name="player_started" msgid="3478865572468310331">"Luajtësi filloi"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Luajtësi ndaloi"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera nuk është gati"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera është gati"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Ngjarje e panjohur në sesionin e telefonatës"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Shërbimi"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Konfigurimi"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;I pavendosur&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Cilësime të tjera të telefonatës"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Telefonatë nëpërmjet <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Hyrëse nëpërmjet <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"fotografia e kontaktit"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"bëje private"</string>
+ <string name="selectContact" msgid="92191462970821951">"përzgjidh kontaktin"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Shkruaj përgjigjen tënde..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Anulo"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Dërgo"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Përgjigju"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Dërgo SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Refuzo"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Përgjigju si telefonatë me video"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Përgjigju si telefonatë me audio"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Prano kërkesën për video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Refuzo kërkesën për video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Prano kërkesën për transmetimin e videos"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Refuzo kërkesën për transmetimin e videos"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Prano kërkesën për marrjen e videos"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Refuzo kërkesën për marrjen e videos"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Rrëshqit lart për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Rrëshqit majtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Rrëshqit djathtas për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Rrëshqit poshtë për <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Dridhja"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Dridhja"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Tingulli"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Tingulli i parazgjedhur (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Toni i ziles i telefonit"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Dridhje edhe kur bie zilja"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Me zile dhe me dridhje"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Menaxho telefonatën konferencë"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Numri i urgjencës"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekonda</item>
+ <item quantity="one">1 sekondë</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuta</item>
+ <item quantity="one">1 minutë</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> orë</item>
+ <item quantity="one">1 orë</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Fotografia e profilit"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera joaktive"</string>
+ <string name="child_number" msgid="4469090994612105532">"përmes <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Shënimi u dërgua"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mesazhet e fundit"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Informacioni i biznesit"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> milje larg"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km larg"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Hapet nesër në <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Hapet sot në <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Mbyllet në <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Mbyllur sot në <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Tani është hapur"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Tani është mbyllur"</string>
+</resources>
diff --git a/InCallUI/res/values-sr/strings.xml b/InCallUI/res/values-sr/strings.xml
new file mode 100644
index 000000000..a6f317b1b
--- /dev/null
+++ b/InCallUI/res/values-sr/strings.xml
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Телефон"</string>
+ <string name="onHold" msgid="527593602772521700">"На чекању"</string>
+ <string name="unknown" msgid="3646075119047488748">"Непознат"</string>
+ <string name="private_num" msgid="6081418498487514686">"Приватан број"</string>
+ <string name="payphone" msgid="5743050584468748607">"Телефонска говорница"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конференцијски позив"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Позив је прекинут"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Звучник"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Слушалица телефона"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Жичане наглавне слушалице"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Желите ли да пошаљете следеће тонове?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Тонови се шаљу\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Пошаљи"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Да"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Не"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Замените џокер знак са"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Конференцијски позив <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Број говорне поште"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Позива се"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Поново се бира"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конференцијски позив"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Долазни позив"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Долазни позив за Work"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Позив је завршен"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"На чекању"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Веза се прекида"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Позив је у току"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Мој број је <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Повезује се видео позив"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Видео позив"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Захтева се видео позив"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Повезивање видео позива није успело"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Захтев за видео позив је одбијен"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Број за повратни позив\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Број за хитан повратни позив\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Позива се"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Пропуштен позив"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Пропуштени позиви"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Број пропуштених позива: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Пропуштен позив од: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Текући позив"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Текући позив за Work"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Текући Wi-Fi позив"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Текући позив за Work преко Wi-Fi-ја"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"На чекању"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Долазни позив"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Долазни позив за Work"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Долазни Wi-Fi позив"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Долазни позив за Work преко Wi-Fi-ја"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Долазни видео позив"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Захтев за долазни видео позив"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Нова порука говорне поште"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Нова порука говорне поште (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Позови <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Непознат број говорне поште"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Мобилна мрежа није доступна"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Изабрана мрежа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) није доступна"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Одговори"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Прекини везу"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Видео"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Гласовни"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Прихватам"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Одбаци"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Узврати позив"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Пошаљи SMS"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Да бисте упутили позив, прво искључите режим рада у авиону."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Није регистровано на мрежи."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Мобилна мрежа није доступна."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Да бисте упутили позив, унесите важећи број."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Позив није успео."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Покреће се MMI секвенца..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Услуга није подржана."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Замена позива није успела."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Раздвајање позива није успело."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Пребацивање није успело."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Конференцијски позив није успео."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Одбијање позива није успело."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Успостављање позива није успело."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP позив"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Хитни позив"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Укључује се радио…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Мобилна мрежа није доступна. Покушавамо поново…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Позив није успео. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> није број за хитне случајеве."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Позив није успео. Позовите број за хитне случајеве."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Користите тастатуру за позивање"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Стави позив на чекање"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Настави позив"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Заврши позив"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Прикажи нумеричку тастатуру"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Сакриј нумеричку тастатуру"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Искључи звук"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Укључи звук"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Додај позив"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Обједини позиве"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Замени"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Управљај позивима"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Управљај конференцијским позивом"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конференцијски позив"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Управљај"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудио"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Видео позив"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Промени у гласовни позив"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Промени камеру"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Паузирај видео"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Још опција"</string>
+ <string name="player_started" msgid="3478865572468310331">"Плејер је покренут"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Плејер је заустављен"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камера није спремна"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камера је спремна"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Непознат догађај сесије позива"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Услуга"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Подешавање"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Није подешено&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Друга подешавања позива"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Позива се преко добављача <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Долазни позив преко <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"слика контакта"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"иди на приватно"</string>
+ <string name="selectContact" msgid="92191462970821951">"изаберите контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Напишите сами…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Откажи"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Пошаљи"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Одговори"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Пошаљи SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Одбиј"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Одговори видео позивом"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Одговори аудио-позивом"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Прихвати захтев за видео"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Одбиј захтев за видео"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Прихвати захтев за одлазни видео позив"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Одбиј захтев за одлазни видео позив"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Прихвати захтев за долазни видео позив"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Одбиј захтев за долазни видео позив"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Превуците нагоре за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Превуците улево за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Превуците удесно за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Превуците надоле за <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Вибрација"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Вибрација"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Звук"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Подразумевани звук (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Мелодија звона телефона"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Вибрирај када звони"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Мелодија звона и вибрација"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Управљај конференцијским позивом"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Број за хитне случајеве"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунде</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> минут</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> минута</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> сат</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> сата</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> сати</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Слика профила"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камера је искључена"</string>
+ <string name="child_number" msgid="4469090994612105532">"на <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Белешка је послата"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Недавне поруке"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Информације о предузећу"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Удаљеност је <xliff:g id="DISTANCE">%.1f</xliff:g> mi"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Удаљеност је <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Отвара се сутра у <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Отвара се данас у <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Затвара се у <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Затворило се данас у <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Тренутно отворено"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Тренутно затворено"</string>
+</resources>
diff --git a/InCallUI/res/values-sv/strings.xml b/InCallUI/res/values-sv/strings.xml
new file mode 100644
index 000000000..2a91e1dd3
--- /dev/null
+++ b/InCallUI/res/values-sv/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Parkerat"</string>
+ <string name="unknown" msgid="3646075119047488748">"Okänd"</string>
+ <string name="private_num" msgid="6081418498487514686">"Privat nummer"</string>
+ <string name="payphone" msgid="5743050584468748607">"Telefonautomat"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferenssamtal"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Samtalet avbröts"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Högtalare"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Telefonlur"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Trådanslutet headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Ska följande toner skickas?\nBREAK"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Skickar signaler\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Skicka"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ja"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Nej"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Ersätt jokertecknet med"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferenssamtal <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Nummer till röstbrevlåda"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Ringer"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Ringer upp igen"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferenssamtal"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Inkommande samtal"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Inkommande jobbsamtal"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Samtal avslutat"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Parkerat"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Lägger på"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"I samtal"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mitt telefonnummer är <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Ansluter video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Videosamtal"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Begär video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Det gick inte att ansluta till videosamtalet"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Videobegäran avslogs"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Ditt nummer för återuppringning\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Ditt nummer för återuppringning vid nödsamtal\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Ringer"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Missat samtal"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Missade samtal"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missade samtal"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Missat samtal från <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Pågående samtal"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Pågående jobbsamtal"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Pågående Wi-Fi-samtal"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Pågående jobbsamtal via Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Parkerat"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Inkommande samtal"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Inkommande jobbsamtal"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Inkommande Wi-Fi-samtal"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Inkommande jobbsamtal via Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Inkommande videosamtal"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Inkommande begäran om videosamtal"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Nytt röstmeddelande"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Nytt röstmeddelande (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Ring <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nummer till röstbrevlåda okänt"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ingen tjänst"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Det valda nätverket (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) är inte tillgängligt"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Svara"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Lägg på"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Röstsamtal"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Godkänn"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ignorera"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Ring upp"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Meddelande"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Om du vill ringa måste du först inaktivera flygplansläge."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Inte registrerat på nätverk."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Det finns inget mobilnät tillgängligt."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Ange ett giltigt nummer om du vill ringa ett samtal."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Det gick inte att ringa."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Startar sekvens för MMI-kod …"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Tjänsten stöds inte."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Det gick inte att växla mellan samtal."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Det gick inte att koppla isär samtalen."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Det gick inte att överföra."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Det gick inte att starta ett konferenssamtal."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Det gick inte att avvisa samtalet."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Det gick inte att släppa samtal."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP-samtal"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Nödsamtal"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Sätter på radion …"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ingen tjänst. Försöker igen …"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Det gick inte att ringa. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> är inget nödnummer."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Det gick inte att ringa. Slå ett nödnummer."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Använd tangentbordet om du vill ringa"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Parkera samtal"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Återuppta samtal"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Avsluta samtal"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Visa knappsats"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Dölj knappsats"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Ljud av"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Sluta ignorera"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Lägg till samtal"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Koppla ihop samtal"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Byt"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Hantera samtal"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Hantera konferenssamtal"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferenssamtal"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Hantera"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Ljud"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Videosamt."</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Byt till röstsamtal"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Byt kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Pausa video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Fler alternativ"</string>
+ <string name="player_started" msgid="3478865572468310331">"Videospelaren har startats"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Videospelaren har stoppats"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kameran är inte klar"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kameran är klar"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Okänd händelse vid samtalssession"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Tjänst"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Konfiguration"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Har inte angetts&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Övriga samtalsinställningar"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Ringer via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Inkommande via <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontaktbild"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"gör privat"</string>
+ <string name="selectContact" msgid="92191462970821951">"välj kontakt"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Skriv ett eget svar …"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Avbryt"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Skicka"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Svara"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Skicka sms"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Avvisa"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Svara som videosamtal"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Svara som röstsamtal"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Godkänn videobegäran"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Avvisa videobegäran"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Godkänn begäran om att skicka video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Avvisa begäran om att skicka video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Godkänn begäran om att ta emot video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Avvisa begäran om att ta emot video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> genom att dra uppåt."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> genom att dra åt vänster."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> genom att dra åt höger."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> genom att dra nedåt."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Vibrera"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Vibrera"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ljud"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Standardsignal (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ringsignal"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Enheten vibrerar vid samtal"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringsignal och vibration"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Hantera konferenssamtal"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Nödsamtalsnummer"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> sekunder</item>
+ <item quantity="one">1 sekund</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> minuter</item>
+ <item quantity="one">1 minut</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> timmar</item>
+ <item quantity="one">1 timme</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profilfoto"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera av"</string>
+ <string name="child_number" msgid="4469090994612105532">"via <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Anteckningen har skickats"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Senaste meddelandena"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Företagsuppgifter"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> miles bort"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km bort"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Öppnar i morgon kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Öppnar i dag kl. <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Stänger kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Stängde i dag kl. <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Öppet"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Stängt"</string>
+</resources>
diff --git a/InCallUI/res/values-sw/strings.xml b/InCallUI/res/values-sw/strings.xml
new file mode 100644
index 000000000..3b29d18d3
--- /dev/null
+++ b/InCallUI/res/values-sw/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Simu"</string>
+ <string name="onHold" msgid="527593602772521700">"Inangoja"</string>
+ <string name="unknown" msgid="3646075119047488748">"Isiyojulikana"</string>
+ <string name="private_num" msgid="6081418498487514686">"Nambari ya faragha"</string>
+ <string name="payphone" msgid="5743050584468748607">"Simu ya kulipia"</string>
+ <string name="confCall" msgid="3181961445236675173">"Simu ya mkutano"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Simu imekatwa"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Spika"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Kipaza sauti cha kichwani"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Vifaa vya sauti visivyo na waya"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Ungependa kutuma milio ya sauti inayofuata? \n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Inatuma milio ya simu\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Tuma"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ndiyo"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Hapana"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Badilisha herufi inayojitegemea kwa"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Simu ya mkutano <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Nambari ya ujumbe wa sauti"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Inapiga"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Inapiga simu tena"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Simu ya mkutano"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Unapigiwa simu"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Simu ya kazi inayoingia"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Simu imekamilika"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Inangoja"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Kukata simu"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Katika simu"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Nambari yangu ni <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Inaunganisha video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Hangout ya Video"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Inaomba video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Haiwezi kuunganisha Hangout ya video"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Ombi la video limekataliwa"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Nambari yako ya kupigiwa simu\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Nambari yako ya dharura ya kupigiwa simu\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Inapiga"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Simu ambayo hukujibu"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Simu ambazo hukujibu"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Simu <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ambazo hukujibu"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Simu ambayo hukujibu kutoka <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Simu inayoendelea"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Simu ya kazi inayoendelea"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Simu ya Wi-Fi inayoendelea"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Simu ya Wi-Fi ya kazi inayoendelea"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Inangoja"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Unapigiwa simu"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Unapigiwa simu ya kazi"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Unapigiwa simu kupitia Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Unapigiwa simu ya kazini kupitia Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Hangout ya Video inayoingia"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Ombi linaloingia la video"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Ujumbe mpya wa sauti"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Ujumbe (<xliff:g id="COUNT">%d</xliff:g>) mpya wa sauti"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Piga <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Nambari ya ujumbe wa sauti haijulikani."</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Hakuna huduma"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Mtandao uliochaguliwa (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) haupatikani"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Jibu"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Kata simu"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Sauti"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Kubali"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Ondoa"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Mpigie"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Ujumbe"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Ili upige simu kwanza, zima Hali ya ndegeni."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Haijasajiliwa kwenye mtandao."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Mitandao ya simu za mkononi haipatikani."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Ili upige simu, weka nambari sahihi."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Haiwezi kupiga simu."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Inaanzisha msururu wa MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Huduma haitumiki."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Haiwezi kubadili simu."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Haiwezi kutenganisha simu."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Haiwezi kuhamisha."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Haiwezi kushiriki katika simu ya mkutano."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Haiwezi kukataa simu."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Haiwezi kutoa simu."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Simu ya SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Simu ya dharura"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Inawasha redio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Hakuna huduma. Inajaribu tena..."</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Haiwezi kupiga simu. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> si nambari ya dharura."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Haiwezi kupiga simu. Piga simu nambari ya dharura."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Tumia kibodi kubonyeza"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Shikilia Simu"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Endelea na Simu"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Kata Simu"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Onyesha Vitufe vya Kupiga Simu"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ficha Vitufe vya Kupiga Simu"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Zima Sauti"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Rejesha sauti"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Ongeza simu"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Unganisha simu"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Badili"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Dhibiti simu"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Dhibiti simu ya mkutano"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Mkutano kwenye simu"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Dhibiti"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Sauti"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Hangout ya Video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Badilisha iwe simu ya sauti"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Badilisha kamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Sitisha video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Chaguo zaidi"</string>
+ <string name="player_started" msgid="3478865572468310331">"Kichezaji Kimeanzishwa"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Kichezaji Kimekomeshwa"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera haiko tayari"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera iko tayari"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Tukio lisilojulikana la kipindi cha simu"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Huduma"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Weka mipangilio"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Haijawekwa&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Mipangilio mingine ya simu"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Kupiga simu kupitia <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Simu zinazoingia kupitia <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"picha ya anwani"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"tumia kwa faragha"</string>
+ <string name="selectContact" msgid="92191462970821951">"chagua anwani"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Andika yako binafsi..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Ghairi"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Tuma"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Jibu"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Tuma SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Kataa"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Pokea kama Hangout ya Video"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Pokea kama simu ya sauti"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Kubali ombi la video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Kataa ombi la video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Kubali ombi la kutuma kupitia hangout ya video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Kataa ombi la kutuma kupitia hangout ya video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Kubali ombi la kupokea kupitia hangout ya video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Kataa ombi la kupokea kupitia hangout ya video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Telezesha kidole juu ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Telezesha kidole kushoto ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Telezesha kidole kulia ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Telezesha kidole chini ili <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Mtetemo"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Mtetemo"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Mlio"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Sauti chaguo-msingi (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Mlio wa simu"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Tetema wakati wa kuita"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Mlio wa simu na Mtetemo"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Dhibiti simu ya mkutano"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Nambari ya dharura"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other">Sekunde <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="one">Sekunde 1</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other">Dakika <xliff:g id="COUNT">%d</xliff:g></item>
+ <item quantity="one">Dakika 1</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other">Saa <xliff:g id="COUNT">%d</xliff:g> </item>
+ <item quantity="one">Saa 1</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Picha ya wasifu"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera imezimwa"</string>
+ <string name="child_number" msgid="4469090994612105532">"kupitia <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Dokezo limetumwa"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Ujumbe wa hivi majuzi"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Maelezo ya biashara"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Umbali wa maili <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Umbali wa kilomita <xliff:g id="DISTANCE">%.1f</xliff:g>"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Itafunguliwa kesho saa <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Itafunguliwa leo saa <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Hufungwa saa <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Imefungwa leo saa <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Sasa imefunguliwa"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Sasa imefungwa"</string>
+</resources>
diff --git a/InCallUI/res/values-sw360dp/dimens.xml b/InCallUI/res/values-sw360dp/dimens.xml
new file mode 100644
index 000000000..9fbcd605b
--- /dev/null
+++ b/InCallUI/res/values-sw360dp/dimens.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Dimensions for CallCard elements (the normal in-call UI) -->
+
+ <!-- Text size for the name in the call info. -->
+ <dimen name="call_status_text_size">22sp</dimen>
+ <dimen name="call_status_text_min_size">18sp</dimen>
+ <dimen name="call_name_text_size">45dp</dimen>
+ <dimen name="call_name_text_min_size">34sp</dimen>
+ <dimen name="call_label_text_size">18sp</dimen>
+
+ <!-- The InCallUI dialpad will sometimes want digits sizes that are different from dialer. -->
+ <dimen name="dialpad_key_number_margin_bottom">@dimen/dialpad_key_number_default_margin_bottom</dimen>
+ <!-- Zero key should have less space between self and text because "+" is smaller -->
+ <dimen name="dialpad_zero_key_number_margin_bottom">@dimen/dialpad_zero_key_number_default_margin_bottom</dimen>
+ <dimen name="dialpad_digits_adjustable_text_size">@dimen/dialpad_digits_text_size</dimen>
+ <dimen name="dialpad_digits_adjustable_height">@dimen/dialpad_digits_height</dimen>
+ <dimen name="dialpad_key_numbers_size">@dimen/dialpad_key_numbers_default_size</dimen>
+</resources>
diff --git a/InCallUI/res/values-sw410dp/config.xml b/InCallUI/res/values-sw410dp/config.xml
new file mode 100644
index 000000000..a57f86784
--- /dev/null
+++ b/InCallUI/res/values-sw410dp/config.xml
@@ -0,0 +1,21 @@
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Determines the maximum number of buttons visible on the call card. Any buttons over this
+ count are put into the overflow menu. -->
+ <integer name="call_card_max_buttons">6</integer>
+</resources> \ No newline at end of file
diff --git a/InCallUI/res/values-ta-rIN/strings.xml b/InCallUI/res/values-ta-rIN/strings.xml
new file mode 100644
index 000000000..cdaf61395
--- /dev/null
+++ b/InCallUI/res/values-ta-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ஃபோன்"</string>
+ <string name="onHold" msgid="527593602772521700">"ஹோல்டில் உள்ளது"</string>
+ <string name="unknown" msgid="3646075119047488748">"தெரியாத எண்"</string>
+ <string name="private_num" msgid="6081418498487514686">"தனிப்பட்ட எண்"</string>
+ <string name="payphone" msgid="5743050584468748607">"கட்டணத் தொலைபேசி"</string>
+ <string name="confCall" msgid="3181961445236675173">"குழு அழைப்பு"</string>
+ <string name="call_lost" msgid="8208184291640961172">"அழைப்பு நிறுத்தப்பட்டது"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ஸ்பீக்கர்"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ஹேண்ட்செட் இயர்ஃபீஸ்"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"வயருள்ள ஹெட்செட்"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"புளூடூத்"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"பின்வரும் டோன்களை அனுப்பவா?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"டோன்களை அனுப்புகிறது\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"அனுப்பு"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ஆம்"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"வேண்டாம்"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"சிறப்புக்குறியை இதன் மூலம் மாற்றியமை"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"குழு அழைப்பு: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"குரலஞ்சல் எண்"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"அழைக்கிறது"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"மீண்டும் டயல் செய்கிறது"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"குழு அழைப்பு"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"உள்வரும் அழைப்பு"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"உள்வரும் அழைப்பு (பணி)"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"அழைப்பு முடிந்தது"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ஹோல்டில் உள்ளது"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"துண்டிக்கிறது"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"அழைப்பில்"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"எனது எண்: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"வீடியோவை இணைக்கிறது"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"வீடியோ அழைப்பு"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"வீடியோவைக் கோருகிறது"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"வீடியோ அழைப்பை இணைக்க முடியவில்லை"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"வீடியோ கோரிக்கை நிராகரிக்கப்பட்டது"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"உங்களைத் திரும்ப அழைப்பதற்கான எண்\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"அவசர அழைப்பு எண்\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"அழைக்கிறது"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"தவறிய அழைப்பு"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"தவறிய அழைப்புகள்"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> தவறிய அழைப்புகள்"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> இடமிருந்து தவறிய அழைப்பு"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"செயலில் இருக்கும் அழைப்பு"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"செயலில் இருக்கும் அழைப்பு (பணி)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"செயலில் இருக்கும் வைஃபை அழைப்பு"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"செயலில் இருக்கும் வைஃபை அழைப்பு"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ஹோல்டில் உள்ளது"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"உள்வரும் அழைப்பு"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"உள்வரும் அழைப்பு (பணி)"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"உள்வரும் வைஃபை அழைப்பு"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"உள்வரும் வைஃபை அழைப்பு (பணி)"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"உள்வரும் வீடியோ அழைப்பு"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"உள்வரும் வீடியோ கோரிக்கை"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"புதிய குரலஞ்சல்"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"புதிய குரலஞ்சல் (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>ஐ அழை"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"குரலஞ்சல் எண் அறியப்படவில்லை"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"சேவை இல்லை"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"தேர்ந்தெடுத்த நெட்வொர்க் (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) கிடைக்கவில்லை"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"பதிலளி"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"துண்டி"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"வீடியோ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"குரல்"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ஏற்கிறேன்"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"நிராகரி"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"திரும்ப அழை"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"செய்தி அனுப்பு"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"அழைப்பதற்கு, முதலில் விமானப் பயன்முறையை முடக்கவும்."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"நெட்வொர்க்கில் பதிவுசெய்யப்படவில்லை."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"செல்லுலார் நெட்வொர்க் கிடைக்கவில்லை."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"அழைக்க, சரியான எண்ணை உள்ளிடவும்."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"அழைக்க முடியாது."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI வரிசையைத் தொடங்குகிறது..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"சேவை ஆதரிக்கப்படவில்லை."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"அழைப்புகளில் மாற முடியாது."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"அழைப்பைப் பிரிக்க முடியாது."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"மாற்ற முடியாது."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"குழு அழைப்பு செய்ய முடியாது."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"அழைப்பை நிராகரிக்க முடியாது."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"அழைப்பை(அழைப்புகளை) விடுவிக்க முடியாது."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP அழைப்பு"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"அவசர அழைப்பு"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ரேடியோவை இயக்குகிறது…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"சேவை இல்லை. மீண்டும் முயல்கிறது…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> என்பது அவசர அழைப்பு எண் இல்லை என்பதால் அழைக்க முடியாது."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"அழைக்க முடியாது. அவசர அழைப்பு எண்ணை அழைக்கவும்."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"டயல் செய்ய, விசைப்பலகையைப் பயன்படுத்தவும்"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"அழைப்பை ஹோல்டில் வை"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"அழைப்பை மீண்டும் தொடங்கு"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"அழைப்பை முடி"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"டயல்பேடைக் காட்டு"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"டயல்பேடை மறை"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ஒலியடக்கு"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"ஒலி இயக்கு"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"அழைப்பைச் சேர்"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"அழைப்புகளை இணை"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"மாற்று"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"அழைப்புகளை நிர்வகி"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"குழு அழைப்பை நிர்வகி"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"குழு அழைப்பு"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"நிர்வகி"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ஆடியோ"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"வீடியோ அழைப்பு"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"குரல் அழைப்பிற்கு மாறு"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"கேமராவை மாற்று"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"வீடியோவை இடைநிறுத்து"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"கூடுதல் விருப்பங்கள்"</string>
+ <string name="player_started" msgid="3478865572468310331">"வீடியோ பிளேயர் துவங்கியது"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"வீடியோ பிளேயர் நிறுத்தப்பட்டது"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"கேமரா தயாராக இல்லை"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"கேமரா தயார்"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"தெரியாத அழைப்பு நேர நிகழ்வு"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"சேவை"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"அமை"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;அமைக்கப்படவில்லை&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"பிற அழைப்பு அமைப்புகள்"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> வழியாக அழைக்கிறது"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> மூலம் உள்வரும் அழைப்புகள்"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"தொடர்புப் படம்"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"தனிப்பட்டதிற்குச் செல்"</string>
+ <string name="selectContact" msgid="92191462970821951">"தொடர்பைத் தேர்ந்தெடுக்கவும்"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"சொந்தமாக எழுதவும்..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"ரத்துசெய்"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"அனுப்பு"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"பதிலளி"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS அனுப்பு"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"நிராகரி"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"வீடியோ அழைப்பில் பதிலளி"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ஆடியோ அழைப்பில் பதிலளி"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"வீடியோ கோரிக்கையை அனுமதி"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"வீடியோ கோரிக்கையை நிராகரி"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"வீடியோவைப் பரிமாற்றும் கோரிக்கையை அனுமதி"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"வீடியோவைப் பரிமாற்றும் கோரிக்கையை நிராகரி"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"வீடியோவைப் பெறும் கோரிக்கையை அனுமதி"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"வீடியோவைப் பெறும் கோரிக்கையை நிராகரி"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, மேலே ஸ்லைடு செய்க."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, இடப்புறம் ஸ்லைடு செய்க."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, வலப்புறம் ஸ்லைடு செய்க."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>, கீழே ஸ்லைடு செய்க."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"அதிர்வுறு"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"அதிர்வுறு"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ஒலி"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"இயல்பு ஒலி (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ஃபோனின் ரிங்டோன்"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"அழைக்கும் போது அதிர்வுறு"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"ரிங்டோன் &amp; அதிர்வு"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"குழு அழைப்பை நிர்வகி"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"அவசர அழைப்பு எண்"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> வினாடிகள்</item>
+ <item quantity="one">1 வினாடி</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> நிமிடங்கள்</item>
+ <item quantity="one">1 நிமிடம்</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> மணிநேரம்</item>
+ <item quantity="one">1 மணிநேரம்</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"சுயவிவரப் படம்"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"கேமரா முடக்கப்பட்டது"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> வழியாக"</string>
+ <string name="note_sent" msgid="7623014827902758398">"குறிப்பு அனுப்பப்பட்டது"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"சமீபத்திய செய்திகள்"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"வணிகத் தகவல்"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> மைல் தொலைவில்"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> கிமீ தொலைவில்"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"நாளை <xliff:g id="OPEN_TIME">%s</xliff:g>க்குத் திறக்கப்படும்"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"இன்று <xliff:g id="OPEN_TIME">%s</xliff:g>க்குத் திறக்கப்படும்"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>க்கு மூடப்படும்"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"இன்று <xliff:g id="CLOSE_TIME">%s</xliff:g>க்கு மூடப்பட்டது"</string>
+ <string name="open_now" msgid="4615706338669555999">"இப்போது திறக்கப்பட்டுள்ளது"</string>
+ <string name="closed_now" msgid="2635314668145282080">"இப்போது மூடப்பட்டுள்ளது"</string>
+</resources>
diff --git a/InCallUI/res/values-te-rIN/strings.xml b/InCallUI/res/values-te-rIN/strings.xml
new file mode 100644
index 000000000..74134fc15
--- /dev/null
+++ b/InCallUI/res/values-te-rIN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"ఫోన్"</string>
+ <string name="onHold" msgid="527593602772521700">"హోల్డ్‌లో ఉంది"</string>
+ <string name="unknown" msgid="3646075119047488748">"తెలియదు"</string>
+ <string name="private_num" msgid="6081418498487514686">"ప్రైవేట్ నంబర్"</string>
+ <string name="payphone" msgid="5743050584468748607">"పే ఫోన్"</string>
+ <string name="confCall" msgid="3181961445236675173">"కాన్ఫరెన్స్ కాల్"</string>
+ <string name="call_lost" msgid="8208184291640961172">"కాల్ కట్ అయింది"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"స్పీకర్"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"హ్యాండ్‌సెట్ ఇయర్‌పీస్"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"వైర్ గల హెడ్‌సెట్"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"బ్లూటూత్"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"కింది టోన్‌లను పంపాలా?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"టోన్‌లు పంపుతోంది\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"పంపు"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"అవును"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"వద్దు"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"దీనితో వైల్డ అక్షరాన్ని భర్తీ చేయండి"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"కాన్ఫరెన్స్ కాల్ <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"వాయిస్ మెయిల్ నంబర్"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"డయల్ చేస్తోంది"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"మళ్లీ డయల్ చేస్తోంది"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"కాన్ఫరెన్స్ కాల్"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"ఇన్‌కమింగ్ కాల్"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"ఇన్‌కమింగ్ కార్యాలయ కాల్"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"కాల్ ముగిసింది"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"హోల్డ్‌లో ఉంది"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"ముగిస్తోంది"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"కాల్‌లో ఉంది"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"నా నంబర్ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"వీడియోను కనెక్ట్ చేస్తోంది"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"వీడియో కాల్"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"వీడియో కోసం అభ్యర్థిస్తోంది"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"వీడియో కాల్‌ను కనెక్ట్ చేయలేరు"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"వీడియో అభ్యర్థన తిరస్కరించబడింది"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"మీ కాల్‌బ్యాక్ నంబర్\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"మీ అత్యవసర కాల్‌బ్యాక్ నంబర్\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"డయల్ చేస్తోంది"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"సమాధానం ఇవ్వని కాల్"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"సమాధానం ఇవ్వని కాల్‌లు"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> సమాధానం ఇవ్వని కాల్‌లు"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> నుండి సమాధానం ఇవ్వని కాల్"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"కార్యాలయ కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Wi-Fi కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Wi-Fi కార్యాలయ కాల్ కొనసాగుతోంది"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"హోల్డ్‌లో ఉంది"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"ఇన్‌కమింగ్ కాల్"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"ఇన్‌కమింగ్ కార్యాలయ కాల్"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"ఇన్‌కమింగ్ Wi-Fi కాల్"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"ఇన్‌కమింగ్ Wi-Fi కార్యాలయ కాల్"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"ఇన్‌కమింగ్ వీడియో కాల్"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"ఇన్‌కమింగ్ వీడియో అభ్యర్థన"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"కొత్త వాయిస్ మెయిల్"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"కొత్త వాయిస్ మెయిల్ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>కు డయల్ చేయండి"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"వాయిస్ మెయిల్ నంబర్ తెలియదు"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"సేవ లేదు"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"ఎంచుకున్న నెట్‌వర్క్ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) అందుబాటులో లేదు"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"సమాధానం"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"కాల్ ముగించు"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"వీడియో"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"వాయిస్"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ఆమోదిస్తున్నాను"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"తీసివేయి"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"తిరిగి కాల్ చేయి"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"సందేశం పంపు"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"కాల్ చేయడానికి, ముందుగా ఎయిర్‌ప్లైన్ మోడ్‌ను ఆపివేయండి."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"నెట్‌వర్క్‌లో నమోదు కాలేదు."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"సెల్యులార్ నెట్‌వర్క్ అందుబాటులో లేదు."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"కాల్ చేయడానికి, చెల్లుబాటు అయ్యే నంబర్‌ను నమోదు చేయండి."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"కాల్ చేయలేరు."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI శ్రేణిని ప్రారంభిస్తోంది…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"సేవకు మద్దతు లేదు."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"కాల్‌లను మార్చలేరు."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"కాల్‌ను వేరు చేయలేరు."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"బదిలీ చేయలేరు."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"కాన్ఫరెన్స్ కాల్ కుదరదు."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"కాల్‌ను తిరస్కరించలేరు."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"కాల్(ల)ను విడిచిపెట్టలేరు."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP కాల్"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"అత్యవసర కాల్"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"రేడియోను ఆన్ చేస్తోంది…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"సేవ లేదు. మళ్లీ ప్రయత్నిస్తోంది…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"కాల్ చేయలేరు. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> అత్యవసర నంబర్ కాదు."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"కాల్ చేయలేరు. అత్యవసర నంబర్‌కు డయల్ చేయండి."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"డయల్ చేయడానికి కీబోర్డ్‌ను ఉపయోగించండి"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"కాల్‌ను హోల్డ్‌లో ఉంచు"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"కాల్‌ను పునఃప్రారంభించు"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"కాల్‌ని ముగించు"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"డయల్‌ప్యాడ్‌ను చూపు"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"డయల్‌ప్యాడ్‌ను దాచు"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"మ్యూట్ చేయి"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"అన్‌మ్యూట్ చేయి"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"కాల్‌ను జోడించు"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"కాల్‌లను విలీనం చేయి"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"స్వాప్ చేయి"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"కాల్‌లను నిర్వహించు"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"కాన్ఫరెన్స్ కాల్‌ను నిర్వహించు"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"కాన్ఫరెన్స్ కాల్"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"నిర్వహించు"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"ఆడియో"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"వీడియో కాల్"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"వాయిస్ కాల్‌కి మార్చు"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"కెమెరాను మార్చు"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"వీడియోను పాజ్ చేయి"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"మరిన్ని ఎంపికలు"</string>
+ <string name="player_started" msgid="3478865572468310331">"ప్లేయర్ ప్రారంభమైంది"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"ప్లేయర్ ఆపివేయబడింది"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"కెమెరా సిద్ధంగా లేదు"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"కెమెరా సిద్ధంగా ఉంది"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"తెలియని కాల్ సెషన్ ఉదంతం"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"సేవ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"సెటప్ చేయండి"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;సెట్ చేయలేదు&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"ఇతర కాల్ సెట్టింగ్‌లు"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ద్వారా కాల్ చేయబడుతోంది"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> ద్వారా ఇన్‌కమింగ్"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"పరిచయం ఫోటో"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"ప్రైవేట్‌గా వెళ్లు"</string>
+ <string name="selectContact" msgid="92191462970821951">"పరిచయాన్ని ఎంచుకోండి"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"మీ స్వంతంగా వ్రాయండి…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"రద్దు చేయి"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"పంపు"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"సమాధానం"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMSని పంపుతుంది"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"తిరస్కరిస్తుంది"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"వీడియో కాల్ రూపంలో సమాధానం"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"ఆడియో కాల్ రూపంలో సమాధానం"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"వీడియో అభ్యర్థనను ఆమోదిస్తుంది"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"వీడియో అభ్యర్థనను తిరస్కరిస్తుంది"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"వీడియో ప్రసరణ అభ్యర్థనను ఆమోదిస్తుంది"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"వీడియో ప్రసరణ అభ్యర్థనను తిరస్కరిస్తుంది"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"వీడియో స్వీకరణ అభ్యర్థనను ఆమోదిస్తుంది"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"వీడియో స్వీకరణ అభ్యర్థనను తిరస్కరిస్తుంది"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం కుడివైపుకు స్లైడ్ చేయండి."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం కిందికి స్లైడ్ చేయండి."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"వైబ్రేట్"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"వైబ్రేట్"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"ధ్వని"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"డిఫాల్ట్ ధ్వని (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"ఫోన్ రింగ్‌టోన్"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"రింగ్ అయ్యేప్పుడు వైబ్రేషన్"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"రింగ్‌టోన్ &amp; వైబ్రేట్"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"కాన్ఫరెన్స్ కాల్‌ను నిర్వహించు"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"అత్యవసర నంబర్"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> సెకన్లు</item>
+ <item quantity="one">1 సెకను</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> నిమిషాలు</item>
+ <item quantity="one">1 నిమిషం</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> గంటలు</item>
+ <item quantity="one">1 గంట</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"ప్రొఫైల్ ఫోటో"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"కెమెరా ఆఫ్‌లో ఉంది"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> ద్వారా"</string>
+ <string name="note_sent" msgid="7623014827902758398">"గమనిక పంపబడింది"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ఇటీవలి సందేశాలు"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"వ్యాపార సంస్థ సమాచారం"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> మై దూరంలో ఉంది"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> కి.మీ దూరంలో ఉంది"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"రేపు <xliff:g id="OPEN_TIME">%s</xliff:g>కి తెరవబడుతుంది"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"ఈరోజు <xliff:g id="OPEN_TIME">%s</xliff:g>కి తెరవబడుతుంది"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g>కి మూసివేయబడుతుంది"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ఈరోజు <xliff:g id="CLOSE_TIME">%s</xliff:g>కి మూసివేయబడి ఉంటుంది"</string>
+ <string name="open_now" msgid="4615706338669555999">"ఇప్పుడు తెరిచి ఉంది"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ఇప్పుడు మూసివేయబడింది"</string>
+</resources>
diff --git a/InCallUI/res/values-th/strings.xml b/InCallUI/res/values-th/strings.xml
new file mode 100644
index 000000000..db9b3418f
--- /dev/null
+++ b/InCallUI/res/values-th/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"โทรศัพท์"</string>
+ <string name="onHold" msgid="527593602772521700">"พักสาย"</string>
+ <string name="unknown" msgid="3646075119047488748">"ไม่ทราบ"</string>
+ <string name="private_num" msgid="6081418498487514686">"หมายเลขส่วนตัว"</string>
+ <string name="payphone" msgid="5743050584468748607">"โทรศัพท์สาธารณะ"</string>
+ <string name="confCall" msgid="3181961445236675173">"การประชุมสาย"</string>
+ <string name="call_lost" msgid="8208184291640961172">"สายหลุด"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"ลำโพง"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ชุดหูฟังโทรศัพท์"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"ชุดหูฟังแบบมีสาย"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"บลูทูธ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"ส่งหมายเลขต่อไปไหม\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"กำลังส่งหมายเลข\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"ส่ง"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ใช่"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"ไม่"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"แทนที่อักขระแทนด้วย"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"การประชุมสาย <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"หมายเลขข้อความเสียง"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"กำลังโทรออก"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"โทรใหม่"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"การประชุมสาย"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"สายเรียกเข้า"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"มีสายเรียกเข้าจากที่ทำงาน"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"วางสายแล้ว"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"พักสาย"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"กำลังวางสาย"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"กำลังใช้สาย"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"หมายเลขของฉันคือ <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"กำลังเชื่อมต่อวิดีโอ"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"แฮงเอาท์วิดีโอ"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"กำลังขอวิดีโอ"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ไม่สามารถเชื่อมต่อแฮงเอาท์วิดีโอได้"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"คำขอวิดีโอถูกปฏิเสธ"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"หมายเลขโทรกลับของคุณ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"หมายเลขโทรกลับฉุกเฉินของคุณ\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"กำลังโทรออก"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"สายที่ไม่ได้รับ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"สายที่ไม่ได้รับ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"ไม่ได้รับ <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> สาย"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"สายที่ไม่ได้รับจาก <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"โทรต่อเนื่อง"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"กำลังอยู่ในสายจากที่ทำงาน"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"กำลังโทรผ่าน Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"กำลังอยู่ในสายจากที่ทำงานผ่าน Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"พักสาย"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"สายเรียกเข้า"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"มีสายเรียกเข้าจากที่ทำงาน"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"สายโทรเข้าผ่าน Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"มีสายเรียกเข้าจากที่ทำงานผ่าน Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"แฮงเอาท์วิดีโอเรียกเข้า"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"คำขอโทรเข้าเป็นวิดีโอ"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"ข้อความเสียงใหม่"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"ข้อความเสียงใหม่ (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"หมุนหมายเลข <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"ไม่ทราบหมายเลขข้อความเสียง"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"ไม่มีบริการ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"เครือข่ายที่เลือกไว้ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ไม่พร้อมใช้งาน"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"รับสาย"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"วางสาย"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"วิดีโอ"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"เสียง"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"ยอมรับ"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"ปิด"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"โทรกลับ"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"ข้อความ"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"หากต้องการโทรออก ให้ปิดโหมดบนเครื่องบินก่อน"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"ยังไม่ได้ลงทะเบียนบนเครือข่าย"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"เครือข่ายมือถือใช้งานไม่ได้"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"หากต้องการโทรออก โปรดป้อนหมายเลขที่ถูกต้อง"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"ไม่สามารถโทรได้"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"กำลังเริ่มต้นลำดับ MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"ไม่สนับสนุนบริการนี้"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"ไม่สามารถสลับสายได้"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"ไม่สามารถแยกสายได้"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"ไม่สามารถโอนได้"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"ไม่สามารถประชุมได้"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"ไม่สามารถปฏิเสธสายได้"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"ไม่สามารถเริ่มการโทรได้"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"โทรแบบ SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"หมายเลขฉุกเฉิน"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"กำลังเปิดวิทยุ…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"ไม่มีบริการ โปรดลองอีกครั้ง…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"โทรออกไม่ได้ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ไม่ใช่หมายเลขฉุกเฉิน"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"ไม่สามารถโทรออก โทรหมายเลขฉุกเฉิน"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ใช้แป้นพิมพ์กดหมายเลขโทรศัพท์"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"พักสาย"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"โทรต่อ"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"วางสาย"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"แสดงแป้นหมายเลข"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ซ่อนแป้นหมายเลข"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"ปิดเสียง"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"เปิดเสียง"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"เพิ่มการโทร"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"รวมสาย"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"สลับ"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"จัดการการโทร"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"จัดการการประชุมสาย"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"การประชุมสาย"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"จัดการ"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"เสียง"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"แฮงเอาท์วิดีโอ"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"เปลี่ยนเป็นการโทรด้วยเสียง"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"เปลี่ยนกล้อง"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"หยุดวิดีโอชั่วคราว"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"ตัวเลือกเพิ่มเติม"</string>
+ <string name="player_started" msgid="3478865572468310331">"โปรแกรมเล่นเริ่มทำงานแล้ว"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"โปรแกรมเล่นหยุดแล้ว"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"กล้องไม่พร้อมทำงาน"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"กล้องพร้อมทำงาน"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"เหตุการณ์เซสชันการโทรที่ไม่รู้จัก"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"บริการ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"ตั้งค่า"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;ไม่ได้ตั้งค่า&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"การตั้งค่าการโทรอื่นๆ"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"โทรผ่าน <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"สายเรียกเข้าผ่าน <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"ภาพของรายชื่อติดต่อ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"เข้าสู่โหมดส่วนตัว"</string>
+ <string name="selectContact" msgid="92191462970821951">"เลือกรายชื่อติดต่อ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"เขียนคำตอบของคุณเอง..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"ยกเลิก"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"ส่ง"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"รับสาย"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"ส่ง SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"ปฏิเสธ"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"รับสายเป็นแฮงเอาท์วิดีโอ"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"รับสายเป็นการโทรด้วยเสียง"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ยอมรับคำขอวิดีโอ"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ปฏิเสธคำขอวิดีโอ"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ยอมรับคำขอให้ส่งวิดีโอ"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ปฏิเสธคำขอให้ส่งวิดีโอ"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ยอมรับคำขอให้รับวิดีโอ"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ปฏิเสธคำขอให้รับวิดีโอ"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"เลื่อนไปข้างบนเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"เลื่อนไปทางซ้ายเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"เลื่อนไปทางขวาเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"เลื่อนลงเพื่อ <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"สั่น"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"สั่น"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"เสียง"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"เสียงเริ่มต้น (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"เสียงเรียกเข้าโทรศัพท์"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"สั่นเมื่อมีสายเข้า"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"เสียงเรียกเข้าและสั่น"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"จัดการการประชุมสาย"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"หมายเลขฉุกเฉิน"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> วินาที</item>
+ <item quantity="one">1 วินาที</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> นาที</item>
+ <item quantity="one">1 นาที</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> ชั่วโมง</item>
+ <item quantity="one">1 ชั่วโมง</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"รูปโปรไฟล์"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"ปิดกล้อง"</string>
+ <string name="child_number" msgid="4469090994612105532">"ผ่านหมายเลข <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"ส่งโน้ตแล้ว"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"ข้อความล่าสุด"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"ข้อมูลธุรกิจ"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"อยู่ห่างออกไป <xliff:g id="DISTANCE">%.1f</xliff:g> ไมล์"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"อยู่ห่างออกไป <xliff:g id="DISTANCE">%.1f</xliff:g> กม."</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"เปิดให้บริการพรุ่งนี้เวลา <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"เปิดให้บริการวันนี้เวลา <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"ปิดให้บริการเวลา <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"ปิดให้บริการแล้ววันนี้เวลา <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"ขณะนี้เปิดทำการ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"ขณะนี้ปิดทำการ"</string>
+</resources>
diff --git a/InCallUI/res/values-tl/strings.xml b/InCallUI/res/values-tl/strings.xml
new file mode 100644
index 000000000..994e5b6d1
--- /dev/null
+++ b/InCallUI/res/values-tl/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telepono"</string>
+ <string name="onHold" msgid="527593602772521700">"Naka-hold"</string>
+ <string name="unknown" msgid="3646075119047488748">"Hindi alam"</string>
+ <string name="private_num" msgid="6081418498487514686">"Pribadong numero"</string>
+ <string name="payphone" msgid="5743050584468748607">"Payphone"</string>
+ <string name="confCall" msgid="3181961445236675173">"Conference call"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Naputol ang tawag"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Speaker"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Handset earpiece"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Wired na headset"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Ipapadala ba ang mga sumusunod na tono?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Nagpapadala ng mga tono\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Ipadala"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Oo"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Hindi"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Palitan ang wild character ng"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Conference call <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Numero ng voicemail"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Dina-dial"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Muling dina-dial"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Conference call"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Papasok na tawag"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Papasok na tawag sa trabaho"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Ibinaba ang tawag"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Naka-hold"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Binababa"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Nasa tawag"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Ang aking numero ay <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Ikinokonekta ang video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Mag-video call"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Humihiling ng video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Hindi makakonekta sa video call"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Tinanggihan ang kahilingan sa video"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Ang iyong numero ng callback\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Ang iyong emergency na numero ng callback\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Dina-dial"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Hindi nasagot na tawag"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Mga hindi nasagot na tawag"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> (na) hindi nasagot na tawag"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Hindi nasagot ang tawag mula kay <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Kasalukuyang tawag"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Kasalukuyang tawag sa trabaho"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Kasalukuyang tawag sa Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Kasalukuyang tawag sa trabaho sa pamamagitan ng Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Naka-hold"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Papasok na tawag"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Papasok na tawag sa trabaho"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Papasok na tawag sa Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Papasok na tawag sa trabaho sa pamamagitan ng Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Papasok na video call"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Papasok na kahilingan ng video"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Bagong voicemail"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Bagong voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"I-dial ang <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Hindi kilala ang numero ng voicemail"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Walang serbisyo"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Hindi available ang piniling network (<xliff:g id="OPERATOR_NAME">%s</xliff:g>)"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Sagutin"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Ibaba"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Boses"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Tanggapin"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"I-dismiss"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Tawagan"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Mensahe"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Upang tumawag, paki-off muna ang Airplane mode."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Hindi nakarehistro sa network."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Hindi available ang cellular network."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Upang tumawag, maglagay ng wastong numero."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Hindi makatawag."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Sinisimulan ang pagkakasunud-sunod ng MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Hindi sinusuportahan ang serbisyo."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Hindi mailipat ang mga tawag."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Hindi mapaghiwalay ang tawag."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Hindi mailipat."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Hindi makapag-conference."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Hindi matanggihan ang tawag."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Hindi mailabas ang (mga) tawag."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Tawag sa SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Emergency na tawag"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Ino-on ang radyo…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Walang serbisyo. Sinusubukang muli…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Hindi makatawag. Ang <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ay hindi isang pang-emergency na numero."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Hindi makatawag. Mag-dial ng pang-emergency na numero."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Gamitin ang keyboard upang mag-dial"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"I-hold ang Tawag"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Ituloy ang Tawag"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Ibaba ang Tawag"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Ipakita ang Dialpad"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Itago ang Dialpad"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"I-mute"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Alisin sa pagkaka-mute"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Magdagdag ng tawag"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Pagsamahin ang mga tawag"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Pagpalitin"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Pamahalaan ang mga tawag"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Pamahalaan ang conference call"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Conference call"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Pamahalaan"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Mag-video call"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Gawing voice call"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Lumipat ng camera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"I-pause ang video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Higit pang mga opsyon"</string>
+ <string name="player_started" msgid="3478865572468310331">"Nagsimula na ang Player"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Huminto ang Player"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Hindi pa handa ang camera"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Handa na ang camera"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Hindi alam na kaganapan ng session ng tawag"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Serbisyo"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"I-setup"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Hindi nakatakda&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Iba pang mga setting ng tawag"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Tumatawag sa pamamagitan ng <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Papasok sa pamamagitan ng <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"larawan ng contact"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"maging pribado"</string>
+ <string name="selectContact" msgid="92191462970821951">"pumili ng contact"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Sumulat ng sarili mong tugon…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Kanselahin"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Ipadala"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Sagutin"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Magpadala ng SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Tanggihan"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Sagutin bilang video call"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Sagutin bilang audio call"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Tanggapin ang kahilingan sa video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Tanggihan ang kahilingan sa video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Tanggapin ang kahilingan sa pagpapadala ng video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Tanggihan ang kahilingan sa pagpapadala ng video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Tanggapin ang kahilingan sa pagtanggap ng video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Tanggihan ang kahilingan sa pagtanggap ng video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Mag-slide pataas para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Mag-slide pakaliwa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Mag-slide pakanan para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Mag-slide pababa para sa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Mag-vibrate"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Mag-vibrate"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Tunog"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Default na tunog (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ringtone ng telepono"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Mag-vibrate kapag nagri-ring"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ringtone at Pag-vibrate"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Pamahalaan ang conference call"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Pang-emergency na numero"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> segundo</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> na segundo</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> minuto</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> na minuto</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> oras</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> na oras</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Larawan sa profile"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Naka-off ang camera"</string>
+ <string name="child_number" msgid="4469090994612105532">"sa pamamagitan ng <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Naipadala ang tala"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Mga kamakailang mensahe"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Impormasyon ng negosyo"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> (na) milya ang layo"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> (na) kilometro ang layo"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Magbubukas bukas nang <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Magbubukas ngayon nang <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Magsasara nang <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Sarado ngayon nang <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Bukas ngayon"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Sarado ngayon"</string>
+</resources>
diff --git a/InCallUI/res/values-tr/strings.xml b/InCallUI/res/values-tr/strings.xml
new file mode 100644
index 000000000..feec3f183
--- /dev/null
+++ b/InCallUI/res/values-tr/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Beklemede"</string>
+ <string name="unknown" msgid="3646075119047488748">"Bilinmiyor"</string>
+ <string name="private_num" msgid="6081418498487514686">"Gizli numara"</string>
+ <string name="payphone" msgid="5743050584468748607">"Ankesörlü telefon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferans görüşmesi"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Çağrı kesildi"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Hoparlör"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Mobil cihaz kulaklığı"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Kablolu kulaklık"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Aşağıdaki zil sesleri gönderilsin mi?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Numara tonları gönderiliyor\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Gönder"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Evet"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Hayır"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Joker karakteri şununla değiştir:"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferans görüşmesi <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Sesli mesaj numarası"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Numara çevriliyor"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Yeniden çevriliyor"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferans görüşmesi"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Gelen çağrı"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"İşle ilgili gelen çağrı"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Çağrı sonlandırıldı"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Beklemede"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Sonlandırılıyor"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Görüşmede"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Numaram: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Video bağlanıyor"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video görüşmesi"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Video isteniyor"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Video görüşmesi bağlantısı yapılamıyor"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video isteği reddedildi"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Geri aranacağınız numara\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Acil durumda geri aranacağınız numara\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Numara çevriliyor"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Cevapsız çağrı"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Cevapsız çağrılar"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cevapsız çağrı"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Cevapsız çağrı: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Devam eden çağrı"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"İşle ilgili devam eden çağrı"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Devam eden kablosuz çağrı"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"İşle ilgili devam eden kablosuz çağrı"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Beklemede"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Gelen çağrı"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"İşle ilgili gelen çağrı"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Gelen kablosuz çağrı"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"İşle ilgili gelen kablosuz çağrı"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Gelen video görüşmesi isteği"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Gelen video isteği"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Yeni sesli mesaj"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Yeni sesli mesaj (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Çevir: <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Sesli mesaj numarası bilinmiyor"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Servis yok"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Seçili ağ (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) kullanılamıyor"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Yanıtla"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Kapat"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Ses"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Kabul et"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Yok say"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Geri ara"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"İleti"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Çağrı yapmak için öncelikle Uçak modunu kapatın."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ağda kayıtlı değil."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Hücresel ağ kullanılamıyor."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Çağrı yapmak için geçerli bir numara girin."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Çağrı yapılamıyor."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI dizisi başlatılıyor…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Service desteklenmiyor"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Çağrı geçişi yapılamıyor."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Çağrı ayrılamıyor."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Aktarılamıyor."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferans çağrısı yapılamıyor."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Çağrı reddedilemiyor."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Çağrılar bırakılamıyor."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP çağrısı"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Acil durum çağrısı"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Radyo açılıyor…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Servis yok. Tekrar deneniyor…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Çağrı yapılamıyor. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> bir acil durum numarası değil."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Çağrı yapılamıyor. Acil durum numarasını çevirin."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Çevirmek için klavyeyi kullan"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Çağrıyı Beklet"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Çağrıyı Devam Ettir"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Çağrıyı Sonlandır"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Tuş Takımını Göster"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Tuş Takımını Gizle"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Sesi kapat"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Sesi aç"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Çağrı ekle"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Çağrıları birleştir"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Değiştir"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Çağrıları yönet"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Konferans çağrısını yönet"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferans çağrısı"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Yönet"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Ses"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Vid. görşm"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Sesli çağrıya geç"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Kamerayı değiştir"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Videoyu duraklat"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Diğer seçenekler"</string>
+ <string name="player_started" msgid="3478865572468310331">"Oynatıcı Başlatıldı"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Oynatıcı Durduruldu"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera hazır değil"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera hazır"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Bilinmeyen çağrı oturumu etkinliği"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Hizmet"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Kurulum"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ayarlanmadı&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Diğer çağrı ayarları"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> üzerinden çağrı yapılıyor"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> adlı sağlayıcı üzerinden gelen çağrı"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kişi fotoğrafı"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"özel görüşmeye geç"</string>
+ <string name="selectContact" msgid="92191462970821951">"kişi seçin"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Kendi yanıtınızı oluşturun…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"İptal"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Gönder"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Yanıtla"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS gönder"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Reddet"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Video görüşmesi olarak yanıtla"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Sesli görüşme olarak yanıtla"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Video isteğini kabul et"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Video isteğini reddet"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Video aktarma isteğini kabul et"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Video aktarma isteğini reddet"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Video alma isteğini kabul et"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Video alma isteğini reddet"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için yukarı kaydırın."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sola kaydırın."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için sağa kaydırın."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> için aşağı kaydırın."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Titreşim"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Titreşim"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ses"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Varsayılan ses (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefon zil sesi"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Çalarken titret"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Zil Sesi ve Titreşim"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Konferans çağrısını yönetin"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Acil durum numarası"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saniye</item>
+ <item quantity="one">1 saniye</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> dakika</item>
+ <item quantity="one">1 dakika</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> saat</item>
+ <item quantity="one">1 saat</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profil fotoğrafı"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera kapalı"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> üzerinden"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Not gönderildi"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Son iletiler"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"İşletme bilgileri"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil uzakta"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km uzakta"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Yarın açılış saati: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Bugün açılış saati: <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Kapanış saati: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Bugün kapanış saati: <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Şu an açık"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Şu an kapalı"</string>
+</resources>
diff --git a/InCallUI/res/values-uk/strings.xml b/InCallUI/res/values-uk/strings.xml
new file mode 100644
index 000000000..39c7c5c13
--- /dev/null
+++ b/InCallUI/res/values-uk/strings.xml
@@ -0,0 +1,202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Номер телефону"</string>
+ <string name="onHold" msgid="527593602772521700">"Очікування"</string>
+ <string name="unknown" msgid="3646075119047488748">"Невідомо"</string>
+ <string name="private_num" msgid="6081418498487514686">"Приватний номер"</string>
+ <string name="payphone" msgid="5743050584468748607">"Таксофон"</string>
+ <string name="confCall" msgid="3181961445236675173">"Конференц-зв’язок"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Виклик перервано"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Динамік"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Динамік гарнітури"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Дротова гарнітура"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Надіслати вказані нижче сигнали?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Надсилання сигналів\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Надіслати"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Так"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Ні"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Замінити довільний символ на"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Конференц-зв’язок <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Номер голосової пошти"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Набір номера"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Повторний набір"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Конференц-зв’язок"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Вхідний виклик"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Вхідний робочий виклик"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Виклик завершено"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Очікування"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Завершення виклику"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Триває виклик"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Мій номер: <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Відеодзвінок: з’єднання"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Відеодзвінок"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Надсилання запиту на відеодзвінок"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Не вдалося здійснити відеодзвінок"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Запрошення на відеодзвінок відхилено"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Номер для зв’язку:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Екстрений номер:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Набір номера"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Пропущений виклик"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Пропущені виклики"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"Пропущено викликів: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Пропущений виклик: <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Поточний виклик"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Поточний виклик на робочий телефон"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Поточний виклик через Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Поточний виклик на робочий телефон через Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Очікування"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Вхідний виклик"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Вхідний виклик на робочий телефон"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Вхідний виклик через Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Вхідний виклик на робочий телефон через Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Вхідний відеодзвінок"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Запит на вхідний відеодзвінок"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Нові голосові повідомлення"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Нові голосові повідомлення (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Набрати <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Невідомий номер голосової пошти"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Немає зв’язку"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Вибрана мережа (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) недоступна"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Відповісти"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Завершити"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Відео"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Гол. виклик"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Прийняти"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Відхилити"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Передзвонити"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Написати SMS"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Щоб зателефонувати, вимкніть режим польоту."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Не зареєстровано в мережі."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Мобільна мережа недоступна."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Щоб зателефонувати, введіть дійсний номер."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Не вдається зателефонувати."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Запуск ряду MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Служба не підтримується."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Неможливо переключитися між викликами."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Неможливо розділити виклик."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Неможливо перенести."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Конференц-зв’язок недоступний."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Неможливо відхилити виклик."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Неможливо телефонувати."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Виклик через протокол SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Екстрений виклик"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Увімкнення радіо…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Немає зв’язку. Повторна спроба…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Не вдається зателефонувати. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> не є екстреним номером."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Не вдається зателефонувати. Наберіть екстрений номер."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Використовуйте для набору клавіатуру"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Призупинити виклик"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Відновити виклик"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Завершити виклик"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Показати цифрову клавіатуру"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Сховати цифрову клавіатуру"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Ігнорувати"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Не ігнорувати"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Додати виклик"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Об’єднати виклики"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Поміняти виклики"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Керувати викликами"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Керувати конференц-зв’язком"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Конференц-зв’язок"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Керувати"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Аудіо"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Відеодзвінок"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Перейти в режим голосового виклику"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Вибрати камеру"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Призупинити відео"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Інші опції"</string>
+ <string name="player_started" msgid="3478865572468310331">"Програвач запущено"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Програвач зупинено"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Камера неготова"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Камера готова"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Невідомий сеанс виклику"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Служба"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Налаштування"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Не налаштовано&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Інші налаштування виклику"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Виклик здійснюється через оператора <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Вхідні виклики через оператора <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"фото контакта"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"приватна розмова"</string>
+ <string name="selectContact" msgid="92191462970821951">"вибрати контакт"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Напишіть власну відповідь…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Скасувати"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Надіслати"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Відповісти"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Надіслати SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Відхилити"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Відповісти в режимі відеодзвінка"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Відповісти в режимі аудіодзвінка"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Прийняти запит на відео"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Відхилити запит на відео"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Прийняти запит на передавання відео"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Відхилити запит на передавання відео"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Прийняти запит на отримання відео"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Відхилити запит на отримання відео"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Проведіть пальцем угору, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Проведіть пальцем ліворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Проведіть пальцем праворуч, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Проведіть пальцем донизу, щоб <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Вібросигнал"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Вібросигнал"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Звук"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Звук за умовчанням (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Сигнал дзвінка телефона"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Вібрувати під час виклику"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Сигнал дзвінка та вібросигнал"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Керування конференц-зв’язком"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Екстрений номер"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> секунда</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> секунд</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> секунди</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> хвилина</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> хвилини</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> хвилин</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> хвилини</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> година</item>
+ <item quantity="few"><xliff:g id="COUNT">%d</xliff:g> години</item>
+ <item quantity="many"><xliff:g id="COUNT">%d</xliff:g> годин</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> години</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Фотографія профілю"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Камеру вимкнено"</string>
+ <string name="child_number" msgid="4469090994612105532">"на номер <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Нотатку надіслано"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Нещодавні повідомлення"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Інформація про компанію"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"За <xliff:g id="DISTANCE">%.1f</xliff:g> мил."</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"За <xliff:g id="DISTANCE">%.1f</xliff:g> км"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g>–<xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Відчиняється завтра о <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Відчиняється сьогодні о <xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Зачиняється о <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Зачинено сьогодні о <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Відчинено"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Зачинено"</string>
+</resources>
diff --git a/InCallUI/res/values-ur-rPK/strings.xml b/InCallUI/res/values-ur-rPK/strings.xml
new file mode 100644
index 000000000..2d5a9125a
--- /dev/null
+++ b/InCallUI/res/values-ur-rPK/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"فون"</string>
+ <string name="onHold" msgid="527593602772521700">"ہولڈ پر ہے"</string>
+ <string name="unknown" msgid="3646075119047488748">"نامعلوم"</string>
+ <string name="private_num" msgid="6081418498487514686">"نجی نمبر"</string>
+ <string name="payphone" msgid="5743050584468748607">"پے فون"</string>
+ <string name="confCall" msgid="3181961445236675173">"کانفرنس کال"</string>
+ <string name="call_lost" msgid="8208184291640961172">"کال ختم ہو گئی"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"اسپیکر"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"ہینڈسیٹ ایئرپیس"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"تار والا ہیڈسیٹ"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"بلوٹوتھ"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"درج ذیل ٹونز بھیجیں؟\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"ٹونز بھیج رہا ہے\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"بھیجیں"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"ہاں"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"نہیں"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"وائلڈ کریکٹر کو اس کے ساتھ بدلیں"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"کانفرنس کال <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"صوتی میل نمبر"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"ڈائل ہو رہا ہے"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"دوبارہ ڈائل ہو رہا ہے"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"کانفرنس کال"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"آنے والی کال"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"کام سے متعلق آنے والی کال"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"کال ختم ہوگئی"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"ہولڈ پر ہے"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"کال منقطع ہو رہی ہے"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"کال میں"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"میرا نمبر ہے <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"ویڈیو منسلک ہو رہی ہے"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"ویڈیو کال"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"ویڈیو کی درخواست کی جا رہی ہے"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"ویڈیو کال منسلک نہیں ہو سکتی"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"ویڈیو کی درخواست مسترد ہو گئی"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"‏آپ کا کال بیک نمبر‎\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"‏آپ کا ہنگامی کال بیک نمبر‎\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"ڈائل ہو رہا ہے"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"چھوٹی ہوئی کال"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"چھوٹی ہوئی کالیں"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> چھوٹی ہوئی کالیں"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> کی جانب سے چھوٹی ہوئی کال"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"جاری کال"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"کام سے متعلق جاری کال"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"‏Wi-Fi کال جاری ہے"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"‏کام سے متعلق جاری Wi-Fi کال"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"ہولڈ پر ہے"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"آنے والی کال"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"کام سے متعلق آنے والی کال"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"‏آنے والی Wi-Fi کال"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"‏کام سے متعلق آنے والی Wi-Fi کال"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"آنے والی ویڈیو کال"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"آنے والی ویڈیو کی درخواست"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"نیا صوتی میل"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"نیا صوتی میل (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> ڈائل کریں"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"صوتی میل نمبر نامعلوم ہے"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"کوئی سروس نہیں ہے"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"منتخب کردہ نیٹ ورک (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) دستیاب نہیں ہے"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"جواب"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"کال منقطع کریں"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"ویڈیو"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"آواز"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"قبول کریں"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"برخاست کریں"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"واپس کال کریں"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"پیغام"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"کال کرنے کیلئے، پہلے ہوائی جہاز طرز کو آف کریں۔"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"نیٹ ورک پر رجسٹرڈ نہیں ہے۔"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"سیلولر نیٹ ورک دستیاب نہیں ہے۔"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"کال کرنے کیلئے، ایک درست نمبر درج کریں۔"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"کال نہیں ہو سکتی۔"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"‏MMI ترتیب شروع ہو رہی ہے…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"سروس تعاون یافتہ نہیں ہے۔"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"کالز سوئچ نہیں ہو سکتیں۔"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"کال الگ نہیں ہو سکتی۔"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"منتقل نہیں ہو سکتی۔"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"کانفرنس نہیں ہو سکتی۔"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"کال مسترد نہیں ہو سکتی۔"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"کال(ز) ریلیز نہیں ہو سکتیں۔"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"‏SIP کال"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"ہنگامی کال"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"ریڈیو آن ہو رہا ہے…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"کوئی سروس نہیں ہے۔ دوبارہ کوشش کی جا رہی ہے…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"کال نہیں کی جا سکتی۔ <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> ایک ہنگامی نمبر نہیں ہے۔"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"کال نہیں کی جا سکتی۔ ایک ہنگامی نمبر ڈائل کریں۔"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"ڈائل کرنے کیلئے کی بورڈ استعمال کریں"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"کال کو ہولڈ کریں"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"کال کو دوبارہ شروع کریں"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"کال ختم کریں"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"ڈائل پیڈ دکھائیں"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"ڈائل پیڈ چھپائیں"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"خاموش کریں"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"آواز چالو کریں"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"کال شامل کریں"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"کالز کو ضم کریں"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"تبادلہ کریں"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"کالز کا نظم کریں"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"کانفرنس کال کا نظم کریں"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"کانفرنس کال"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"نظم کریں"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"آڈیو"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"ویڈیو کال"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"صوتی کال میں تبدیل کریں"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"کیمرا سوئچ کریں"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"ویڈیو موقوف کریں"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"مزید اختیارات"</string>
+ <string name="player_started" msgid="3478865572468310331">"پلیئر شروع ہوگیا"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"پلیئر بند ہوگیا"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"کیمرا تیار نہیں ہے"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"کیمرا تیار ہے"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"نامعلوم کال سیشن ایونٹ"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"سروس"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"ترتیب دیں"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"‏‎&lt;سیٹ نہیں ہے&gt;‎"</string>
+ <string name="other_settings" msgid="6699076019841942826">"کال کی دیگر ترتیبات"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"کالنگ بذریعہ <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> کے ذریعے آنے والی"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"رابطہ کی تصویر"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"نجی ہوجائیں"</string>
+ <string name="selectContact" msgid="92191462970821951">"رابطہ منتخب کریں"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"اپنا ذاتی تحریر کریں…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"منسوخ کریں"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"بھیجیں"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"جواب دیں"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"‏SMS بھیجیں"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"مسترد کریں"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"ویڈیو کال کے بطور جواب دیں"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"آڈیو کال کے بطور جواب دیں"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"ویڈیو کی درخواست قبول کریں"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"ویڈیو کی درخواست مسترد کریں"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"ویڈیو منتقل کرنے کی درخواست قبول کریں"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"ویڈیو منتقل کرنے کی درخواست مسترد کریں"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"ویڈیو موصول کرنے کی درخواست قبول کریں"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"ویڈیو موصول کرنے کی درخواست مسترد کریں"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے اوپر سلائیڈ کریں۔"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے بائیں سلائیڈ کریں۔"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے دائیں سلائیڈ کریں۔"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> کیلئے نیچے سلائیڈ کریں۔"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"ارتعاش"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"ارتعاش"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"آواز"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"ڈیفالٹ آواز (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"فون رِنگ ٹون"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"رِنگ کے وقت مرتعش کریں"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"رنگ ٹون اور ارتعاش"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"کانفرنس کال کا نظم کریں"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"ہنگامی نمبر"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> سیکنڈ</item>
+ <item quantity="one">1 سیکنڈ</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"> منٹ</item>
+ <item quantity="one">1 منٹ</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> گھنٹے</item>
+ <item quantity="one">1 گھنٹہ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"پروفائل کی تصویر"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"کیمرا آف ہے"</string>
+ <string name="child_number" msgid="4469090994612105532">"بذریعہ <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"نوٹ بھیج دیا گیا"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"حالیہ پیغامات"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"کاروباری معلومات"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> میل دور"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> کلومیٹر دور"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>، <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>، <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"کل <xliff:g id="OPEN_TIME">%s</xliff:g> بجے کھلے گا"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"آج <xliff:g id="OPEN_TIME">%s</xliff:g> بجے کھلے گا"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> بجے بند ہوگا"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"آج <xliff:g id="CLOSE_TIME">%s</xliff:g> بجے بند ہوا"</string>
+ <string name="open_now" msgid="4615706338669555999">"ابھی کھلا ہے"</string>
+ <string name="closed_now" msgid="2635314668145282080">"اب بند ہے"</string>
+</resources>
diff --git a/InCallUI/res/values-uz-rUZ/strings.xml b/InCallUI/res/values-uz-rUZ/strings.xml
new file mode 100644
index 000000000..0e1d48223
--- /dev/null
+++ b/InCallUI/res/values-uz-rUZ/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Telefon"</string>
+ <string name="onHold" msgid="527593602772521700">"Kutilmoqda"</string>
+ <string name="unknown" msgid="3646075119047488748">"Noma’lum"</string>
+ <string name="private_num" msgid="6081418498487514686">"Maxfiy raqam"</string>
+ <string name="payphone" msgid="5743050584468748607">"Taksofon"</string>
+ <string name="confCall" msgid="3181961445236675173">"Konferens-aloqa"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Qo‘ng‘iroq tugatildi"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Karnay"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Telefon quloqchini"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Simli garnitura"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Quyidagi tovush signallari yuborilsinmi?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Tovush signallari yuborilmoqda\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Yuborish"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Ha"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Yo‘q"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Universal belgini bunga almashtirish"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Konferens-aloqa: <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Ovozli pochta raqami"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Chaqiruv"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Qayta terilmoqda"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Konferens-aloqa"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Kiruvchi qo‘ng‘iroq"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Kiruvchi qo‘ng‘iroq (ish)"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Chaqiruv tugadi"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Kutilmoqda"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Suhbat tugatilmoqda"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Suhbat"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Mening raqamim – <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Videoga ulanmoqda"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Video qo‘ng‘iroq"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Video so‘ralmoqda"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Video qo‘ng‘iroqqa ulanib bo‘lmadi"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Video qo‘ng‘iroq so‘rovi rad etildi"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Teskari qo‘ng‘iroq raqamingiz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Favqulodda holatlar uchun teskari qo‘ng‘iroq raqamingiz\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Chaqiruv"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Javobsiz qo‘ng‘iroq"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Javobsiz qo‘ng‘iroqlar"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ta javobsiz qo‘ng‘iroq"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"<xliff:g id="MISSED_CALL_FROM">%s</xliff:g> qo‘ng‘irog‘i javobsiz qoldirildi"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Joriy qo‘ng‘iroq"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Joriy qo‘ng‘iroq (ish)"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Joriy Wi-Fi qo‘ng‘iroq"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Joriy Wi-Fi qo‘ng‘iroq (ish)"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Kutilmoqda"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Kiruvchi qo‘ng‘iroq"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Kiruvchi qo‘ng‘iroq (ish)"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Kiruvchi Wi-Fi qo‘ng‘iroq"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Kiruvchi Wi-Fi qo‘ng‘iroq (ish)"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Kiruvchi video qo‘ng‘iroq"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Kiruvchi video qo‘ng‘iroq"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Yangi ovozli xabar"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Yangi ovozli xabar (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g> raqamini terish"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Ovozli pochta raqami noma’lum"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Xizmat mavjud emas"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Tanlangan tarmoq (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) mavjud emas"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Javob berish"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Tugatish"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video aloqa"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Ovozli aloqa"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Qabul qilish"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Rad etish"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Telefon qilish"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"SMS yuborish"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Qo‘ng‘iroq qilish uchun, avval “Parvoz rejimi” o‘chirilishi kerak."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Tarmoqda ro‘yxatdan o‘tmagan."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Uyali tarmoq mavjud emas."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Qo‘ng‘iroq qilish uchun raqamni to‘g‘ri kiriting."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Qo‘ng‘iroq qilib bo‘lmadi."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"MMI tartibi ishga tushmoqda…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Xizmat qo‘llab-quvvatlanmaydi."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Qo‘ng‘iroqlarni almashtirib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Qo‘ng‘iroqni ajratib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"O‘tkazib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Konferens-aloqa o‘rnatib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Qo‘ng‘iroqni rad qilib bo‘lmadi."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Qo‘ng‘iroq(lar)ni chiqarib bo‘lmadi."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP qo‘ng‘iroq"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Favqulodda chaqiruv"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Radio yoqilmoqda…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Aloqa yo‘q. Qayta urinilmoqda…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Qo‘ng‘iroq qilib bo‘lmadi. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> favqulodda raqam emas."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Qo‘ng‘iroq qilib bo‘lmadi. Favqulodda raqamga tering."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Terish uchun klaviaturadan foydalaning"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Qo‘ng‘iroqni ushlab turish"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Qo‘ng‘iroqni davom ettirish"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Qo‘ng‘iroqni tugatish"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Raqam terish panelini ochish"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Raqam terish panelini yopish"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Ovozni o‘chirish"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Ovozni yoqish"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Chaqiruv qo‘shish"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Qo‘ng‘iroqlarni birlashtirish"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Almashtirish"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Qo‘ng‘iroqlarni boshqarish"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Konferens-aloqani sozlash"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Konferens-aloqa"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Boshqarish"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Audio"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Video qo‘ng‘iroq"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Ovozli qo‘ng‘iroqqa o‘zgartirish"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Kamerani almashtirish"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Videoni to‘xtatib turish"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Boshqa sozlamalar"</string>
+ <string name="player_started" msgid="3478865572468310331">"Pleyer ishga tushirildi"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Pleyer to‘xtatildi"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Kamera tayyor emas"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Kamera tayyor"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Aloqa seansining noma’lum hodisasi"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Xizmat"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Sozlash"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ko‘rsatilmagan&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Boshqa qo‘ng‘iroq sozlamalari"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> orqali qo‘ng‘rioq qilinmoqda"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"<xliff:g id="PROVIDER_NAME">%s</xliff:g> orqali kiruvchi qo‘ng‘iroqlar"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"kontakt rasmi"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"alohida suhbatga o‘tish"</string>
+ <string name="selectContact" msgid="92191462970821951">"kontaktni tanlash"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"O‘z javobingizni yozing…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Bekor qilish"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Yuborish"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Javob berish"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"SMS yuborish"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Rad etish"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Video qo‘ng‘iroqqa javob berish"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Ovozli qo‘ng‘iroqqa javob berish"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Video qo‘ng‘iroq so‘rovini qabul qilish"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Video qo‘ng‘iroq so‘rovini rad etish"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Video uzatishga ruxsat berish"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Video uzatishga ruxsat bermaslik"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Kiruvchi video qo‘ng‘iroqni qabul qilish"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Kiruvchi video qo‘ng‘iroqni rad etish"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun tepaga suring."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun o‘ngga suring."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun pastga suring."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Tebranish"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Tebranish"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Ovoz"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Standart ovoz (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Telefon ringtoni"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Jiringlash vaqtida tebranish"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Qo‘ng‘iroq ohangi va tebranish"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Konferens-aloqani sozlash"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Favqulodda qo‘ng‘iroq raqami"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soniya</item>
+ <item quantity="one">1 soniya</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> daqiqa</item>
+ <item quantity="one">1 daqiqa</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soat</item>
+ <item quantity="one">1 soat</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Profil rasmi"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Kamera o‘chiq"</string>
+ <string name="child_number" msgid="4469090994612105532">"<xliff:g id="CHILD_NUMBER">%s</xliff:g> orqali"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Qayd yuborildi"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"So‘nggi xabarlar"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Kompaniya haqida ma’lumot"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> mil masofada"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> km masofada"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> – <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Ertaga <xliff:g id="OPEN_TIME">%s</xliff:g> da ochiladi"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Bugun <xliff:g id="OPEN_TIME">%s</xliff:g> da ochiladi"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"<xliff:g id="CLOSE_TIME">%s</xliff:g> da yopiladi"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Bugun <xliff:g id="CLOSE_TIME">%s</xliff:g> da yopiladi"</string>
+ <string name="open_now" msgid="4615706338669555999">"Ochiq"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Yopiq"</string>
+</resources>
diff --git a/InCallUI/res/values-vi/strings.xml b/InCallUI/res/values-vi/strings.xml
new file mode 100644
index 000000000..473650d60
--- /dev/null
+++ b/InCallUI/res/values-vi/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Điện thoại"</string>
+ <string name="onHold" msgid="527593602772521700">"Đang chờ"</string>
+ <string name="unknown" msgid="3646075119047488748">"Không xác định"</string>
+ <string name="private_num" msgid="6081418498487514686">"Số cá nhân"</string>
+ <string name="payphone" msgid="5743050584468748607">"Điện thoại trả tiền"</string>
+ <string name="confCall" msgid="3181961445236675173">"Cuộc gọi nhiều bên"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Cuộc gọi bị gián đoạn"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Loa"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Tai nghe ĐTDĐ"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Tai nghe có dây"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Gửi các âm sau?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Đang gửi âm\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Gửi"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Có"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Không"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Thay thế ký tự tự do bằng"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Cuộc gọi nhiều bên <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Số thư thoại"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Đang gọi"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Đang quay số lại"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Cuộc gọi nhiều bên"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Cuộc gọi đến"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Cuộc gọi đến về công việc"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Cuộc gọi đã kết thúc"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Đang chờ"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Kết thúc cuộc gọi"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Trong cuộc gọi"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Số điện thoại của tôi là <xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Đang kết nối video"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Cuộc gọi điện video"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Đang yêu cầu video"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Không kết nối được cuộc gọi điện video"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Đã từ chối yêu cầu video"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Số gọi lại của bạn\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Số gọi lại khẩn cấp của bạn\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Đang gọi"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Cuộc gọi nhỡ từ <xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Cuộc gọi đang thực hiện"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Cuộc gọi đang diễn ra về công việc"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Cuộc gọi đang diễn ra qua Wi-Fi"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Cuộc gọi đang diễn ra qua Wi-Fi về công việc"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Đang chờ"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Cuộc gọi đến"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Cuộc gọi đến về công việc"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Cuộc gọi đến qua Wi-Fi"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Cuộc gọi đến qua Wi-Fi về công việc"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Cuộc gọi điện video đến"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Yêu cầu video đến"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Thư thoại mới"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Thư thoại mới (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Quay số <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Số thư thoại không xác định"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Không có dịch vụ"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Mạng được chọn (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) không khả dụng"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Trả lời"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Gác máy"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Video"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Thoại"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Chấp nhận"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Loại bỏ"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Gọi lại"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Tin nhắn"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Để thực hiện cuộc gọi, trước tiên, hãy tắt chế độ trên Máy bay."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Chưa được đăng ký trên mạng."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Không có mạng di động."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Để thực hiện cuộc gọi, hãy nhập một số hợp lệ."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Không thực hiện được cuộc gọi."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Đang khởi động chuỗi MMI…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Dịch vụ không được hỗ trợ."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Không chuyển đổi được cuộc gọi."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Không tách được cuộc gọi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Không chuyển được cuộc gọi."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Không thực hiện được cuộc gọi nhiều bên."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Không từ chối được cuộc gọi."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Không thực hiện được cuộc gọi."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Cuộc gọi qua SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Cuộc gọi khẩn cấp"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Đang bật radio..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Không có dịch vụ nào. Đang thử lại…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Không thực hiện được cuộc gọi. <xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> không phải là số khẩn cấp."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Không thực hiện được cuộc gọi. Hãy quay số khẩn cấp."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Sử dụng bàn phím để quay số"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Giữ cuộc gọi"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Tiếp tục cuộc gọi"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Kết thúc cuộc gọi"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Hiển thị bàn phím số"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Ẩn bàn phím số"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Tắt tiếng"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Bật tiếng"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Thêm cuộc gọi"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Hợp nhất cuộc gọi"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Hoán đổi"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Quản lý cuộc gọi"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Quản lý cuộc gọi nhiều bên"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Cuộc gọi nhiều bên"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Quản lý"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Âm thanh"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Cuộc gọi điện video"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Thay đổi thành cuộc gọi thoại"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Chuyển máy ảnh"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Dừng video"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Tùy chọn khác"</string>
+ <string name="player_started" msgid="3478865572468310331">"Đã khởi động trình phát"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Đã dừng trình phát"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Máy ảnh chưa sẵn sàng"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Máy ảnh đã sẵn sàng"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Sự kiện phiên cuộc gọi không xác định"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Dịch vụ"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Thiết lập"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Chưa được đặt&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Cài đặt cuộc gọi khác"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Gọi điện qua <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Cuộc gọi đến qua <xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"ảnh liên hệ"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"chuyển thành riêng tư"</string>
+ <string name="selectContact" msgid="92191462970821951">"chọn địa chỉ liên hệ"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Viết trả lời của riêng bạn..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Hủy"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Gửi"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Trả lời"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Gửi SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Từ chối"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Trả lời là cuộc gọi điện video"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Trả lời là cuộc gọi âm thanh"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Chấp nhận yêu cầu cuộc gọi video"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Từ chối yêu cầu cuộc gọi video"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Chấp nhận yêu cầu truyền video"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Từ chối yêu cầu truyền video"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Chấp nhận yêu cầu nhận video"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Từ chối yêu cầu nhận video"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Trượt lên để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Trượt sang trái để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Trượt sang phải để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Trượt xuống để <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Rung"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Rung"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Âm thanh"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Âm thanh mặc định (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Nhạc chuông điện thoại"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Rung khi đổ chuông"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Nhạc chuông và rung"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Quản lý cuộc gọi nhiều bên"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Số khẩn cấp"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> giây</item>
+ <item quantity="one">1 giây</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> phút</item>
+ <item quantity="one">1 phút</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> giờ</item>
+ <item quantity="one">1 giờ</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Ảnh hồ sơ"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Tắt máy ảnh"</string>
+ <string name="child_number" msgid="4469090994612105532">"qua <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Đã gửi ghi chú"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Tin nhắn gần đây"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Thông tin doanh nghiệp"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"Cách <xliff:g id="DISTANCE">%.1f</xliff:g> dặm"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"Cách <xliff:g id="DISTANCE">%.1f</xliff:g> km"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Mở cửa lúc <xliff:g id="OPEN_TIME">%s</xliff:g> ngày mai"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Mở cửa lúc <xliff:g id="OPEN_TIME">%s</xliff:g> hôm nay"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Đóng cửa lúc <xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Đã đóng cửa lúc <xliff:g id="CLOSE_TIME">%s</xliff:g> hôm nay"</string>
+ <string name="open_now" msgid="4615706338669555999">"Mở ngay bây giờ"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Hiện đã đóng cửa"</string>
+</resources>
diff --git a/InCallUI/res/values-w500dp-land/colors.xml b/InCallUI/res/values-w500dp-land/colors.xml
new file mode 100644
index 000000000..77eea2e68
--- /dev/null
+++ b/InCallUI/res/values-w500dp-land/colors.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Background color for status bar. For portrait this will be ignored. -->
+ <color name="statusbar_background_color">#000000</color>
+</resources>
diff --git a/InCallUI/res/values-w500dp-land/dimens.xml b/InCallUI/res/values-w500dp-land/dimens.xml
new file mode 100644
index 000000000..112ec5f09
--- /dev/null
+++ b/InCallUI/res/values-w500dp-land/dimens.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Whether or not this layout displays a large photo. -->
+ <bool name="has_large_photo">true</bool>
+
+ <!-- Whether or not the landscape mode layout is currently being used -->
+ <bool name="is_layout_landscape">true</bool>
+
+ <!-- Height and width of the in-call buttons. -->
+ <dimen name="in_call_button_dimension">40dp</dimen>
+
+ <!-- Margin underneath the call buttons. This is used only in landscape mode and is sized
+ so that the call buttons are center aligned with the end call button. -->
+ <dimen name="call_buttons_bottom_margin">30dp</dimen>
+
+ <dimen name="dialpad_elevation">2dp</dimen>
+
+ <dimen name="video_preview_margin">20dp</dimen>
+</resources>
diff --git a/InCallUI/res/values-zh-rCN/strings.xml b/InCallUI/res/values-zh-rCN/strings.xml
new file mode 100644
index 000000000..4ff11f1aa
--- /dev/null
+++ b/InCallUI/res/values-zh-rCN/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"电话"</string>
+ <string name="onHold" msgid="527593602772521700">"保持"</string>
+ <string name="unknown" msgid="3646075119047488748">"未知"</string>
+ <string name="private_num" msgid="6081418498487514686">"私密号码"</string>
+ <string name="payphone" msgid="5743050584468748607">"公用电话"</string>
+ <string name="confCall" msgid="3181961445236675173">"电话会议"</string>
+ <string name="call_lost" msgid="8208184291640961172">"通话中断"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"扬声器"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"手机听筒"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"有线耳机"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"蓝牙"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"发送以下信号音?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"正在发送信号音\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"发送"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"是"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"否"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"将通配符替换为"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"电话会议(<xliff:g id="CONF_CALL_TIME">%s</xliff:g>)"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"语音信箱号码"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"正在拨号"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"正在重拨"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"电话会议"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"来电"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"工作来电"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"通话已结束"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"保持"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"正在挂断"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"正在通话"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"我的电话号码:<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"正在接通视频"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"视频通话"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"正在发出视频请求"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"无法接通视频通话"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"视频请求遭拒"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"您的回拨号码如下:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"您的紧急回拨号码如下:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"正在拨号"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"未接电话"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"未接电话"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 个未接电话"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"来自<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>的未接电话"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"通话进行中"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"工作通话进行中"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"WLAN 通话进行中"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"WLAN 工作通话进行中"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"保持"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"来电"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"工作来电"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"WLAN 来电"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"WLAN 工作来电"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"视频通话来电"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"收到视频通话请求"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"新语音邮件"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"新语音邮件 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"拨打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"语音信箱号码未知"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"没有服务"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"所选网络(<xliff:g id="OPERATOR_NAME">%s</xliff:g>)不可用"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"接听"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"挂断"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"视频"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"语音"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"接受"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"拒绝"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"回电"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"发短信"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"要拨打电话,请先关闭飞行模式。"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"尚未注册网络。"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"无法连接到移动网络。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"要拨打电话,请输入有效的电话号码。"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"无法拨打该电话。"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"正在启动 MMI 序列…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"服务不受支持。"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"无法切换通话。"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"无法单独通话。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"无法转移呼叫。"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"无法进行电话会议。"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"无法拒接来电。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"无法挂断。"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP 通话"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"紧急呼救"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"正在开启无线装置…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"找不到服务信号,正在重试…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"无法拨打该电话。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是紧急呼救号码。"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"无法拨打该电话。请拨打紧急呼救号码。"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"使用键盘拨号"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"保持通话"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"恢复通话"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"结束通话"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"显示拨号键盘"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"隐藏拨号键盘"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"静音"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"取消静音"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"添加通话"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"合并通话"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"切换"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"管理通话"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"管理电话会议"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"电话会议"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"管理"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"音频"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"视频通话"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"改为语音通话"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"切换摄像头"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"暂停视频"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"更多选项"</string>
+ <string name="player_started" msgid="3478865572468310331">"播放器已启动"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"播放器已停止"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"摄像头尚未准备就绪"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"摄像头已准备就绪"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"未知通话事件"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"服务"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"设置"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;未设置&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"其他通话设置"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"正在通过<xliff:g id="PROVIDER_NAME">%s</xliff:g>进行通话"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"有人通过<xliff:g id="PROVIDER_NAME">%s</xliff:g>来电"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"联系人照片"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"单独通话"</string>
+ <string name="selectContact" msgid="92191462970821951">"选择联系人"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"自行撰写回复…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"取消"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"发送"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"接听"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"发送短信"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"拒绝"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"以视频通话的形式接听"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"以音频通话的形式接听"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"接受视频请求"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"拒绝视频请求"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"接受视频传输请求"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"拒绝视频传输请求"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"接受视频接收请求"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"拒绝视频接收请求"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"向上滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"向左滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"向右滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"向下滑动即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"振动"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"振动"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"提示音"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"默认提示音(<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"手机铃声"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"响铃时振动"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"铃声和振动"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"管理电话会议"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"紧急呼救号码"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒</item>
+ <item quantity="one">1 秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 分钟</item>
+ <item quantity="one">1 分钟</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 小时</item>
+ <item quantity="one">1 小时</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"个人资料照片"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"摄像头已关闭"</string>
+ <string name="child_number" msgid="4469090994612105532">"通过 <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"已发送备注"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"最近的信息"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"商家信息"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> 英里远"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> 公里远"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="LOCALITY">%2$s</xliff:g><xliff:g id="STREET_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>,<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"将于明天<xliff:g id="OPEN_TIME">%s</xliff:g>开始营业"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"将于今天<xliff:g id="OPEN_TIME">%s</xliff:g>开始营业"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"将于<xliff:g id="CLOSE_TIME">%s</xliff:g>结束营业"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"已于今天<xliff:g id="CLOSE_TIME">%s</xliff:g>结束营业"</string>
+ <string name="open_now" msgid="4615706338669555999">"营业中"</string>
+ <string name="closed_now" msgid="2635314668145282080">"现已结束营业"</string>
+</resources>
diff --git a/InCallUI/res/values-zh-rHK/strings.xml b/InCallUI/res/values-zh-rHK/strings.xml
new file mode 100644
index 000000000..9213658b1
--- /dev/null
+++ b/InCallUI/res/values-zh-rHK/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"電話"</string>
+ <string name="onHold" msgid="527593602772521700">"保留通話"</string>
+ <string name="unknown" msgid="3646075119047488748">"不明"</string>
+ <string name="private_num" msgid="6081418498487514686">"私人號碼"</string>
+ <string name="payphone" msgid="5743050584468748607">"公共電話"</string>
+ <string name="confCall" msgid="3181961445236675173">"會議通話"</string>
+ <string name="call_lost" msgid="8208184291640961172">"通話已中斷"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"喇叭"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"免提聽筒"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"有線耳機"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"藍牙"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"要傳送以下訊號音嗎?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"正在傳送訊號音\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"傳送"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"是"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"否"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"將萬用字元改為"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"會議通話:<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"留言號碼"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"正在撥號"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"正在重撥"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"會議通話"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"來電"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"工作來電"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"通話已結束"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"保留通話"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"正在掛斷電話"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"正在通話"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"我的電話號碼:<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"正在建立視像通話連線"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"視像通話"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"正在提出視像通話要求"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"無法建立視像通話連線"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"視像通話要求被拒"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"您的回撥號碼:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"您的緊急回撥號碼:\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"正在撥號"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"未接來電"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"未接來電"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 個未接來電"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"來自 <xliff:g id="MISSED_CALL_FROM">%s</xliff:g> 的未接來電"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"通話中"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"正在進行工作通話"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"正在進行 Wi-Fi 通話"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"正在進行 Wi-Fi 工作通話"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"保留通話"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"來電"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"工作來電"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Wi-Fi 來電"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Wi-Fi 工作來電"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"視像通話來電"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"收到視像通話要求"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"新留言"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"新留言 (<xliff:g id="COUNT">%d</xliff:g> 個)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"撥打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"留言號碼不明"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"沒有服務"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"您選取的網絡 (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) 無法使用"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"接聽"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"掛斷電話"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"視像通話"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"語音通話"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"接受"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"拒絕"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"回電"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"短訊"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"如要撥打電話,請先關閉飛行模式。"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"未在網絡上註冊。"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"無法連線至流動網絡。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"如要撥打電話,請輸入有效的號碼。"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"無法通話。"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"開始 MMI 序列…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"不支援此服務。"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"無法切換通話。"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"無法分開通話。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"無法轉接。"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"無法進行會議通話。"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"無法拒接來電。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"無法結束通話。"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP 通話"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"緊急電話"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"正在開啟無線電…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"找不到服務,請再試一次…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"無法通話。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是緊急電話號碼。"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"無法通話。請撥打緊急電話號碼。"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"使用鍵盤撥號"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"保留通話"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"恢復通話"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"結束通話"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"顯示撥號鍵盤"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"隱藏撥號鍵盤"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"略過"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"取消靜音"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"新增通話"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"合併通話"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"切換"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"管理通話"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"管理會議通話"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"會議通話"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"管理"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"音訊"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"視像通話"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"變更為語音通話"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"切換鏡頭"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"暫停視像通話"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"更多選項"</string>
+ <string name="player_started" msgid="3478865572468310331">"已啟動播放器"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"已停止播放器"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"相機未準備好"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"相機已準備就緒"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"不明的通話工作階段活動"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"服務"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"設定"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;未設定&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"其他通話設定"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"正在透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 撥號"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"有人透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 來電"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"聯絡人相片"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"私人通話"</string>
+ <string name="selectContact" msgid="92191462970821951">"選取聯絡人"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"自行撰寫回覆..."</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"取消"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"傳送"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"接聽"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"傳送短訊"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"拒絕"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"接聽視像通話"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"接聽語音通話"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"接受視像通話要求"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"拒絕視像通話要求"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"接受視像通話轉駁要求"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"拒絕視像通話轉駁要求"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"接受視像接收要求"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"拒絕視像接收要求"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"震動"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"震動"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"音效"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"預設音效 (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"手機鈴聲"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"響鈴時震動"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"鈴聲和震動"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"管理會議通話"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"緊急電話號碼"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒</item>
+ <item quantity="one">1 秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 分鐘</item>
+ <item quantity="one">1 分鐘</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 小時</item>
+ <item quantity="one">1 小時</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"個人檔案相片"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"相機已關閉"</string>
+ <string name="child_number" msgid="4469090994612105532">"透過 <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"已傳送筆記"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"最近的訊息"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"公司資料"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> 英里外"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> 公里外"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="LOCALITY">%2$s</xliff:g><xliff:g id="STREET_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>,<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"將於明天<xliff:g id="OPEN_TIME">%s</xliff:g>開始營業"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"將於今天<xliff:g id="OPEN_TIME">%s</xliff:g>開始營業"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"將於<xliff:g id="CLOSE_TIME">%s</xliff:g>關門"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"已於今天<xliff:g id="CLOSE_TIME">%s</xliff:g>關門"</string>
+ <string name="open_now" msgid="4615706338669555999">"營業中"</string>
+ <string name="closed_now" msgid="2635314668145282080">"目前休息"</string>
+</resources>
diff --git a/InCallUI/res/values-zh-rTW/strings.xml b/InCallUI/res/values-zh-rTW/strings.xml
new file mode 100644
index 000000000..0c52ee22a
--- /dev/null
+++ b/InCallUI/res/values-zh-rTW/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"電話"</string>
+ <string name="onHold" msgid="527593602772521700">"保留"</string>
+ <string name="unknown" msgid="3646075119047488748">"不明"</string>
+ <string name="private_num" msgid="6081418498487514686">"私人號碼"</string>
+ <string name="payphone" msgid="5743050584468748607">"公用電話"</string>
+ <string name="confCall" msgid="3181961445236675173">"電話會議"</string>
+ <string name="call_lost" msgid="8208184291640961172">"通話已中斷"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"喇叭"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"手機聽筒"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"有線耳機"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"藍牙"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"要傳送以下的信號音嗎?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"正在傳送信號音\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"傳送"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"是"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"否"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"將萬用字元替換為"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"電話會議 <xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"語音留言號碼"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"撥號中"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"重撥中"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"電話會議"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"來電"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"公司來電"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"通話已結束"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"保留"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"掛斷中"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"通話中"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"我的電話號碼:<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"正在建立視訊通話連線"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"視訊通話"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"正在提出視訊通話要求"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"無法建立視訊通話連線"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"視訊通話要求遭拒"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"您的回撥號碼如下\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"您的緊急回撥號碼如下\n <xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"撥號中"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"未接來電"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"未接來電"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 通未接來電"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"來自 <xliff:g id="MISSED_CALL_FROM">%s</xliff:g> 的未接來電"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"進行中的通話"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"進行中的公司通話"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"進行中的通話 (透過 Wi-Fi)"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"進行中的公司通話 (透過 Wi-Fi)"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"保留"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"來電"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"公司來電"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"來電 (透過 Wi-Fi)"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"公司來電 (透過 Wi-Fi)"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"視訊通話來電"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"收到視訊通話要求"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"新的語音留言"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"新的語音留言 (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"撥打 <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"語音留言號碼不明"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"沒有服務"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"您所選取的網路 (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) 無法使用"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"接聽"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"掛斷"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"視訊通話"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"語音通話"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"接受"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"拒絕"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"回撥"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"傳送簡訊"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"撥號前,請先關閉飛航模式。"</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"尚未註冊網路。"</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"無法連線到行動網路。"</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"如要撥打電話,請輸入有效的號碼。"</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"無法通話。"</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"開始 MMI 序列…"</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"不支援的服務。"</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"無法切換通話。"</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"無法分割通話。"</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"無法轉接。"</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"無法進行電話會議。"</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"無法拒接來電。"</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"無法掛斷電話。"</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"SIP 通話"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"緊急電話"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"正在開啟無線通訊…"</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"找不到服務訊號,重試中…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"無法通話。<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> 不是緊急電話號碼。"</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"無法通話。只能撥打緊急號碼。"</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"使用鍵盤撥號"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"保留通話"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"恢復通話"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"結束通話"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"顯示撥號鍵盤"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"隱藏撥號鍵盤"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"忽略"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"取消忽略"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"新增通話"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"合併通話"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"切換"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"管理通話"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"管理電話會議"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"電話會議"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"管理"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"音訊"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"視訊通話"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"變更為語音通話"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"切換鏡頭"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"暫停視訊畫面"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"更多選項"</string>
+ <string name="player_started" msgid="3478865572468310331">"已啟動播放器"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"已停止播放器"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"相機尚未就緒"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"相機已準備就緒"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"不明的通話工作階段事件"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"服務"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"設定"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;未設定&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"其他通話設定"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"正在透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 撥號"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"有人透過 <xliff:g id="PROVIDER_NAME">%s</xliff:g> 來電"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"聯絡人相片"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"私人通話"</string>
+ <string name="selectContact" msgid="92191462970821951">"選取聯絡人"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"自行撰寫回應…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"取消"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"傳送"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"接聽"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"傳送簡訊"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"拒絕"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"接聽視訊通話"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"接聽語音通話"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"接受視訊通話要求"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"拒絕視訊通話要求"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"接受視訊傳送要求"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"拒絕視訊傳送要求"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"接受視訊接收要求"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"拒絕視訊接收要求"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"向上滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"向左滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"向右滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"向下滑動即可<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>。"</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"震動"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"震動"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"音效"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"預設音效 (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"手機鈴聲"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"鈴響時震動"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"鈴聲與震動"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"管理電話會議"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"緊急電話號碼"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 秒</item>
+ <item quantity="one">1 秒</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 分鐘</item>
+ <item quantity="one">1 分鐘</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> 小時</item>
+ <item quantity="one">1 小時</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"個人資料相片"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"相機已停用"</string>
+ <string name="child_number" msgid="4469090994612105532">"透過 <xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"備註已送出"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"最近的訊息"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"商家資訊"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> 英里遠"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> 公里遠"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="LOCALITY">%2$s</xliff:g>,<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>,<xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"將於明日<xliff:g id="OPEN_TIME">%s</xliff:g>開始營業"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"將於本日<xliff:g id="OPEN_TIME">%s</xliff:g>開始營業"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"將於<xliff:g id="CLOSE_TIME">%s</xliff:g>結束營業"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"已於本日<xliff:g id="CLOSE_TIME">%s</xliff:g>結束營業"</string>
+ <string name="open_now" msgid="4615706338669555999">"營業中"</string>
+ <string name="closed_now" msgid="2635314668145282080">"本日已結束營業"</string>
+</resources>
diff --git a/InCallUI/res/values-zu/strings.xml b/InCallUI/res/values-zu/strings.xml
new file mode 100644
index 000000000..f04867c8c
--- /dev/null
+++ b/InCallUI/res/values-zu/strings.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="phoneAppLabel" product="default" msgid="4753450867264774000">"Ifoni"</string>
+ <string name="onHold" msgid="527593602772521700">"Ibanjiwe"</string>
+ <string name="unknown" msgid="3646075119047488748">"Akwaziwa"</string>
+ <string name="private_num" msgid="6081418498487514686">"Inombolo eyimfihlo"</string>
+ <string name="payphone" msgid="5743050584468748607">"Ucingo olufakwa imali"</string>
+ <string name="confCall" msgid="3181961445236675173">"Ikholi yenkomfa"</string>
+ <string name="call_lost" msgid="8208184291640961172">"Ikholi ivaliwe"</string>
+ <string name="audio_mode_speaker" msgid="6160127758732918123">"Isipikha"</string>
+ <string name="audio_mode_earpiece" msgid="3138677187223932893">"Isipikha sendlebe sama-ear phone"</string>
+ <string name="audio_mode_wired_headset" msgid="583080366967943196">"Ama-earphone anezintambo"</string>
+ <string name="audio_mode_bluetooth" msgid="3188504589946495676">"I-Bluetooth"</string>
+ <string name="wait_prompt_str" msgid="3784275777844586675">"Thumela amathoni alandelayo?\n"</string>
+ <string name="pause_prompt_str" msgid="4507496811727697620">"Ithumela amathoni\n"</string>
+ <string name="send_button" msgid="4054398309483035794">"Thumela"</string>
+ <string name="pause_prompt_yes" msgid="6738588490007499118">"Yebo"</string>
+ <string name="pause_prompt_no" msgid="417286529736964178">"Cha"</string>
+ <string name="wild_prompt_str" msgid="8178750766679617355">"Miselela uhlamvu lwasendle nge"</string>
+ <string name="caller_manage_header" msgid="4036790479287738218">"Ikholi yenkomfa engu-<xliff:g id="CONF_CALL_TIME">%s</xliff:g>"</string>
+ <string name="voicemail_settings_number_label" msgid="2951965862286532957">"Inombolo yevoyisimeyili"</string>
+ <string name="card_title_dialing" msgid="5046026076417718916">"Iyadayela"</string>
+ <string name="card_title_redialing" msgid="8072468059192027844">"Iphinda iyadayela"</string>
+ <string name="card_title_conf_call" msgid="1747835072739982104">"Ikholi yenkomfa"</string>
+ <string name="card_title_incoming_call" msgid="4138485434087223132">"Ikholi engenayo"</string>
+ <string name="card_title_incoming_work_call" msgid="7000583925426981712">"Ikholi engenayo yomsebenzi"</string>
+ <string name="card_title_call_ended" msgid="5249815286629136486">"Ikholi iqediwe"</string>
+ <string name="card_title_on_hold" msgid="5633854828341577689">"Ibanjiwe"</string>
+ <string name="card_title_hanging_up" msgid="3402022578391538671">"Iyavala"</string>
+ <string name="card_title_in_call" msgid="5029165346952099302">"Ukukholi"</string>
+ <string name="card_title_my_phone_number" msgid="3749572971322520177">"Inombolo yami ngu-<xliff:g id="MY_PHONE_NUMBER">%s</xliff:g>"</string>
+ <string name="card_title_video_call_connecting" msgid="9171270899902894036">"Ixhuma ividiyo"</string>
+ <string name="card_title_video_call" msgid="6519406270853889302">"Ikholi yevidiyo"</string>
+ <string name="card_title_video_call_requesting" msgid="1611293204379882739">"Icela ividiyo"</string>
+ <string name="card_title_video_call_error" msgid="8488074823425848193">"Ayikwazi ukuxhuma ikholi yevidiyo"</string>
+ <string name="card_title_video_call_rejected" msgid="2885215432045215465">"Isicelo sevidiyo sinqatshelwe"</string>
+ <string name="card_title_callback_number" msgid="7646082782307705748">"Inombolo yakho yokuphinda ushaye\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="card_title_callback_number_emergency" msgid="8916355112472826080">"Inombolo yakho yokuphinda ushayelwe yesimo esiphuthumayo\n<xliff:g id="DARK_NUMBER">%1$s</xliff:g>"</string>
+ <string name="notification_dialing" msgid="8080968169444117163">"Iyadayela"</string>
+ <string name="notification_missedCallTitle" msgid="2774630248151712215">"Ikholi ephuthelwe"</string>
+ <string name="notification_missedCallsTitle" msgid="263275811089605859">"Amakholi akuphuthele"</string>
+ <string name="notification_missedCallsMsg" msgid="69408330370667429">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> amakholi akulahlekele"</string>
+ <string name="notification_missedCallTicker" msgid="1599269453813734699">"Uphuthelwe ikholi kusukela ku-<xliff:g id="MISSED_CALL_FROM">%s</xliff:g>"</string>
+ <string name="notification_ongoing_call" msgid="8633734299234807397">"Ikholi eqhubekayo"</string>
+ <string name="notification_ongoing_work_call" msgid="3465083293325006579">"Ikholi yomsebenzi eqhubekayo"</string>
+ <string name="notification_ongoing_call_wifi" msgid="4140639349603930166">"Ikholi ye-Wi-Fi eqhubekayo"</string>
+ <string name="notification_ongoing_work_call_wifi" msgid="8469582753279163976">"Ikholi yomsebenzi eqhubekayo ye-Wi-Fi"</string>
+ <string name="notification_on_hold" msgid="3151343576023182586">"Ibanjiwe"</string>
+ <string name="notification_incoming_call" msgid="5904745644632328863">"Ikholi engenayo"</string>
+ <string name="notification_incoming_work_call" msgid="281305845895342925">"Ikholi engenayo yomsebenzi"</string>
+ <string name="notification_incoming_call_wifi" msgid="8337740714221114955">"Ikholi ye-Wi-Fi engenayo"</string>
+ <string name="notification_incoming_work_call_wifi" msgid="3248418394186803763">"Ikholi engenayo yomsebenzi ye-Wi-Fi"</string>
+ <string name="notification_incoming_video_call" msgid="7814873581838165772">"Ikholi yevidiyo engenayo"</string>
+ <string name="notification_requesting_video_call" msgid="4844596091477863245">"Isicelo sevidiyo engenayo"</string>
+ <string name="notification_voicemail_title" msgid="7595628197933709144">"Ivoyisimeyili entsha"</string>
+ <string name="notification_voicemail_title_count" msgid="1241573926817248239">"Ivoyisimeyili entsha (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+ <string name="notification_voicemail_text_format" msgid="6496440879085042069">"Dayela u-<xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
+ <string name="notification_voicemail_no_vm_number" msgid="5433652017869242375">"Inombolo yevoyisimeyili ayaziwa"</string>
+ <string name="notification_network_selection_title" msgid="6785177943238085441">"Ayikho isevisi"</string>
+ <string name="notification_network_selection_text" msgid="9097902390701009591">"Inethiwekhi ekhethiwe (<xliff:g id="OPERATOR_NAME">%s</xliff:g>) ayitholakali"</string>
+ <string name="notification_action_answer" msgid="8418990052527593953">"Phendula"</string>
+ <string name="notification_action_end_call" msgid="2152010639043225860">"Vala ikholi"</string>
+ <string name="notification_action_answer_video" msgid="2400233093494856655">"Ividiyo"</string>
+ <string name="notification_action_answer_voice" msgid="3206168292649273866">"Izwi"</string>
+ <string name="notification_action_accept" msgid="8595047032790476122">"Yamukela"</string>
+ <string name="notification_action_dismiss" msgid="1998811618480434300">"Cashisa"</string>
+ <string name="notification_missedCall_call_back" msgid="7855043480614703539">"Phinda ushayele"</string>
+ <string name="notification_missedCall_message" msgid="2407410183079324393">"Umlayezo"</string>
+ <string name="incall_error_power_off" msgid="3626117639377110403">"Ukwenza ikholi, vala kuqala imodi Yendiza."</string>
+ <string name="incall_error_emergency_only" msgid="8704761887752183855">"Ayibhalisiwe kwinethiwekhi."</string>
+ <string name="incall_error_out_of_service" msgid="1830319376612608339">"Inethiwekhi yeselula ayitholakali."</string>
+ <string name="incall_error_no_phone_number_supplied" msgid="3042963797202928322">"Ukuze wenze ikholi, faka inombolo evumelekile."</string>
+ <string name="incall_error_call_failed" msgid="2213413937257570551">"Ayikwazi ukushaya."</string>
+ <string name="incall_status_dialed_mmi" msgid="8864341962086874751">"Iqalisa ukulandelana kwe-MMI..."</string>
+ <string name="incall_error_supp_service_unknown" msgid="3390926762577861268">"Isevisi ayisekelwe."</string>
+ <string name="incall_error_supp_service_switch" msgid="4893764463854753730">"Ayikwazi ukushintsha amakholi."</string>
+ <string name="incall_error_supp_service_separate" msgid="5469628699581380277">"Ayikwazi ukuhlukanisa ikholi."</string>
+ <string name="incall_error_supp_service_transfer" msgid="3220469890457973326">"Ayikwazi ukudlulisela."</string>
+ <string name="incall_error_supp_service_conference" msgid="3100373998543200356">"Ayikwazi ukwenza inkomfa."</string>
+ <string name="incall_error_supp_service_reject" msgid="4543915892409365831">"Ayikwazi ukunqabela ikholi."</string>
+ <string name="incall_error_supp_service_hangup" msgid="101167589969625637">"Ayikwazi ukukhipha amakholi."</string>
+ <string name="incall_call_type_label_sip" msgid="1327822795765282192">"Ikholi ye-SIP"</string>
+ <string name="emergency_enable_radio_dialog_title" msgid="7882321703828314787">"Ikholi ephuthumayo"</string>
+ <string name="emergency_enable_radio_dialog_message" msgid="4382752053654184327">"Ivula irediyo..."</string>
+ <string name="emergency_enable_radio_dialog_retry" msgid="1672288458940152814">"Ayikho isevisi. Iyazama futhi…"</string>
+ <string name="dial_emergency_error" msgid="582305854626092376">"Ayikwazi ukushaya. U-<xliff:g id="NON_EMERGENCY_NUMBER">%s</xliff:g> akuyona inombolo yesimo esiphuthumayo."</string>
+ <string name="dial_emergency_empty_error" msgid="199888628163390267">"Ayikwazi ukushaya. Shayela inombolo yesimo esiphuthumayo."</string>
+ <string name="dialerKeyboardHintText" msgid="8533449463925408141">"Sebenzisa ikhibhodi ukudayela"</string>
+ <string name="onscreenHoldText_unselected" msgid="4509232821220492533">"Bamba ikholi"</string>
+ <string name="onscreenHoldText_selected" msgid="2988100347384733032">"Qalisa kabusha ikholi"</string>
+ <string name="onscreenEndCallText" msgid="1416981593311001074">"Qeda ikholi"</string>
+ <string name="onscreenShowDialpadText_unselected" msgid="8253784035944284938">"Bonisa iphedi yokudayela"</string>
+ <string name="onscreenShowDialpadText_selected" msgid="7368390784890311449">"Fihla iphedi yokudayela"</string>
+ <string name="onscreenMuteText_unselected" msgid="4130269060091842798">"Thulisa"</string>
+ <string name="onscreenMuteText_selected" msgid="7074763815284369548">"Susa ukuthula"</string>
+ <string name="onscreenAddCallText" msgid="5577548650466595598">"Engeza ikholi"</string>
+ <string name="onscreenMergeCallsText" msgid="4946687067221459357">"Hlanganisa amakholi"</string>
+ <string name="onscreenSwapCallsText" msgid="8272036175646846198">"Shintsha"</string>
+ <string name="onscreenManageCallsText" msgid="5491297234697209677">"Phatha amakholi"</string>
+ <string name="onscreenManageConferenceText" msgid="7043499154946980355">"Phatha ucingo lwengqungquthela"</string>
+ <string name="onscreenConferenceText" msgid="171855677185793827">"Ikholi yenkomfa"</string>
+ <string name="onscreenManageText" msgid="7625850560625708322">"Phatha"</string>
+ <string name="onscreenAudioText" msgid="8963459818052898299">"Umsindo"</string>
+ <string name="onscreenVideoCallText" msgid="1578940167445068369">"Ikholi yevidiyo"</string>
+ <string name="onscreenChangeToVoiceText" msgid="6249580619992009182">"Shintshela kukholi yezwi"</string>
+ <string name="onscreenSwitchCameraText" msgid="7141261218152736690">"Shintsha Ikhamera"</string>
+ <string name="onscreenPauseVideoText" msgid="1268768027709892604">"Misa isikhashana ividiyo"</string>
+ <string name="onscreenOverflowText" msgid="7932741239724473887">"Izinketho eziningi"</string>
+ <string name="player_started" msgid="3478865572468310331">"Umdlali uqalile"</string>
+ <string name="player_stopped" msgid="1278611664986561535">"Umdlali umisiwe"</string>
+ <string name="camera_not_ready" msgid="6614469280264241251">"Ikhamera ayilungile"</string>
+ <string name="camera_ready" msgid="2614541247814590887">"Ikhamera ilungile"</string>
+ <string name="unknown_call_session_event" msgid="2947023743819984299">"Umcimbi wesikhathi sekholi ongaziwa"</string>
+ <string name="voicemail_provider" msgid="2878119321474918370">"Isevisi"</string>
+ <string name="voicemail_settings" msgid="7548868784816068975">"Ukusetha"</string>
+ <string name="voicemail_number_not_set" msgid="2690477999015436138">"&lt;Ayisethiwe&gt;"</string>
+ <string name="other_settings" msgid="6699076019841942826">"Ezinye izilungiselelo zekholi"</string>
+ <string name="calling_via_template" msgid="3539373093109976255">"Ishaya nge-<xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="incoming_via_template" msgid="6281138766370092800">"Ingena nge-<xliff:g id="PROVIDER_NAME">%s</xliff:g>"</string>
+ <string name="contactPhoto" msgid="6028825355597675193">"isithombe soxhumana naye"</string>
+ <string name="goPrivate" msgid="3554069451018659483">"yenza kube imfihlo"</string>
+ <string name="selectContact" msgid="92191462970821951">"khetha othintana naye"</string>
+ <string name="respond_via_sms_custom_message" msgid="8210393177674619127">"Bhala okwakho…"</string>
+ <string name="custom_message_cancel" msgid="5920059627508662163">"Khansela"</string>
+ <string name="custom_message_send" msgid="3798076337006735995">"Thumela"</string>
+ <string name="description_target_answer" msgid="1111945818996518320">"Phendula"</string>
+ <string name="description_target_send_sms" msgid="3652217769615310018">"Thumela i-SMS"</string>
+ <string name="description_target_decline" msgid="7108154434759234035">"Yenqaba"</string>
+ <string name="description_target_answer_video_call" msgid="4655616461181308405">"Phendula njengekholi yevidiyo"</string>
+ <string name="description_target_answer_audio_call" msgid="3234714934649708854">"Phendula njengekholi yomsindo"</string>
+ <string name="description_target_accept_upgrade_to_video_request" msgid="384894008955682630">"Yamukela isicelo sevidiyo"</string>
+ <string name="description_target_decline_upgrade_to_video_request" msgid="7342968876159189300">"Yenqaba isicelo sevidiyo"</string>
+ <string name="description_target_accept_upgrade_to_video_transmit_request" msgid="4586773853073826378">"Yamukela isicelo sokudlulisa ividiyo"</string>
+ <string name="description_target_decline_upgrade_to_video_transmit_request" msgid="1191166008711514234">"Yenqaba isicelo sokudlulisa ividiyo"</string>
+ <string name="description_target_accept_upgrade_to_video_receive_request" msgid="2224978927364021080">"Yamukela isicelo sokwamukela ividiyo"</string>
+ <string name="description_target_decline_upgrade_to_video_receive_request" msgid="3151115394424918077">"Yenqaba isicelo sokwamukela ividiyo"</string>
+ <string name="description_direction_up" msgid="1735018141439291766">"Slayidela phezulu ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_left" msgid="6811598791620851239">"Slayida ngakwesokunxele ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_right" msgid="5461971399586296023">"Slayida ngakwesokudla ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="description_direction_down" msgid="3331715227997561639">"Slayida ngezansi ku-<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
+ <string name="voicemail_notification_vibrate_when_title" msgid="4595145399183729630">"Dlidlizela"</string>
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="2390729279972461242">"Dlidlizela"</string>
+ <string name="voicemail_notification_ringtone_title" msgid="1996920553949534944">"Umsindo"</string>
+ <string name="default_notification_description" msgid="4950807644546509965">"Umsindo ozenzakalelayo (<xliff:g id="DEFAULT_SOUND_TITLE">%1$s</xliff:g>)"</string>
+ <string name="ringtone_title" msgid="835582004693335905">"Ithoni yokukhala yefoni"</string>
+ <string name="vibrate_on_ring_title" msgid="5019791043398986665">"Dlidlizisa uma ikhala"</string>
+ <string name="preference_category_ringtone" msgid="6246687516643676729">"Ithoni yokukhala nokudlidliza"</string>
+ <string name="manageConferenceLabel" msgid="7237614418556336108">"Phatha ucingo lwengqungquthela"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="7244995877625769187">"Inombolo ephuthumayo"</string>
+ <plurals name="duration_seconds" formatted="false" msgid="2544699588744957418">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> amasekhondi</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> amasekhondi</item>
+ </plurals>
+ <plurals name="duration_minutes" formatted="false" msgid="8379077285441507101">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> amaminithi</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> amaminithi</item>
+ </plurals>
+ <plurals name="duration_hours" formatted="false" msgid="7420759096931824344">
+ <item quantity="one"><xliff:g id="COUNT">%d</xliff:g> amahora</item>
+ <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> amahora</item>
+ </plurals>
+ <string name="profile_photo_description" msgid="7958198110870319358">"Isithombe sephrofayela"</string>
+ <string name="camera_off_description" msgid="4220023868645225790">"Ikhamera ivaliwe"</string>
+ <string name="child_number" msgid="4469090994612105532">"nge-<xliff:g id="CHILD_NUMBER">%s</xliff:g>"</string>
+ <string name="note_sent" msgid="7623014827902758398">"Inothi lithunyelwe"</string>
+ <string name="person_contact_context_title" msgid="8490058088809090979">"Imilayezo yakamuva"</string>
+ <string name="business_contact_context_title" msgid="8448362898576496764">"Ulwazi lwebhizinisi"</string>
+ <string name="distance_imperial_away" msgid="2083362798225798740">"<xliff:g id="DISTANCE">%.1f</xliff:g> amamitha kude"</string>
+ <string name="distance_metric_away" msgid="9021396592464955256">"<xliff:g id="DISTANCE">%.1f</xliff:g> amakhilomitha kude"</string>
+ <string name="display_address" msgid="444235484565491291">"<xliff:g id="STREET_ADDRESS">%1$s</xliff:g>, <xliff:g id="LOCALITY">%2$s</xliff:g>"</string>
+ <string name="open_time_span" msgid="2762952234657271236">"<xliff:g id="OPEN_TIME">%1$s</xliff:g> - <xliff:g id="CLOSE_TIME">%2$s</xliff:g>"</string>
+ <string name="opening_hours" msgid="7803506319518398380">"<xliff:g id="EARLIER_TIMES">%1$s</xliff:g>, <xliff:g id="LATER_TIME">%2$s</xliff:g>"</string>
+ <string name="opens_tomorrow_at" msgid="3567511490448488788">"Kuvulwa kusasa ngo-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="opens_today_at" msgid="6281212768937222891">"Kuvulwa namuhla ngo-<xliff:g id="OPEN_TIME">%s</xliff:g>"</string>
+ <string name="closes_today_at" msgid="4822369201263491509">"Kuvalwa ngo-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="closed_today_at" msgid="4060072663433467233">"Kuvalwe namuhla ngo-<xliff:g id="CLOSE_TIME">%s</xliff:g>"</string>
+ <string name="open_now" msgid="4615706338669555999">"Kuvuliwe manje"</string>
+ <string name="closed_now" msgid="2635314668145282080">"Kuvaliwe manje"</string>
+</resources>
diff --git a/InCallUI/res/values/animation_constants.xml b/InCallUI/res/values/animation_constants.xml
new file mode 100644
index 000000000..8df6a7281
--- /dev/null
+++ b/InCallUI/res/values/animation_constants.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+ <!-- Duration of the InCallUI reveal and shrink animations after a call is placed -->
+ <integer name="reveal_animation_duration">333</integer>
+ <integer name="shrink_animation_duration">333</integer>
+ <integer name="video_animation_duration">257</integer>
+</resources>
diff --git a/InCallUI/res/values/array.xml b/InCallUI/res/values/array.xml
new file mode 100644
index 000000000..7877ec8f3
--- /dev/null
+++ b/InCallUI/res/values/array.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Array resources for the Phone app. -->
+<resources>
+ <!-- "Target" resources for the GlowPadView widget used for incoming calls;
+ see InCallTouchUi.showIncomingCallWidget() and incall_touch_ui.xml. -->
+
+ <!-- For audio calls, if respond via SMS is disabled:
+ - Answer (drag right)
+ - Decline (drag left) -->
+ <array name="incoming_call_widget_audio_without_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@null</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_target_descriptions">
+ <item>@string/description_target_answer</item>
+ <item>@null</item>
+ <item>@string/description_target_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@null</item>
+ </array>
+
+ <!-- For audio calls, if respond via SMS is enabled:
+ - Answer (drag right)
+ - Respond via SMS (drag up)
+ - Decline (drag left) -->
+ <array name="incoming_call_widget_audio_with_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@drawable/ic_lockscreen_text</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_target_descriptions">
+ <item>@string/description_target_answer</item>
+ <item>@string/description_target_send_sms</item>
+ <item>@string/description_target_decline</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@string/description_direction_up</item>
+ <item>@string/description_direction_left</item>
+ <item>@null</item>
+ </array>
+
+ <!-- For video calls, if respond via SMS is disabled:
+ - Answer as video call (drag right)
+ - Decline (drag left)
+ - Answer as audio call (drag down) -->
+ <array name="incoming_call_widget_video_without_sms_targets">
+ <item>@drawable/ic_lockscreen_answer</item>
+ <item>@null</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@drawable/ic_lockscreen_answer_video</item>
+ </array>
+ <array name="incoming_call_widget_video_without_sms_target_descriptions">
+ <item>@string/description_target_answer_video_call</item>
+ <item>@null</item>
+ <item>@string/description_target_decline</item>
+ <item>@string/description_target_answer_audio_call</item>
+ </array>
+ <array name="incoming_call_widget_video_without_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@string/description_direction_down</item>
+ </array>
+
+ <!-- For video calls, if respond via SMS is enabled:
+ - Answer as video call (drag right)
+ - Respond via SMS (drag up)
+ - Decline (drag left)
+ - Answer as audio call (drag down) -->
+ <array name="incoming_call_widget_video_with_sms_targets">
+ <item>@drawable/ic_lockscreen_answer_video</item>
+ <item>@drawable/ic_lockscreen_text</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@drawable/ic_lockscreen_answer</item>
+ </array>
+ <array name="incoming_call_widget_video_with_sms_target_descriptions">
+ <item>@string/description_target_answer_video_call</item>
+ <item>@string/description_target_send_sms</item>
+ <item>@string/description_target_decline</item>
+ <item>@string/description_target_answer_audio_call</item>
+ </array>
+ <array name="incoming_call_widget_video_with_sms_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@string/description_direction_up</item>
+ <item>@string/description_direction_left</item>
+ <item>@string/description_direction_down</item>
+ </array>
+
+ <!-- For accept/reject upgrade to video in active video call
+ - Accept upgrade to video request (drag right)
+ - Decline upgrade to video request (drag left)-->
+ <array name="incoming_call_widget_video_request_targets">
+ <item>@drawable/ic_lockscreen_answer_video</item>
+ <item>@drawable/ic_lockscreen_decline_video</item>
+ </array>
+
+ <array name="incoming_call_widget_video_request_target_descriptions">
+ <item>@string/description_target_accept_upgrade_to_video_request</item>
+ <item>@null</item>
+ <item>@string/description_target_decline_upgrade_to_video_request</item>
+ <item>@null</item>"
+ </array>
+ <array name="incoming_call_widget_video_request_target_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@null</item>
+ </array>
+</resources>
diff --git a/InCallUI/res/values/attrs.xml b/InCallUI/res/values/attrs.xml
new file mode 100644
index 000000000..e135fb72d
--- /dev/null
+++ b/InCallUI/res/values/attrs.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <declare-styleable name="GlowPadView">
+ <attr name="android:gravity"/>
+
+ <!-- Reference to an array resource that be shown as targets around a circle. -->
+ <attr name="targetDrawables" format="reference"/>
+
+ <!-- Reference to an array resource that be used as description for the targets around the circle. -->
+ <attr name="targetDescriptions" format="reference"/>
+
+ <!-- Reference to an array resource that be used to announce the directions with targets around the circle. -->
+ <attr name="directionDescriptions" format="reference"/>
+
+ <!-- Sets a drawable as the center. -->
+ <attr name="handleDrawable" format="reference"/>
+
+ <!-- Drawable to use for wave ripple animation. -->
+ <attr name="outerRingDrawable" format="reference"/>
+
+ <!-- Drawble used for drawing points -->
+ <attr name="pointDrawable" format="reference"/>
+
+ <!-- Inner radius of glow area. -->
+ <attr name="innerRadius" format="dimension"/>
+
+ <!-- Outer radius of glow area. Target icons will be drawn on this circle. -->
+ <attr name="outerRadius" format="dimension"/>
+
+ <!-- Size of target radius. Points within this distance of target center is a "hit". -->
+ <!--
+ <attr name="hitRadius" format="dimension"/>
+ -->
+
+ <!-- Radius of glow under finger. -->
+ <attr name="glowRadius" format="dimension"/>
+
+ <!-- Tactile feedback duration for actions. Set to '0' for no vibration. -->
+ <attr name="vibrationDuration" format="integer"/>
+
+ <!-- How close we need to be before snapping to a target. -->
+ <attr name="snapMargin" format="dimension"/>
+
+ <!-- Number of waves/chevrons to show in animation. -->
+ <attr name="feedbackCount" format="integer"/>
+
+ <!-- Used when the handle shouldn't wait to be hit before following the finger -->
+ <attr name="alwaysTrackFinger" format="boolean"/>
+
+ <!-- Determine whether the glow pad is allowed to scale to fit the bounds indicated
+ by its parent. If this is set to false, no scaling will occur. If this is set to true
+ scaling will occur to fit for any axis in which gravity is set to center. -->
+ <attr name="allowScaling" format="boolean" />
+ </declare-styleable>
+</resources>
diff --git a/InCallUI/res/values/colors.xml b/InCallUI/res/values/colors.xml
new file mode 100644
index 000000000..99cf7b023
--- /dev/null
+++ b/InCallUI/res/values/colors.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+
+ <!-- In-call UI background color. -->
+ <color name="incall_background_color">@color/dialer_theme_color</color>
+ <color name="incall_accent_color">#ffffff</color>
+
+ <!-- Background color of main banner. -->
+ <color name="incall_call_banner_background_color">@color/incall_background_color</color>
+ <color name="incall_call_banner_text_color">#ffffff</color>
+ <!-- 100% opacity, white -->
+ <color name="incall_call_banner_subtext_color">#ffffff</color>
+ <color name="incall_banner_secondary_background_color">#f5f5f5</color>
+ <color name="incall_banner_secondary_text_color">#333333</color>
+
+ <color name="incall_action_bar_background_color">@color/incall_background_color</color>
+ <color name="incall_action_bar_text_color">@color/incall_call_banner_text_color</color>
+
+ <color name="incall_photo_background_color">#545454</color>
+
+ <!-- Put on top of each photo, implying 80% darker than usual. -->
+ <color name="on_hold_dim_effect">#cc000000</color>
+
+ <color name="conference_call_manager_background_color">#f8f8f8</color>
+ <color name="conference_call_manager_caller_name_text_color">#4d4d4d</color>
+ <color name="conference_call_manager_icon_color">#999999</color>
+ <!-- Used with some smaller texts in manage conference screen. -->
+ <color name="conference_call_manager_secondary_text_color">#999999</color>
+ <color name="secondary_call_info_divider_highlight_color">#ffffff</color>
+
+ <color name="end_call_touch_feedback_tint">#dddddd</color>
+
+ <!-- Color of dialpad digits -->
+ <color name="dialpad_digits_text_color">#333</color>
+
+ <color name="incall_dialpad_background">#ffffff</color>
+ <color name="incall_dialpad_background_pressed">#ccaaaaaa</color>
+
+ <color name="button_background_color">@color/incall_background_color</color>
+ <color name="button_selected_color">@color/dialer_theme_color_dark</color>
+ <!-- 70% opacity, white. -->
+ <color name="button_default_color">#b3ffffff</color>
+ <!-- 20% opacity, white. -->
+ <color name="button_disabled_color">#33ffffff</color>
+
+ <!-- Background color of action bars -->
+ <color name="actionbar_background_color">@color/dialer_theme_color</color>
+ <!-- Background color for status bar. For portrait this will be ignored. -->
+ <color name="statusbar_background_color">@color/dialer_theme_color</color>
+
+ <color name="translucent_shadow">#33999999</color>
+
+ <!-- 70% opacity, black. -->
+ <color name="glowpad_background_color">#b3000000</color>
+ <!-- 15% opacity, white. -->
+ <color name="glowpad_outer_ring_color">#26ffffff</color>
+ <color name="glowpad_text_widget_ring_color">#ffffff</color>
+ <color name="glowpad_widget_active_color">#ffffff</color>
+ <color name="glowpad_text_widget_normal_tint">#cccccc</color>
+ <color name="glowpad_call_widget_normal_tint">#00c853</color>
+ <color name="glowpad_end_call_widget_normal_tint">#ff1744</color>
+ <color name="glowpad_incoming_widget_tint">#a3a3a3</color>
+ <color name="glowpad_incoming_widget_background_tint">#ffffff</color>
+
+ <!-- 70% opacity, white. -->
+ <color name="accessible_answer_hint_text_color">#B2FFFFFF</color>
+
+ <!-- 20% opacity, theme color. -->
+ <color name="incall_dialpad_touch_tint">#330288d1</color>
+
+ <!-- Background colors for InCallUI. This set of colors is a subset of
+ https://spec.googleplex.com/quantumpalette#extended which pass WCAG AA and all have a
+ contrast ratio over 5:1.
+
+ These colors are also used by InCallUIMaterialColorMapUtils to generate primary
+ activity colors.
+ -->
+ <array name="background_colors">
+ <item>#00796B</item>
+ <item>#3367D6</item>
+ <item>#303F9F</item>
+ <item>#7B1FA2</item>
+ <item>#C2185B</item>
+ <item>#C53929</item>
+ </array>
+
+ <!-- Darker versions of background_colors, two shades darker. These colors are used for the
+ status bar. -->
+ <array name="background_colors_dark">
+ <item>#00695C</item>
+ <item>#2A56C6</item>
+ <item>#283593</item>
+ <item>#6A1B9A</item>
+ <item>#AD1457</item>
+ <item>#B93221</item>
+ </array>
+
+ <!-- Ripple color used over light backgrounds. -->
+ <color name="ripple_light">#40000000</color>
+
+ <color name="contact_context_title_text_color">@color/incall_call_banner_subtext_color</color>
+ <color name="person_contact_context_message_text_color">@color/dialer_theme_color</color>
+ <color name="person_contact_context_message_background_color">@color/incall_call_banner_subtext_color</color>
+ <color name="person_contact_context_detail_text_color">@color/incall_call_banner_subtext_color</color>
+ <color name="business_contact_context_text_color">@color/incall_call_banner_subtext_color</color>
+
+ <!-- White background for dialer -->
+ <color name="background_dialer_white">#ffffff</color>
+</resources>
diff --git a/InCallUI/res/values/config.xml b/InCallUI/res/values/config.xml
new file mode 100644
index 000000000..b81ba3ca0
--- /dev/null
+++ b/InCallUI/res/values/config.xml
@@ -0,0 +1,27 @@
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+<resources>
+ <!-- Determines the maximum number of buttons visible on the call card. Any buttons over this
+ count are put into the overflow menu. -->
+ <integer name="call_card_max_buttons">5</integer>
+
+ <!-- Determines video calls will automatically enter fullscreen mode after the start of the
+ call. -->
+ <bool name="video_call_auto_fullscreen">true</bool>
+ <!-- The number of milliseconds after which a video call will automatically enter fullscreen
+ mode (requires video_call_auto_fullscreen to be true). -->
+ <integer name="video_call_auto_fullscreen_timeout">5000</integer>
+</resources> \ No newline at end of file
diff --git a/InCallUI/res/values/dimens.xml b/InCallUI/res/values/dimens.xml
new file mode 100644
index 000000000..59da7860a
--- /dev/null
+++ b/InCallUI/res/values/dimens.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <!-- Whether or not this layout displays a large photo. -->
+ <bool name="has_large_photo">false</bool>
+
+ <!-- Whether or not the landscape mode layout is currently being used -->
+ <bool name="is_layout_landscape">false</bool>
+
+ <!-- Dimensions for CallCard elements (the normal in-call UI) -->
+
+ <dimen name="call_banner_height">0dp</dimen>
+ <dimen name="call_banner_vertical_margin">20dp</dimen>
+
+ <dimen name="incall_action_bar_elevation">3dp</dimen>
+
+ <!-- Margin between the bottom of the "call card" photo
+ and the top of the in-call button cluster. -->
+ <dimen name="in_call_touch_ui_upper_margin">2dp</dimen>
+
+ <!-- Padding at the left and right edges of the "call banner". -->
+ <dimen name="call_banner_side_padding">24dp</dimen>
+ <!-- Padding at the top and bottom edges of the "call banner". -->
+ <dimen name="call_banner_primary_call_container_top_padding">16dp</dimen>
+ <dimen name="secondary_call_info_horizontal_padding">24dp</dimen>
+ <dimen name="secondary_call_info_vertical_padding">32dp</dimen>
+ <dimen name="secondary_call_info_text_size">16sp</dimen>
+
+ <!-- Padding at the top and bottom edges of the "provider information" -->
+ <dimen name="provider_info_top_bottom_padding">8dp</dimen>
+
+ <!-- Text sizes for information in the call card.
+ Note: These are the default sizes for small (<600dp height) devices: larger screen sizes
+ apply the values in values-sw360dp/dimens.xml. -->
+ <dimen name="call_status_text_size">16sp</dimen>
+ <dimen name="call_status_text_min_size">12sp</dimen>
+ <dimen name="call_name_text_size">34dp</dimen>
+ <dimen name="call_name_text_min_size">28sp</dimen>
+ <dimen name="call_label_text_size">16sp</dimen>
+ <!-- Right padding for name and number fields in the call banner.
+ This padding is used to ensure that ultra-long names or
+ numbers won't overlap the elapsed time indication. -->
+ <dimen name="call_banner_name_number_right_padding">50sp</dimen>
+
+ <!-- Height and width of the in-call buttons. -->
+ <dimen name="in_call_button_dimension">48dp</dimen>
+
+ <dimen name="primary_call_elevation">0dp</dimen>
+ <dimen name="dialpad_elevation">2dp</dimen>
+
+ <!-- The InCallUI dialpad will sometimes want digits sizes that are different from dialer.
+ Note: These are the default sizes for small (<600dp height) devices: larger screen sizes
+ apply the values in values-h600dp/dimens.xml. -->
+ <dimen name="dialpad_key_number_margin_bottom">1dp</dimen>
+ <!-- Zero key should have less space between self and text because "+" is smaller -->
+ <dimen name="dialpad_zero_key_number_margin_bottom">0dp</dimen>
+ <dimen name="dialpad_digits_adjustable_text_size">20sp</dimen>
+ <dimen name="dialpad_digits_adjustable_height">50dp</dimen>
+ <dimen name="dialpad_key_numbers_size">36dp</dimen>
+
+ <dimen name="floating_action_button_vertical_offset">-10dp</dimen>
+
+ <dimen name="call_button_margin_vertical">8dp</dimen>
+ <dimen name="call_button_margin_horizontal">6dp</dimen>
+
+ <!-- Dimensions for OTA Call Card -->
+ <dimen name="otaactivate_layout_marginTop">10dp</dimen>
+ <dimen name="otalistenprogress_layout_marginTop">5dp</dimen>
+ <dimen name="otasuccessfail_layout_marginTop">10dp</dimen>
+
+ <!-- Dimension used to possibly down-scale high-res photo into what is suitable
+ for notification's large icon. -->
+ <dimen name="notification_icon_size">64dp</dimen>
+
+ <!-- Circle size for incoming call widget's each item. -->
+ <dimen name="incoming_call_widget_circle_size">56dp</dimen>
+
+ <!-- Size of alarm alert outer ring. -->
+ <dimen name="glowpadview_outerring_diameter">250dp</dimen>
+ <!-- Default target placement radius for GlowPadView. Should be 1/2 of outerring diameter. -->
+ <dimen name="glowpadview_target_placement_radius">125dp</dimen>
+
+ <!-- Default glow radius for GlowPadView -->
+ <dimen name="glowpadview_glow_radius">70dip</dimen>
+
+ <!-- Default distance beyond which GlowPadView snaps to the matching target -->
+ <dimen name="glowpadview_snap_margin">40dip</dimen>
+
+ <!-- Default distance from each snap target that GlowPadView considers a "hit" -->
+ <dimen name="glowpadview_inner_radius">15dip</dimen>
+
+ <dimen name="glowpadview_margin_bottom">-48dip</dimen>
+ <dimen name="glowpadview_margin_right">0dip</dimen>
+ <!-- Height of translucent shadow effect -->
+ <dimen name="translucent_shadow_height">2dp</dimen>
+
+ <dimen name="end_call_button_margin_bottom">2dp</dimen>
+
+ <dimen name="call_card_anim_translate_y_offset">50dp</dimen>
+
+ <!-- The smaller dimension of the video preview. When in portrait orientation this is the
+ width of the preview. When in landscape, this is the height. -->
+ <dimen name="video_preview_small_dimension">90dp</dimen>
+
+ <dimen name="video_preview_margin">0dp</dimen>
+
+ <dimen name="end_call_floating_action_button_diameter">72dp</dimen>
+ <dimen name="end_call_floating_action_button_small_diameter">56dp</dimen>
+
+ <dimen name="conference_call_manager_padding_top">64dp</dimen>
+ <dimen name="conference_call_manager_button_dimension">46dp</dimen>
+
+ <dimen name="contact_context_title_text_size">14sp</dimen>
+ <dimen name="contact_context_title_image_size">19dp</dimen>
+ <dimen name="contact_context_title_image_side_padding">23dp</dimen>
+ <dimen name="contact_context_title_margin_bottom">13dp</dimen>
+ <dimen name="contact_context_list_item_padding">13dp</dimen>
+
+ <dimen name="person_contact_context_horizontal_padding">30dp</dimen>
+ <dimen name="person_contact_context_message_text_size">16sp</dimen>
+ <dimen name="person_contact_context_message_vertical_padding">7dp</dimen>
+ <dimen name="person_contact_context_message_horizontal_padding">12dp</dimen>
+ <dimen name="person_contact_context_message_background_main_radius">15dp</dimen>
+ <dimen name="person_contact_context_message_background_accent_radius">2dp</dimen>
+ <dimen name="person_contact_context_detail_padding_top">7dp</dimen>
+ <dimen name="person_contact_context_detail_text_size">14sp</dimen>
+
+ <dimen name="business_contact_context_end_padding">10dp</dimen>
+ <dimen name="business_contact_context_image_size">25dp</dimen>
+ <dimen name="business_contact_context_image_padding">20dp</dimen>
+ <dimen name="business_contact_context_heading_font_size">16sp</dimen>
+ <dimen name="business_contact_context_detail_font_size">12sp</dimen>
+
+ <dimen name="contact_context_small_photo_size">40dp</dimen>
+</resources>
diff --git a/res/menu/call_details_cab.xml b/InCallUI/res/values/ids.xml
index 7de675ff1..accb8fb73 100644
--- a/res/menu/call_details_cab.xml
+++ b/InCallUI/res/values/ids.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,10 +13,8 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
- <item
- android:id="@+id/copy_phone_number"
- android:icon="?android:attr/actionModeCopyDrawable"
- android:title="@string/menu_copy"
- />
-</menu>
+
+<resources>
+ <item type="id" name="fadeState" />
+ <item type="id" name="view_tag_callcard_actual_height" />
+</resources>
diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml
new file mode 100644
index 000000000..57a1b5389
--- /dev/null
+++ b/InCallUI/res/values/strings.xml
@@ -0,0 +1,526 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+ <!-- Official label of the phone app, as seen in "Manage Applications"
+ and other settings UIs. -->
+ <string name="phoneAppLabel" product="default">Phone</string>
+
+ <!-- Official label for the in-call UI. DO NOT TRANSLATE. -->
+ <string name="inCallLabel" translate="false">InCallUI</string>
+
+ <!-- Call status -->
+
+ <!-- In-call screen: status label for a call that's on hold -->
+ <string name="onHold">On hold</string>
+
+ <!-- Incoming call screen, name of "unknown" caller -->
+ <string name="unknown">Unknown</string>
+ <!-- Incoming call screen, string when number hidden -->
+ <string name="private_num">Private number</string>
+ <!-- Incoming call screen, string when called from a pay phone -->
+ <string name="payphone">Payphone</string>
+
+ <!-- In-call screen: status label for a conference call -->
+ <string name="confCall">Conference call</string>
+ <!-- In-call screen: call lost dialog text -->
+ <string name="call_lost">Call dropped</string>
+
+ <!-- MMI dialog strings -->
+ <!-- Dialog label when an MMI code starts running -->
+
+ <!-- "Audio mode" popup menu: Item label to select the speakerphone [CHAR LIMIT=25] -->
+ <string name="audio_mode_speaker">Speaker</string>
+ <!-- "Audio mode" popup menu: Item label to select the handset earpiece [CHAR LIMIT=25] -->
+ <string name="audio_mode_earpiece">Handset earpiece</string>
+ <!-- "Audio mode" popup menu: Item label to select the wired headset [CHAR LIMIT=25] -->
+ <string name="audio_mode_wired_headset">Wired headset</string>
+ <!-- "Audio mode" popup menu: Item label to select the bluetooth headset [CHAR LIMIT=25] -->
+ <string name="audio_mode_bluetooth">Bluetooth</string>
+
+ <!-- post dial -->
+ <!-- In-call screen: body text of the dialog that appears when we encounter
+ the "wait" character in a phone number to be dialed; this dialog asks the
+ user if it's OK to send the numbers following the "wait". -->
+ <string name="wait_prompt_str">Send the following tones?\n</string>
+ <!-- In-call screen: body text of the dialog that appears when we encounter
+ the "PAUSE" character in a phone number to be dialed; this dialog gives
+ informative message to the user to show the sending numbers following the "Pause". -->
+ <string name="pause_prompt_str">Sending tones\n</string>
+ <!-- In-call screen: button label on the "wait" prompt dialog -->
+ <string name="send_button">Send</string>
+ <!-- In-call screen: button label on the "wait" prompt dialog in CDMA Mode-->
+ <string name="pause_prompt_yes">Yes</string>
+ <!-- In-call screen: button label on the "wait" prompt dialog in CDMA Mode-->
+ <string name="pause_prompt_no">No</string>
+ <!-- In-call screen: on the "wild" character dialog, this is the label
+ for a text widget that lets the user enter the digits that should
+ replace the "wild" character. -->
+ <string name="wild_prompt_str">Replace wild character with</string>
+
+ <!-- In-call screen: status label for a conference call -->
+ <string name="caller_manage_header">Conference call <xliff:g id="conf_call_time">%s</xliff:g></string>
+
+ <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
+ <string name="fake_phone_activity_phoneNumber_text" translatable="false">(650) 555-1234</string>
+ <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
+ <string name="fake_phone_activity_infoText_text" translatable="false">Incoming phone number</string>
+ <!-- Used in FakePhoneActivity test code. DO NOT TRANSLATE. -->
+ <string name="fake_phone_activity_placeCall_text" translatable="false">Fake Incoming Call</string>
+
+ <!-- Call settings screen, Set voicemail dialog title -->
+ <string name="voicemail_settings_number_label">Voicemail number</string>
+
+ <!-- Card titles -->
+ <!-- In-call screen: status label for a call in the "dialing" state [CHAR LIMIT=25] -->
+ <string name="card_title_dialing">Dialing</string>
+ <!-- In-call screen: status label for a re-dialing call [CHAR LIMIT=25] -->
+ <string name="card_title_redialing">Redialing</string>
+ <!-- In-call screen: status label for a conference call [CHAR LIMIT=25] -->
+ <string name="card_title_conf_call">Conference call</string>
+ <!-- In-call screen: status label for an incoming call [CHAR LIMIT=25] -->
+ <string name="card_title_incoming_call">Incoming call</string>
+ <!-- In-call screen: status label for an incoming work call [CHAR LIMIT=25] -->
+ <string name="card_title_incoming_work_call">Incoming work call</string>
+ <!-- In-call screen: status label displayed briefly after a call ends [CHAR LIMIT=25] -->
+ <string name="card_title_call_ended">Call ended</string>
+ <!-- In-call screen: status label for call that's on hold [CHAR LIMIT=25] -->
+ <string name="card_title_on_hold">On hold</string>
+ <!-- In-call screen: status label for a call that's in the process of hanging up [CHAR LIMIT=25] -->
+ <string name="card_title_hanging_up">Hanging up</string>
+ <!-- In-call screen: status label for a call that's in CDMA flash mode [CHAR LIMIT=25] -->
+ <string name="card_title_in_call">In call</string>
+ <!-- In-call screen: special status label that shows your own phone
+ number during emergency callback mode (ECM) [CHAR LIMIT=30] -->
+ <string name="card_title_my_phone_number">My number is <xliff:g id="my_phone_number">%s</xliff:g></string>
+ <!-- In-call screen: status label when connecting video. -->
+ <string name="card_title_video_call_connecting">Connecting video</string>
+ <!-- In-call screen: status label when in a video call. -->
+ <string name="card_title_video_call">Video call</string>
+ <!-- In-call screen: status label when requesting video. -->
+ <string name="card_title_video_call_requesting">Requesting video</string>
+ <!-- In-call screen: status label when there is a problem connecting a video call. -->
+ <string name="card_title_video_call_error">Can\'t connect video call</string>
+ <!-- In-call screen: status label when the remote party rejects a video call request. -->
+ <string name="card_title_video_call_rejected">Video request rejected</string>
+
+ <!-- In-call screen: string shown to the user when their outgoing number is different than the
+ number reported by TelephonyManager#getLine1Number() -->
+ <string name="card_title_callback_number">Your callback number\n
+ <xliff:g id="dark_number">%1$s</xliff:g>
+ </string>
+
+ <!-- In-call screen: string shown to the user when their outgoing number is different than the
+ number reported by TelephonyManager#getLine1Number() and they're calling emergency
+ services. -->
+ <string name="card_title_callback_number_emergency">Your emergency callback number\n
+ <xliff:g id="dark_number">%1$s</xliff:g>
+ </string>
+
+ <!-- Notification strings -->
+ <!-- The "label" of the in-call Notification for a dialing call, used
+ as the format string for a Chronometer widget. [CHAR LIMIT=60] -->
+ <string name="notification_dialing">Dialing</string>
+ <!-- Missed call notification label, used when there's exactly one missed call -->
+ <string name="notification_missedCallTitle">Missed call</string>
+ <!-- Missed call notification label, used when there are two or more missed calls -->
+ <string name="notification_missedCallsTitle">Missed calls</string>
+ <!-- Missed call notification message used when there are multiple missed calls -->
+ <string name="notification_missedCallsMsg"><xliff:g id="num_missed_calls">%s</xliff:g> missed calls</string>
+ <!-- Missed call notification message used for a single missed call, including
+ the caller-id info from the missed call -->
+ <string name="notification_missedCallTicker">Missed call from <xliff:g id="missed_call_from">%s</xliff:g></string>
+ <!-- The "label" of the in-call Notification for an ongoing call. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_call">Ongoing call</string>
+ <!-- The "label" of the in-call Notification for an ongoing work call. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_work_call">Ongoing work call</string>
+ <!-- The "label" of the in-call Notification for an ongoing call, which is being made over
+ Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_call_wifi">Ongoing Wi-Fi call</string>
+ <!-- The "label" of the in-call Notification for an ongoing work call, which is being made
+ over Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_ongoing_work_call_wifi">Ongoing Wi-Fi work call</string>
+ <!-- The "label" of the in-call Notification for a call that's on hold -->
+ <string name="notification_on_hold">On hold</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing call. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_call">Incoming call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing call. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_work_call">Incoming work call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing call,
+ which is being made over Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_call_wifi">Incoming Wi-Fi call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing work call,
+ which is being made over Wi-Fi. [CHAR LIMIT=60] -->
+ <string name="notification_incoming_work_call_wifi">Incoming Wi-Fi work call</string>
+ <!-- The "label" of the in-call Notification for an incoming ringing video call. -->
+ <string name="notification_incoming_video_call">Incoming video call</string>
+ <!-- The "label" of the in-call Notification for upgrading an existing call to a video call. -->
+ <string name="notification_requesting_video_call">Incoming video request</string>
+ <!-- Label for the "Voicemail" notification item, when expanded. -->
+ <string name="notification_voicemail_title">New voicemail</string>
+ <!-- Label for the expanded "Voicemail" notification item,
+ including a count of messages. -->
+ <string name="notification_voicemail_title_count">New voicemail (<xliff:g id="count">%d</xliff:g>)</string>
+ <!-- Message displayed in the "Voicemail" notification item, allowing the user
+ to dial the indicated number. -->
+ <string name="notification_voicemail_text_format">Dial <xliff:g id="voicemail_number">%s</xliff:g></string>
+ <!-- Message displayed in the "Voicemail" notification item,
+ indicating that there's no voicemail number available -->
+ <string name="notification_voicemail_no_vm_number">Voicemail number unknown</string>
+ <!-- Label for the "No service" notification item, when expanded. -->
+ <string name="notification_network_selection_title">No service</string>
+ <!-- Label for the expanded "No service" notification item, including the
+ operator name set by user -->
+ <string name="notification_network_selection_text">Selected network (<xliff:g id="operator_name">%s</xliff:g>) unavailable</string>
+ <!-- Label for the "Answer call" action. This is the displayed label for the action that answers
+ an incoming call. [CHAR LIMIT=12] -->
+ <string name="notification_action_answer">Answer</string>
+ <!-- Label for "end call" Action.
+ It is displayed in the "Ongoing call" notification, which is shown
+ when the user is outside the in-call screen while the phone call is still
+ active. [CHAR LIMIT=12] -->
+ <string name="notification_action_end_call">Hang up</string>
+ <!-- Label for "Video Call" notification action. This is a displayed on the notification for an
+ incoming video call, and answers the call as a video call. [CHAR LIMIT=12] -->
+ <string name="notification_action_answer_video">Video</string>
+ <!-- Label for "Voice" notification action. This is a displayed on the notification for an
+ incoming video call, and answers the call as an audio call. [CHAR LIMIT=12] -->
+ <string name="notification_action_answer_voice">Voice</string>
+ <!-- Label for "Accept" notification action. This is somewhat generic, and may refer to
+ scenarios such as accepting an incoming call or accepting a video call request.
+ [CHAR LIMIT=12] -->
+ <string name="notification_action_accept">Accept</string>
+ <!-- Label for "Dismiss" notification action. This is somewhat generic, and may refer to
+ scenarios such as declining an incoming call or declining a video call request.
+ [CHAR LIMIT=12] -->
+ <string name="notification_action_dismiss">Dismiss</string>
+
+ <!-- Message for "call back" Action, which is displayed in the missed call notification.
+ The user will be able to call back to the person or the phone number.
+ [CHAR LIMIT=12] -->
+ <string name="notification_missedCall_call_back">Call back</string>
+ <!-- Message for "reply via sms" action, which is displayed in the missed call notification.
+ The user will be able to send text messages using the phone number.
+ [CHAR LIMIT=12] -->
+ <string name="notification_missedCall_message">Message</string>
+
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_power_off">To place a call, first turn off Airplane mode.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog.
+ This string is currently unused (see comments in InCallActivity.java.) -->
+ <string name="incall_error_emergency_only">Not registered on network.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_out_of_service">Cellular network not available.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_no_phone_number_supplied">To place a call, enter a valid number.</string>
+ <!-- In-call screen: call failure message displayed in an error dialog -->
+ <string name="incall_error_call_failed">Can\'t call.</string>
+ <!-- In-call screen: status message displayed in a dialog when starting an MMI -->
+ <string name="incall_status_dialed_mmi">Starting MMI sequence\u2026</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_unknown">Service not supported.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_switch">Can\'t switch calls.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_separate">Can\'t separate call.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_transfer">Can\'t transfer.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_conference">Can\'t conference.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_reject">Can\'t reject call.</string>
+ <!-- In-call screen: message displayed in an error dialog -->
+ <string name="incall_error_supp_service_hangup">Can\'t release call(s).</string>
+
+ <!-- In-call screen: "call type" indication for a SIP call [CHAR LIMIT=30] -->
+ <string name="incall_call_type_label_sip">SIP call</string>
+
+ <!-- Dialog title for the "radio enable" UI for emergency calls -->
+ <string name="emergency_enable_radio_dialog_title">Emergency call</string>
+ <!-- Status message for the "radio enable" UI for emergency calls -->
+ <string name="emergency_enable_radio_dialog_message">Turning on radio\u2026</string>
+ <!-- Status message for the "radio enable" UI for emergency calls -->
+ <string name="emergency_enable_radio_dialog_retry">No service. Trying again\u2026</string>
+
+ <!-- Dialer text on Emergency Dialer -->
+ <!-- Emergency dialer: message displayed in an error dialog -->
+ <string name="dial_emergency_error">Can\'t call. <xliff:g id="non_emergency_number">%s</xliff:g> is not an emergency number.</string>
+ <!-- Emergency dialer: message displayed in an error dialog -->
+ <string name="dial_emergency_empty_error">Can\'t call. Dial an emergency number.</string>
+
+ <!-- Displayed in the text entry box in the dialer when in landscape mode to guide the user
+ to dial using the physical keyboard -->
+ <string name="dialerKeyboardHintText">Use keyboard to dial</string>
+
+ <!-- Text for the onscreen "Hold" button when it is not selected. Pressing it will put
+ the call on hold. -->
+ <string name="onscreenHoldText_unselected">Hold Call</string>
+ <!-- Text for the onscreen "Hold" button when it is selected. Pressing it will resume
+ the call from a previously held state. -->
+ <string name="onscreenHoldText_selected">Resume Call</string>
+ <!-- Text for the onscreen "End call" button -->
+ <string name="onscreenEndCallText">End Call</string>
+ <!-- Text for the onscreen "Show Dialpad" button when it is not selected. Pressing it will
+ show the dialpad. -->
+ <string name="onscreenShowDialpadText_unselected">Show Dialpad</string>
+ <!-- Text for the onscreen "Show Dialpad" button when it is selected. Pressing it will
+ hide the dialpad. -->
+ <string name="onscreenShowDialpadText_selected">Hide Dialpad</string>
+ <!-- Text for the onscreen "Mute" button when it is not selected. Pressing it will mute
+ the call. -->
+ <string name="onscreenMuteText_unselected">Mute</string>
+ <!-- Text for the onscreen "Mute" button when it is selected. Pressing it will unmute
+ the call. -->
+ <string name="onscreenMuteText_selected">Unmute</string>
+ <!-- Text for the onscreen "Add call" button -->
+ <string name="onscreenAddCallText">Add call</string>
+ <!-- Text for the onscreen "Merge calls" button -->
+ <string name="onscreenMergeCallsText">Merge calls</string>
+ <!-- Text for the onscreen "Swap calls" button -->
+ <string name="onscreenSwapCallsText">Swap</string>
+ <!-- Text for the onscreen "Manage calls" button -->
+ <string name="onscreenManageCallsText">Manage calls</string>
+ <!-- Text for the onscreen "Manage conference" button [CHAR LIMIT=30] -->
+ <string name="onscreenManageConferenceText">Manage conference call</string>
+ <!-- Text for the first half of the onscreen "Manage conference" button [CHAR LIMIT=30] -->
+ <string name="onscreenConferenceText">Conference call</string>
+ <!-- Text for the second half of the onscreen "Manage conference" button [CHAR LIMIT=30] -->
+ <string name="onscreenManageText">Manage</string>
+ <!-- Text for the onscreen "Audio" button that lets you switch
+ between speaker / bluetooth / earpiece [CHAR LIMIT=10] -->
+ <string name="onscreenAudioText">Audio</string>
+ <!-- Text for the onscreen "Video call" button used to change a voice call
+ to a video call. [CHAR LIMIT=10] -->
+ <string name="onscreenVideoCallText">Video call</string>
+ <!-- Text for the onscreen "Change to voice" button. When clicked, this downgrades a video call
+ to a voice call. -->
+ <string name="onscreenChangeToVoiceText">Change to voice call</string>
+ <!-- Text for the onscreen "Switch camera" button. When clicked, this switches the user's camera
+ for video calling between the front-facing camera and the back-facing camera. -->
+ <string name="onscreenSwitchCameraText">Switch camera</string>
+ <!-- Text for the onscreen "Pause video" button. -->
+ <string name="onscreenPauseVideoText">Pause video</string>
+ <!-- Text for the onscreen overflow button, to see additional actions which can be done. -->
+ <string name="onscreenOverflowText">More options</string>
+
+ <!-- Message indicating that Video Started flowing for IMS-VT calls -->
+ <string name="player_started">Player Started</string>
+ <!-- Message indicating that Video Stopped flowing for IMS-VT calls -->
+ <string name="player_stopped">Player Stopped</string>
+ <!-- Message indicating that camera failure has occurred for the selected camera and
+ as result camera is not ready -->
+ <string name="camera_not_ready">Camera not ready</string>
+ <!-- Message indicating that camera is ready/available -->
+ <string name="camera_ready">Camera ready</string>
+ <!-- Message indicating unknown call session event -->
+ <string name="unknown_call_session_event">"Unkown call session event"</string>
+
+ <!-- For incoming calls, this is a string we can get from a CDMA network instead of
+ the actual phone number, to indicate there's no number present. DO NOT TRANSLATE. -->
+ <string-array name="absent_num" translatable="false">
+ <item>ABSENT NUMBER</item>
+ <item>ABSENTNUMBER</item>
+ </string-array>
+
+ <!-- Preference for Voicemail service provider under "Voicemail" settings.
+ [CHAR LIMIT=40] -->
+ <string name="voicemail_provider">Service</string>
+
+ <!-- Preference for Voicemail setting of each provider.
+ [CHAR LIMIT=40] -->
+ <string name="voicemail_settings">Setup</string>
+
+ <!-- String to display in voicemail number summary when no voicemail num is set -->
+ <string name="voicemail_number_not_set">&lt;Not set&gt;</string>
+
+ <!-- Title displayed above settings coming after voicemail in the call features screen -->
+ <string name="other_settings">Other call settings</string>
+
+ <!-- Title displayed in the overlay for outgoing calls which include the name of the provider.
+ [CHAR LIMIT=40] -->
+ <string name="calling_via_template">Calling via <xliff:g id="provider_name">%s</xliff:g></string>
+ <!-- Title displayed in the overlay for incoming calls which include the name of the provider.
+ [CHAR LIMIT=40] -->
+ <string name="incoming_via_template">Incoming via <xliff:g id="provider_name">%s</xliff:g></string>
+
+ <!-- Use this as a default to describe the contact photo; currently for screen readers through accessibility. -->
+ <string name="contactPhoto">contact photo</string>
+ <!-- Use this to describe the separate conference call button; currently for screen readers through accessibility. -->
+ <string name="goPrivate">go private</string>
+ <!-- Use this to describe the select contact button in EditPhoneNumberPreference; currently for screen readers through accessibility. -->
+ <string name="selectContact">select contact</string>
+
+ <!-- "Respond via SMS" option that lets you compose a custom response. [CHAR LIMIT=30] -->
+ <string name="respond_via_sms_custom_message">Write your own...</string>
+ <!-- "Custom Message" Cancel alert dialog button -->
+ <string name="custom_message_cancel">Cancel</string>
+ <!-- "Custom Message" Send alert dialog button -->
+ <string name="custom_message_send">Send</string>
+
+ <!-- Description of the answer target in the Slide unlock screen of Phone. [CHAR LIMIT=NONE] -->
+ <string name="description_target_answer">Answer</string>
+ <!-- Description of the send_sms target in the Slide unlock screen of Phone. [CHAR LIMIT=NONE] -->
+ <string name="description_target_send_sms">Send SMS</string>
+ <!-- Description of the decline target in the Slide unlock screen. [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline">Decline</string>
+ <!-- Description of the target to answer a call as a video call in the Slide unlock screen.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_answer_video_call">Answer as video call</string>
+ <!-- Description of the target to answer a call as an audio call in the Slide unlock screen.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_answer_audio_call">Answer as audio call</string>
+ <!-- Description of the target to accept a request to upgrade from an audio call to a video call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_accept_upgrade_to_video_request">Accept video request</string>
+ <!-- Description of the target to decline a request to upgrade from an audio call to a video call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline_upgrade_to_video_request">Decline video request</string>
+ <!-- Description of the target to accept a request to upgrade from any call to a video transmit call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_accept_upgrade_to_video_transmit_request">Accept video transmit request</string>
+ <!-- Description of the target to decline a request to upgrade from any call to a video transmit call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline_upgrade_to_video_transmit_request">Decline video transmit request</string>
+ <!-- Description of the target to accept a request to upgrade from any call to a video receive call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_accept_upgrade_to_video_receive_request">Accept video receive request</string>
+ <!-- Description of the target to decline a request to upgrade from any call to a video receive call.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_target_decline_upgrade_to_video_receive_request">Decline video receive request</string>
+
+ <!-- Description of the up direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_up">Slide up for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+ <!-- Description of the left direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_left">"Slide left for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+ <!-- Description of the right direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_right">Slide right for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+ <!-- Description of the down direction in which one can to slide the handle in the phone answer screen. [CHAR LIMIT=NONE] -->
+ <string name="description_direction_down">Slide down for <xliff:g id="target_description" example="Unlock">%s</xliff:g>.</string>
+
+ <!-- Dialog title for the vibration settings for voicemail notifications [CHAR LIMIT=40] -->
+ <string name="voicemail_notification_vibrate_when_title" msgid="8731372580674292759">Vibrate</string>
+ <!-- Dialog title for the vibration settings for voice mail notifications [CHAR LIMIT=40]-->
+ <string name="voicemail_notification_vibarte_when_dialog_title" msgid="8995274609647451109">Vibrate</string>
+
+ <!-- Voicemail ringtone title. The user clicks on this preference to select
+ which sound to play when a voicemail notification is received.
+ [CHAR LIMIT=30] -->
+ <string name="voicemail_notification_ringtone_title">Sound</string>
+
+ <!-- The string used to describe a notification if it is the default one in the system. For
+ example, if the user selects the default notification, it will appear as something like
+ Default sound(Capella) in the notification summary.
+ [CHAR LIMIT=40] -->
+ <string name="default_notification_description">Default sound (<xliff:g id="default_sound_title">%1$s</xliff:g>)</string>
+
+ <!-- The default value value for voicemail notification. -->
+ <string name="voicemail_notification_vibrate_when_default" translatable="false">never</string>
+
+ <!-- Actual values used in our code for voicemail notifications. DO NOT TRANSLATE -->
+ <string-array name="voicemail_notification_vibrate_when_values" translatable="false">
+ <item>always</item>
+ <item>silent</item>
+ <item>never</item>
+ </string-array>
+
+ <!-- Setting option name to pick ringtone (a list dialog comes up). [CHAR LIMIT=30] -->
+ <string name="ringtone_title" msgid="5379026328015343686">Phone ringtone</string>
+
+ <!-- Setting option name to enable or disable vibration when ringing
+ the phone.
+ [CHAR LIMIT=30] -->
+ <string name="vibrate_on_ring_title">Vibrate when ringing</string>
+
+ <!-- Title for the category "ringtone", which is shown above ringtone and vibration
+ related settings.
+ [CHAR LIMIT=30] -->
+ <string name="preference_category_ringtone">Ringtone &amp; Vibrate</string>
+
+ <!-- Label for "Manage conference call" panel [CHAR LIMIT=40] -->
+ <string name="manageConferenceLabel">Manage conference call</string>
+
+ <!-- This can be used in any application wanting to disable the text "Emergency number" -->
+ <string name="emergency_call_dialog_number_for_display">Emergency number</string>
+
+ <!-- Phrase describing a time duration using seconds [CHAR LIMIT=16] -->
+ <plurals name="duration_seconds">
+ <item quantity="one">1 second</item>
+ <item quantity="other"><xliff:g id="count">%d</xliff:g> seconds</item>
+ </plurals>
+ <!-- Phrase describing a time duration using minutes [CHAR LIMIT=16] -->
+ <plurals name="duration_minutes">
+ <item quantity="one">1 minute</item>
+ <item quantity="other"><xliff:g id="count">%d</xliff:g> minutes</item>
+ </plurals>
+ <!-- Phrase describing a time duration using hours [CHAR LIMIT=16] -->
+ <plurals name="duration_hours">
+ <item quantity="one">1 hour</item>
+ <item quantity="other"><xliff:g id="count">%d</xliff:g> hours</item>
+ </plurals>
+
+ <!-- Description of the profile photo shown when the device's camera is disabled udring a video
+ call. [CHAR LIMIT=NONE] -->
+ <string name="profile_photo_description">Profile photo</string>
+
+ <!-- Description of the "camera off" icon displayed when the device's camera is disabled during
+ a video call. [CHAR LIMIT=NONE] -->
+ <string name="camera_off_description">Camera off</string>
+
+ <!-- Used to inform the user that a call was received via a number other than the primary
+ phone number associated with their device. [CHAR LIMIT=16] -->
+ <string name="child_number">via <xliff:g id="child_number" example="650-555-1212">%s</xliff:g></string>
+
+ <!-- Used to inform the user that the note associated with an outgoing call has been sent.
+ [CHAR LIMIT=32] -->
+ <string name="note_sent">Note sent</string>
+
+ <!-- Title for the call context with a person-type contact. [CHAR LIMIT=40] -->
+ <string name="person_contact_context_title">Recent messages</string>
+
+ <!-- Title for the call context with a business-type contact. [CHAR LIMIT=40] -->
+ <string name="business_contact_context_title">Business info</string>
+
+ <!-- Distance strings for business caller ID context. -->
+
+ <!-- Used to inform the user how far away a location is in miles. [CHAR LIMIT=NONE] -->
+ <string name="distance_imperial_away"><xliff:g id="distance">%.1f</xliff:g> mi away</string>
+ <!-- Used to inform the user how far away a location is in kilometers. [CHAR LIMIT=NONE] -->
+ <string name="distance_metric_away"><xliff:g id="distance">%.1f</xliff:g> km away</string>
+ <!-- A shortened way to display a business address. Formatted [street address], [city/locality]. -->
+ <string name="display_address"><xliff:g id="street_address">%1$s</xliff:g>, <xliff:g id="locality">%2$s</xliff:g></string>
+ <!-- Used to indicate hours of operation for a location as a time span. e.g. "11 am - 9 pm" [CHAR LIMIT=NONE] -->
+ <string name="open_time_span"><xliff:g id="open_time">%1$s</xliff:g> - <xliff:g id="close_time">%2$s</xliff:g></string>
+ <!-- Used to indicate a series of opening hours for a location.
+ This first argument may be one or more time spans. e.g. "11 am - 9 pm, 9 pm - 11 pm"
+ The second argument is an additional time span. e.g. "11 pm - 1 am"
+ The string is used to build a list of opening hours.
+ [CHAR LIMIT=NONE] -->
+ <string name="opening_hours"><xliff:g id="earlier_times">%1$s</xliff:g>, <xliff:g id="later_time">%2$s</xliff:g></string>
+ <!-- Used to express when a location will open the next day. [CHAR LIMIT=NONE] -->
+ <string name="opens_tomorrow_at">Opens tomorrow at <xliff:g id="open_time">%s</xliff:g></string>
+ <!-- Used to express the next time at which a location will be open today. [CHAR LIMIT=NONE] -->
+ <string name="opens_today_at">Opens today at <xliff:g id="open_time">%s</xliff:g></string>
+ <!-- Used to express the next time at which a location will close today. [CHAR LIMIT=NONE] -->
+ <string name="closes_today_at">Closes at <xliff:g id="close_time">%s</xliff:g></string>
+ <!-- Used to express the next time at which a location closed today if it is already closed. [CHAR LIMIT=NONE] -->
+ <string name="closed_today_at">Closed today at <xliff:g id="close_time">%s</xliff:g></string>
+ <!-- Displayed when a place is open. -->
+ <string name="open_now">Open now</string>
+ <!-- Displayed when a place is closed. -->
+ <string name="closed_now">Closed now</string>
+</resources>
diff --git a/InCallUI/res/values/styles.xml b/InCallUI/res/values/styles.xml
new file mode 100644
index 000000000..11d636261
--- /dev/null
+++ b/InCallUI/res/values/styles.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2013 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources>
+ <drawable name="grayBg">#FF333333</drawable>
+
+ <style name="info_label">
+ <item name="android:layout_height">wrap_content</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:textAppearance">@style/TextAppearance.info_label</item>
+ <item name="android:paddingEnd">4dip</item>
+ </style>
+
+ <style name="info_layout">
+ <item name="android:orientation">vertical</item>
+ <item name="android:paddingStart">10dip</item>
+ <item name="android:paddingTop">10dip</item>
+ <item name="android:paddingEnd">10dip</item>
+ <item name="android:paddingBottom">10dip</item>
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">match_parent</item>
+ </style>
+
+ <style name="entry_layout">
+ <item name="android:orientation">vertical</item>
+ <item name="android:layout_width">wrap_content</item>
+ <item name="android:layout_height">wrap_content</item>
+ </style>
+
+ <style name="TextAppearance" parent="android:TextAppearance">
+ </style>
+
+ <style name="TextAppearance.info_label">
+ <item name="android:textSize">14sp</item>
+ <item name="android:textStyle">bold</item>
+ </style>
+
+
+ <!-- Buttons in the main "button row" of the in-call onscreen touch UI. -->
+ <style name="InCallButton">
+ <item name="android:layout_width">@dimen/in_call_button_dimension</item>
+ <item name="android:layout_height">@dimen/in_call_button_dimension</item>
+ <item name="android:layout_marginBottom">@dimen/call_button_margin_vertical</item>
+ <item name="android:layout_marginLeft">@dimen/call_button_margin_horizontal</item>
+ <item name="android:layout_marginRight">@dimen/call_button_margin_horizontal</item>
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ </style>
+
+ <!-- "Compound button" variation of InCallButton.
+ These buttons have the concept of two states: checked and unchecked. This style is just
+ like "InCallButton" except that we also clear out android:background, android:textOn,
+ android:textOff, to avoid the default behavior of the ToggleButton class. -->
+ <style name="InCallCompoundButton" parent="InCallButton">
+ <item name="android:background">@null</item>
+ <item name="android:textOn">@null</item>
+ <item name="android:textOff">@null</item>
+ </style>
+
+ <!-- Theme for the InCallActivity activity. Should have a transparent background for the
+ circular reveal animation for a new outgoing call to work correctly. We don't just use
+ Theme.Black.NoTitleBar directly, since we want any popups or dialogs from the
+ InCallActivity to have the correct Material style. -->
+ <style name="Theme.InCallScreen" parent="@android:style/Theme.Material.Light">
+ <item name="android:windowAnimationStyle">@null</item>
+ <item name="android:windowIsTranslucent">true</item>
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="dialpad_key_button_touch_tint">@color/incall_dialpad_touch_tint</item>
+ <item name="android:textColorPrimary">@color/incall_call_banner_text_color</item>
+ <item name="android:colorPrimaryDark">@color/dialer_theme_color_dark</item>
+ <item name="android:popupMenuStyle">@style/InCallPopupMenuStyle</item>
+ <item name="android:actionBarStyle">@style/InCallActionBarStyle</item>
+ <item name="android:buttonStyleToggle">@style/InCallCompoundButton</item>
+ <item name="android:alertDialogTheme">@android:style/Theme.Material.Light.Dialog.Alert</item>
+ </style>
+
+ <style name="InCallPopupMenuStyle" parent="@android:style/Theme.Material.Light">
+ <item name="android:textColorPrimary">@color/popup_menu_color</item>
+ </style>
+
+ <style name="InCallActionBarStyle" parent="@android:style/Widget.Material.Light.ActionBar">
+ <item name="android:background">@color/incall_action_bar_background_color</item>
+ <item name="android:textColor">@color/incall_action_bar_text_color</item>
+ </style>
+
+</resources>
diff --git a/InCallUI/src/com/android/incallui/AccelerometerListener.java b/InCallUI/src/com/android/incallui/AccelerometerListener.java
new file mode 100644
index 000000000..b5ad29675
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AccelerometerListener.java
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+/**
+ * This class is used to listen to the accelerometer to monitor the
+ * orientation of the phone. The client of this class is notified when
+ * the orientation changes between horizontal and vertical.
+ */
+public class AccelerometerListener {
+ private static final String TAG = "AccelerometerListener";
+ private static final boolean DEBUG = true;
+ private static final boolean VDEBUG = false;
+
+ private SensorManager mSensorManager;
+ private Sensor mSensor;
+
+ // mOrientation is the orientation value most recently reported to the client.
+ private int mOrientation;
+
+ // mPendingOrientation is the latest orientation computed based on the sensor value.
+ // This is sent to the client after a rebounce delay, at which point it is copied to
+ // mOrientation.
+ private int mPendingOrientation;
+
+ private OrientationListener mListener;
+
+ // Device orientation
+ public static final int ORIENTATION_UNKNOWN = 0;
+ public static final int ORIENTATION_VERTICAL = 1;
+ public static final int ORIENTATION_HORIZONTAL = 2;
+
+ private static final int ORIENTATION_CHANGED = 1234;
+
+ private static final int VERTICAL_DEBOUNCE = 100;
+ private static final int HORIZONTAL_DEBOUNCE = 500;
+ private static final double VERTICAL_ANGLE = 50.0;
+
+ public interface OrientationListener {
+ public void orientationChanged(int orientation);
+ }
+
+ public AccelerometerListener(Context context) {
+ mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
+ mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
+ }
+
+ public void setListener(OrientationListener listener) {
+ mListener = listener;
+ }
+
+ public void enable(boolean enable) {
+ if (DEBUG) Log.d(TAG, "enable(" + enable + ")");
+ synchronized (this) {
+ if (enable) {
+ mOrientation = ORIENTATION_UNKNOWN;
+ mPendingOrientation = ORIENTATION_UNKNOWN;
+ mSensorManager.registerListener(mSensorListener, mSensor,
+ SensorManager.SENSOR_DELAY_NORMAL);
+ } else {
+ mSensorManager.unregisterListener(mSensorListener);
+ mHandler.removeMessages(ORIENTATION_CHANGED);
+ }
+ }
+ }
+
+ private void setOrientation(int orientation) {
+ synchronized (this) {
+ if (mPendingOrientation == orientation) {
+ // Pending orientation has not changed, so do nothing.
+ return;
+ }
+
+ // Cancel any pending messages.
+ // We will either start a new timer or cancel alltogether
+ // if the orientation has not changed.
+ mHandler.removeMessages(ORIENTATION_CHANGED);
+
+ if (mOrientation != orientation) {
+ // Set timer to send an event if the orientation has changed since its
+ // previously reported value.
+ mPendingOrientation = orientation;
+ final Message m = mHandler.obtainMessage(ORIENTATION_CHANGED);
+ // set delay to our debounce timeout
+ int delay = (orientation == ORIENTATION_VERTICAL ? VERTICAL_DEBOUNCE
+ : HORIZONTAL_DEBOUNCE);
+ mHandler.sendMessageDelayed(m, delay);
+ } else {
+ // no message is pending
+ mPendingOrientation = ORIENTATION_UNKNOWN;
+ }
+ }
+ }
+
+ private void onSensorEvent(double x, double y, double z) {
+ if (VDEBUG) Log.d(TAG, "onSensorEvent(" + x + ", " + y + ", " + z + ")");
+
+ // If some values are exactly zero, then likely the sensor is not powered up yet.
+ // ignore these events to avoid false horizontal positives.
+ if (x == 0.0 || y == 0.0 || z == 0.0) return;
+
+ // magnitude of the acceleration vector projected onto XY plane
+ final double xy = Math.hypot(x, y);
+ // compute the vertical angle
+ double angle = Math.atan2(xy, z);
+ // convert to degrees
+ angle = angle * 180.0 / Math.PI;
+ final int orientation = (angle > VERTICAL_ANGLE ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL);
+ if (VDEBUG) Log.d(TAG, "angle: " + angle + " orientation: " + orientation);
+ setOrientation(orientation);
+ }
+
+ SensorEventListener mSensorListener = new SensorEventListener() {
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ onSensorEvent(event.values[0], event.values[1], event.values[2]);
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // ignore
+ }
+ };
+
+ Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case ORIENTATION_CHANGED:
+ synchronized (this) {
+ mOrientation = mPendingOrientation;
+ if (DEBUG) {
+ Log.d(TAG, "orientation: " +
+ (mOrientation == ORIENTATION_HORIZONTAL ? "horizontal"
+ : (mOrientation == ORIENTATION_VERTICAL ? "vertical"
+ : "unknown")));
+ }
+ if (mListener != null) {
+ mListener.orientationChanged(mOrientation);
+ }
+ }
+ break;
+ }
+ }
+ };
+}
diff --git a/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java b/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java
new file mode 100644
index 000000000..89c78ec61
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+import android.telecom.VideoProfile;
+import android.view.GestureDetector;
+import android.view.GestureDetector.SimpleOnGestureListener;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.dialer.R;
+
+/**
+ * AnswerFragment to use when touch exploration is enabled in accessibility.
+ */
+public class AccessibleAnswerFragment extends AnswerFragment {
+
+ private static final String TAG = AccessibleAnswerFragment.class.getSimpleName();
+ private static final int SWIPE_THRESHOLD = 100;
+
+ private View mAnswer;
+ private View mDecline;
+ private View mText;
+
+ private TouchListener mTouchListener;
+ private GestureDetector mGestureDetector;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ ViewGroup group = (ViewGroup) inflater.inflate(R.layout.accessible_answer_fragment,
+ container, false);
+
+ mTouchListener = new TouchListener();
+ mGestureDetector = new GestureDetector(getContext(), new SimpleOnGestureListener() {
+ @Override
+ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ float velocityY) {
+ return AccessibleAnswerFragment.this.onFling(e1, e2, velocityX, velocityX);
+ }
+ });
+
+ mAnswer = group.findViewById(R.id.accessible_answer_fragment_answer);
+ mAnswer.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "Answer Button Clicked");
+ onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext());
+ }
+ });
+ mDecline = group.findViewById(R.id.accessible_answer_fragment_decline);
+ mDecline.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "Decline Button Clicked");
+ onDecline(getContext());
+ }
+ });
+
+ mText = group.findViewById(R.id.accessible_answer_fragment_text);
+ mText.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Log.d(TAG, "Text Button Clicked");
+ onText();
+ }
+ });
+ return group;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // Intercept all touch events for full screen swiping gesture.
+ InCallActivity activity = (InCallActivity) getActivity();
+ activity.setDispatchTouchEventListener(mTouchListener);
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ InCallActivity activity = (InCallActivity) getActivity();
+ activity.setDispatchTouchEventListener(null);
+ }
+
+ private class TouchListener implements View.OnTouchListener {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ return mGestureDetector.onTouchEvent(event);
+ }
+ }
+
+ private boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
+ float velocityY) {
+ if (hasPendingDialogs()) {
+ return false;
+ }
+
+ float diffY = e2.getY() - e1.getY();
+ float diffX = e2.getX() - e1.getX();
+ if (Math.abs(diffX) > Math.abs(diffY)) {
+ if (Math.abs(diffX) > SWIPE_THRESHOLD) {
+ if (diffX > 0) {
+ onSwipeRight();
+ } else {
+ onSwipeLeft();
+ }
+ }
+ return true;
+ } else if (Math.abs(diffY) > SWIPE_THRESHOLD) {
+ if (diffY > 0) {
+ onSwipeDown();
+ } else {
+ onSwipeUp();
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ private void onSwipeUp() {
+ Log.d(TAG, "onSwipeUp");
+ onText();
+ }
+
+ private void onSwipeDown() {
+ Log.d(TAG, "onSwipeDown");
+ }
+
+ private void onSwipeLeft() {
+ Log.d(TAG, "onSwipeLeft");
+ onDecline(getContext());
+ }
+
+ private void onSwipeRight() {
+ Log.d(TAG, "onSwipeRight");
+ onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext());
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
new file mode 100644
index 000000000..44ddfcd49
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ListView;
+
+import com.android.dialer.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Provides only common interface and functions. Should be derived to implement the actual UI.
+ */
+public abstract class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresenter.AnswerUi>
+ implements AnswerPresenter.AnswerUi {
+
+ public static final int TARGET_SET_FOR_AUDIO_WITHOUT_SMS = 0;
+ public static final int TARGET_SET_FOR_AUDIO_WITH_SMS = 1;
+ public static final int TARGET_SET_FOR_VIDEO_WITHOUT_SMS = 2;
+ public static final int TARGET_SET_FOR_VIDEO_WITH_SMS = 3;
+ public static final int TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST = 4;
+
+ /**
+ * This fragment implement no UI at all. Derived class should do it.
+ */
+ @Override
+ public abstract View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState);
+
+ /**
+ * The popup showing the list of canned responses.
+ *
+ * This is an AlertDialog containing a ListView showing the possible choices. This may be null
+ * if the InCallScreen hasn't ever called showRespondViaSmsPopup() yet, or if the popup was
+ * visible once but then got dismissed.
+ */
+ private Dialog mCannedResponsePopup = null;
+
+ /**
+ * The popup showing a text field for users to type in their custom message.
+ */
+ private AlertDialog mCustomMessagePopup = null;
+
+ private ArrayAdapter<String> mSmsResponsesAdapter;
+
+ private final List<String> mSmsResponses = new ArrayList<>();
+
+ @Override
+ public AnswerPresenter createPresenter() {
+ return InCallPresenter.getInstance().getAnswerPresenter();
+ }
+
+ @Override
+ public AnswerPresenter.AnswerUi getUi() {
+ return this;
+ }
+
+ @Override
+ public void showMessageDialog() {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+
+ mSmsResponsesAdapter = new ArrayAdapter<>(builder.getContext(),
+ android.R.layout.simple_list_item_1, android.R.id.text1, mSmsResponses);
+
+ final ListView lv = new ListView(getActivity());
+ lv.setAdapter(mSmsResponsesAdapter);
+ lv.setOnItemClickListener(new RespondViaSmsItemClickListener());
+
+ builder.setCancelable(true).setView(lv).setOnCancelListener(
+ new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialogInterface) {
+ onMessageDialogCancel();
+ dismissCannedResponsePopup();
+ getPresenter().onDismissDialog();
+ }
+ });
+ mCannedResponsePopup = builder.create();
+ mCannedResponsePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ mCannedResponsePopup.show();
+ }
+
+ private boolean isCannedResponsePopupShowing() {
+ if (mCannedResponsePopup != null) {
+ return mCannedResponsePopup.isShowing();
+ }
+ return false;
+ }
+
+ private boolean isCustomMessagePopupShowing() {
+ if (mCustomMessagePopup != null) {
+ return mCustomMessagePopup.isShowing();
+ }
+ return false;
+ }
+
+ /**
+ * Dismiss the canned response list popup.
+ *
+ * This is safe to call even if the popup is already dismissed, and even if you never called
+ * showRespondViaSmsPopup() in the first place.
+ */
+ protected void dismissCannedResponsePopup() {
+ if (mCannedResponsePopup != null) {
+ mCannedResponsePopup.dismiss(); // safe even if already dismissed
+ mCannedResponsePopup = null;
+ }
+ }
+
+ /**
+ * Dismiss the custom compose message popup.
+ */
+ private void dismissCustomMessagePopup() {
+ if (mCustomMessagePopup != null) {
+ mCustomMessagePopup.dismiss();
+ mCustomMessagePopup = null;
+ }
+ }
+
+ public void dismissPendingDialogs() {
+ if (isCannedResponsePopupShowing()) {
+ dismissCannedResponsePopup();
+ }
+
+ if (isCustomMessagePopupShowing()) {
+ dismissCustomMessagePopup();
+ }
+ }
+
+ public boolean hasPendingDialogs() {
+ return !(mCannedResponsePopup == null && mCustomMessagePopup == null);
+ }
+
+ /**
+ * Shows the custom message entry dialog.
+ */
+ public void showCustomMessageDialog() {
+ // Create an alert dialog containing an EditText
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ final EditText et = new EditText(builder.getContext());
+ builder.setCancelable(true).setView(et)
+ .setPositiveButton(R.string.custom_message_send,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // The order is arranged in a way that the popup will be destroyed
+ // when the InCallActivity is about to finish.
+ final String textMessage = et.getText().toString().trim();
+ dismissCustomMessagePopup();
+ getPresenter().rejectCallWithMessage(textMessage);
+ }
+ })
+ .setNegativeButton(R.string.custom_message_cancel,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dismissCustomMessagePopup();
+ getPresenter().onDismissDialog();
+ }
+ })
+ .setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialogInterface) {
+ dismissCustomMessagePopup();
+ getPresenter().onDismissDialog();
+ }
+ })
+ .setTitle(R.string.respond_via_sms_custom_message);
+ mCustomMessagePopup = builder.create();
+
+ // Enable/disable the send button based on whether there is a message in the EditText
+ et.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ final Button sendButton = mCustomMessagePopup.getButton(
+ DialogInterface.BUTTON_POSITIVE);
+ sendButton.setEnabled(s != null && s.toString().trim().length() != 0);
+ }
+ });
+
+ // Keyboard up, show the dialog
+ mCustomMessagePopup.getWindow().setSoftInputMode(
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+ mCustomMessagePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
+ mCustomMessagePopup.show();
+
+ // Send button starts out disabled
+ final Button sendButton = mCustomMessagePopup.getButton(DialogInterface.BUTTON_POSITIVE);
+ sendButton.setEnabled(false);
+ }
+
+ @Override
+ public void configureMessageDialog(List<String> textResponses) {
+ mSmsResponses.clear();
+ mSmsResponses.addAll(textResponses);
+ mSmsResponses.add(getResources().getString(
+ R.string.respond_via_sms_custom_message));
+ if (mSmsResponsesAdapter != null) {
+ mSmsResponsesAdapter.notifyDataSetChanged();
+ }
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ public void onAnswer(int videoState, Context context) {
+ Log.d(this, "onAnswer videoState=" + videoState + " context=" + context);
+ getPresenter().onAnswer(videoState, context);
+ }
+
+ public void onDecline(Context context) {
+ getPresenter().onDecline(context);
+ }
+
+ public void onDeclineUpgradeRequest(Context context) {
+ InCallPresenter.getInstance().declineUpgradeRequest(context);
+ }
+
+ public void onText() {
+ getPresenter().onText();
+ }
+
+ /**
+ * OnItemClickListener for the "Respond via SMS" popup.
+ */
+ public class RespondViaSmsItemClickListener implements AdapterView.OnItemClickListener {
+
+ /**
+ * Handles the user selecting an item from the popup.
+ */
+ @Override
+ public void onItemClick(AdapterView<?> parent, // The ListView
+ View view, // The TextView that was clicked
+ int position, long id) {
+ Log.d(this, "RespondViaSmsItemClickListener.onItemClick(" + position + ")...");
+ final String message = (String) parent.getItemAtPosition(position);
+ Log.v(this, "- message: '" + message + "'");
+ dismissCannedResponsePopup();
+
+ // The "Custom" choice is a special case.
+ // (For now, it's guaranteed to be the last item.)
+ if (position == (parent.getCount() - 1)) {
+ // Show the custom message dialog
+ showCustomMessageDialog();
+ } else {
+ getPresenter().rejectCallWithMessage(message);
+ }
+ }
+ }
+
+ public void onShowAnswerUi(boolean shown) {
+ // Do Nothing
+ }
+
+ public void showTargets(int targetSet) {
+ // Do Nothing
+ }
+
+ public void showTargets(int targetSet, int videoState) {
+ // Do Nothing
+ }
+
+ protected void onMessageDialogCancel() {
+ // Do nothing.
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
new file mode 100644
index 000000000..6757268f3
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+
+import com.android.dialer.compat.UserManagerCompat;
+import com.android.dialer.util.TelecomUtil;
+import com.android.incallui.InCallPresenter.InCallState;
+
+import java.util.List;
+
+/**
+ * Presenter for the Incoming call widget. The {@link AnswerPresenter} handles the logic during
+ * incoming calls. It is also in charge of responding to incoming calls, so there needs to be
+ * an instance alive so that it can receive onIncomingCall callbacks.
+ *
+ * An instance of {@link AnswerPresenter} is created by InCallPresenter at startup, registers
+ * for callbacks via InCallPresenter, and shows/hides the {@link AnswerFragment} via IncallActivity.
+ *
+ */
+public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
+ implements CallList.CallUpdateListener, InCallPresenter.InCallUiListener,
+ InCallPresenter.IncomingCallListener,
+ CallList.Listener {
+
+ private static final String TAG = AnswerPresenter.class.getSimpleName();
+
+ private String mCallId;
+ private Call mCall = null;
+ private boolean mHasTextMessages = false;
+
+ @Override
+ public void onUiShowing(boolean showing) {
+ if (showing) {
+ CallList.getInstance().addListener(this);
+ final CallList calls = CallList.getInstance();
+ Call call;
+ call = calls.getIncomingCall();
+ if (call != null) {
+ processIncomingCall(call);
+ }
+ call = calls.getVideoUpgradeRequestCall();
+ Log.d(this, "getVideoUpgradeRequestCall call =" + call);
+ if (call != null) {
+ showAnswerUi(true);
+ processVideoUpgradeRequestCall(call);
+ }
+ } else {
+ CallList.getInstance().removeListener(this);
+ // This is necessary because the activity can be destroyed while an incoming call exists.
+ // This happens when back button is pressed while incoming call is still being shown.
+ if (mCallId != null) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+ }
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ Log.d(this, "onIncomingCall: " + this);
+ Call modifyCall = CallList.getInstance().getVideoUpgradeRequestCall();
+ if (modifyCall != null) {
+ showAnswerUi(false);
+ Log.d(this, "declining upgrade request id: ");
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ InCallPresenter.getInstance().declineUpgradeRequest();
+ }
+ if (!call.getId().equals(mCallId)) {
+ // A new call is coming in.
+ processIncomingCall(call);
+ }
+ }
+
+ @Override
+ public void onIncomingCall(Call call) {
+ }
+
+ @Override
+ public void onCallListChange(CallList list) {
+ }
+
+ @Override
+ public void onDisconnect(Call call) {
+ // no-op
+ }
+
+ public void onSessionModificationStateChange(int sessionModificationState) {
+ boolean isUpgradePending = sessionModificationState ==
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+
+ if (!isUpgradePending) {
+ // Stop listening for updates.
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ showAnswerUi(false);
+ }
+ }
+
+ @Override
+ public void onLastForwardedNumberChange() {
+ // no-op
+ }
+
+ @Override
+ public void onChildNumberChange() {
+ // no-op
+ }
+
+ private boolean isVideoUpgradePending(Call call) {
+ return call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+ }
+
+ @Override
+ public void onUpgradeToVideo(Call call) {
+ Log.d(this, "onUpgradeToVideo: " + this + " call=" + call);
+ if (getUi() == null) {
+ Log.d(this, "onUpgradeToVideo ui is null");
+ return;
+ }
+ boolean isUpgradePending = isVideoUpgradePending(call);
+ InCallPresenter inCallPresenter = InCallPresenter.getInstance();
+ if (isUpgradePending
+ && inCallPresenter.getInCallState() == InCallPresenter.InCallState.INCOMING) {
+ Log.d(this, "declining upgrade request");
+ //If there is incoming call reject upgrade request
+ inCallPresenter.declineUpgradeRequest(getUi().getContext());
+ } else if (isUpgradePending) {
+ Log.d(this, "process upgrade request as no MT call");
+ processVideoUpgradeRequestCall(call);
+ }
+ }
+
+ private void processIncomingCall(Call call) {
+ mCallId = call.getId();
+ mCall = call;
+
+ // Listen for call updates for the current call.
+ CallList.getInstance().addCallUpdateListener(mCallId, this);
+
+ Log.d(TAG, "Showing incoming for call id: " + mCallId + " " + this);
+ if (showAnswerUi(true)) {
+ final List<String> textMsgs = CallList.getInstance().getTextResponses(call.getId());
+ configureAnswerTargetsForSms(call, textMsgs);
+ }
+ }
+
+ private boolean showAnswerUi(boolean show) {
+ final InCallActivity activity = InCallPresenter.getInstance().getActivity();
+ if (activity != null) {
+ activity.showAnswerFragment(show);
+ if (getUi() != null) {
+ getUi().onShowAnswerUi(show);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private void processVideoUpgradeRequestCall(Call call) {
+ Log.d(this, " processVideoUpgradeRequestCall call=" + call);
+ mCallId = call.getId();
+ mCall = call;
+
+ // Listen for call updates for the current call.
+ CallList.getInstance().addCallUpdateListener(mCallId, this);
+
+ final int currentVideoState = call.getVideoState();
+ final int modifyToVideoState = call.getRequestedVideoState();
+
+ if (currentVideoState == modifyToVideoState) {
+ Log.w(this, "processVideoUpgradeRequestCall: Video states are same. Return.");
+ return;
+ }
+
+ AnswerUi ui = getUi();
+
+ if (ui == null) {
+ Log.e(this, "Ui is null. Can't process upgrade request");
+ return;
+ }
+ showAnswerUi(true);
+ ui.showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST,
+ modifyToVideoState);
+ }
+
+ private boolean isEnabled(int videoState, int mask) {
+ return (videoState & mask) == mask;
+ }
+
+ @Override
+ public void onCallChanged(Call call) {
+ Log.d(this, "onCallStateChange() " + call + " " + this);
+ if (call.getState() != Call.State.INCOMING) {
+ boolean isUpgradePending = isVideoUpgradePending(call);
+ if (!isUpgradePending) {
+ // Stop listening for updates.
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+
+ final Call incall = CallList.getInstance().getIncomingCall();
+ if (incall != null || isUpgradePending) {
+ showAnswerUi(true);
+ } else {
+ showAnswerUi(false);
+ }
+
+ mHasTextMessages = false;
+ } else if (!mHasTextMessages) {
+ final List<String> textMsgs = CallList.getInstance().getTextResponses(call.getId());
+ if (textMsgs != null) {
+ configureAnswerTargetsForSms(call, textMsgs);
+ }
+ }
+ }
+
+ public void onAnswer(int videoState, Context context) {
+ if (mCallId == null) {
+ return;
+ }
+
+ if (mCall.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ Log.d(this, "onAnswer (upgradeCall) mCallId=" + mCallId + " videoState=" + videoState);
+ InCallPresenter.getInstance().acceptUpgradeRequest(videoState, context);
+ } else {
+ Log.d(this, "onAnswer (answerCall) mCallId=" + mCallId + " videoState=" + videoState);
+ TelecomAdapter.getInstance().answerCall(mCall.getId(), videoState);
+ }
+ }
+
+ /**
+ * TODO: We are using reject and decline interchangeably. We should settle on
+ * reject since it seems to be more prevalent.
+ */
+ public void onDecline(Context context) {
+ Log.d(this, "onDecline " + mCallId);
+ if (mCall.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ InCallPresenter.getInstance().declineUpgradeRequest(context);
+ } else {
+ TelecomAdapter.getInstance().rejectCall(mCall.getId(), false, null);
+ }
+ }
+
+ public void onText() {
+ if (getUi() != null) {
+ TelecomUtil.silenceRinger(getUi().getContext());
+ getUi().showMessageDialog();
+ }
+ }
+
+ public void rejectCallWithMessage(String message) {
+ Log.d(this, "sendTextToDefaultActivity()...");
+ TelecomAdapter.getInstance().rejectCall(mCall.getId(), true, message);
+
+ onDismissDialog();
+ }
+
+ public void onDismissDialog() {
+ InCallPresenter.getInstance().onDismissDialog();
+ }
+
+ private void configureAnswerTargetsForSms(Call call, List<String> textMsgs) {
+ if (getUi() == null) {
+ return;
+ }
+ mHasTextMessages = textMsgs != null;
+ boolean withSms = UserManagerCompat.isUserUnlocked(getUi().getContext())
+ && call.can(android.telecom.Call.Details.CAPABILITY_RESPOND_VIA_TEXT)
+ && mHasTextMessages;
+
+ // Only present the user with the option to answer as a video call if the incoming call is
+ // a bi-directional video call.
+ if (VideoUtils.isBidirectionalVideoCall(call)) {
+ if (withSms) {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_WITH_SMS);
+ getUi().configureMessageDialog(textMsgs);
+ } else {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_VIDEO_WITHOUT_SMS);
+ }
+ } else {
+ if (withSms) {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS);
+ getUi().configureMessageDialog(textMsgs);
+ } else {
+ getUi().showTargets(AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS);
+ }
+ }
+ }
+
+ interface AnswerUi extends Ui {
+ public void onShowAnswerUi(boolean shown);
+ public void showTargets(int targetSet);
+ public void showTargets(int targetSet, int videoState);
+ public void showMessageDialog();
+ public void configureMessageDialog(List<String> textResponses);
+ public Context getContext();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/AudioModeProvider.java b/InCallUI/src/com/android/incallui/AudioModeProvider.java
new file mode 100644
index 000000000..ea56dd624
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/AudioModeProvider.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.telecom.CallAudioState;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+/**
+ * Proxy class for getting and setting the audio mode.
+ */
+public class AudioModeProvider {
+
+ static final int AUDIO_MODE_INVALID = 0;
+
+ private static AudioModeProvider sAudioModeProvider = new AudioModeProvider();
+ private int mAudioMode = CallAudioState.ROUTE_EARPIECE;
+ private boolean mMuted = false;
+ private int mSupportedModes = CallAudioState.ROUTE_EARPIECE
+ | CallAudioState.ROUTE_BLUETOOTH | CallAudioState.ROUTE_WIRED_HEADSET
+ | CallAudioState.ROUTE_SPEAKER;
+ private final List<AudioModeListener> mListeners = Lists.newArrayList();
+
+ public static AudioModeProvider getInstance() {
+ return sAudioModeProvider;
+ }
+
+ public void onAudioStateChanged(boolean isMuted, int route, int supportedRouteMask) {
+ onAudioModeChange(route, isMuted);
+ onSupportedAudioModeChange(supportedRouteMask);
+ }
+
+ public void onAudioModeChange(int newMode, boolean muted) {
+ if (mAudioMode != newMode) {
+ mAudioMode = newMode;
+ for (AudioModeListener l : mListeners) {
+ l.onAudioMode(mAudioMode);
+ }
+ }
+
+ if (mMuted != muted) {
+ mMuted = muted;
+ for (AudioModeListener l : mListeners) {
+ l.onMute(mMuted);
+ }
+ }
+ }
+
+ public void onSupportedAudioModeChange(int newModeMask) {
+ mSupportedModes = newModeMask;
+
+ for (AudioModeListener l : mListeners) {
+ l.onSupportedAudioMode(mSupportedModes);
+ }
+ }
+
+ public void addListener(AudioModeListener listener) {
+ if (!mListeners.contains(listener)) {
+ mListeners.add(listener);
+ listener.onSupportedAudioMode(mSupportedModes);
+ listener.onAudioMode(mAudioMode);
+ listener.onMute(mMuted);
+ }
+ }
+
+ public void removeListener(AudioModeListener listener) {
+ if (mListeners.contains(listener)) {
+ mListeners.remove(listener);
+ }
+ }
+
+ public int getSupportedModes() {
+ return mSupportedModes;
+ }
+
+ public int getAudioMode() {
+ return mAudioMode;
+ }
+
+ public boolean getMute() {
+ return mMuted;
+ }
+
+ /* package */ interface AudioModeListener {
+ void onAudioMode(int newMode);
+ void onMute(boolean muted);
+ void onSupportedAudioMode(int modeMask);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/BaseFragment.java b/InCallUI/src/com/android/incallui/BaseFragment.java
new file mode 100644
index 000000000..58d991acd
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/BaseFragment.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.os.Bundle;
+
+/**
+ * Parent for all fragments that use Presenters and Ui design.
+ */
+public abstract class BaseFragment<T extends Presenter<U>, U extends Ui> extends Fragment {
+
+ private static final String KEY_FRAGMENT_HIDDEN = "key_fragment_hidden";
+
+ private T mPresenter;
+
+ public abstract T createPresenter();
+
+ public abstract U getUi();
+
+ protected BaseFragment() {
+ mPresenter = createPresenter();
+ }
+
+ /**
+ * Presenter will be available after onActivityCreated().
+ *
+ * @return The presenter associated with this fragment.
+ */
+ public T getPresenter() {
+ return mPresenter;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ mPresenter.onUiReady(getUi());
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ mPresenter.onRestoreInstanceState(savedInstanceState);
+ if (savedInstanceState.getBoolean(KEY_FRAGMENT_HIDDEN)) {
+ getFragmentManager().beginTransaction().hide(this).commit();
+ }
+ }
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ mPresenter.onUiDestroy(getUi());
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mPresenter.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_FRAGMENT_HIDDEN, isHidden());
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ ((FragmentDisplayManager) activity).onFragmentAttached(this);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java
new file mode 100644
index 000000000..447c34c88
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Call.java
@@ -0,0 +1,922 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.hardware.camera2.CameraCharacteristics;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Trace;
+import android.telecom.Call.Details;
+import android.telecom.Connection;
+import android.telecom.DisconnectCause;
+import android.telecom.GatewayInfo;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.text.TextUtils;
+
+import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.util.IntentUtil;
+import com.android.incallui.util.TelecomCallUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Objects;
+
+/**
+ * Describes a single call and its state.
+ */
+@NeededForTesting
+public class Call {
+ /* Defines different states of this call */
+ public static class State {
+ public static final int INVALID = 0;
+ public static final int NEW = 1; /* The call is new. */
+ public static final int IDLE = 2; /* The call is idle. Nothing active */
+ public static final int ACTIVE = 3; /* There is an active call */
+ public static final int INCOMING = 4; /* A normal incoming phone call */
+ public static final int CALL_WAITING = 5; /* Incoming call while another is active */
+ public static final int DIALING = 6; /* An outgoing call during dial phase */
+ public static final int REDIALING = 7; /* Subsequent dialing attempt after a failure */
+ public static final int ONHOLD = 8; /* An active phone call placed on hold */
+ public static final int DISCONNECTING = 9; /* A call is being ended. */
+ public static final int DISCONNECTED = 10; /* State after a call disconnects */
+ public static final int CONFERENCED = 11; /* Call part of a conference call */
+ public static final int SELECT_PHONE_ACCOUNT = 12; /* Waiting for account selection */
+ public static final int CONNECTING = 13; /* Waiting for Telecom broadcast to finish */
+ public static final int BLOCKED = 14; /* The number was found on the block list */
+
+
+ public static boolean isConnectingOrConnected(int state) {
+ switch(state) {
+ case ACTIVE:
+ case INCOMING:
+ case CALL_WAITING:
+ case CONNECTING:
+ case DIALING:
+ case REDIALING:
+ case ONHOLD:
+ case CONFERENCED:
+ return true;
+ default:
+ }
+ return false;
+ }
+
+ public static boolean isDialing(int state) {
+ return state == DIALING || state == REDIALING;
+ }
+
+ public static String toString(int state) {
+ switch (state) {
+ case INVALID:
+ return "INVALID";
+ case NEW:
+ return "NEW";
+ case IDLE:
+ return "IDLE";
+ case ACTIVE:
+ return "ACTIVE";
+ case INCOMING:
+ return "INCOMING";
+ case CALL_WAITING:
+ return "CALL_WAITING";
+ case DIALING:
+ return "DIALING";
+ case REDIALING:
+ return "REDIALING";
+ case ONHOLD:
+ return "ONHOLD";
+ case DISCONNECTING:
+ return "DISCONNECTING";
+ case DISCONNECTED:
+ return "DISCONNECTED";
+ case CONFERENCED:
+ return "CONFERENCED";
+ case SELECT_PHONE_ACCOUNT:
+ return "SELECT_PHONE_ACCOUNT";
+ case CONNECTING:
+ return "CONNECTING";
+ case BLOCKED:
+ return "BLOCKED";
+ default:
+ return "UNKNOWN";
+ }
+ }
+ }
+
+ /**
+ * Defines different states of session modify requests, which are used to upgrade to video, or
+ * downgrade to audio.
+ */
+ public static class SessionModificationState {
+ public static final int NO_REQUEST = 0;
+ public static final int WAITING_FOR_RESPONSE = 1;
+ public static final int REQUEST_FAILED = 2;
+ public static final int RECEIVED_UPGRADE_TO_VIDEO_REQUEST = 3;
+ public static final int UPGRADE_TO_VIDEO_REQUEST_TIMED_OUT = 4;
+ public static final int REQUEST_REJECTED = 5;
+ }
+
+ public static class VideoSettings {
+ public static final int CAMERA_DIRECTION_UNKNOWN = -1;
+ public static final int CAMERA_DIRECTION_FRONT_FACING =
+ CameraCharacteristics.LENS_FACING_FRONT;
+ public static final int CAMERA_DIRECTION_BACK_FACING =
+ CameraCharacteristics.LENS_FACING_BACK;
+
+ private int mCameraDirection = CAMERA_DIRECTION_UNKNOWN;
+
+ /**
+ * Sets the camera direction. if camera direction is set to CAMERA_DIRECTION_UNKNOWN,
+ * the video state of the call should be used to infer the camera direction.
+ *
+ * @see {@link CameraCharacteristics#LENS_FACING_FRONT}
+ * @see {@link CameraCharacteristics#LENS_FACING_BACK}
+ */
+ public void setCameraDir(int cameraDirection) {
+ if (cameraDirection == CAMERA_DIRECTION_FRONT_FACING
+ || cameraDirection == CAMERA_DIRECTION_BACK_FACING) {
+ mCameraDirection = cameraDirection;
+ } else {
+ mCameraDirection = CAMERA_DIRECTION_UNKNOWN;
+ }
+ }
+
+ /**
+ * Gets the camera direction. if camera direction is set to CAMERA_DIRECTION_UNKNOWN,
+ * the video state of the call should be used to infer the camera direction.
+ *
+ * @see {@link CameraCharacteristics#LENS_FACING_FRONT}
+ * @see {@link CameraCharacteristics#LENS_FACING_BACK}
+ */
+ public int getCameraDir() {
+ return mCameraDirection;
+ }
+
+ @Override
+ public String toString() {
+ return "(CameraDir:" + getCameraDir() + ")";
+ }
+ }
+
+ /**
+ * Tracks any state variables that is useful for logging. There is some amount of overlap with
+ * existing call member variables, but this duplication helps to ensure that none of these
+ * logging variables will interface with/and affect call logic.
+ */
+ public static class LogState {
+
+ // Contact lookup type constants
+ // Unknown lookup result (lookup not completed yet?)
+ public static final int LOOKUP_UNKNOWN = 0;
+ public static final int LOOKUP_NOT_FOUND = 1;
+ public static final int LOOKUP_LOCAL_CONTACT = 2;
+ public static final int LOOKUP_LOCAL_CACHE = 3;
+ public static final int LOOKUP_REMOTE_CONTACT = 4;
+ public static final int LOOKUP_EMERGENCY = 5;
+ public static final int LOOKUP_VOICEMAIL = 6;
+
+ // Call initiation type constants
+ public static final int INITIATION_UNKNOWN = 0;
+ public static final int INITIATION_INCOMING = 1;
+ public static final int INITIATION_DIALPAD = 2;
+ public static final int INITIATION_SPEED_DIAL = 3;
+ public static final int INITIATION_REMOTE_DIRECTORY = 4;
+ public static final int INITIATION_SMART_DIAL = 5;
+ public static final int INITIATION_REGULAR_SEARCH = 6;
+ public static final int INITIATION_CALL_LOG = 7;
+ public static final int INITIATION_CALL_LOG_FILTER = 8;
+ public static final int INITIATION_VOICEMAIL_LOG = 9;
+ public static final int INITIATION_CALL_DETAILS = 10;
+ public static final int INITIATION_QUICK_CONTACTS = 11;
+ public static final int INITIATION_EXTERNAL = 12;
+
+ public DisconnectCause disconnectCause;
+ public boolean isIncoming = false;
+ public int contactLookupResult = LOOKUP_UNKNOWN;
+ public int callInitiationMethod = INITIATION_EXTERNAL;
+ // If this was a conference call, the total number of calls involved in the conference.
+ public int conferencedCalls = 0;
+ public long duration = 0;
+ public boolean isLogged = false;
+
+ @Override
+ public String toString() {
+ return String.format(Locale.US, "["
+ + "%s, " // DisconnectCause toString already describes the object type
+ + "isIncoming: %s, "
+ + "contactLookup: %s, "
+ + "callInitiation: %s, "
+ + "duration: %s"
+ + "]",
+ disconnectCause,
+ isIncoming,
+ lookupToString(contactLookupResult),
+ initiationToString(callInitiationMethod),
+ duration);
+ }
+
+ private static String lookupToString(int lookupType) {
+ switch (lookupType) {
+ case LOOKUP_LOCAL_CONTACT:
+ return "Local";
+ case LOOKUP_LOCAL_CACHE:
+ return "Cache";
+ case LOOKUP_REMOTE_CONTACT:
+ return "Remote";
+ case LOOKUP_EMERGENCY:
+ return "Emergency";
+ case LOOKUP_VOICEMAIL:
+ return "Voicemail";
+ default:
+ return "Not found";
+ }
+ }
+
+ private static String initiationToString(int initiationType) {
+ switch (initiationType) {
+ case INITIATION_INCOMING:
+ return "Incoming";
+ case INITIATION_DIALPAD:
+ return "Dialpad";
+ case INITIATION_SPEED_DIAL:
+ return "Speed Dial";
+ case INITIATION_REMOTE_DIRECTORY:
+ return "Remote Directory";
+ case INITIATION_SMART_DIAL:
+ return "Smart Dial";
+ case INITIATION_REGULAR_SEARCH:
+ return "Regular Search";
+ case INITIATION_CALL_LOG:
+ return "Call Log";
+ case INITIATION_CALL_LOG_FILTER:
+ return "Call Log Filter";
+ case INITIATION_VOICEMAIL_LOG:
+ return "Voicemail Log";
+ case INITIATION_CALL_DETAILS:
+ return "Call Details";
+ case INITIATION_QUICK_CONTACTS:
+ return "Quick Contacts";
+ default:
+ return "Unknown";
+ }
+ }
+ }
+
+
+ private static final String ID_PREFIX = Call.class.getSimpleName() + "_";
+ private static int sIdCounter = 0;
+
+ private final android.telecom.Call.Callback mTelecomCallCallback =
+ new android.telecom.Call.Callback() {
+ @Override
+ public void onStateChanged(android.telecom.Call call, int newState) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " newState="
+ + newState);
+ update();
+ }
+
+ @Override
+ public void onParentChanged(android.telecom.Call call,
+ android.telecom.Call newParent) {
+ Log.d(this, "TelecomCallCallback onParentChanged call=" + call + " newParent="
+ + newParent);
+ update();
+ }
+
+ @Override
+ public void onChildrenChanged(android.telecom.Call call,
+ List<android.telecom.Call> children) {
+ update();
+ }
+
+ @Override
+ public void onDetailsChanged(android.telecom.Call call,
+ android.telecom.Call.Details details) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " details="
+ + details);
+ update();
+ }
+
+ @Override
+ public void onCannedTextResponsesLoaded(android.telecom.Call call,
+ List<String> cannedTextResponses) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call
+ + " cannedTextResponses=" + cannedTextResponses);
+ update();
+ }
+
+ @Override
+ public void onPostDialWait(android.telecom.Call call,
+ String remainingPostDialSequence) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call
+ + " remainingPostDialSequence=" + remainingPostDialSequence);
+ update();
+ }
+
+ @Override
+ public void onVideoCallChanged(android.telecom.Call call,
+ VideoCall videoCall) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call + " videoCall="
+ + videoCall);
+ update();
+ }
+
+ @Override
+ public void onCallDestroyed(android.telecom.Call call) {
+ Log.d(this, "TelecomCallCallback onStateChanged call=" + call);
+ call.unregisterCallback(this);
+ }
+
+ @Override
+ public void onConferenceableCallsChanged(android.telecom.Call call,
+ List<android.telecom.Call> conferenceableCalls) {
+ update();
+ }
+ };
+
+ private android.telecom.Call mTelecomCall;
+ private boolean mIsEmergencyCall;
+ private Uri mHandle;
+ private final String mId;
+ private int mState = State.INVALID;
+ private DisconnectCause mDisconnectCause;
+ private int mSessionModificationState;
+ private final List<String> mChildCallIds = new ArrayList<>();
+ private final VideoSettings mVideoSettings = new VideoSettings();
+ private int mVideoState;
+
+ /**
+ * mRequestedVideoState is used to store requested upgrade / downgrade video state
+ */
+ private int mRequestedVideoState = VideoProfile.STATE_AUDIO_ONLY;
+
+ private InCallVideoCallCallback mVideoCallCallback;
+ private boolean mIsVideoCallCallbackRegistered;
+ private String mChildNumber;
+ private String mLastForwardedNumber;
+ private String mCallSubject;
+ private PhoneAccountHandle mPhoneAccountHandle;
+
+ /**
+ * Indicates whether the phone account associated with this call supports specifying a call
+ * subject.
+ */
+ private boolean mIsCallSubjectSupported;
+
+ private long mTimeAddedMs;
+
+ private LogState mLogState = new LogState();
+
+ /**
+ * Used only to create mock calls for testing
+ */
+ @NeededForTesting
+ Call(int state) {
+ mTelecomCall = null;
+ mId = ID_PREFIX + Integer.toString(sIdCounter++);
+ setState(state);
+ }
+
+ public Call(android.telecom.Call telecomCall) {
+ mTelecomCall = telecomCall;
+ mId = ID_PREFIX + Integer.toString(sIdCounter++);
+
+ updateFromTelecomCall();
+
+ mTelecomCall.registerCallback(mTelecomCallCallback);
+
+ mTimeAddedMs = System.currentTimeMillis();
+ }
+
+ public android.telecom.Call getTelecomCall() {
+ return mTelecomCall;
+ }
+
+ /**
+ * @return video settings of the call, null if the call is not a video call.
+ * @see VideoProfile
+ */
+ public VideoSettings getVideoSettings() {
+ return mVideoSettings;
+ }
+
+ private void update() {
+ Trace.beginSection("Update");
+ int oldState = getState();
+ updateFromTelecomCall();
+ if (oldState != getState() && getState() == Call.State.DISCONNECTED) {
+ CallList.getInstance().onDisconnect(this);
+ } else {
+ CallList.getInstance().onUpdate(this);
+ }
+ Trace.endSection();
+ }
+
+ private void updateFromTelecomCall() {
+ Log.d(this, "updateFromTelecomCall: " + mTelecomCall.toString());
+ final int translatedState = translateState(mTelecomCall.getState());
+ if (mState != State.BLOCKED) {
+ setState(translatedState);
+ setDisconnectCause(mTelecomCall.getDetails().getDisconnectCause());
+ maybeCancelVideoUpgrade(mTelecomCall.getDetails().getVideoState());
+ }
+
+ if (mTelecomCall.getVideoCall() != null) {
+ if (mVideoCallCallback == null) {
+ mVideoCallCallback = new InCallVideoCallCallback(this);
+ }
+ mTelecomCall.getVideoCall().registerCallback(mVideoCallCallback);
+ mIsVideoCallCallbackRegistered = true;
+ }
+
+ mChildCallIds.clear();
+ final int numChildCalls = mTelecomCall.getChildren().size();
+ for (int i = 0; i < numChildCalls; i++) {
+ mChildCallIds.add(
+ CallList.getInstance().getCallByTelecomCall(
+ mTelecomCall.getChildren().get(i)).getId());
+ }
+
+ // The number of conferenced calls can change over the course of the call, so use the
+ // maximum number of conferenced child calls as the metric for conference call usage.
+ mLogState.conferencedCalls = Math.max(numChildCalls, mLogState.conferencedCalls);
+
+ updateFromCallExtras(mTelecomCall.getDetails().getExtras());
+
+ // If the handle of the call has changed, update state for the call determining if it is an
+ // emergency call.
+ Uri newHandle = mTelecomCall.getDetails().getHandle();
+ if (!Objects.equals(mHandle, newHandle)) {
+ mHandle = newHandle;
+ updateEmergencyCallState();
+ }
+
+ // If the phone account handle of the call is set, cache capability bit indicating whether
+ // the phone account supports call subjects.
+ PhoneAccountHandle newPhoneAccountHandle = mTelecomCall.getDetails().getAccountHandle();
+ if (!Objects.equals(mPhoneAccountHandle, newPhoneAccountHandle)) {
+ mPhoneAccountHandle = newPhoneAccountHandle;
+
+ if (mPhoneAccountHandle != null) {
+ TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+ PhoneAccount phoneAccount =
+ TelecomManagerCompat.getPhoneAccount(mgr, mPhoneAccountHandle);
+ if (phoneAccount != null) {
+ mIsCallSubjectSupported = phoneAccount.hasCapabilities(
+ PhoneAccount.CAPABILITY_CALL_SUBJECT);
+ }
+ }
+ }
+ }
+
+ /**
+ * Tests corruption of the {@code callExtras} bundle by calling {@link
+ * Bundle#containsKey(String)}. If the bundle is corrupted a {@link IllegalArgumentException}
+ * will be thrown and caught by this function.
+ *
+ * @param callExtras the bundle to verify
+ * @returns {@code true} if the bundle is corrupted, {@code false} otherwise.
+ */
+ protected boolean areCallExtrasCorrupted(Bundle callExtras) {
+ /**
+ * There's currently a bug in Telephony service (b/25613098) that could corrupt the
+ * extras bundle, resulting in a IllegalArgumentException while validating data under
+ * {@link Bundle#containsKey(String)}.
+ */
+ try {
+ callExtras.containsKey(Connection.EXTRA_CHILD_ADDRESS);
+ return false;
+ } catch (IllegalArgumentException e) {
+ Log.e(this, "CallExtras is corrupted, ignoring exception", e);
+ return true;
+ }
+ }
+
+ protected void updateFromCallExtras(Bundle callExtras) {
+ if (callExtras == null || areCallExtrasCorrupted(callExtras)) {
+ /**
+ * If the bundle is corrupted, abandon information update as a work around. These are
+ * not critical for the dialer to function.
+ */
+ return;
+ }
+ // Check for a change in the child address and notify any listeners.
+ if (callExtras.containsKey(Connection.EXTRA_CHILD_ADDRESS)) {
+ String childNumber = callExtras.getString(Connection.EXTRA_CHILD_ADDRESS);
+ if (!Objects.equals(childNumber, mChildNumber)) {
+ mChildNumber = childNumber;
+ CallList.getInstance().onChildNumberChange(this);
+ }
+ }
+
+ // Last forwarded number comes in as an array of strings. We want to choose the
+ // last item in the array. The forwarding numbers arrive independently of when the
+ // call is originally set up, so we need to notify the the UI of the change.
+ if (callExtras.containsKey(Connection.EXTRA_LAST_FORWARDED_NUMBER)) {
+ ArrayList<String> lastForwardedNumbers =
+ callExtras.getStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER);
+
+ if (lastForwardedNumbers != null) {
+ String lastForwardedNumber = null;
+ if (!lastForwardedNumbers.isEmpty()) {
+ lastForwardedNumber = lastForwardedNumbers.get(
+ lastForwardedNumbers.size() - 1);
+ }
+
+ if (!Objects.equals(lastForwardedNumber, mLastForwardedNumber)) {
+ mLastForwardedNumber = lastForwardedNumber;
+ CallList.getInstance().onLastForwardedNumberChange(this);
+ }
+ }
+ }
+
+ // Call subject is present in the extras at the start of call, so we do not need to
+ // notify any other listeners of this.
+ if (callExtras.containsKey(Connection.EXTRA_CALL_SUBJECT)) {
+ String callSubject = callExtras.getString(Connection.EXTRA_CALL_SUBJECT);
+ if (!Objects.equals(mCallSubject, callSubject)) {
+ mCallSubject = callSubject;
+ }
+ }
+ }
+
+ /**
+ * Determines if a received upgrade to video request should be cancelled. This can happen if
+ * another InCall UI responds to the upgrade to video request.
+ *
+ * @param newVideoState The new video state.
+ */
+ private void maybeCancelVideoUpgrade(int newVideoState) {
+ boolean isVideoStateChanged = mVideoState != newVideoState;
+
+ if (mSessionModificationState == SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST
+ && isVideoStateChanged) {
+
+ Log.v(this, "maybeCancelVideoUpgrade : cancelling upgrade notification");
+ setSessionModificationState(SessionModificationState.NO_REQUEST);
+ }
+ mVideoState = newVideoState;
+ }
+ private static int translateState(int state) {
+ switch (state) {
+ case android.telecom.Call.STATE_NEW:
+ case android.telecom.Call.STATE_CONNECTING:
+ return Call.State.CONNECTING;
+ case android.telecom.Call.STATE_SELECT_PHONE_ACCOUNT:
+ return Call.State.SELECT_PHONE_ACCOUNT;
+ case android.telecom.Call.STATE_DIALING:
+ return Call.State.DIALING;
+ case android.telecom.Call.STATE_RINGING:
+ return Call.State.INCOMING;
+ case android.telecom.Call.STATE_ACTIVE:
+ return Call.State.ACTIVE;
+ case android.telecom.Call.STATE_HOLDING:
+ return Call.State.ONHOLD;
+ case android.telecom.Call.STATE_DISCONNECTED:
+ return Call.State.DISCONNECTED;
+ case android.telecom.Call.STATE_DISCONNECTING:
+ return Call.State.DISCONNECTING;
+ default:
+ return Call.State.INVALID;
+ }
+ }
+
+ public String getId() {
+ return mId;
+ }
+
+ public long getTimeAddedMs() {
+ return mTimeAddedMs;
+ }
+
+ public String getNumber() {
+ return TelecomCallUtil.getNumber(mTelecomCall);
+ }
+
+ public void blockCall() {
+ mTelecomCall.reject(false, null);
+ setState(State.BLOCKED);
+ }
+
+ public Uri getHandle() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getHandle();
+ }
+
+ public boolean isEmergencyCall() {
+ return mIsEmergencyCall;
+ }
+
+ public int getState() {
+ if (mTelecomCall != null && mTelecomCall.getParent() != null) {
+ return State.CONFERENCED;
+ } else {
+ return mState;
+ }
+ }
+
+ public void setState(int state) {
+ mState = state;
+ if (mState == State.INCOMING) {
+ mLogState.isIncoming = true;
+ } else if (mState == State.DISCONNECTED) {
+ mLogState.duration = getConnectTimeMillis() == 0 ?
+ 0: System.currentTimeMillis() - getConnectTimeMillis();
+ }
+ }
+
+ public int getNumberPresentation() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getHandlePresentation();
+ }
+
+ public int getCnapNamePresentation() {
+ return mTelecomCall == null ? null
+ : mTelecomCall.getDetails().getCallerDisplayNamePresentation();
+ }
+
+ public String getCnapName() {
+ return mTelecomCall == null ? null
+ : getTelecomCall().getDetails().getCallerDisplayName();
+ }
+
+ public Bundle getIntentExtras() {
+ return mTelecomCall.getDetails().getIntentExtras();
+ }
+
+ public Bundle getExtras() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getExtras();
+ }
+
+ /**
+ * @return The child number for the call, or {@code null} if none specified.
+ */
+ public String getChildNumber() {
+ return mChildNumber;
+ }
+
+ /**
+ * @return The last forwarded number for the call, or {@code null} if none specified.
+ */
+ public String getLastForwardedNumber() {
+ return mLastForwardedNumber;
+ }
+
+ /**
+ * @return The call subject, or {@code null} if none specified.
+ */
+ public String getCallSubject() {
+ return mCallSubject;
+ }
+
+ /**
+ * @return {@code true} if the call's phone account supports call subjects, {@code false}
+ * otherwise.
+ */
+ public boolean isCallSubjectSupported() {
+ return mIsCallSubjectSupported;
+ }
+
+ /** Returns call disconnect cause, defined by {@link DisconnectCause}. */
+ public DisconnectCause getDisconnectCause() {
+ if (mState == State.DISCONNECTED || mState == State.IDLE) {
+ return mDisconnectCause;
+ }
+
+ return new DisconnectCause(DisconnectCause.UNKNOWN);
+ }
+
+ public void setDisconnectCause(DisconnectCause disconnectCause) {
+ mDisconnectCause = disconnectCause;
+ mLogState.disconnectCause = mDisconnectCause;
+ }
+
+ /** Returns the possible text message responses. */
+ public List<String> getCannedSmsResponses() {
+ return mTelecomCall.getCannedTextResponses();
+ }
+
+ /** Checks if the call supports the given set of capabilities supplied as a bit mask. */
+ public boolean can(int capabilities) {
+ int supportedCapabilities = mTelecomCall.getDetails().getCallCapabilities();
+
+ if ((capabilities & android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE) != 0) {
+ // We allow you to merge if the capabilities allow it or if it is a call with
+ // conferenceable calls.
+ if (mTelecomCall.getConferenceableCalls().isEmpty() &&
+ ((android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE
+ & supportedCapabilities) == 0)) {
+ // Cannot merge calls if there are no calls to merge with.
+ return false;
+ }
+ capabilities &= ~android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE;
+ }
+ return (capabilities == (capabilities & mTelecomCall.getDetails().getCallCapabilities()));
+ }
+
+ public boolean hasProperty(int property) {
+ return mTelecomCall.getDetails().hasProperty(property);
+ }
+
+ /** Gets the time when the call first became active. */
+ public long getConnectTimeMillis() {
+ return mTelecomCall.getDetails().getConnectTimeMillis();
+ }
+
+ public boolean isConferenceCall() {
+ return hasProperty(android.telecom.Call.Details.PROPERTY_CONFERENCE);
+ }
+
+ public GatewayInfo getGatewayInfo() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getGatewayInfo();
+ }
+
+ public PhoneAccountHandle getAccountHandle() {
+ return mTelecomCall == null ? null : mTelecomCall.getDetails().getAccountHandle();
+ }
+
+ /**
+ * @return The {@link VideoCall} instance associated with the {@link android.telecom.Call}.
+ * Will return {@code null} until {@link #updateFromTelecomCall()} has registered a valid
+ * callback on the {@link VideoCall}.
+ */
+ public VideoCall getVideoCall() {
+ return mTelecomCall == null || !mIsVideoCallCallbackRegistered ? null
+ : mTelecomCall.getVideoCall();
+ }
+
+ public List<String> getChildCallIds() {
+ return mChildCallIds;
+ }
+
+ public String getParentId() {
+ android.telecom.Call parentCall = mTelecomCall.getParent();
+ if (parentCall != null) {
+ return CallList.getInstance().getCallByTelecomCall(parentCall).getId();
+ }
+ return null;
+ }
+
+ public int getVideoState() {
+ return mTelecomCall.getDetails().getVideoState();
+ }
+
+ public boolean isVideoCall(Context context) {
+ return CallUtil.isVideoEnabled(context) &&
+ VideoUtils.isVideoCall(getVideoState());
+ }
+
+ /**
+ * Handles incoming session modification requests. Stores the pending video request and sets
+ * the session modification state to
+ * {@link SessionModificationState#RECEIVED_UPGRADE_TO_VIDEO_REQUEST} so that we can keep track
+ * of the fact the request was received. Only upgrade requests require user confirmation and
+ * will be handled by this method. The remote user can turn off their own camera without
+ * confirmation.
+ *
+ * @param videoState The requested video state.
+ */
+ public void setRequestedVideoState(int videoState) {
+ Log.d(this, "setRequestedVideoState - video state= " + videoState);
+ if (videoState == getVideoState()) {
+ mSessionModificationState = Call.SessionModificationState.NO_REQUEST;
+ Log.w(this,"setRequestedVideoState - Clearing session modification state");
+ return;
+ }
+
+ mSessionModificationState = Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+ mRequestedVideoState = videoState;
+ CallList.getInstance().onUpgradeToVideo(this);
+
+ Log.d(this, "setRequestedVideoState - mSessionModificationState="
+ + mSessionModificationState + " video state= " + videoState);
+ update();
+ }
+
+ /**
+ * Set the session modification state. Used to keep track of pending video session modification
+ * operations and to inform listeners of these changes.
+ *
+ * @param state the new session modification state.
+ */
+ public void setSessionModificationState(int state) {
+ boolean hasChanged = mSessionModificationState != state;
+ mSessionModificationState = state;
+ Log.d(this, "setSessionModificationState " + state + " mSessionModificationState="
+ + mSessionModificationState);
+ if (hasChanged) {
+ CallList.getInstance().onSessionModificationStateChange(this, state);
+ }
+ }
+
+ /**
+ * Determines if the call handle is an emergency number or not and caches the result to avoid
+ * repeated calls to isEmergencyNumber.
+ */
+ private void updateEmergencyCallState() {
+ mIsEmergencyCall = TelecomCallUtil.isEmergencyCall(mTelecomCall);
+ }
+
+ /**
+ * Gets the video state which was requested via a session modification request.
+ *
+ * @return The video state.
+ */
+ public int getRequestedVideoState() {
+ return mRequestedVideoState;
+ }
+
+ public static boolean areSame(Call call1, Call call2) {
+ if (call1 == null && call2 == null) {
+ return true;
+ } else if (call1 == null || call2 == null) {
+ return false;
+ }
+
+ // otherwise compare call Ids
+ return call1.getId().equals(call2.getId());
+ }
+
+ public static boolean areSameNumber(Call call1, Call call2) {
+ if (call1 == null && call2 == null) {
+ return true;
+ } else if (call1 == null || call2 == null) {
+ return false;
+ }
+
+ // otherwise compare call Numbers
+ return TextUtils.equals(call1.getNumber(), call2.getNumber());
+ }
+
+ /**
+ * Gets the current video session modification state.
+ *
+ * @return The session modification state.
+ */
+ public int getSessionModificationState() {
+ return mSessionModificationState;
+ }
+
+ public LogState getLogState() {
+ return mLogState;
+ }
+
+ /**
+ * Logging utility methods
+ */
+ public void logCallInitiationType() {
+ if (getState() == State.INCOMING) {
+ getLogState().callInitiationMethod = LogState.INITIATION_INCOMING;
+ } else if (getIntentExtras() != null) {
+ getLogState().callInitiationMethod =
+ getIntentExtras().getInt(IntentUtil.EXTRA_CALL_INITIATION_TYPE,
+ LogState.INITIATION_EXTERNAL);
+ }
+ }
+
+ @Override
+ public String toString() {
+ if (mTelecomCall == null) {
+ // This should happen only in testing since otherwise we would never have a null
+ // Telecom call.
+ return String.valueOf(mId);
+ }
+
+ return String.format(Locale.US, "[%s, %s, %s, children:%s, parent:%s, conferenceable:%s, " +
+ "videoState:%s, mSessionModificationState:%d, VideoSettings:%s]",
+ mId,
+ State.toString(getState()),
+ Details.capabilitiesToString(mTelecomCall.getDetails().getCallCapabilities()),
+ mChildCallIds,
+ getParentId(),
+ this.mTelecomCall.getConferenceableCalls(),
+ VideoProfile.videoStateToString(mTelecomCall.getDetails().getVideoState()),
+ mSessionModificationState,
+ getVideoSettings());
+ }
+
+ public String toSimpleString() {
+ return super.toString();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
new file mode 100644
index 000000000..5a25b6a7b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -0,0 +1,814 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_ADD_CALL;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_COUNT;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DIALPAD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DOWNGRADE_TO_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_HOLD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MANAGE_VIDEO_CONFERENCE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MERGE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MUTE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_PAUSE_VIDEO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWAP;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWITCH_CAMERA;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_UPGRADE_TO_VIDEO;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.LayerDrawable;
+import android.graphics.drawable.RippleDrawable;
+import android.graphics.drawable.StateListDrawable;
+import android.os.Bundle;
+import android.telecom.CallAudioState;
+import android.util.SparseIntArray;
+import android.view.ContextThemeWrapper;
+import android.view.HapticFeedbackConstants;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.ImageButton;
+import android.widget.PopupMenu;
+import android.widget.PopupMenu.OnDismissListener;
+import android.widget.PopupMenu.OnMenuItemClickListener;
+
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.dialer.R;
+
+/**
+ * Fragment for call control buttons
+ */
+public class CallButtonFragment
+ extends BaseFragment<CallButtonPresenter, CallButtonPresenter.CallButtonUi>
+ implements CallButtonPresenter.CallButtonUi, OnMenuItemClickListener, OnDismissListener,
+ View.OnClickListener {
+
+ private static final int INVALID_INDEX = -1;
+ private int mButtonMaxVisible;
+ // The button is currently visible in the UI
+ private static final int BUTTON_VISIBLE = 1;
+ // The button is hidden in the UI
+ private static final int BUTTON_HIDDEN = 2;
+ // The button has been collapsed into the overflow menu
+ private static final int BUTTON_MENU = 3;
+
+ public interface Buttons {
+
+ public static final int BUTTON_AUDIO = 0;
+ public static final int BUTTON_MUTE = 1;
+ public static final int BUTTON_DIALPAD = 2;
+ public static final int BUTTON_HOLD = 3;
+ public static final int BUTTON_SWAP = 4;
+ public static final int BUTTON_UPGRADE_TO_VIDEO = 5;
+ public static final int BUTTON_SWITCH_CAMERA = 6;
+ public static final int BUTTON_DOWNGRADE_TO_AUDIO = 7;
+ public static final int BUTTON_ADD_CALL = 8;
+ public static final int BUTTON_MERGE = 9;
+ public static final int BUTTON_PAUSE_VIDEO = 10;
+ public static final int BUTTON_MANAGE_VIDEO_CONFERENCE = 11;
+ public static final int BUTTON_COUNT = 12;
+ }
+
+ private SparseIntArray mButtonVisibilityMap = new SparseIntArray(BUTTON_COUNT);
+
+ private CompoundButton mAudioButton;
+ private CompoundButton mMuteButton;
+ private CompoundButton mShowDialpadButton;
+ private CompoundButton mHoldButton;
+ private ImageButton mSwapButton;
+ private ImageButton mChangeToVideoButton;
+ private ImageButton mChangeToVoiceButton;
+ private CompoundButton mSwitchCameraButton;
+ private ImageButton mAddCallButton;
+ private ImageButton mMergeButton;
+ private CompoundButton mPauseVideoButton;
+ private ImageButton mOverflowButton;
+ private ImageButton mManageVideoCallConferenceButton;
+
+ private PopupMenu mAudioModePopup;
+ private boolean mAudioModePopupVisible;
+ private PopupMenu mOverflowPopup;
+
+ private int mPrevAudioMode = 0;
+
+ // Constants for Drawable.setAlpha()
+ private static final int HIDDEN = 0;
+ private static final int VISIBLE = 255;
+
+ private boolean mIsEnabled;
+ private MaterialPalette mCurrentThemeColors;
+
+ @Override
+ public CallButtonPresenter createPresenter() {
+ // TODO: find a cleaner way to include audio mode provider than having a singleton instance.
+ return new CallButtonPresenter();
+ }
+
+ @Override
+ public CallButtonPresenter.CallButtonUi getUi() {
+ return this;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ for (int i = 0; i < BUTTON_COUNT; i++) {
+ mButtonVisibilityMap.put(i, BUTTON_HIDDEN);
+ }
+
+ mButtonMaxVisible = getResources().getInteger(R.integer.call_card_max_buttons);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View parent = inflater.inflate(R.layout.call_button_fragment, container, false);
+
+ mAudioButton = (CompoundButton) parent.findViewById(R.id.audioButton);
+ mAudioButton.setOnClickListener(this);
+ mMuteButton = (CompoundButton) parent.findViewById(R.id.muteButton);
+ mMuteButton.setOnClickListener(this);
+ mShowDialpadButton = (CompoundButton) parent.findViewById(R.id.dialpadButton);
+ mShowDialpadButton.setOnClickListener(this);
+ mHoldButton = (CompoundButton) parent.findViewById(R.id.holdButton);
+ mHoldButton.setOnClickListener(this);
+ mSwapButton = (ImageButton) parent.findViewById(R.id.swapButton);
+ mSwapButton.setOnClickListener(this);
+ mChangeToVideoButton = (ImageButton) parent.findViewById(R.id.changeToVideoButton);
+ mChangeToVideoButton.setOnClickListener(this);
+ mChangeToVoiceButton = (ImageButton) parent.findViewById(R.id.changeToVoiceButton);
+ mChangeToVoiceButton.setOnClickListener(this);
+ mSwitchCameraButton = (CompoundButton) parent.findViewById(R.id.switchCameraButton);
+ mSwitchCameraButton.setOnClickListener(this);
+ mAddCallButton = (ImageButton) parent.findViewById(R.id.addButton);
+ mAddCallButton.setOnClickListener(this);
+ mMergeButton = (ImageButton) parent.findViewById(R.id.mergeButton);
+ mMergeButton.setOnClickListener(this);
+ mPauseVideoButton = (CompoundButton) parent.findViewById(R.id.pauseVideoButton);
+ mPauseVideoButton.setOnClickListener(this);
+ mOverflowButton = (ImageButton) parent.findViewById(R.id.overflowButton);
+ mOverflowButton.setOnClickListener(this);
+ mManageVideoCallConferenceButton = (ImageButton) parent.findViewById(
+ R.id.manageVideoCallConferenceButton);
+ mManageVideoCallConferenceButton.setOnClickListener(this);
+ return parent;
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ // set the buttons
+ updateAudioButtons(getPresenter().getSupportedAudio());
+ }
+
+ @Override
+ public void onResume() {
+ if (getPresenter() != null) {
+ getPresenter().refreshMuteState();
+ }
+ super.onResume();
+
+ updateColors();
+ }
+
+ @Override
+ public void onClick(View view) {
+ int id = view.getId();
+ Log.d(this, "onClick(View " + view + ", id " + id + ")...");
+
+ if (id == R.id.audioButton) {
+ onAudioButtonClicked();
+ } else if (id == R.id.addButton) {
+ getPresenter().addCallClicked();
+ } else if (id == R.id.muteButton) {
+ getPresenter().muteClicked(!mMuteButton.isSelected());
+ } else if (id == R.id.mergeButton) {
+ getPresenter().mergeClicked();
+ mMergeButton.setEnabled(false);
+ } else if (id == R.id.holdButton) {
+ getPresenter().holdClicked(!mHoldButton.isSelected());
+ } else if (id == R.id.swapButton) {
+ getPresenter().swapClicked();
+ } else if (id == R.id.dialpadButton) {
+ getPresenter().showDialpadClicked(!mShowDialpadButton.isSelected());
+ } else if (id == R.id.changeToVideoButton) {
+ getPresenter().changeToVideoClicked();
+ } else if (id == R.id.changeToVoiceButton) {
+ getPresenter().changeToVoiceClicked();
+ } else if (id == R.id.switchCameraButton) {
+ getPresenter().switchCameraClicked(
+ mSwitchCameraButton.isSelected() /* useFrontFacingCamera */);
+ } else if (id == R.id.pauseVideoButton) {
+ getPresenter().pauseVideoClicked(
+ !mPauseVideoButton.isSelected() /* pause */);
+ } else if (id == R.id.overflowButton) {
+ if (mOverflowPopup != null) {
+ mOverflowPopup.show();
+ }
+ } else if (id == R.id.manageVideoCallConferenceButton) {
+ onManageVideoCallConferenceClicked();
+ } else {
+ Log.wtf(this, "onClick: unexpected");
+ return;
+ }
+
+ view.performHapticFeedback(
+ HapticFeedbackConstants.VIRTUAL_KEY,
+ HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING);
+ }
+
+ public void updateColors() {
+ MaterialPalette themeColors = InCallPresenter.getInstance().getThemeColors();
+
+ if (mCurrentThemeColors != null && mCurrentThemeColors.equals(themeColors)) {
+ return;
+ }
+
+ View[] compoundButtons = {
+ mAudioButton,
+ mMuteButton,
+ mShowDialpadButton,
+ mHoldButton,
+ mSwitchCameraButton,
+ mPauseVideoButton
+ };
+
+ for (View button : compoundButtons) {
+ final LayerDrawable layers = (LayerDrawable) button.getBackground();
+ final RippleDrawable btnCompoundDrawable = compoundBackgroundDrawable(themeColors);
+ layers.setDrawableByLayerId(R.id.compoundBackgroundItem, btnCompoundDrawable);
+ }
+
+ ImageButton[] normalButtons = {
+ mSwapButton,
+ mChangeToVideoButton,
+ mChangeToVoiceButton,
+ mAddCallButton,
+ mMergeButton,
+ mOverflowButton
+ };
+
+ for (ImageButton button : normalButtons) {
+ final LayerDrawable layers = (LayerDrawable) button.getBackground();
+ final RippleDrawable btnDrawable = backgroundDrawable(themeColors);
+ layers.setDrawableByLayerId(R.id.backgroundItem, btnDrawable);
+ }
+
+ mCurrentThemeColors = themeColors;
+ }
+
+ /**
+ * Generate a RippleDrawable which will be the background for a compound button, i.e.
+ * a button with pressed and unpressed states. The unpressed state will be the same color
+ * as the rest of the call card, the pressed state will be the dark version of that color.
+ */
+ private RippleDrawable compoundBackgroundDrawable(MaterialPalette palette) {
+ Resources res = getResources();
+ ColorStateList rippleColor =
+ ColorStateList.valueOf(res.getColor(R.color.incall_accent_color));
+
+ StateListDrawable stateListDrawable = new StateListDrawable();
+ addSelectedAndFocused(res, stateListDrawable);
+ addFocused(res, stateListDrawable);
+ addSelected(res, stateListDrawable, palette);
+ addUnselected(res, stateListDrawable, palette);
+
+ return new RippleDrawable(rippleColor, stateListDrawable, null);
+ }
+
+ /**
+ * Generate a RippleDrawable which will be the background of a button to ensure it
+ * is the same color as the rest of the call card.
+ */
+ private RippleDrawable backgroundDrawable(MaterialPalette palette) {
+ Resources res = getResources();
+ ColorStateList rippleColor =
+ ColorStateList.valueOf(res.getColor(R.color.incall_accent_color));
+
+ StateListDrawable stateListDrawable = new StateListDrawable();
+ addFocused(res, stateListDrawable);
+ addUnselected(res, stateListDrawable, palette);
+
+ return new RippleDrawable(rippleColor, stateListDrawable, null);
+ }
+
+ // state_selected and state_focused
+ private void addSelectedAndFocused(Resources res, StateListDrawable drawable) {
+ int[] selectedAndFocused = {android.R.attr.state_selected, android.R.attr.state_focused};
+ Drawable selectedAndFocusedDrawable = res.getDrawable(R.drawable.btn_selected_focused);
+ drawable.addState(selectedAndFocused, selectedAndFocusedDrawable);
+ }
+
+ // state_focused
+ private void addFocused(Resources res, StateListDrawable drawable) {
+ int[] focused = {android.R.attr.state_focused};
+ Drawable focusedDrawable = res.getDrawable(R.drawable.btn_unselected_focused);
+ drawable.addState(focused, focusedDrawable);
+ }
+
+ // state_selected
+ private void addSelected(Resources res, StateListDrawable drawable, MaterialPalette palette) {
+ int[] selected = {android.R.attr.state_selected};
+ LayerDrawable selectedDrawable = (LayerDrawable) res.getDrawable(R.drawable.btn_selected);
+ ((GradientDrawable) selectedDrawable.getDrawable(0)).setColor(palette.mSecondaryColor);
+ drawable.addState(selected, selectedDrawable);
+ }
+
+ // default
+ private void addUnselected(Resources res, StateListDrawable drawable, MaterialPalette palette) {
+ LayerDrawable unselectedDrawable =
+ (LayerDrawable) res.getDrawable(R.drawable.btn_unselected);
+ ((GradientDrawable) unselectedDrawable.getDrawable(0)).setColor(palette.mPrimaryColor);
+ drawable.addState(new int[0], unselectedDrawable);
+ }
+
+ @Override
+ public void setEnabled(boolean isEnabled) {
+ mIsEnabled = isEnabled;
+
+ mAudioButton.setEnabled(isEnabled);
+ mMuteButton.setEnabled(isEnabled);
+ mShowDialpadButton.setEnabled(isEnabled);
+ mHoldButton.setEnabled(isEnabled);
+ mSwapButton.setEnabled(isEnabled);
+ mChangeToVideoButton.setEnabled(isEnabled);
+ mChangeToVoiceButton.setEnabled(isEnabled);
+ mSwitchCameraButton.setEnabled(isEnabled);
+ mAddCallButton.setEnabled(isEnabled);
+ mMergeButton.setEnabled(isEnabled);
+ mPauseVideoButton.setEnabled(isEnabled);
+ mOverflowButton.setEnabled(isEnabled);
+ mManageVideoCallConferenceButton.setEnabled(isEnabled);
+ }
+
+ @Override
+ public void showButton(int buttonId, boolean show) {
+ mButtonVisibilityMap.put(buttonId, show ? BUTTON_VISIBLE : BUTTON_HIDDEN);
+ }
+
+ @Override
+ public void enableButton(int buttonId, boolean enable) {
+ final View button = getButtonById(buttonId);
+ if (button != null) {
+ button.setEnabled(enable);
+ }
+ }
+
+ private View getButtonById(int id) {
+ if (id == BUTTON_AUDIO) {
+ return mAudioButton;
+ } else if (id == BUTTON_MUTE) {
+ return mMuteButton;
+ } else if (id == BUTTON_DIALPAD) {
+ return mShowDialpadButton;
+ } else if (id == BUTTON_HOLD) {
+ return mHoldButton;
+ } else if (id == BUTTON_SWAP) {
+ return mSwapButton;
+ } else if (id == BUTTON_UPGRADE_TO_VIDEO) {
+ return mChangeToVideoButton;
+ } else if (id == BUTTON_DOWNGRADE_TO_AUDIO) {
+ return mChangeToVoiceButton;
+ } else if (id == BUTTON_SWITCH_CAMERA) {
+ return mSwitchCameraButton;
+ } else if (id == BUTTON_ADD_CALL) {
+ return mAddCallButton;
+ } else if (id == BUTTON_MERGE) {
+ return mMergeButton;
+ } else if (id == BUTTON_PAUSE_VIDEO) {
+ return mPauseVideoButton;
+ } else if (id == BUTTON_MANAGE_VIDEO_CONFERENCE) {
+ return mManageVideoCallConferenceButton;
+ } else {
+ Log.w(this, "Invalid button id");
+ return null;
+ }
+ }
+
+ @Override
+ public void setHold(boolean value) {
+ if (mHoldButton.isSelected() != value) {
+ mHoldButton.setSelected(value);
+ mHoldButton.setContentDescription(getContext().getString(
+ value ? R.string.onscreenHoldText_selected
+ : R.string.onscreenHoldText_unselected));
+ }
+ }
+
+ @Override
+ public void setCameraSwitched(boolean isBackFacingCamera) {
+ mSwitchCameraButton.setSelected(isBackFacingCamera);
+ }
+
+ @Override
+ public void setVideoPaused(boolean isPaused) {
+ mPauseVideoButton.setSelected(isPaused);
+ }
+
+ @Override
+ public void setMute(boolean value) {
+ if (mMuteButton.isSelected() != value) {
+ mMuteButton.setSelected(value);
+ mMuteButton.setContentDescription(getContext().getString(
+ value ? R.string.onscreenMuteText_selected
+ : R.string.onscreenMuteText_unselected));
+ }
+ }
+
+ private void addToOverflowMenu(int id, View button, PopupMenu menu) {
+ button.setVisibility(View.GONE);
+ menu.getMenu().add(Menu.NONE, id, Menu.NONE, button.getContentDescription());
+ mButtonVisibilityMap.put(id, BUTTON_MENU);
+ }
+
+ private PopupMenu getPopupMenu() {
+ return new PopupMenu(new ContextThemeWrapper(getActivity(), R.style.InCallPopupMenuStyle),
+ mOverflowButton);
+ }
+
+ /**
+ * Iterates through the list of buttons and toggles their visibility depending on the
+ * setting configured by the CallButtonPresenter. If there are more visible buttons than
+ * the allowed maximum, the excess buttons are collapsed into a single overflow menu.
+ */
+ @Override
+ public void updateButtonStates() {
+ View prevVisibleButton = null;
+ int prevVisibleId = -1;
+ PopupMenu menu = null;
+ int visibleCount = 0;
+ for (int i = 0; i < BUTTON_COUNT; i++) {
+ final int visibility = mButtonVisibilityMap.get(i);
+ final View button = getButtonById(i);
+ if (visibility == BUTTON_VISIBLE) {
+ visibleCount++;
+ if (visibleCount <= mButtonMaxVisible) {
+ button.setVisibility(View.VISIBLE);
+ prevVisibleButton = button;
+ prevVisibleId = i;
+ } else {
+ if (menu == null) {
+ menu = getPopupMenu();
+ }
+ // Collapse the current button into the overflow menu. If is the first visible
+ // button that exceeds the threshold, also collapse the previous visible button
+ // so that the total number of visible buttons will never exceed the threshold.
+ if (prevVisibleButton != null) {
+ addToOverflowMenu(prevVisibleId, prevVisibleButton, menu);
+ prevVisibleButton = null;
+ prevVisibleId = -1;
+ }
+ addToOverflowMenu(i, button, menu);
+ }
+ } else if (visibility == BUTTON_HIDDEN) {
+ button.setVisibility(View.GONE);
+ }
+ }
+
+ mOverflowButton.setVisibility(menu != null ? View.VISIBLE : View.GONE);
+ if (menu != null) {
+ mOverflowPopup = menu;
+ mOverflowPopup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ final int id = item.getItemId();
+ getButtonById(id).performClick();
+ return true;
+ }
+ });
+ }
+ }
+
+ @Override
+ public void setAudio(int mode) {
+ updateAudioButtons(getPresenter().getSupportedAudio());
+ refreshAudioModePopup();
+
+ if (mPrevAudioMode != mode) {
+ updateAudioButtonContentDescription(mode);
+ mPrevAudioMode = mode;
+ }
+ }
+
+ @Override
+ public void setSupportedAudio(int modeMask) {
+ updateAudioButtons(modeMask);
+ refreshAudioModePopup();
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ Log.d(this, "- onMenuItemClick: " + item);
+ Log.d(this, " id: " + item.getItemId());
+ Log.d(this, " title: '" + item.getTitle() + "'");
+
+ int mode = CallAudioState.ROUTE_WIRED_OR_EARPIECE;
+ int resId = item.getItemId();
+
+ if (resId == R.id.audio_mode_speaker) {
+ mode = CallAudioState.ROUTE_SPEAKER;
+ } else if (resId == R.id.audio_mode_earpiece || resId == R.id.audio_mode_wired_headset) {
+ // InCallCallAudioState.ROUTE_EARPIECE means either the handset earpiece,
+ // or the wired headset (if connected.)
+ mode = CallAudioState.ROUTE_WIRED_OR_EARPIECE;
+ } else if (resId == R.id.audio_mode_bluetooth) {
+ mode = CallAudioState.ROUTE_BLUETOOTH;
+ } else {
+ Log.e(this, "onMenuItemClick: unexpected View ID " + item.getItemId()
+ + " (MenuItem = '" + item + "')");
+ }
+
+ getPresenter().setAudioMode(mode);
+
+ return true;
+ }
+
+ // PopupMenu.OnDismissListener implementation; see showAudioModePopup().
+ // This gets called when the PopupMenu gets dismissed for *any* reason, like
+ // the user tapping outside its bounds, or pressing Back, or selecting one
+ // of the menu items.
+ @Override
+ public void onDismiss(PopupMenu menu) {
+ Log.d(this, "- onDismiss: " + menu);
+ mAudioModePopupVisible = false;
+ updateAudioButtons(getPresenter().getSupportedAudio());
+ }
+
+ /**
+ * Checks for supporting modes. If bluetooth is supported, it uses the audio
+ * pop up menu. Otherwise, it toggles the speakerphone.
+ */
+ private void onAudioButtonClicked() {
+ Log.d(this, "onAudioButtonClicked: " +
+ CallAudioState.audioRouteToString(getPresenter().getSupportedAudio()));
+
+ if (isSupported(CallAudioState.ROUTE_BLUETOOTH)) {
+ showAudioModePopup();
+ } else {
+ getPresenter().toggleSpeakerphone();
+ }
+ }
+
+ private void onManageVideoCallConferenceClicked() {
+ Log.d(this, "onManageVideoCallConferenceClicked");
+ InCallPresenter.getInstance().showConferenceCallManager(true);
+ }
+
+ /**
+ * Refreshes the "Audio mode" popup if it's visible. This is useful
+ * (for example) when a wired headset is plugged or unplugged,
+ * since we need to switch back and forth between the "earpiece"
+ * and "wired headset" items.
+ *
+ * This is safe to call even if the popup is already dismissed, or even if
+ * you never called showAudioModePopup() in the first place.
+ */
+ public void refreshAudioModePopup() {
+ if (mAudioModePopup != null && mAudioModePopupVisible) {
+ // Dismiss the previous one
+ mAudioModePopup.dismiss(); // safe even if already dismissed
+ // And bring up a fresh PopupMenu
+ showAudioModePopup();
+ }
+ }
+
+ /**
+ * Updates the audio button so that the appriopriate visual layers
+ * are visible based on the supported audio formats.
+ */
+ private void updateAudioButtons(int supportedModes) {
+ final boolean bluetoothSupported = isSupported(CallAudioState.ROUTE_BLUETOOTH);
+ final boolean speakerSupported = isSupported(CallAudioState.ROUTE_SPEAKER);
+
+ boolean audioButtonEnabled = false;
+ boolean audioButtonChecked = false;
+ boolean showMoreIndicator = false;
+
+ boolean showBluetoothIcon = false;
+ boolean showSpeakerphoneIcon = false;
+ boolean showHandsetIcon = false;
+
+ boolean showToggleIndicator = false;
+
+ if (bluetoothSupported) {
+ Log.d(this, "updateAudioButtons - popup menu mode");
+
+ audioButtonEnabled = true;
+ audioButtonChecked = true;
+ showMoreIndicator = true;
+
+ // Update desired layers:
+ if (isAudio(CallAudioState.ROUTE_BLUETOOTH)) {
+ showBluetoothIcon = true;
+ } else if (isAudio(CallAudioState.ROUTE_SPEAKER)) {
+ showSpeakerphoneIcon = true;
+ } else {
+ showHandsetIcon = true;
+ // TODO: if a wired headset is plugged in, that takes precedence
+ // over the handset earpiece. If so, maybe we should show some
+ // sort of "wired headset" icon here instead of the "handset
+ // earpiece" icon. (Still need an asset for that, though.)
+ }
+
+ // The audio button is NOT a toggle in this state, so set selected to false.
+ mAudioButton.setSelected(false);
+ } else if (speakerSupported) {
+ Log.d(this, "updateAudioButtons - speaker toggle mode");
+
+ audioButtonEnabled = true;
+
+ // The audio button *is* a toggle in this state, and indicated the
+ // current state of the speakerphone.
+ audioButtonChecked = isAudio(CallAudioState.ROUTE_SPEAKER);
+ mAudioButton.setSelected(audioButtonChecked);
+
+ // update desired layers:
+ showToggleIndicator = true;
+ showSpeakerphoneIcon = true;
+ } else {
+ Log.d(this, "updateAudioButtons - disabled...");
+
+ // The audio button is a toggle in this state, but that's mostly
+ // irrelevant since it's always disabled and unchecked.
+ audioButtonEnabled = false;
+ audioButtonChecked = false;
+ mAudioButton.setSelected(false);
+
+ // update desired layers:
+ showToggleIndicator = true;
+ showSpeakerphoneIcon = true;
+ }
+
+ // Finally, update it all!
+
+ Log.v(this, "audioButtonEnabled: " + audioButtonEnabled);
+ Log.v(this, "audioButtonChecked: " + audioButtonChecked);
+ Log.v(this, "showMoreIndicator: " + showMoreIndicator);
+ Log.v(this, "showBluetoothIcon: " + showBluetoothIcon);
+ Log.v(this, "showSpeakerphoneIcon: " + showSpeakerphoneIcon);
+ Log.v(this, "showHandsetIcon: " + showHandsetIcon);
+
+ // Only enable the audio button if the fragment is enabled.
+ mAudioButton.setEnabled(audioButtonEnabled && mIsEnabled);
+ mAudioButton.setChecked(audioButtonChecked);
+
+ final LayerDrawable layers = (LayerDrawable) mAudioButton.getBackground();
+ Log.d(this, "'layers' drawable: " + layers);
+
+ layers.findDrawableByLayerId(R.id.compoundBackgroundItem)
+ .setAlpha(showToggleIndicator ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.moreIndicatorItem)
+ .setAlpha(showMoreIndicator ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.bluetoothItem)
+ .setAlpha(showBluetoothIcon ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.handsetItem)
+ .setAlpha(showHandsetIcon ? VISIBLE : HIDDEN);
+
+ layers.findDrawableByLayerId(R.id.speakerphoneItem)
+ .setAlpha(showSpeakerphoneIcon ? VISIBLE : HIDDEN);
+
+ }
+
+ /**
+ * Update the content description of the audio button.
+ */
+ private void updateAudioButtonContentDescription(int mode) {
+ int stringId = 0;
+
+ // If bluetooth is not supported, the audio buttion will toggle, so use the label "speaker".
+ // Otherwise, use the label of the currently selected audio mode.
+ if (!isSupported(CallAudioState.ROUTE_BLUETOOTH)) {
+ stringId = R.string.audio_mode_speaker;
+ } else {
+ switch (mode) {
+ case CallAudioState.ROUTE_EARPIECE:
+ stringId = R.string.audio_mode_earpiece;
+ break;
+ case CallAudioState.ROUTE_BLUETOOTH:
+ stringId = R.string.audio_mode_bluetooth;
+ break;
+ case CallAudioState.ROUTE_WIRED_HEADSET:
+ stringId = R.string.audio_mode_wired_headset;
+ break;
+ case CallAudioState.ROUTE_SPEAKER:
+ stringId = R.string.audio_mode_speaker;
+ break;
+ }
+ }
+
+ if (stringId != 0) {
+ mAudioButton.setContentDescription(getResources().getString(stringId));
+ }
+ }
+
+ private void showAudioModePopup() {
+ Log.d(this, "showAudioPopup()...");
+
+ final ContextThemeWrapper contextWrapper = new ContextThemeWrapper(getActivity(),
+ R.style.InCallPopupMenuStyle);
+ mAudioModePopup = new PopupMenu(contextWrapper, mAudioButton /* anchorView */);
+ mAudioModePopup.getMenuInflater().inflate(R.menu.incall_audio_mode_menu,
+ mAudioModePopup.getMenu());
+ mAudioModePopup.setOnMenuItemClickListener(this);
+ mAudioModePopup.setOnDismissListener(this);
+
+ final Menu menu = mAudioModePopup.getMenu();
+
+ // TODO: Still need to have the "currently active" audio mode come
+ // up pre-selected (or focused?) with a blue highlight. Still
+ // need exact visual design, and possibly framework support for this.
+ // See comments below for the exact logic.
+
+ final MenuItem speakerItem = menu.findItem(R.id.audio_mode_speaker);
+ speakerItem.setEnabled(isSupported(CallAudioState.ROUTE_SPEAKER));
+ // TODO: Show speakerItem as initially "selected" if
+ // speaker is on.
+
+ // We display *either* "earpiece" or "wired headset", never both,
+ // depending on whether a wired headset is physically plugged in.
+ final MenuItem earpieceItem = menu.findItem(R.id.audio_mode_earpiece);
+ final MenuItem wiredHeadsetItem = menu.findItem(R.id.audio_mode_wired_headset);
+
+ final boolean usingHeadset = isSupported(CallAudioState.ROUTE_WIRED_HEADSET);
+ earpieceItem.setVisible(!usingHeadset);
+ earpieceItem.setEnabled(!usingHeadset);
+ wiredHeadsetItem.setVisible(usingHeadset);
+ wiredHeadsetItem.setEnabled(usingHeadset);
+ // TODO: Show the above item (either earpieceItem or wiredHeadsetItem)
+ // as initially "selected" if speakerOn and
+ // bluetoothIndicatorOn are both false.
+
+ final MenuItem bluetoothItem = menu.findItem(R.id.audio_mode_bluetooth);
+ bluetoothItem.setEnabled(isSupported(CallAudioState.ROUTE_BLUETOOTH));
+ // TODO: Show bluetoothItem as initially "selected" if
+ // bluetoothIndicatorOn is true.
+
+ mAudioModePopup.show();
+
+ // Unfortunately we need to manually keep track of the popup menu's
+ // visiblity, since PopupMenu doesn't have an isShowing() method like
+ // Dialogs do.
+ mAudioModePopupVisible = true;
+ }
+
+ private boolean isSupported(int mode) {
+ return (mode == (getPresenter().getSupportedAudio() & mode));
+ }
+
+ private boolean isAudio(int mode) {
+ return (mode == getPresenter().getAudioMode());
+ }
+
+ @Override
+ public void displayDialpad(boolean value, boolean animate) {
+ if (getActivity() != null && getActivity() instanceof InCallActivity) {
+ boolean changed = ((InCallActivity) getActivity()).showDialpadFragment(value, animate);
+ if (changed) {
+ mShowDialpadButton.setSelected(value);
+ mShowDialpadButton.setContentDescription(getContext().getString(
+ value /* show */ ? R.string.onscreenShowDialpadText_unselected
+ : R.string.onscreenShowDialpadText_selected));
+ }
+ }
+ }
+
+ @Override
+ public boolean isDialpadVisible() {
+ if (getActivity() != null && getActivity() instanceof InCallActivity) {
+ return ((InCallActivity) getActivity()).isDialpadVisible();
+ }
+ return false;
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
new file mode 100644
index 000000000..e8c2d4b13
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -0,0 +1,483 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_ADD_CALL;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DIALPAD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_DOWNGRADE_TO_AUDIO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_HOLD;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MERGE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_MUTE;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_PAUSE_VIDEO;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWAP;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_SWITCH_CAMERA;
+import static com.android.incallui.CallButtonFragment.Buttons.BUTTON_UPGRADE_TO_VIDEO;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.telecom.CallAudioState;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.VideoProfile;
+
+import com.android.contacts.common.compat.CallSdkCompat;
+import com.android.contacts.common.compat.SdkVersionOverride;
+import com.android.dialer.compat.UserManagerCompat;
+import com.android.incallui.AudioModeProvider.AudioModeListener;
+import com.android.incallui.InCallCameraManager.Listener;
+import com.android.incallui.InCallPresenter.CanAddCallListener;
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+
+/**
+ * Logic for call buttons.
+ */
+public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButtonUi>
+ implements InCallStateListener, AudioModeListener, IncomingCallListener,
+ InCallDetailsListener, CanAddCallListener, Listener {
+
+ private static final String KEY_AUTOMATICALLY_MUTED = "incall_key_automatically_muted";
+ private static final String KEY_PREVIOUS_MUTE_STATE = "incall_key_previous_mute_state";
+
+ private Call mCall;
+ private boolean mAutomaticallyMuted = false;
+ private boolean mPreviousMuteState = false;
+
+ public CallButtonPresenter() {
+ }
+
+ @Override
+ public void onUiReady(CallButtonUi ui) {
+ super.onUiReady(ui);
+
+ AudioModeProvider.getInstance().addListener(this);
+
+ // register for call state changes last
+ final InCallPresenter inCallPresenter = InCallPresenter.getInstance();
+ inCallPresenter.addListener(this);
+ inCallPresenter.addIncomingCallListener(this);
+ inCallPresenter.addDetailsListener(this);
+ inCallPresenter.addCanAddCallListener(this);
+ inCallPresenter.getInCallCameraManager().addCameraSelectionListener(this);
+
+ // Update the buttons state immediately for the current call
+ onStateChange(InCallState.NO_CALLS, inCallPresenter.getInCallState(),
+ CallList.getInstance());
+ }
+
+ @Override
+ public void onUiUnready(CallButtonUi ui) {
+ super.onUiUnready(ui);
+
+ InCallPresenter.getInstance().removeListener(this);
+ AudioModeProvider.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ InCallPresenter.getInstance().removeDetailsListener(this);
+ InCallPresenter.getInstance().getInCallCameraManager().removeCameraSelectionListener(this);
+ InCallPresenter.getInstance().removeCanAddCallListener(this);
+ }
+
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ CallButtonUi ui = getUi();
+
+ if (newState == InCallState.OUTGOING) {
+ mCall = callList.getOutgoingCall();
+ } else if (newState == InCallState.INCALL) {
+ mCall = callList.getActiveOrBackgroundCall();
+
+ // When connected to voice mail, automatically shows the dialpad.
+ // (On previous releases we showed it when in-call shows up, before waiting for
+ // OUTGOING. We may want to do that once we start showing "Voice mail" label on
+ // the dialpad too.)
+ if (ui != null) {
+ if (oldState == InCallState.OUTGOING && mCall != null) {
+ if (CallerInfoUtils.isVoiceMailNumber(ui.getContext(), mCall)) {
+ ui.displayDialpad(true /* show */, true /* animate */);
+ }
+ }
+ }
+ } else if (newState == InCallState.INCOMING) {
+ if (ui != null) {
+ ui.displayDialpad(false /* show */, true /* animate */);
+ }
+ mCall = callList.getIncomingCall();
+ } else {
+ mCall = null;
+ }
+ updateUi(newState, mCall);
+ }
+
+ /**
+ * Updates the user interface in response to a change in the details of a call.
+ * Currently handles changes to the call buttons in response to a change in the details for a
+ * call. This is important to ensure changes to the active call are reflected in the available
+ * buttons.
+ *
+ * @param call The active call.
+ * @param details The call details.
+ */
+ @Override
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details) {
+ // Only update if the changes are for the currently active call
+ if (getUi() != null && call != null && call.equals(mCall)) {
+ updateButtonsState(call);
+ }
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ onStateChange(oldState, newState, CallList.getInstance());
+ }
+
+ @Override
+ public void onCanAddCallChanged(boolean canAddCall) {
+ if (getUi() != null && mCall != null) {
+ updateButtonsState(mCall);
+ }
+ }
+
+ @Override
+ public void onAudioMode(int mode) {
+ if (getUi() != null) {
+ getUi().setAudio(mode);
+ }
+ }
+
+ @Override
+ public void onSupportedAudioMode(int mask) {
+ if (getUi() != null) {
+ getUi().setSupportedAudio(mask);
+ }
+ }
+
+ @Override
+ public void onMute(boolean muted) {
+ if (getUi() != null && !mAutomaticallyMuted) {
+ getUi().setMute(muted);
+ }
+ }
+
+ public int getAudioMode() {
+ return AudioModeProvider.getInstance().getAudioMode();
+ }
+
+ public int getSupportedAudio() {
+ return AudioModeProvider.getInstance().getSupportedModes();
+ }
+
+ public void setAudioMode(int mode) {
+
+ // TODO: Set a intermediate state in this presenter until we get
+ // an update for onAudioMode(). This will make UI response immediate
+ // if it turns out to be slow
+
+ Log.d(this, "Sending new Audio Mode: " + CallAudioState.audioRouteToString(mode));
+ TelecomAdapter.getInstance().setAudioRoute(mode);
+ }
+
+ /**
+ * Function assumes that bluetooth is not supported.
+ */
+ public void toggleSpeakerphone() {
+ // this function should not be called if bluetooth is available
+ if (0 != (CallAudioState.ROUTE_BLUETOOTH & getSupportedAudio())) {
+
+ // It's clear the UI is wrong, so update the supported mode once again.
+ Log.e(this, "toggling speakerphone not allowed when bluetooth supported.");
+ getUi().setSupportedAudio(getSupportedAudio());
+ return;
+ }
+
+ int newMode = CallAudioState.ROUTE_SPEAKER;
+
+ // if speakerphone is already on, change to wired/earpiece
+ if (getAudioMode() == CallAudioState.ROUTE_SPEAKER) {
+ newMode = CallAudioState.ROUTE_WIRED_OR_EARPIECE;
+ }
+
+ setAudioMode(newMode);
+ }
+
+ public void muteClicked(boolean checked) {
+ Log.d(this, "turning on mute: " + checked);
+ TelecomAdapter.getInstance().mute(checked);
+ }
+
+ public void holdClicked(boolean checked) {
+ if (mCall == null) {
+ return;
+ }
+ if (checked) {
+ Log.i(this, "Putting the call on hold: " + mCall);
+ TelecomAdapter.getInstance().holdCall(mCall.getId());
+ } else {
+ Log.i(this, "Removing the call from hold: " + mCall);
+ TelecomAdapter.getInstance().unholdCall(mCall.getId());
+ }
+ }
+
+ public void swapClicked() {
+ if (mCall == null) {
+ return;
+ }
+
+ Log.i(this, "Swapping the call: " + mCall);
+ TelecomAdapter.getInstance().swap(mCall.getId());
+ }
+
+ public void mergeClicked() {
+ TelecomAdapter.getInstance().merge(mCall.getId());
+ }
+
+ public void addCallClicked() {
+ // Automatically mute the current call
+ mAutomaticallyMuted = true;
+ mPreviousMuteState = AudioModeProvider.getInstance().getMute();
+ // Simulate a click on the mute button
+ muteClicked(true);
+ TelecomAdapter.getInstance().addCall();
+ }
+
+ public void changeToVoiceClicked() {
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+
+ VideoProfile videoProfile = new VideoProfile(VideoProfile.STATE_AUDIO_ONLY);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ }
+
+ public void showDialpadClicked(boolean checked) {
+ Log.v(this, "Show dialpad " + String.valueOf(checked));
+ getUi().displayDialpad(checked /* show */, true /* animate */);
+ }
+
+ public void changeToVideoClicked() {
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+ int currVideoState = mCall.getVideoState();
+ int currUnpausedVideoState = VideoUtils.getUnPausedVideoState(currVideoState);
+ currUnpausedVideoState |= VideoProfile.STATE_BIDIRECTIONAL;
+
+ VideoProfile videoProfile = new VideoProfile(currUnpausedVideoState);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ mCall.setSessionModificationState(Call.SessionModificationState.WAITING_FOR_RESPONSE);
+ }
+
+ /**
+ * Switches the camera between the front-facing and back-facing camera.
+ * @param useFrontFacingCamera True if we should switch to using the front-facing camera, or
+ * false if we should switch to using the back-facing camera.
+ */
+ public void switchCameraClicked(boolean useFrontFacingCamera) {
+ InCallCameraManager cameraManager = InCallPresenter.getInstance().getInCallCameraManager();
+ cameraManager.setUseFrontFacingCamera(useFrontFacingCamera);
+
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+
+ String cameraId = cameraManager.getActiveCameraId();
+ if (cameraId != null) {
+ final int cameraDir = cameraManager.isUsingFrontFacingCamera()
+ ? Call.VideoSettings.CAMERA_DIRECTION_FRONT_FACING
+ : Call.VideoSettings.CAMERA_DIRECTION_BACK_FACING;
+ mCall.getVideoSettings().setCameraDir(cameraDir);
+ videoCall.setCamera(cameraId);
+ videoCall.requestCameraCapabilities();
+ }
+ }
+
+
+ /**
+ * Stop or start client's video transmission.
+ * @param pause True if pausing the local user's video, or false if starting the local user's
+ * video.
+ */
+ public void pauseVideoClicked(boolean pause) {
+ VideoCall videoCall = mCall.getVideoCall();
+ if (videoCall == null) {
+ return;
+ }
+
+ if (pause) {
+ videoCall.setCamera(null);
+ VideoProfile videoProfile = new VideoProfile(
+ mCall.getVideoState() & ~VideoProfile.STATE_TX_ENABLED);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ } else {
+ InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+ videoCall.setCamera(cameraManager.getActiveCameraId());
+ VideoProfile videoProfile = new VideoProfile(
+ mCall.getVideoState() | VideoProfile.STATE_TX_ENABLED);
+ videoCall.sendSessionModifyRequest(videoProfile);
+ mCall.setSessionModificationState(Call.SessionModificationState.WAITING_FOR_RESPONSE);
+ }
+ getUi().setVideoPaused(pause);
+ }
+
+ private void updateUi(InCallState state, Call call) {
+ Log.d(this, "Updating call UI for call: ", call);
+
+ final CallButtonUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ final boolean isEnabled =
+ state.isConnectingOrConnected() &&!state.isIncoming() && call != null;
+ ui.setEnabled(isEnabled);
+
+ if (call == null) {
+ return;
+ }
+
+ updateButtonsState(call);
+ }
+
+ /**
+ * Updates the buttons applicable for the UI.
+ *
+ * @param call The active call.
+ */
+ private void updateButtonsState(Call call) {
+ Log.v(this, "updateButtonsState");
+ final CallButtonUi ui = getUi();
+
+ final boolean isVideo = VideoUtils.isVideoCall(call);
+
+ // Common functionality (audio, hold, etc).
+ // Show either HOLD or SWAP, but not both. If neither HOLD or SWAP is available:
+ // (1) If the device normally can hold, show HOLD in a disabled state.
+ // (2) If the device doesn't have the concept of hold/swap, remove the button.
+ final boolean showSwap = call.can(
+ android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE);
+ final boolean showHold = !showSwap
+ && call.can(android.telecom.Call.Details.CAPABILITY_SUPPORT_HOLD)
+ && call.can(android.telecom.Call.Details.CAPABILITY_HOLD);
+ final boolean isCallOnHold = call.getState() == Call.State.ONHOLD;
+
+ final boolean showAddCall = TelecomAdapter.getInstance().canAddCall()
+ && UserManagerCompat.isUserUnlocked(ui.getContext());
+ final boolean showMerge = call.can(
+ android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE);
+ final boolean showUpgradeToVideo = !isVideo && hasVideoCallCapabilities(call);
+ final boolean showDowngradeToAudio = isVideo && isDowngradeToAudioSupported(call);
+ final boolean showMute = call.can(android.telecom.Call.Details.CAPABILITY_MUTE);
+
+ ui.showButton(BUTTON_AUDIO, true);
+ ui.showButton(BUTTON_SWAP, showSwap);
+ ui.showButton(BUTTON_HOLD, showHold);
+ ui.setHold(isCallOnHold);
+ ui.showButton(BUTTON_MUTE, showMute);
+ ui.showButton(BUTTON_ADD_CALL, showAddCall);
+ ui.showButton(BUTTON_UPGRADE_TO_VIDEO, showUpgradeToVideo);
+ ui.showButton(BUTTON_DOWNGRADE_TO_AUDIO, showDowngradeToAudio);
+ ui.showButton(BUTTON_SWITCH_CAMERA, isVideo);
+ ui.showButton(BUTTON_PAUSE_VIDEO, isVideo);
+ ui.showButton(BUTTON_DIALPAD, true);
+ ui.showButton(BUTTON_MERGE, showMerge);
+
+ ui.updateButtonStates();
+ }
+
+ private boolean hasVideoCallCapabilities(Call call) {
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M) {
+ return call.can(android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX)
+ && call.can(android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_REMOTE_RX);
+ }
+ // In L, this single flag represents both video transmitting and receiving capabilities
+ return call.can(android.telecom.Call.Details.CAPABILITY_SUPPORTS_VT_LOCAL_TX);
+ }
+
+ /**
+ * Determines if downgrading from a video call to an audio-only call is supported. In order to
+ * support downgrade to audio, the SDK version must be >= N and the call should NOT have the
+ * {@link android.telecom.Call.Details#CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO}.
+ * @param call The call.
+ * @return {@code true} if downgrading to an audio-only call from a video call is supported.
+ */
+ private boolean isDowngradeToAudioSupported(Call call) {
+ return !call.can(CallSdkCompat.Details.CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO);
+ }
+
+ public void refreshMuteState() {
+ // Restore the previous mute state
+ if (mAutomaticallyMuted &&
+ AudioModeProvider.getInstance().getMute() != mPreviousMuteState) {
+ if (getUi() == null) {
+ return;
+ }
+ muteClicked(mPreviousMuteState);
+ }
+ mAutomaticallyMuted = false;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_AUTOMATICALLY_MUTED, mAutomaticallyMuted);
+ outState.putBoolean(KEY_PREVIOUS_MUTE_STATE, mPreviousMuteState);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ mAutomaticallyMuted =
+ savedInstanceState.getBoolean(KEY_AUTOMATICALLY_MUTED, mAutomaticallyMuted);
+ mPreviousMuteState =
+ savedInstanceState.getBoolean(KEY_PREVIOUS_MUTE_STATE, mPreviousMuteState);
+ super.onRestoreInstanceState(savedInstanceState);
+ }
+
+ public interface CallButtonUi extends Ui {
+ void showButton(int buttonId, boolean show);
+ void enableButton(int buttonId, boolean enable);
+ void setEnabled(boolean on);
+ void setMute(boolean on);
+ void setHold(boolean on);
+ void setCameraSwitched(boolean isBackFacingCamera);
+ void setVideoPaused(boolean isPaused);
+ void setAudio(int mode);
+ void setSupportedAudio(int mask);
+ void displayDialpad(boolean on, boolean animate);
+ boolean isDialpadVisible();
+
+ /**
+ * Once showButton() has been called on each of the individual buttons in the UI, call
+ * this to configure the overflow menu appropriately.
+ */
+ void updateButtonStates();
+ Context getContext();
+ }
+
+ @Override
+ public void onActiveCameraSelectionChanged(boolean isUsingFrontFacingCamera) {
+ if (getUi() == null) {
+ return;
+ }
+ getUi().setCameraSwitched(!isUsingFrontFacingCamera);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
new file mode 100644
index 000000000..39dd5eae2
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -0,0 +1,1492 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.GradientDrawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Trace;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+import android.telecom.DisconnectCause;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnLayoutChangeListener;
+import android.view.ViewGroup;
+import android.view.ViewPropertyAnimator;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.contacts.common.widget.FloatingActionButtonController;
+import com.android.dialer.R;
+import com.android.phone.common.animation.AnimUtils;
+
+import java.util.List;
+
+/**
+ * Fragment for call card.
+ */
+public class CallCardFragment extends BaseFragment<CallCardPresenter, CallCardPresenter.CallCardUi>
+ implements CallCardPresenter.CallCardUi {
+ private static final String TAG = "CallCardFragment";
+
+ /**
+ * Internal class which represents the call state label which is to be applied.
+ */
+ private class CallStateLabel {
+ private CharSequence mCallStateLabel;
+ private boolean mIsAutoDismissing;
+
+ public CallStateLabel(CharSequence callStateLabel, boolean isAutoDismissing) {
+ mCallStateLabel = callStateLabel;
+ mIsAutoDismissing = isAutoDismissing;
+ }
+
+ public CharSequence getCallStateLabel() {
+ return mCallStateLabel;
+ }
+
+ /**
+ * Determines if the call state label should auto-dismiss.
+ *
+ * @return {@code true} if the call state label should auto-dismiss.
+ */
+ public boolean isAutoDismissing() {
+ return mIsAutoDismissing;
+ }
+ };
+
+ private static final String IS_DIALPAD_SHOWING_KEY = "is_dialpad_showing";
+
+ /**
+ * The duration of time (in milliseconds) a call state label should remain visible before
+ * resetting to its previous value.
+ */
+ private static final long CALL_STATE_LABEL_RESET_DELAY_MS = 3000;
+ /**
+ * Amount of time to wait before sending an announcement via the accessibility manager.
+ * When the call state changes to an outgoing or incoming state for the first time, the
+ * UI can often be changing due to call updates or contact lookup. This allows the UI
+ * to settle to a stable state to ensure that the correct information is announced.
+ */
+ private static final long ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS = 500;
+
+ private AnimatorSet mAnimatorSet;
+ private int mShrinkAnimationDuration;
+ private int mFabNormalDiameter;
+ private int mFabSmallDiameter;
+ private boolean mIsLandscape;
+ private boolean mHasLargePhoto;
+ private boolean mIsDialpadShowing;
+
+ // Primary caller info
+ private TextView mPhoneNumber;
+ private TextView mNumberLabel;
+ private TextView mPrimaryName;
+ private View mCallStateButton;
+ private ImageView mCallStateIcon;
+ private ImageView mCallStateVideoCallIcon;
+ private TextView mCallStateLabel;
+ private TextView mCallTypeLabel;
+ private ImageView mHdAudioIcon;
+ private ImageView mForwardIcon;
+ private View mCallNumberAndLabel;
+ private TextView mElapsedTime;
+ private Drawable mPrimaryPhotoDrawable;
+ private TextView mCallSubject;
+ private ImageView mWorkProfileIcon;
+
+ // Container view that houses the entire primary call card, including the call buttons
+ private View mPrimaryCallCardContainer;
+ // Container view that houses the primary call information
+ private ViewGroup mPrimaryCallInfo;
+ private View mCallButtonsContainer;
+ private ImageView mPhotoSmall;
+
+ // Secondary caller info
+ private View mSecondaryCallInfo;
+ private TextView mSecondaryCallName;
+ private View mSecondaryCallProviderInfo;
+ private TextView mSecondaryCallProviderLabel;
+ private View mSecondaryCallConferenceCallIcon;
+ private View mSecondaryCallVideoCallIcon;
+ private View mProgressSpinner;
+
+ // Call card content
+ private View mCallCardContent;
+ private ImageView mPhotoLarge;
+ private View mContactContext;
+ private TextView mContactContextTitle;
+ private ListView mContactContextListView;
+ private LinearLayout mContactContextListHeaders;
+
+ private View mManageConferenceCallButton;
+
+ // Dark number info bar
+ private TextView mInCallMessageLabel;
+
+ private FloatingActionButtonController mFloatingActionButtonController;
+ private View mFloatingActionButtonContainer;
+ private ImageButton mFloatingActionButton;
+ private int mFloatingActionButtonVerticalOffset;
+
+ private float mTranslationOffset;
+ private Animation mPulseAnimation;
+
+ private int mVideoAnimationDuration;
+ // Whether or not the call card is currently in the process of an animation
+ private boolean mIsAnimating;
+
+ private MaterialPalette mCurrentThemeColors;
+
+ /**
+ * Call state label to set when an auto-dismissing call state label is dismissed.
+ */
+ private CharSequence mPostResetCallStateLabel;
+ private boolean mCallStateLabelResetPending = false;
+ private Handler mHandler;
+
+ /**
+ * Determines if secondary call info is populated in the secondary call info UI.
+ */
+ private boolean mHasSecondaryCallInfo = false;
+
+ @Override
+ public CallCardPresenter.CallCardUi getUi() {
+ return this;
+ }
+
+ @Override
+ public CallCardPresenter createPresenter() {
+ return new CallCardPresenter();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mHandler = new Handler(Looper.getMainLooper());
+ mShrinkAnimationDuration = getResources().getInteger(R.integer.shrink_animation_duration);
+ mVideoAnimationDuration = getResources().getInteger(R.integer.video_animation_duration);
+ mFloatingActionButtonVerticalOffset = getResources().getDimensionPixelOffset(
+ R.dimen.floating_action_button_vertical_offset);
+ mFabNormalDiameter = getResources().getDimensionPixelOffset(
+ R.dimen.end_call_floating_action_button_diameter);
+ mFabSmallDiameter = getResources().getDimensionPixelOffset(
+ R.dimen.end_call_floating_action_button_small_diameter);
+
+ if (savedInstanceState != null) {
+ mIsDialpadShowing = savedInstanceState.getBoolean(IS_DIALPAD_SHOWING_KEY, false);
+ }
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ final CallList calls = CallList.getInstance();
+ final Call call = calls.getFirstCall();
+ getPresenter().init(getActivity(), call);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(IS_DIALPAD_SHOWING_KEY, mIsDialpadShowing);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ Trace.beginSection(TAG + " onCreate");
+ mTranslationOffset =
+ getResources().getDimensionPixelSize(R.dimen.call_card_anim_translate_y_offset);
+ final View view = inflater.inflate(R.layout.call_card_fragment, container, false);
+ Trace.endSection();
+ return view;
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ mPulseAnimation =
+ AnimationUtils.loadAnimation(view.getContext(), R.anim.call_status_pulse);
+
+ mPhoneNumber = (TextView) view.findViewById(R.id.phoneNumber);
+ mPrimaryName = (TextView) view.findViewById(R.id.name);
+ mNumberLabel = (TextView) view.findViewById(R.id.label);
+ mSecondaryCallInfo = view.findViewById(R.id.secondary_call_info);
+ mSecondaryCallProviderInfo = view.findViewById(R.id.secondary_call_provider_info);
+ mCallCardContent = view.findViewById(R.id.call_card_content);
+ mPhotoLarge = (ImageView) view.findViewById(R.id.photoLarge);
+ mPhotoLarge.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().onContactPhotoClick();
+ }
+ });
+
+ mContactContext = view.findViewById(R.id.contact_context);
+ mContactContextTitle = (TextView) view.findViewById(R.id.contactContextTitle);
+ mContactContextListView = (ListView) view.findViewById(R.id.contactContextInfo);
+ // This layout stores all the list header layouts so they can be easily removed.
+ mContactContextListHeaders = new LinearLayout(getView().getContext());
+ mContactContextListView.addHeaderView(mContactContextListHeaders);
+
+ mCallStateIcon = (ImageView) view.findViewById(R.id.callStateIcon);
+ mCallStateVideoCallIcon = (ImageView) view.findViewById(R.id.videoCallIcon);
+ mWorkProfileIcon = (ImageView) view.findViewById(R.id.workProfileIcon);
+ mCallStateLabel = (TextView) view.findViewById(R.id.callStateLabel);
+ mHdAudioIcon = (ImageView) view.findViewById(R.id.hdAudioIcon);
+ mForwardIcon = (ImageView) view.findViewById(R.id.forwardIcon);
+ mCallNumberAndLabel = view.findViewById(R.id.labelAndNumber);
+ mCallTypeLabel = (TextView) view.findViewById(R.id.callTypeLabel);
+ mElapsedTime = (TextView) view.findViewById(R.id.elapsedTime);
+ mPrimaryCallCardContainer = view.findViewById(R.id.primary_call_info_container);
+ mPrimaryCallInfo = (ViewGroup) view.findViewById(R.id.primary_call_banner);
+ mCallButtonsContainer = view.findViewById(R.id.callButtonFragment);
+ mPhotoSmall = (ImageView) view.findViewById(R.id.photoSmall);
+ mPhotoSmall.setVisibility(View.GONE);
+ mInCallMessageLabel = (TextView) view.findViewById(R.id.connectionServiceMessage);
+ mProgressSpinner = view.findViewById(R.id.progressSpinner);
+
+ mFloatingActionButtonContainer = view.findViewById(
+ R.id.floating_end_call_action_button_container);
+ mFloatingActionButton = (ImageButton) view.findViewById(
+ R.id.floating_end_call_action_button);
+ mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().endCallClicked();
+ }
+ });
+ mFloatingActionButtonController = new FloatingActionButtonController(getActivity(),
+ mFloatingActionButtonContainer, mFloatingActionButton);
+
+ mSecondaryCallInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getPresenter().secondaryInfoClicked();
+ updateFabPositionForSecondaryCallInfo();
+ }
+ });
+
+ mCallStateButton = view.findViewById(R.id.callStateButton);
+ mCallStateButton.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ getPresenter().onCallStateButtonTouched();
+ return false;
+ }
+ });
+
+ mManageConferenceCallButton = view.findViewById(R.id.manage_conference_call_button);
+ mManageConferenceCallButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ InCallActivity activity = (InCallActivity) getActivity();
+ activity.showConferenceFragment(true);
+ }
+ });
+
+ mPrimaryName.setElegantTextHeight(false);
+ mCallStateLabel.setElegantTextHeight(false);
+ mCallSubject = (TextView) view.findViewById(R.id.callSubject);
+ }
+
+ @Override
+ public void setVisible(boolean on) {
+ if (on) {
+ getView().setVisibility(View.VISIBLE);
+ } else {
+ getView().setVisibility(View.INVISIBLE);
+ }
+ }
+
+ /**
+ * Hides or shows the progress spinner.
+ *
+ * @param visible {@code True} if the progress spinner should be visible.
+ */
+ @Override
+ public void setProgressSpinnerVisible(boolean visible) {
+ mProgressSpinner.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void setContactContextTitle(View headerView) {
+ mContactContextListHeaders.removeAllViews();
+ mContactContextListHeaders.addView(headerView);
+ }
+
+ @Override
+ public void setContactContextContent(ListAdapter listAdapter) {
+ mContactContextListView.setAdapter(listAdapter);
+ }
+
+ @Override
+ public void showContactContext(boolean show) {
+ showImageView(mPhotoLarge, !show);
+ showImageView(mPhotoSmall, show);
+ mPrimaryCallCardContainer.setElevation(
+ show ? 0 : getResources().getDimension(R.dimen.primary_call_elevation));
+ mContactContext.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Sets the visibility of the primary call card.
+ * Ensures that when the primary call card is hidden, the video surface slides over to fill the
+ * entire screen.
+ *
+ * @param visible {@code True} if the primary call card should be visible.
+ */
+ @Override
+ public void setCallCardVisible(final boolean visible) {
+ Log.v(this, "setCallCardVisible : isVisible = " + visible);
+ // When animating the hide/show of the views in a landscape layout, we need to take into
+ // account whether we are in a left-to-right locale or a right-to-left locale and adjust
+ // the animations accordingly.
+ final boolean isLayoutRtl = InCallPresenter.isRtl();
+
+ // Retrieve here since at fragment creation time the incoming video view is not inflated.
+ final View videoView = getView().findViewById(R.id.incomingVideo);
+ if (videoView == null) {
+ return;
+ }
+
+ // Determine how much space there is below or to the side of the call card.
+ final float spaceBesideCallCard = getSpaceBesideCallCard();
+
+ // We need to translate the video surface, but we need to know its position after the layout
+ // has occurred so use a {@code ViewTreeObserver}.
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+ observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ // We don't want to continue getting called.
+ getView().getViewTreeObserver().removeOnPreDrawListener(this);
+
+ float videoViewTranslation = 0f;
+
+ // Translate the call card to its pre-animation state.
+ if (!mIsLandscape) {
+ mPrimaryCallCardContainer.setTranslationY(visible ?
+ -mPrimaryCallCardContainer.getHeight() : 0);
+
+ ViewGroup.LayoutParams p = videoView.getLayoutParams();
+ videoViewTranslation = p.height / 2 - spaceBesideCallCard / 2;
+ }
+
+ // Perform animation of video view.
+ ViewPropertyAnimator videoViewAnimator = videoView.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mVideoAnimationDuration);
+ if (mIsLandscape) {
+ videoViewAnimator
+ .translationX(visible ? videoViewTranslation : 0);
+ } else {
+ videoViewAnimator
+ .translationY(visible ? videoViewTranslation : 0);
+ }
+ videoViewAnimator.start();
+
+ // Animate the call card sliding.
+ ViewPropertyAnimator callCardAnimator = mPrimaryCallCardContainer.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mVideoAnimationDuration)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+ if (!visible) {
+ mPrimaryCallCardContainer.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ super.onAnimationStart(animation);
+ if (visible) {
+ mPrimaryCallCardContainer.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+
+ if (mIsLandscape) {
+ float translationX = mPrimaryCallCardContainer.getWidth();
+ translationX *= isLayoutRtl ? 1 : -1;
+ callCardAnimator
+ .translationX(visible ? 0 : translationX)
+ .start();
+ } else {
+ callCardAnimator
+ .translationY(visible ? 0 : -mPrimaryCallCardContainer.getHeight())
+ .start();
+ }
+
+ return true;
+ }
+ });
+ }
+
+ /**
+ * Determines the amount of space below the call card for portrait layouts), or beside the
+ * call card for landscape layouts.
+ *
+ * @return The amount of space below or beside the call card.
+ */
+ public float getSpaceBesideCallCard() {
+ if (mIsLandscape) {
+ return getView().getWidth() - mPrimaryCallCardContainer.getWidth();
+ } else {
+ final int callCardHeight;
+ // Retrieve the actual height of the call card, independent of whether or not the
+ // outgoing call animation is in progress. The animation does not run in landscape mode
+ // so this only needs to be done for portrait.
+ if (mPrimaryCallCardContainer.getTag(R.id.view_tag_callcard_actual_height) != null) {
+ callCardHeight = (int) mPrimaryCallCardContainer.getTag(
+ R.id.view_tag_callcard_actual_height);
+ } else {
+ callCardHeight = mPrimaryCallCardContainer.getHeight();
+ }
+ return getView().getHeight() - callCardHeight;
+ }
+ }
+
+ @Override
+ public void setPrimaryName(String name, boolean nameIsNumber) {
+ if (TextUtils.isEmpty(name)) {
+ mPrimaryName.setText(null);
+ } else {
+ mPrimaryName.setText(nameIsNumber
+ ? PhoneNumberUtilsCompat.createTtsSpannable(name)
+ : name);
+
+ // Set direction of the name field
+ int nameDirection = View.TEXT_DIRECTION_INHERIT;
+ if (nameIsNumber) {
+ nameDirection = View.TEXT_DIRECTION_LTR;
+ }
+ mPrimaryName.setTextDirection(nameDirection);
+ }
+ }
+
+ /**
+ * Sets the primary image for the contact photo.
+ *
+ * @param image The drawable to set.
+ * @param isVisible Whether the contact photo should be visible after being set.
+ */
+ @Override
+ public void setPrimaryImage(Drawable image, boolean isVisible) {
+ if (image != null) {
+ setDrawableToImageViews(image);
+ showImageView(mPhotoLarge, isVisible);
+ }
+ }
+
+ @Override
+ public void setPrimaryPhoneNumber(String number) {
+ // Set the number
+ if (TextUtils.isEmpty(number)) {
+ mPhoneNumber.setText(null);
+ mPhoneNumber.setVisibility(View.GONE);
+ } else {
+ mPhoneNumber.setText(PhoneNumberUtilsCompat.createTtsSpannable(number));
+ mPhoneNumber.setVisibility(View.VISIBLE);
+ mPhoneNumber.setTextDirection(View.TEXT_DIRECTION_LTR);
+ }
+ }
+
+ @Override
+ public void setPrimaryLabel(String label) {
+ if (!TextUtils.isEmpty(label)) {
+ mNumberLabel.setText(label);
+ mNumberLabel.setVisibility(View.VISIBLE);
+ } else {
+ mNumberLabel.setVisibility(View.GONE);
+ }
+
+ }
+
+ /**
+ * Sets the primary caller information.
+ *
+ * @param number The caller phone number.
+ * @param name The caller name.
+ * @param nameIsNumber {@code true} if the name should be shown in place of the phone number.
+ * @param label The label.
+ * @param photo The contact photo drawable.
+ * @param isSipCall {@code true} if this is a SIP call.
+ * @param isContactPhotoShown {@code true} if the contact photo should be shown (it will be
+ * updated even if it is not shown).
+ * @param isWorkCall Whether the call is placed through a work phone account or caller is a work
+ contact.
+ */
+ @Override
+ public void setPrimary(String number, String name, boolean nameIsNumber, String label,
+ Drawable photo, boolean isSipCall, boolean isContactPhotoShown, boolean isWorkCall) {
+ Log.d(this, "Setting primary call");
+ // set the name field.
+ setPrimaryName(name, nameIsNumber);
+
+ if (TextUtils.isEmpty(number) && TextUtils.isEmpty(label)) {
+ mCallNumberAndLabel.setVisibility(View.GONE);
+ mElapsedTime.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
+ } else {
+ mCallNumberAndLabel.setVisibility(View.VISIBLE);
+ mElapsedTime.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
+ }
+
+ setPrimaryPhoneNumber(number);
+
+ // Set the label (Mobile, Work, etc)
+ setPrimaryLabel(label);
+
+ showInternetCallLabel(isSipCall);
+
+ setDrawableToImageViews(photo);
+ showImageView(mPhotoLarge, isContactPhotoShown);
+ showImageView(mWorkProfileIcon, isWorkCall);
+ }
+
+ @Override
+ public void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
+ String providerLabel, boolean isConference, boolean isVideoCall, boolean isFullscreen) {
+
+ if (show) {
+ mHasSecondaryCallInfo = true;
+ boolean hasProvider = !TextUtils.isEmpty(providerLabel);
+ initializeSecondaryCallInfo(hasProvider);
+
+ // Do not show the secondary caller info in fullscreen mode, but ensure it is populated
+ // in case fullscreen mode is exited in the future.
+ setSecondaryInfoVisible(!isFullscreen);
+
+ mSecondaryCallConferenceCallIcon.setVisibility(isConference ? View.VISIBLE : View.GONE);
+ mSecondaryCallVideoCallIcon.setVisibility(isVideoCall ? View.VISIBLE : View.GONE);
+
+ mSecondaryCallName.setText(nameIsNumber
+ ? PhoneNumberUtilsCompat.createTtsSpannable(name)
+ : name);
+ if (hasProvider) {
+ mSecondaryCallProviderLabel.setText(providerLabel);
+ }
+
+ int nameDirection = View.TEXT_DIRECTION_INHERIT;
+ if (nameIsNumber) {
+ nameDirection = View.TEXT_DIRECTION_LTR;
+ }
+ mSecondaryCallName.setTextDirection(nameDirection);
+ } else {
+ mHasSecondaryCallInfo = false;
+ setSecondaryInfoVisible(false);
+ }
+ }
+
+ /**
+ * Sets the visibility of the secondary caller info box. Note, if the {@code visible} parameter
+ * is passed in {@code true}, and there is no secondary caller info populated (as determined by
+ * {@code mHasSecondaryCallInfo}, the secondary caller info box will not be shown.
+ *
+ * @param visible {@code true} if the secondary caller info should be shown, {@code false}
+ * otherwise.
+ */
+ @Override
+ public void setSecondaryInfoVisible(final boolean visible) {
+ boolean wasVisible = mSecondaryCallInfo.isShown();
+ final boolean isVisible = visible && mHasSecondaryCallInfo;
+ Log.v(this, "setSecondaryInfoVisible: wasVisible = " + wasVisible + " isVisible = "
+ + isVisible);
+
+ // If visibility didn't change, nothing to do.
+ if (wasVisible == isVisible) {
+ return;
+ }
+
+ // If we are showing the secondary info, we need to show it before animating so that its
+ // height will be determined on layout.
+ if (isVisible) {
+ mSecondaryCallInfo.setVisibility(View.VISIBLE);
+ } else {
+ mSecondaryCallInfo.setVisibility(View.GONE);
+ }
+
+ updateFabPositionForSecondaryCallInfo();
+ // We need to translate the secondary caller info, but we need to know its position after
+ // the layout has occurred so use a {@code ViewTreeObserver}.
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+
+ observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ // We don't want to continue getting called.
+ getView().getViewTreeObserver().removeOnPreDrawListener(this);
+
+ // Get the height of the secondary call info now, and then re-hide the view prior
+ // to doing the actual animation.
+ int secondaryHeight = mSecondaryCallInfo.getHeight();
+ if (isVisible) {
+ mSecondaryCallInfo.setVisibility(View.GONE);
+ } else {
+ mSecondaryCallInfo.setVisibility(View.VISIBLE);
+ }
+ Log.v(this, "setSecondaryInfoVisible: secondaryHeight = " + secondaryHeight);
+
+ // Set the position of the secondary call info card to its starting location.
+ mSecondaryCallInfo.setTranslationY(visible ? secondaryHeight : 0);
+
+ // Animate the secondary card info slide up/down as it appears and disappears.
+ ViewPropertyAnimator secondaryInfoAnimator = mSecondaryCallInfo.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mVideoAnimationDuration)
+ .translationY(isVisible ? 0 : secondaryHeight)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!isVisible) {
+ mSecondaryCallInfo.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+ if (isVisible) {
+ mSecondaryCallInfo.setVisibility(View.VISIBLE);
+ }
+ }
+ });
+ secondaryInfoAnimator.start();
+
+ // Notify listeners of a change in the visibility of the secondary info. This is
+ // important when in a video call so that the video call presenter can shift the
+ // video preview up or down to accommodate the secondary caller info.
+ InCallPresenter.getInstance().notifySecondaryCallerInfoVisibilityChanged(visible,
+ secondaryHeight);
+
+ return true;
+ }
+ });
+ }
+
+ @Override
+ public void setCallState(
+ int state,
+ int videoState,
+ int sessionModificationState,
+ DisconnectCause disconnectCause,
+ String connectionLabel,
+ Drawable callStateIcon,
+ String gatewayNumber,
+ boolean isWifi,
+ boolean isConference,
+ boolean isWorkCall) {
+ boolean isGatewayCall = !TextUtils.isEmpty(gatewayNumber);
+ CallStateLabel callStateLabel = getCallStateLabelFromState(state, videoState,
+ sessionModificationState, disconnectCause, connectionLabel, isGatewayCall, isWifi,
+ isConference, isWorkCall);
+
+ Log.v(this, "setCallState " + callStateLabel.getCallStateLabel());
+ Log.v(this, "AutoDismiss " + callStateLabel.isAutoDismissing());
+ Log.v(this, "DisconnectCause " + disconnectCause.toString());
+ Log.v(this, "gateway " + connectionLabel + gatewayNumber);
+
+ // Check for video state change and update the visibility of the contact photo. The contact
+ // photo is hidden when the incoming video surface is shown.
+ // The contact photo visibility can also change in setPrimary().
+ boolean showContactPhoto = !VideoCallPresenter.showIncomingVideo(videoState, state);
+ mPhotoLarge.setVisibility(showContactPhoto ? View.VISIBLE : View.GONE);
+
+ // Check if the call subject is showing -- if it is, we want to bypass showing the call
+ // state.
+ boolean isSubjectShowing = mCallSubject.getVisibility() == View.VISIBLE;
+
+ if (TextUtils.equals(callStateLabel.getCallStateLabel(), mCallStateLabel.getText()) &&
+ !isSubjectShowing) {
+ // Nothing to do if the labels are the same
+ if (state == Call.State.ACTIVE || state == Call.State.CONFERENCED) {
+ mCallStateLabel.clearAnimation();
+ mCallStateIcon.clearAnimation();
+ }
+ return;
+ }
+
+ if (isSubjectShowing) {
+ changeCallStateLabel(null);
+ callStateIcon = null;
+ } else {
+ // Update the call state label and icon.
+ setCallStateLabel(callStateLabel);
+ }
+
+ if (!TextUtils.isEmpty(callStateLabel.getCallStateLabel())) {
+ if (state == Call.State.ACTIVE || state == Call.State.CONFERENCED) {
+ mCallStateLabel.clearAnimation();
+ } else {
+ mCallStateLabel.startAnimation(mPulseAnimation);
+ }
+ } else {
+ mCallStateLabel.clearAnimation();
+ }
+
+ if (callStateIcon != null) {
+ mCallStateIcon.setVisibility(View.VISIBLE);
+ // Invoke setAlpha(float) instead of setAlpha(int) to set the view's alpha. This is
+ // needed because the pulse animation operates on the view alpha.
+ mCallStateIcon.setAlpha(1.0f);
+ mCallStateIcon.setImageDrawable(callStateIcon);
+
+ if (state == Call.State.ACTIVE || state == Call.State.CONFERENCED
+ || TextUtils.isEmpty(callStateLabel.getCallStateLabel())) {
+ mCallStateIcon.clearAnimation();
+ } else {
+ mCallStateIcon.startAnimation(mPulseAnimation);
+ }
+
+ if (callStateIcon instanceof AnimationDrawable) {
+ ((AnimationDrawable) callStateIcon).start();
+ }
+ } else {
+ mCallStateIcon.clearAnimation();
+
+ // Invoke setAlpha(float) instead of setAlpha(int) to set the view's alpha. This is
+ // needed because the pulse animation operates on the view alpha.
+ mCallStateIcon.setAlpha(0.0f);
+ mCallStateIcon.setVisibility(View.GONE);
+ }
+
+ if (VideoUtils.isVideoCall(videoState)
+ || (state == Call.State.ACTIVE && sessionModificationState
+ == Call.SessionModificationState.WAITING_FOR_RESPONSE)) {
+ mCallStateVideoCallIcon.setVisibility(View.VISIBLE);
+ } else {
+ mCallStateVideoCallIcon.setVisibility(View.GONE);
+ }
+ }
+
+ private void setCallStateLabel(CallStateLabel callStateLabel) {
+ Log.v(this, "setCallStateLabel : label = " + callStateLabel.getCallStateLabel());
+
+ if (callStateLabel.isAutoDismissing()) {
+ mCallStateLabelResetPending = true;
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Log.v(this, "restoringCallStateLabel : label = " +
+ mPostResetCallStateLabel);
+ changeCallStateLabel(mPostResetCallStateLabel);
+ mCallStateLabelResetPending = false;
+ }
+ }, CALL_STATE_LABEL_RESET_DELAY_MS);
+
+ changeCallStateLabel(callStateLabel.getCallStateLabel());
+ } else {
+ // Keep track of the current call state label; used when resetting auto dismissing
+ // call state labels.
+ mPostResetCallStateLabel = callStateLabel.getCallStateLabel();
+
+ if (!mCallStateLabelResetPending) {
+ changeCallStateLabel(callStateLabel.getCallStateLabel());
+ }
+ }
+ }
+
+ private void changeCallStateLabel(CharSequence callStateLabel) {
+ Log.v(this, "changeCallStateLabel : label = " + callStateLabel);
+ if (!TextUtils.isEmpty(callStateLabel)) {
+ mCallStateLabel.setText(callStateLabel);
+ mCallStateLabel.setAlpha(1);
+ mCallStateLabel.setVisibility(View.VISIBLE);
+ } else {
+ Animation callStateLabelAnimation = mCallStateLabel.getAnimation();
+ if (callStateLabelAnimation != null) {
+ callStateLabelAnimation.cancel();
+ }
+ mCallStateLabel.setText(null);
+ mCallStateLabel.setAlpha(0);
+ mCallStateLabel.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void setCallbackNumber(String callbackNumber, boolean isEmergencyCall) {
+ if (mInCallMessageLabel == null) {
+ return;
+ }
+
+ if (TextUtils.isEmpty(callbackNumber)) {
+ mInCallMessageLabel.setVisibility(View.GONE);
+ return;
+ }
+
+ // TODO: The new Locale-specific methods don't seem to be working. Revisit this.
+ callbackNumber = PhoneNumberUtils.formatNumber(callbackNumber);
+
+ int stringResourceId = isEmergencyCall ? R.string.card_title_callback_number_emergency
+ : R.string.card_title_callback_number;
+
+ String text = getString(stringResourceId, callbackNumber);
+ mInCallMessageLabel.setText(text);
+
+ mInCallMessageLabel.setVisibility(View.VISIBLE);
+ }
+
+ /**
+ * Sets and shows the call subject if it is not empty. Hides the call subject otherwise.
+ *
+ * @param callSubject The call subject.
+ */
+ @Override
+ public void setCallSubject(String callSubject) {
+ boolean showSubject = !TextUtils.isEmpty(callSubject);
+
+ mCallSubject.setVisibility(showSubject ? View.VISIBLE : View.GONE);
+ if (showSubject) {
+ mCallSubject.setText(callSubject);
+ } else {
+ mCallSubject.setText(null);
+ }
+ }
+
+ public boolean isAnimating() {
+ return mIsAnimating;
+ }
+
+ private void showInternetCallLabel(boolean show) {
+ if (show) {
+ final String label = getView().getContext().getString(
+ R.string.incall_call_type_label_sip);
+ mCallTypeLabel.setVisibility(View.VISIBLE);
+ mCallTypeLabel.setText(label);
+ } else {
+ mCallTypeLabel.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void setPrimaryCallElapsedTime(boolean show, long duration) {
+ if (show) {
+ if (mElapsedTime.getVisibility() != View.VISIBLE) {
+ AnimUtils.fadeIn(mElapsedTime, AnimUtils.DEFAULT_DURATION);
+ }
+ String callTimeElapsed = DateUtils.formatElapsedTime(duration / 1000);
+ mElapsedTime.setText(callTimeElapsed);
+
+ String durationDescription =
+ InCallDateUtils.formatDuration(getView().getContext(), duration);
+ mElapsedTime.setContentDescription(
+ !TextUtils.isEmpty(durationDescription) ? durationDescription : null);
+ } else {
+ // hide() animation has no effect if it is already hidden.
+ AnimUtils.fadeOut(mElapsedTime, AnimUtils.DEFAULT_DURATION);
+ }
+ }
+
+ /**
+ * Set all the ImageViews to the same photo. Currently there are 2 photo views: the large one
+ * (which fills about the bottom half of the screen) and the small one, which displays as a
+ * circle next to the primary contact info. This method does not handle whether the ImageView
+ * is shown or not.
+ *
+ * @param photo The photo to set for the image views.
+ */
+ private void setDrawableToImageViews(Drawable photo) {
+ if (photo == null) {
+ photo = ContactInfoCache.getInstance(getView().getContext())
+ .getDefaultContactPhotoDrawable();
+ }
+
+ if (mPrimaryPhotoDrawable == photo){
+ return;
+ }
+ mPrimaryPhotoDrawable = photo;
+
+ mPhotoLarge.setImageDrawable(photo);
+
+ // Modify the drawable to be round for the smaller ImageView.
+ Bitmap bitmap = drawableToBitmap(photo);
+ if (bitmap != null) {
+ final RoundedBitmapDrawable drawable =
+ RoundedBitmapDrawableFactory.create(getResources(), bitmap);
+ drawable.setAntiAlias(true);
+ drawable.setCornerRadius(bitmap.getHeight() / 2);
+ photo = drawable;
+ }
+ mPhotoSmall.setImageDrawable(photo);
+ }
+
+ /**
+ * Helper method for image view to handle animations.
+ *
+ * @param view The image view to show or hide.
+ * @param isVisible {@code true} if we want to show the image, {@code false} to hide it.
+ */
+ private void showImageView(ImageView view, boolean isVisible) {
+ if (view.getDrawable() == null) {
+ if (isVisible) {
+ AnimUtils.fadeIn(mElapsedTime, AnimUtils.DEFAULT_DURATION);
+ }
+ } else {
+ // Cross fading is buggy and not noticeable due to the multiple calls to this method
+ // that switch drawables in the middle of the cross-fade animations. Just show the
+ // photo directly instead.
+ view.setVisibility(isVisible ? View.VISIBLE : View.GONE);
+ }
+ }
+
+ /**
+ * Converts a drawable into a bitmap.
+ *
+ * @param drawable the drawable to be converted.
+ */
+ public static Bitmap drawableToBitmap(Drawable drawable) {
+ Bitmap bitmap;
+ if (drawable instanceof BitmapDrawable) {
+ bitmap = ((BitmapDrawable) drawable).getBitmap();
+ } else {
+ if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
+ // Needed for drawables that are just a colour.
+ bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ } else {
+ bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
+ drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+ }
+
+ Log.i(TAG, "Created bitmap with width " + bitmap.getWidth() + ", height "
+ + bitmap.getHeight());
+
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ }
+ return bitmap;
+ }
+
+ /**
+ * Gets the call state label based on the state of the call or cause of disconnect.
+ *
+ * Additional labels are applied as follows:
+ * 1. All outgoing calls with display "Calling via [Provider]".
+ * 2. Ongoing calls will display the name of the provider.
+ * 3. Incoming calls will only display "Incoming via..." for accounts.
+ * 4. Video calls, and session modification states (eg. requesting video).
+ * 5. Incoming and active Wi-Fi calls will show label provided by hint.
+ *
+ * TODO: Move this to the CallCardPresenter.
+ */
+ private CallStateLabel getCallStateLabelFromState(int state, int videoState,
+ int sessionModificationState, DisconnectCause disconnectCause, String label,
+ boolean isGatewayCall, boolean isWifi, boolean isConference, boolean isWorkCall) {
+ final Context context = getView().getContext();
+ CharSequence callStateLabel = null; // Label to display as part of the call banner
+
+ boolean hasSuggestedLabel = label != null;
+ boolean isAccount = hasSuggestedLabel && !isGatewayCall;
+ boolean isAutoDismissing = false;
+
+ switch (state) {
+ case Call.State.IDLE:
+ // "Call state" is meaningless in this state.
+ break;
+ case Call.State.ACTIVE:
+ // We normally don't show a "call state label" at all in this state
+ // (but we can use the call state label to display the provider name).
+ if ((isAccount || isWifi || isConference) && hasSuggestedLabel) {
+ callStateLabel = label;
+ } else if (sessionModificationState
+ == Call.SessionModificationState.REQUEST_REJECTED) {
+ callStateLabel = context.getString(R.string.card_title_video_call_rejected);
+ isAutoDismissing = true;
+ } else if (sessionModificationState
+ == Call.SessionModificationState.REQUEST_FAILED) {
+ callStateLabel = context.getString(R.string.card_title_video_call_error);
+ isAutoDismissing = true;
+ } else if (sessionModificationState
+ == Call.SessionModificationState.WAITING_FOR_RESPONSE) {
+ callStateLabel = context.getString(R.string.card_title_video_call_requesting);
+ } else if (sessionModificationState
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ callStateLabel = context.getString(R.string.card_title_video_call_requesting);
+ } else if (VideoUtils.isVideoCall(videoState)) {
+ callStateLabel = context.getString(R.string.card_title_video_call);
+ }
+ break;
+ case Call.State.ONHOLD:
+ callStateLabel = context.getString(R.string.card_title_on_hold);
+ break;
+ case Call.State.CONNECTING:
+ case Call.State.DIALING:
+ if (hasSuggestedLabel && !isWifi) {
+ callStateLabel = context.getString(R.string.calling_via_template, label);
+ } else {
+ callStateLabel = context.getString(R.string.card_title_dialing);
+ }
+ break;
+ case Call.State.REDIALING:
+ callStateLabel = context.getString(R.string.card_title_redialing);
+ break;
+ case Call.State.INCOMING:
+ case Call.State.CALL_WAITING:
+ if (isWifi && hasSuggestedLabel) {
+ callStateLabel = label;
+ } else if (isAccount) {
+ callStateLabel = context.getString(R.string.incoming_via_template, label);
+ } else if (VideoUtils.isVideoCall(videoState)) {
+ callStateLabel = context.getString(R.string.notification_incoming_video_call);
+ } else {
+ callStateLabel =
+ context.getString(isWorkCall ? R.string.card_title_incoming_work_call
+ : R.string.card_title_incoming_call);
+ }
+ break;
+ case Call.State.DISCONNECTING:
+ // While in the DISCONNECTING state we display a "Hanging up"
+ // message in order to make the UI feel more responsive. (In
+ // GSM it's normal to see a delay of a couple of seconds while
+ // negotiating the disconnect with the network, so the "Hanging
+ // up" state at least lets the user know that we're doing
+ // something. This state is currently not used with CDMA.)
+ callStateLabel = context.getString(R.string.card_title_hanging_up);
+ break;
+ case Call.State.DISCONNECTED:
+ callStateLabel = disconnectCause.getLabel();
+ if (TextUtils.isEmpty(callStateLabel)) {
+ callStateLabel = context.getString(R.string.card_title_call_ended);
+ }
+ break;
+ case Call.State.CONFERENCED:
+ callStateLabel = context.getString(R.string.card_title_conf_call);
+ break;
+ default:
+ Log.wtf(this, "updateCallStateWidgets: unexpected call: " + state);
+ }
+ return new CallStateLabel(callStateLabel, isAutoDismissing);
+ }
+
+ private void initializeSecondaryCallInfo(boolean hasProvider) {
+ // mSecondaryCallName is initialized here (vs. onViewCreated) because it is inaccessible
+ // until mSecondaryCallInfo is inflated in the call above.
+ if (mSecondaryCallName == null) {
+ mSecondaryCallName = (TextView) getView().findViewById(R.id.secondaryCallName);
+ mSecondaryCallConferenceCallIcon =
+ getView().findViewById(R.id.secondaryCallConferenceCallIcon);
+ mSecondaryCallVideoCallIcon =
+ getView().findViewById(R.id.secondaryCallVideoCallIcon);
+ }
+
+ if (mSecondaryCallProviderLabel == null && hasProvider) {
+ mSecondaryCallProviderInfo.setVisibility(View.VISIBLE);
+ mSecondaryCallProviderLabel = (TextView) getView()
+ .findViewById(R.id.secondaryCallProviderLabel);
+ }
+ }
+
+ public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (event.getEventType() == AccessibilityEvent.TYPE_ANNOUNCEMENT) {
+ // Indicate this call is in active if no label is provided. The label is empty when
+ // the call is in active, not in other status such as onhold or dialing etc.
+ if (!mCallStateLabel.isShown() || TextUtils.isEmpty(mCallStateLabel.getText())) {
+ event.getText().add(
+ TextUtils.expandTemplate(
+ getResources().getText(R.string.accessibility_call_is_active),
+ mPrimaryName.getText()));
+ } else {
+ dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+ dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+ dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+ dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+ }
+ return;
+ }
+ dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+ dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+ dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+ dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+ dispatchPopulateAccessibilityEvent(event, mSecondaryCallName);
+ dispatchPopulateAccessibilityEvent(event, mSecondaryCallProviderLabel);
+
+ return;
+ }
+
+ @Override
+ public void sendAccessibilityAnnouncement() {
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ if (getView() != null && getView().getParent() != null &&
+ isAccessibilityEnabled(getContext())) {
+ AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_ANNOUNCEMENT);
+ dispatchPopulateAccessibilityEvent(event);
+ getView().getParent().requestSendAccessibilityEvent(getView(), event);
+ }
+ }
+
+ private boolean isAccessibilityEnabled(Context context) {
+ AccessibilityManager accessibilityManager =
+ (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ return accessibilityManager != null && accessibilityManager.isEnabled();
+
+ }
+ }, ACCESSIBILITY_ANNOUNCEMENT_DELAY_MS);
+ }
+
+ @Override
+ public void setEndCallButtonEnabled(boolean enabled, boolean animate) {
+ if (enabled != mFloatingActionButton.isEnabled()) {
+ if (animate) {
+ if (enabled) {
+ mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY);
+ } else {
+ mFloatingActionButtonController.scaleOut();
+ }
+ } else {
+ if (enabled) {
+ mFloatingActionButtonContainer.setScaleX(1);
+ mFloatingActionButtonContainer.setScaleY(1);
+ mFloatingActionButtonContainer.setVisibility(View.VISIBLE);
+ } else {
+ mFloatingActionButtonContainer.setVisibility(View.GONE);
+ }
+ }
+ mFloatingActionButton.setEnabled(enabled);
+ updateFabPosition();
+ }
+ }
+
+ /**
+ * Changes the visibility of the HD audio icon.
+ *
+ * @param visible {@code true} if the UI should show the HD audio icon.
+ */
+ @Override
+ public void showHdAudioIndicator(boolean visible) {
+ mHdAudioIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Changes the visibility of the forward icon.
+ *
+ * @param visible {@code true} if the UI should show the forward icon.
+ */
+ @Override
+ public void showForwardIndicator(boolean visible) {
+ mForwardIcon.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+
+ /**
+ * Changes the visibility of the "manage conference call" button.
+ *
+ * @param visible Whether to set the button to be visible or not.
+ */
+ @Override
+ public void showManageConferenceCallButton(boolean visible) {
+ mManageConferenceCallButton.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ /**
+ * Determines the current visibility of the manage conference button.
+ *
+ * @return {@code true} if the button is visible.
+ */
+ @Override
+ public boolean isManageConferenceVisible() {
+ return mManageConferenceCallButton.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Determines the current visibility of the call subject.
+ *
+ * @return {@code true} if the subject is visible.
+ */
+ @Override
+ public boolean isCallSubjectVisible() {
+ return mCallSubject.getVisibility() == View.VISIBLE;
+ }
+
+ /**
+ * Get the overall InCallUI background colors and apply to call card.
+ */
+ public void updateColors() {
+ MaterialPalette themeColors = InCallPresenter.getInstance().getThemeColors();
+
+ if (mCurrentThemeColors != null && mCurrentThemeColors.equals(themeColors)) {
+ return;
+ }
+
+ if (getResources().getBoolean(R.bool.is_layout_landscape)) {
+ final GradientDrawable drawable =
+ (GradientDrawable) mPrimaryCallCardContainer.getBackground();
+ drawable.setColor(themeColors.mPrimaryColor);
+ } else {
+ mPrimaryCallCardContainer.setBackgroundColor(themeColors.mPrimaryColor);
+ }
+ mCallButtonsContainer.setBackgroundColor(themeColors.mPrimaryColor);
+ mCallSubject.setTextColor(themeColors.mPrimaryColor);
+ mContactContext.setBackgroundColor(themeColors.mPrimaryColor);
+ //TODO: set color of message text in call context "recent messages" to be the theme color.
+
+ mCurrentThemeColors = themeColors;
+ }
+
+ private void dispatchPopulateAccessibilityEvent(AccessibilityEvent event, View view) {
+ if (view == null) return;
+ final List<CharSequence> eventText = event.getText();
+ int size = eventText.size();
+ view.dispatchPopulateAccessibilityEvent(event);
+ // if no text added write null to keep relative position
+ if (size == eventText.size()) {
+ eventText.add(null);
+ }
+ }
+
+ @Override
+ public void animateForNewOutgoingCall() {
+ final ViewGroup parent = (ViewGroup) mPrimaryCallCardContainer.getParent();
+
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+
+ mIsAnimating = true;
+
+ observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ final ViewTreeObserver observer = getView().getViewTreeObserver();
+ if (!observer.isAlive()) {
+ return;
+ }
+ observer.removeOnGlobalLayoutListener(this);
+
+ final LayoutIgnoringListener listener = new LayoutIgnoringListener();
+ mPrimaryCallCardContainer.addOnLayoutChangeListener(listener);
+
+ // Prepare the state of views before the slide animation
+ final int originalHeight = mPrimaryCallCardContainer.getHeight();
+ mPrimaryCallCardContainer.setTag(R.id.view_tag_callcard_actual_height,
+ originalHeight);
+ mPrimaryCallCardContainer.setBottom(parent.getHeight());
+
+ // Set up FAB.
+ mFloatingActionButtonContainer.setVisibility(View.GONE);
+ mFloatingActionButtonController.setScreenWidth(parent.getWidth());
+
+ mCallButtonsContainer.setAlpha(0);
+ mCallStateLabel.setAlpha(0);
+ mPrimaryName.setAlpha(0);
+ mCallTypeLabel.setAlpha(0);
+ mCallNumberAndLabel.setAlpha(0);
+
+ assignTranslateAnimation(mCallStateLabel, 1);
+ assignTranslateAnimation(mCallStateIcon, 1);
+ assignTranslateAnimation(mPrimaryName, 2);
+ assignTranslateAnimation(mCallNumberAndLabel, 3);
+ assignTranslateAnimation(mCallTypeLabel, 4);
+ assignTranslateAnimation(mCallButtonsContainer, 5);
+
+ final Animator animator = getShrinkAnimator(parent.getHeight(), originalHeight);
+
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mPrimaryCallCardContainer.setTag(R.id.view_tag_callcard_actual_height,
+ null);
+ setViewStatePostAnimation(listener);
+ mIsAnimating = false;
+ InCallPresenter.getInstance().onShrinkAnimationComplete();
+ }
+ });
+ animator.start();
+ }
+ });
+ }
+
+ @Override
+ public void showNoteSentToast() {
+ Toast.makeText(getContext(), R.string.note_sent, Toast.LENGTH_LONG).show();
+ }
+
+ public void onDialpadVisibilityChange(boolean isShown) {
+ mIsDialpadShowing = isShown;
+ updateFabPosition();
+ }
+
+ private void updateFabPosition() {
+ int offsetY = 0;
+ if (!mIsDialpadShowing) {
+ offsetY = mFloatingActionButtonVerticalOffset;
+ if (mSecondaryCallInfo.isShown() && mHasLargePhoto) {
+ offsetY -= mSecondaryCallInfo.getHeight();
+ }
+ }
+
+ mFloatingActionButtonController.align(
+ FloatingActionButtonController.ALIGN_MIDDLE,
+ 0 /* offsetX */,
+ offsetY,
+ true);
+
+ mFloatingActionButtonController.resize(
+ mIsDialpadShowing ? mFabSmallDiameter : mFabNormalDiameter, true);
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ // If the previous launch animation is still running, cancel it so that we don't get
+ // stuck in an intermediate animation state.
+ if (mAnimatorSet != null && mAnimatorSet.isRunning()) {
+ mAnimatorSet.cancel();
+ }
+
+ mIsLandscape = getResources().getBoolean(R.bool.is_layout_landscape);
+ mHasLargePhoto = getResources().getBoolean(R.bool.has_large_photo);
+
+ final ViewGroup parent = ((ViewGroup) mPrimaryCallCardContainer.getParent());
+ final ViewTreeObserver observer = parent.getViewTreeObserver();
+ parent.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ ViewTreeObserver viewTreeObserver = observer;
+ if (!viewTreeObserver.isAlive()) {
+ viewTreeObserver = parent.getViewTreeObserver();
+ }
+ viewTreeObserver.removeOnGlobalLayoutListener(this);
+ mFloatingActionButtonController.setScreenWidth(parent.getWidth());
+ updateFabPosition();
+ }
+ });
+
+ updateColors();
+ }
+
+ /**
+ * Adds a global layout listener to update the FAB's positioning on the next layout. This allows
+ * us to position the FAB after the secondary call info's height has been calculated.
+ */
+ private void updateFabPositionForSecondaryCallInfo() {
+ mSecondaryCallInfo.getViewTreeObserver().addOnGlobalLayoutListener(
+ new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ final ViewTreeObserver observer = mSecondaryCallInfo.getViewTreeObserver();
+ if (!observer.isAlive()) {
+ return;
+ }
+ observer.removeOnGlobalLayoutListener(this);
+
+ onDialpadVisibilityChange(mIsDialpadShowing);
+ }
+ });
+ }
+
+ /**
+ * Animator that performs the upwards shrinking animation of the blue call card scrim.
+ * At the start of the animation, each child view is moved downwards by a pre-specified amount
+ * and then translated upwards together with the scrim.
+ */
+ private Animator getShrinkAnimator(int startHeight, int endHeight) {
+ final ObjectAnimator shrinkAnimator =
+ ObjectAnimator.ofInt(mPrimaryCallCardContainer, "bottom", startHeight, endHeight);
+ shrinkAnimator.setDuration(mShrinkAnimationDuration);
+ shrinkAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mFloatingActionButton.setEnabled(true);
+ }
+ });
+ shrinkAnimator.setInterpolator(AnimUtils.EASE_IN);
+ return shrinkAnimator;
+ }
+
+ private void assignTranslateAnimation(View view, int offset) {
+ view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ view.buildLayer();
+ view.setTranslationY(mTranslationOffset * offset);
+ view.animate().translationY(0).alpha(1).withLayer()
+ .setDuration(mShrinkAnimationDuration).setInterpolator(AnimUtils.EASE_IN);
+ }
+
+ private void setViewStatePostAnimation(View view) {
+ view.setTranslationY(0);
+ view.setAlpha(1);
+ }
+
+ private void setViewStatePostAnimation(OnLayoutChangeListener layoutChangeListener) {
+ setViewStatePostAnimation(mCallButtonsContainer);
+ setViewStatePostAnimation(mCallStateLabel);
+ setViewStatePostAnimation(mPrimaryName);
+ setViewStatePostAnimation(mCallTypeLabel);
+ setViewStatePostAnimation(mCallNumberAndLabel);
+ setViewStatePostAnimation(mCallStateIcon);
+
+ mPrimaryCallCardContainer.removeOnLayoutChangeListener(layoutChangeListener);
+
+ mFloatingActionButtonController.scaleIn(AnimUtils.NO_DELAY);
+ }
+
+ private final class LayoutIgnoringListener implements View.OnLayoutChangeListener {
+ @Override
+ public void onLayoutChange(View v,
+ int left,
+ int top,
+ int right,
+ int bottom,
+ int oldLeft,
+ int oldTop,
+ int oldRight,
+ int oldBottom) {
+ v.setLeft(oldLeft);
+ v.setRight(oldRight);
+ v.setTop(oldTop);
+ v.setBottom(oldBottom);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
new file mode 100644
index 000000000..10bf5e612
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -0,0 +1,1173 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.telecom.Call.Details;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.StatusHints;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.ListAdapter;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.R;
+import com.android.incallui.Call.State;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallEventListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+import com.android.incalluibind.ObjectFactory;
+
+import java.lang.ref.WeakReference;
+
+import static com.android.contacts.common.compat.CallSdkCompat.Details.PROPERTY_ENTERPRISE_CALL;
+/**
+ * Presenter for the Call Card Fragment.
+ * <p>
+ * This class listens for changes to InCallState and passes it along to the fragment.
+ */
+public class CallCardPresenter extends Presenter<CallCardPresenter.CallCardUi>
+ implements InCallStateListener, IncomingCallListener, InCallDetailsListener,
+ InCallEventListener, CallList.CallUpdateListener, DistanceHelper.Listener {
+
+ public interface EmergencyCallListener {
+ public void onCallUpdated(BaseFragment fragment, boolean isEmergency);
+ }
+
+ private static final String TAG = CallCardPresenter.class.getSimpleName();
+ private static final long CALL_TIME_UPDATE_INTERVAL_MS = 1000;
+
+ private final EmergencyCallListener mEmergencyCallListener =
+ ObjectFactory.newEmergencyCallListener();
+ private DistanceHelper mDistanceHelper;
+
+ private Call mPrimary;
+ private Call mSecondary;
+ private ContactCacheEntry mPrimaryContactInfo;
+ private ContactCacheEntry mSecondaryContactInfo;
+ private CallTimer mCallTimer;
+ private Context mContext;
+ @Nullable private ContactsPreferences mContactsPreferences;
+ private boolean mSpinnerShowing = false;
+ private boolean mHasShownToast = false;
+ private InCallContactInteractions mInCallContactInteractions;
+ private boolean mIsFullscreen = false;
+
+ public static class ContactLookupCallback implements ContactInfoCacheCallback {
+ private final WeakReference<CallCardPresenter> mCallCardPresenter;
+ private final boolean mIsPrimary;
+
+ public ContactLookupCallback(CallCardPresenter callCardPresenter, boolean isPrimary) {
+ mCallCardPresenter = new WeakReference<CallCardPresenter>(callCardPresenter);
+ mIsPrimary = isPrimary;
+ }
+
+ @Override
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onContactInfoComplete(callId, entry, mIsPrimary);
+ }
+ }
+
+ @Override
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onImageLoadComplete(callId, entry);
+ }
+ }
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {
+ CallCardPresenter presenter = mCallCardPresenter.get();
+ if (presenter != null) {
+ presenter.onContactInteractionsInfoComplete(callId, entry);
+ }
+ }
+ }
+
+ public CallCardPresenter() {
+ // create the call timer
+ mCallTimer = new CallTimer(new Runnable() {
+ @Override
+ public void run() {
+ updateCallTime();
+ }
+ });
+ }
+
+ public void init(Context context, Call call) {
+ mContext = Preconditions.checkNotNull(context);
+ mDistanceHelper = ObjectFactory.newDistanceHelper(mContext, this);
+ mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+
+ // Call may be null if disconnect happened already.
+ if (call != null) {
+ mPrimary = call;
+ if (shouldShowNoteSentToast(mPrimary)) {
+ final CallCardUi ui = getUi();
+ if (ui != null) {
+ ui.showNoteSentToast();
+ }
+ }
+ CallList.getInstance().addCallUpdateListener(call.getId(), this);
+
+ // start processing lookups right away.
+ if (!call.isConferenceCall()) {
+ startContactInfoSearch(call, true, call.getState() == Call.State.INCOMING);
+ } else {
+ updateContactEntry(null, true);
+ }
+ }
+
+ onStateChange(null, InCallPresenter.getInstance().getInCallState(), CallList.getInstance());
+ }
+
+ @Override
+ public void onUiReady(CallCardUi ui) {
+ super.onUiReady(ui);
+
+ if (mContactsPreferences != null) {
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ }
+
+ // Contact search may have completed before ui is ready.
+ if (mPrimaryContactInfo != null) {
+ updatePrimaryDisplayInfo();
+ }
+
+ // Register for call state changes last
+ InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
+ InCallPresenter.getInstance().addDetailsListener(this);
+ InCallPresenter.getInstance().addInCallEventListener(this);
+ }
+
+ @Override
+ public void onUiUnready(CallCardUi ui) {
+ super.onUiUnready(ui);
+
+ // stop getting call state changes
+ InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ InCallPresenter.getInstance().removeDetailsListener(this);
+ InCallPresenter.getInstance().removeInCallEventListener(this);
+ if (mPrimary != null) {
+ CallList.getInstance().removeCallUpdateListener(mPrimary.getId(), this);
+ }
+
+ if (mDistanceHelper != null) {
+ mDistanceHelper.cleanUp();
+ }
+
+ mPrimary = null;
+ mPrimaryContactInfo = null;
+ mSecondaryContactInfo = null;
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ // same logic should happen as with onStateChange()
+ onStateChange(oldState, newState, CallList.getInstance());
+ }
+
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ Log.d(this, "onStateChange() " + newState);
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ Call primary = null;
+ Call secondary = null;
+
+ if (newState == InCallState.INCOMING) {
+ primary = callList.getIncomingCall();
+ } else if (newState == InCallState.PENDING_OUTGOING || newState == InCallState.OUTGOING) {
+ primary = callList.getOutgoingCall();
+ if (primary == null) {
+ primary = callList.getPendingOutgoingCall();
+ }
+
+ // getCallToDisplay doesn't go through outgoing or incoming calls. It will return the
+ // highest priority call to display as the secondary call.
+ secondary = getCallToDisplay(callList, null, true);
+ } else if (newState == InCallState.INCALL) {
+ primary = getCallToDisplay(callList, null, false);
+ secondary = getCallToDisplay(callList, primary, true);
+ }
+
+ if (mInCallContactInteractions != null &&
+ (oldState == InCallState.INCOMING || newState == InCallState.INCOMING)) {
+ ui.showContactContext(newState != InCallState.INCOMING);
+ }
+
+ Log.d(this, "Primary call: " + primary);
+ Log.d(this, "Secondary call: " + secondary);
+
+ final boolean primaryChanged = !(Call.areSame(mPrimary, primary) &&
+ Call.areSameNumber(mPrimary, primary));
+ final boolean secondaryChanged = !(Call.areSame(mSecondary, secondary) &&
+ Call.areSameNumber(mSecondary, secondary));
+
+ mSecondary = secondary;
+ Call previousPrimary = mPrimary;
+ mPrimary = primary;
+
+ if (primaryChanged && shouldShowNoteSentToast(primary)) {
+ ui.showNoteSentToast();
+ }
+
+ // Refresh primary call information if either:
+ // 1. Primary call changed.
+ // 2. The call's ability to manage conference has changed.
+ // 3. The call subject should be shown or hidden.
+ if (shouldRefreshPrimaryInfo(primaryChanged, ui, shouldShowCallSubject(mPrimary))) {
+ // primary call has changed
+ if (previousPrimary != null) {
+ //clear progess spinner (if any) related to previous primary call
+ maybeShowProgressSpinner(previousPrimary.getState(),
+ Call.SessionModificationState.NO_REQUEST);
+ CallList.getInstance().removeCallUpdateListener(previousPrimary.getId(), this);
+ }
+ CallList.getInstance().addCallUpdateListener(mPrimary.getId(), this);
+
+ mPrimaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext, mPrimary,
+ mPrimary.getState() == Call.State.INCOMING);
+ updatePrimaryDisplayInfo();
+ maybeStartSearch(mPrimary, true);
+ maybeClearSessionModificationState(mPrimary);
+ }
+
+ if (previousPrimary != null && mPrimary == null) {
+ //clear progess spinner (if any) related to previous primary call
+ maybeShowProgressSpinner(previousPrimary.getState(),
+ Call.SessionModificationState.NO_REQUEST);
+ CallList.getInstance().removeCallUpdateListener(previousPrimary.getId(), this);
+ }
+
+ if (mSecondary == null) {
+ // Secondary call may have ended. Update the ui.
+ mSecondaryContactInfo = null;
+ updateSecondaryDisplayInfo();
+ } else if (secondaryChanged) {
+ // secondary call has changed
+ mSecondaryContactInfo = ContactInfoCache.buildCacheEntryFromCall(mContext, mSecondary,
+ mSecondary.getState() == Call.State.INCOMING);
+ updateSecondaryDisplayInfo();
+ maybeStartSearch(mSecondary, false);
+ maybeClearSessionModificationState(mSecondary);
+ }
+
+ // Start/stop timers.
+ if (isPrimaryCallActive()) {
+ Log.d(this, "Starting the calltime timer");
+ mCallTimer.start(CALL_TIME_UPDATE_INTERVAL_MS);
+ } else {
+ Log.d(this, "Canceling the calltime timer");
+ mCallTimer.cancel();
+ ui.setPrimaryCallElapsedTime(false, 0);
+ }
+
+ // Set the call state
+ int callState = Call.State.IDLE;
+ if (mPrimary != null) {
+ callState = mPrimary.getState();
+ updatePrimaryCallState();
+ } else {
+ getUi().setCallState(
+ callState,
+ VideoProfile.STATE_AUDIO_ONLY,
+ Call.SessionModificationState.NO_REQUEST,
+ new DisconnectCause(DisconnectCause.UNKNOWN),
+ null,
+ null,
+ null,
+ false /* isWifi */,
+ false /* isConference */,
+ false /* isWorkCall */);
+ getUi().showHdAudioIndicator(false);
+ }
+
+ maybeShowManageConferenceCallButton();
+
+ // Hide the end call button instantly if we're receiving an incoming call.
+ getUi().setEndCallButtonEnabled(shouldShowEndCallButton(mPrimary, callState),
+ callState != Call.State.INCOMING /* animate */);
+
+ maybeSendAccessibilityEvent(oldState, newState, primaryChanged);
+ }
+
+ @Override
+ public void onDetailsChanged(Call call, Details details) {
+ updatePrimaryCallState();
+
+ if (call.can(Details.CAPABILITY_MANAGE_CONFERENCE) !=
+ details.can(Details.CAPABILITY_MANAGE_CONFERENCE)) {
+ maybeShowManageConferenceCallButton();
+ }
+ }
+
+ @Override
+ public void onCallChanged(Call call) {
+ // No-op; specific call updates handled elsewhere.
+ }
+
+ /**
+ * Handles a change to the session modification state for a call. Triggers showing the progress
+ * spinner, as well as updating the call state label.
+ *
+ * @param sessionModificationState The new session modification state.
+ */
+ @Override
+ public void onSessionModificationStateChange(int sessionModificationState) {
+ Log.d(this, "onSessionModificationStateChange : sessionModificationState = " +
+ sessionModificationState);
+
+ if (mPrimary == null) {
+ return;
+ }
+ maybeShowProgressSpinner(mPrimary.getState(), sessionModificationState);
+ getUi().setEndCallButtonEnabled(sessionModificationState !=
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST,
+ true /* shouldAnimate */);
+ updatePrimaryCallState();
+ }
+
+ /**
+ * Handles a change to the last forwarding number by refreshing the primary call info.
+ */
+ @Override
+ public void onLastForwardedNumberChange() {
+ Log.v(this, "onLastForwardedNumberChange");
+
+ if (mPrimary == null) {
+ return;
+ }
+ updatePrimaryDisplayInfo();
+ }
+
+ /**
+ * Handles a change to the child number by refreshing the primary call info.
+ */
+ @Override
+ public void onChildNumberChange() {
+ Log.v(this, "onChildNumberChange");
+
+ if (mPrimary == null) {
+ return;
+ }
+ updatePrimaryDisplayInfo();
+ }
+
+ private boolean shouldRefreshPrimaryInfo(boolean primaryChanged, CallCardUi ui,
+ boolean shouldShowCallSubject) {
+ if (mPrimary == null) {
+ return false;
+ }
+ return primaryChanged ||
+ ui.isManageConferenceVisible() != shouldShowManageConference() ||
+ ui.isCallSubjectVisible() != shouldShowCallSubject;
+ }
+
+ private String getSubscriptionNumber() {
+ // If it's an emergency call, and they're not populating the callback number,
+ // then try to fall back to the phone sub info (to hopefully get the SIM's
+ // number directly from the telephony layer).
+ PhoneAccountHandle accountHandle = mPrimary.getAccountHandle();
+ if (accountHandle != null) {
+ TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+ PhoneAccount account = TelecomManagerCompat.getPhoneAccount(mgr, accountHandle);
+ if (account != null) {
+ return getNumberFromHandle(account.getSubscriptionAddress());
+ }
+ }
+ return null;
+ }
+
+ private void updatePrimaryCallState() {
+ if (getUi() != null && mPrimary != null) {
+ boolean isWorkCall = mPrimary.hasProperty(PROPERTY_ENTERPRISE_CALL)
+ || (mPrimaryContactInfo == null ? false
+ : mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
+ getUi().setCallState(
+ mPrimary.getState(),
+ mPrimary.getVideoState(),
+ mPrimary.getSessionModificationState(),
+ mPrimary.getDisconnectCause(),
+ getConnectionLabel(),
+ getCallStateIcon(),
+ getGatewayNumber(),
+ mPrimary.hasProperty(Details.PROPERTY_WIFI),
+ mPrimary.isConferenceCall(),
+ isWorkCall);
+
+ maybeShowHdAudioIcon();
+ setCallbackNumber();
+ }
+ }
+
+ /**
+ * Show the HD icon if the call is active and has {@link Details#PROPERTY_HIGH_DEF_AUDIO},
+ * except if the call has a last forwarded number (we will show that icon instead).
+ */
+ private void maybeShowHdAudioIcon() {
+ boolean showHdAudioIndicator =
+ isPrimaryCallActive() && mPrimary.hasProperty(Details.PROPERTY_HIGH_DEF_AUDIO) &&
+ TextUtils.isEmpty(mPrimary.getLastForwardedNumber());
+ getUi().showHdAudioIndicator(showHdAudioIndicator);
+ }
+
+ /**
+ * Only show the conference call button if we can manage the conference.
+ */
+ private void maybeShowManageConferenceCallButton() {
+ getUi().showManageConferenceCallButton(shouldShowManageConference());
+ }
+
+ /**
+ * Determines if a pending session modification exists for the current call. If so, the
+ * progress spinner is shown, and the call state is updated.
+ *
+ * @param callState The call state.
+ * @param sessionModificationState The session modification state.
+ */
+ private void maybeShowProgressSpinner(int callState, int sessionModificationState) {
+ final boolean show = sessionModificationState ==
+ Call.SessionModificationState.WAITING_FOR_RESPONSE
+ && callState == Call.State.ACTIVE;
+ if (show != mSpinnerShowing) {
+ getUi().setProgressSpinnerVisible(show);
+ mSpinnerShowing = show;
+ }
+ }
+
+ /**
+ * Determines if the manage conference button should be visible, based on the current primary
+ * call.
+ *
+ * @return {@code True} if the manage conference button should be visible.
+ */
+ private boolean shouldShowManageConference() {
+ if (mPrimary == null) {
+ return false;
+ }
+
+ return mPrimary.can(android.telecom.Call.Details.CAPABILITY_MANAGE_CONFERENCE)
+ && !mIsFullscreen;
+ }
+
+ private void setCallbackNumber() {
+ String callbackNumber = null;
+
+ // Show the emergency callback number if either:
+ // 1. This is an emergency call.
+ // 2. The phone is in Emergency Callback Mode, which means we should show the callback
+ // number.
+ boolean showCallbackNumber = mPrimary.hasProperty(Details.PROPERTY_EMERGENCY_CALLBACK_MODE);
+
+ if (mPrimary.isEmergencyCall() || showCallbackNumber) {
+ callbackNumber = getSubscriptionNumber();
+ } else {
+ StatusHints statusHints = mPrimary.getTelecomCall().getDetails().getStatusHints();
+ if (statusHints != null) {
+ Bundle extras = statusHints.getExtras();
+ if (extras != null) {
+ callbackNumber = extras.getString(TelecomManager.EXTRA_CALL_BACK_NUMBER);
+ }
+ }
+ }
+
+ final String simNumber = TelecomManagerCompat.getLine1Number(
+ InCallPresenter.getInstance().getTelecomManager(),
+ InCallPresenter.getInstance().getTelephonyManager(),
+ mPrimary.getAccountHandle());
+ if (!showCallbackNumber && PhoneNumberUtils.compare(callbackNumber, simNumber)) {
+ Log.d(this, "Numbers are the same (and callback number is not being forced to show);" +
+ " not showing the callback number");
+ callbackNumber = null;
+ }
+
+ getUi().setCallbackNumber(callbackNumber, mPrimary.isEmergencyCall() || showCallbackNumber);
+ }
+
+ public void updateCallTime() {
+ final CallCardUi ui = getUi();
+
+ if (ui == null) {
+ mCallTimer.cancel();
+ } else if (!isPrimaryCallActive()) {
+ ui.setPrimaryCallElapsedTime(false, 0);
+ mCallTimer.cancel();
+ } else {
+ final long callStart = mPrimary.getConnectTimeMillis();
+ final long duration = System.currentTimeMillis() - callStart;
+ ui.setPrimaryCallElapsedTime(true, duration);
+ }
+ }
+
+ public void onCallStateButtonTouched() {
+ Intent broadcastIntent = ObjectFactory.getCallStateButtonBroadcastIntent(mContext);
+ if (broadcastIntent != null) {
+ Log.d(this, "Sending call state button broadcast: ", broadcastIntent);
+ mContext.sendBroadcast(broadcastIntent, Manifest.permission.READ_PHONE_STATE);
+ }
+ }
+
+ /**
+ * Handles click on the contact photo by toggling fullscreen mode if the current call is a video
+ * call.
+ */
+ public void onContactPhotoClick() {
+ if (mPrimary != null && mPrimary.isVideoCall(mContext)) {
+ InCallPresenter.getInstance().toggleFullscreenMode();
+ }
+ }
+
+ private void maybeStartSearch(Call call, boolean isPrimary) {
+ // no need to start search for conference calls which show generic info.
+ if (call != null && !call.isConferenceCall()) {
+ startContactInfoSearch(call, isPrimary, call.getState() == Call.State.INCOMING);
+ }
+ }
+
+ private void maybeClearSessionModificationState(Call call) {
+ if (call.getSessionModificationState() !=
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+ }
+
+ /**
+ * Starts a query for more contact data for the save primary and secondary calls.
+ */
+ private void startContactInfoSearch(final Call call, final boolean isPrimary,
+ boolean isIncoming) {
+ final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+
+ cache.findInfo(call, isIncoming, new ContactLookupCallback(this, isPrimary));
+ }
+
+ private void onContactInfoComplete(String callId, ContactCacheEntry entry, boolean isPrimary) {
+ final boolean entryMatchesExistingCall =
+ (isPrimary && mPrimary != null && TextUtils.equals(callId, mPrimary.getId())) ||
+ (!isPrimary && mSecondary != null && TextUtils.equals(callId, mSecondary.getId()));
+ if (entryMatchesExistingCall) {
+ updateContactEntry(entry, isPrimary);
+ } else {
+ Log.w(this, "Dropping stale contact lookup info for " + callId);
+ }
+
+ final Call call = CallList.getInstance().getCallById(callId);
+ if (call != null) {
+ call.getLogState().contactLookupResult = entry.contactLookupResult;
+ }
+ if (entry.contactUri != null) {
+ CallerInfoUtils.sendViewNotification(mContext, entry.contactUri);
+ }
+ }
+
+ private void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ if (getUi() == null) {
+ return;
+ }
+
+ if (entry.photo != null) {
+ if (mPrimary != null && callId.equals(mPrimary.getId())) {
+ boolean showContactPhoto = !VideoCallPresenter.showIncomingVideo(
+ mPrimary.getVideoState(), mPrimary.getState());
+ getUi().setPrimaryImage(entry.photo, showContactPhoto);
+ }
+ }
+ }
+
+ private void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {
+ if (getUi() == null) {
+ return;
+ }
+
+ if (mPrimary != null && callId.equals(mPrimary.getId())) {
+ mPrimaryContactInfo.locationAddress = entry.locationAddress;
+ updateContactInteractions();
+ }
+ }
+
+ @Override
+ public void onLocationReady() {
+ // This will only update the contacts interactions data if the location returns after
+ // the contact information is found.
+ updateContactInteractions();
+ }
+
+ private void updateContactInteractions() {
+ if (mPrimary != null && mPrimaryContactInfo != null
+ && (mPrimaryContactInfo.locationAddress != null
+ || mPrimaryContactInfo.openingHours != null)) {
+ // TODO: This is hardcoded to "isBusiness" because functionality to differentiate
+ // between business and personal has not yet been added.
+ if (setInCallContactInteractionsType(true /* isBusiness */)) {
+ getUi().setContactContextTitle(
+ mInCallContactInteractions.getBusinessListHeaderView());
+ }
+
+ mInCallContactInteractions.setBusinessInfo(
+ mPrimaryContactInfo.locationAddress,
+ mDistanceHelper.calculateDistance(mPrimaryContactInfo.locationAddress),
+ mPrimaryContactInfo.openingHours);
+ getUi().setContactContextContent(mInCallContactInteractions.getListAdapter());
+ getUi().showContactContext(mPrimary.getState() != State.INCOMING);
+ } else {
+ getUi().showContactContext(false);
+ }
+ }
+
+ /**
+ * Update the contact interactions type so that the correct UI is shown.
+ *
+ * @param isBusiness {@code true} if the interaction is a business interaction, {@code false} if
+ * it is a personal contact.
+ *
+ * @return {@code true} if this is a new type of contact interaction (business or personal).
+ * {@code false} if it hasn't changed.
+ */
+ private boolean setInCallContactInteractionsType(boolean isBusiness) {
+ if (mInCallContactInteractions == null) {
+ mInCallContactInteractions =
+ new InCallContactInteractions(mContext, isBusiness);
+ return true;
+ }
+
+ return mInCallContactInteractions.switchContactType(isBusiness);
+ }
+
+ private void updateContactEntry(ContactCacheEntry entry, boolean isPrimary) {
+ if (isPrimary) {
+ mPrimaryContactInfo = entry;
+ updatePrimaryDisplayInfo();
+ } else {
+ mSecondaryContactInfo = entry;
+ updateSecondaryDisplayInfo();
+ }
+ }
+
+ /**
+ * Get the highest priority call to display.
+ * Goes through the calls and chooses which to return based on priority of which type of call
+ * to display to the user. Callers can use the "ignore" feature to get the second best call
+ * by passing a previously found primary call as ignore.
+ *
+ * @param ignore A call to ignore if found.
+ */
+ private Call getCallToDisplay(CallList callList, Call ignore, boolean skipDisconnected) {
+ // Active calls come second. An active call always gets precedent.
+ Call retval = callList.getActiveCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+
+ // Sometimes there is intemediate state that two calls are in active even one is about
+ // to be on hold.
+ retval = callList.getSecondActiveCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+
+ // Disconnected calls get primary position if there are no active calls
+ // to let user know quickly what call has disconnected. Disconnected
+ // calls are very short lived.
+ if (!skipDisconnected) {
+ retval = callList.getDisconnectingCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+ retval = callList.getDisconnectedCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+ }
+
+ // Then we go to background call (calls on hold)
+ retval = callList.getBackgroundCall();
+ if (retval != null && retval != ignore) {
+ return retval;
+ }
+
+ // Lastly, we go to a second background call.
+ retval = callList.getSecondBackgroundCall();
+
+ return retval;
+ }
+
+ private void updatePrimaryDisplayInfo() {
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ // TODO: May also occur if search result comes back after ui is destroyed. Look into
+ // removing that case completely.
+ Log.d(TAG, "updatePrimaryDisplayInfo called but ui is null!");
+ return;
+ }
+
+ if (mPrimary == null) {
+ // Clear the primary display info.
+ ui.setPrimary(null, null, false, null, null, false, false, false);
+ return;
+ }
+
+ // Hide the contact photo if we are in a video call and the incoming video surface is
+ // showing.
+ boolean showContactPhoto = !VideoCallPresenter
+ .showIncomingVideo(mPrimary.getVideoState(), mPrimary.getState());
+
+ // Call placed through a work phone account.
+ boolean hasWorkCallProperty = mPrimary.hasProperty(PROPERTY_ENTERPRISE_CALL);
+
+ if (mPrimary.isConferenceCall()) {
+ Log.d(TAG, "Update primary display info for conference call.");
+
+ ui.setPrimary(
+ null /* number */,
+ getConferenceString(mPrimary),
+ false /* nameIsNumber */,
+ null /* label */,
+ getConferencePhoto(mPrimary),
+ false /* isSipCall */,
+ showContactPhoto,
+ hasWorkCallProperty);
+ } else if (mPrimaryContactInfo != null) {
+ Log.d(TAG, "Update primary display info for " + mPrimaryContactInfo);
+
+ String name = getNameForCall(mPrimaryContactInfo);
+ String number;
+
+ boolean isChildNumberShown = !TextUtils.isEmpty(mPrimary.getChildNumber());
+ boolean isForwardedNumberShown = !TextUtils.isEmpty(mPrimary.getLastForwardedNumber());
+ boolean isCallSubjectShown = shouldShowCallSubject(mPrimary);
+
+ if (isCallSubjectShown) {
+ ui.setCallSubject(mPrimary.getCallSubject());
+ } else {
+ ui.setCallSubject(null);
+ }
+
+ if (isCallSubjectShown) {
+ number = null;
+ } else if (isChildNumberShown) {
+ number = mContext.getString(R.string.child_number, mPrimary.getChildNumber());
+ } else if (isForwardedNumberShown) {
+ // Use last forwarded number instead of second line, if present.
+ number = mPrimary.getLastForwardedNumber();
+ } else {
+ number = getNumberForCall(mPrimaryContactInfo);
+ }
+
+ ui.showForwardIndicator(isForwardedNumberShown);
+ maybeShowHdAudioIcon();
+
+ boolean nameIsNumber = name != null && name.equals(mPrimaryContactInfo.number);
+ // Call with caller that is a work contact.
+ boolean isWorkContact = (mPrimaryContactInfo.userType == ContactsUtils.USER_TYPE_WORK);
+ ui.setPrimary(
+ number,
+ name,
+ nameIsNumber,
+ isChildNumberShown || isCallSubjectShown ? null : mPrimaryContactInfo.label,
+ mPrimaryContactInfo.photo,
+ mPrimaryContactInfo.isSipCall,
+ showContactPhoto,
+ hasWorkCallProperty || isWorkContact);
+
+ updateContactInteractions();
+ } else {
+ // Clear the primary display info.
+ ui.setPrimary(null, null, false, null, null, false, false, false);
+ }
+
+ if (mEmergencyCallListener != null) {
+ boolean isEmergencyCall = mPrimary.isEmergencyCall();
+ mEmergencyCallListener.onCallUpdated((BaseFragment) ui, isEmergencyCall);
+ }
+ }
+
+ private void updateSecondaryDisplayInfo() {
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ if (mSecondary == null) {
+ // Clear the secondary display info.
+ ui.setSecondary(false, null, false, null, null, false /* isConference */,
+ false /* isVideoCall */, mIsFullscreen);
+ return;
+ }
+
+ if (mSecondary.isConferenceCall()) {
+ ui.setSecondary(
+ true /* show */,
+ getConferenceString(mSecondary),
+ false /* nameIsNumber */,
+ null /* label */,
+ getCallProviderLabel(mSecondary),
+ true /* isConference */,
+ mSecondary.isVideoCall(mContext),
+ mIsFullscreen);
+ } else if (mSecondaryContactInfo != null) {
+ Log.d(TAG, "updateSecondaryDisplayInfo() " + mSecondaryContactInfo);
+ String name = getNameForCall(mSecondaryContactInfo);
+ boolean nameIsNumber = name != null && name.equals(mSecondaryContactInfo.number);
+ ui.setSecondary(
+ true /* show */,
+ name,
+ nameIsNumber,
+ mSecondaryContactInfo.label,
+ getCallProviderLabel(mSecondary),
+ false /* isConference */,
+ mSecondary.isVideoCall(mContext),
+ mIsFullscreen);
+ } else {
+ // Clear the secondary display info.
+ ui.setSecondary(false, null, false, null, null, false /* isConference */,
+ false /* isVideoCall */, mIsFullscreen);
+ }
+ }
+
+
+ /**
+ * Gets the phone account to display for a call.
+ */
+ private PhoneAccount getAccountForCall(Call call) {
+ PhoneAccountHandle accountHandle = call.getAccountHandle();
+ if (accountHandle == null) {
+ return null;
+ }
+ return TelecomManagerCompat.getPhoneAccount(
+ InCallPresenter.getInstance().getTelecomManager(),
+ accountHandle);
+ }
+
+ /**
+ * Returns the gateway number for any existing outgoing call.
+ */
+ private String getGatewayNumber() {
+ if (hasOutgoingGatewayCall()) {
+ return getNumberFromHandle(mPrimary.getGatewayInfo().getGatewayAddress());
+ }
+ return null;
+ }
+
+ /**
+ * Return the string label to represent the call provider
+ */
+ private String getCallProviderLabel(Call call) {
+ PhoneAccount account = getAccountForCall(call);
+ TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+ if (account != null && !TextUtils.isEmpty(account.getLabel())
+ && TelecomManagerCompat.getCallCapablePhoneAccounts(mgr).size() > 1) {
+ return account.getLabel().toString();
+ }
+ return null;
+ }
+
+ /**
+ * Returns the label (line of text above the number/name) for any given call.
+ * For example, "calling via [Account/Google Voice]" for outgoing calls.
+ */
+ private String getConnectionLabel() {
+ StatusHints statusHints = mPrimary.getTelecomCall().getDetails().getStatusHints();
+ if (statusHints != null && !TextUtils.isEmpty(statusHints.getLabel())) {
+ return statusHints.getLabel().toString();
+ }
+
+ if (hasOutgoingGatewayCall() && getUi() != null) {
+ // Return the label for the gateway app on outgoing calls.
+ final PackageManager pm = mContext.getPackageManager();
+ try {
+ ApplicationInfo info = pm.getApplicationInfo(
+ mPrimary.getGatewayInfo().getGatewayProviderPackageName(), 0);
+ return pm.getApplicationLabel(info).toString();
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(this, "Gateway Application Not Found.", e);
+ return null;
+ }
+ }
+ return getCallProviderLabel(mPrimary);
+ }
+
+ private Drawable getCallStateIcon() {
+ // Return connection icon if one exists.
+ StatusHints statusHints = mPrimary.getTelecomCall().getDetails().getStatusHints();
+ if (statusHints != null && statusHints.getIcon() != null) {
+ Drawable icon = statusHints.getIcon().loadDrawable(mContext);
+ if (icon != null) {
+ return icon;
+ }
+ }
+
+ return null;
+ }
+
+ private boolean hasOutgoingGatewayCall() {
+ // We only display the gateway information while STATE_DIALING so return false for any other
+ // call state.
+ // TODO: mPrimary can be null because this is called from updatePrimaryDisplayInfo which
+ // is also called after a contact search completes (call is not present yet). Split the
+ // UI update so it can receive independent updates.
+ if (mPrimary == null) {
+ return false;
+ }
+ return Call.State.isDialing(mPrimary.getState()) && mPrimary.getGatewayInfo() != null &&
+ !mPrimary.getGatewayInfo().isEmpty();
+ }
+
+ /**
+ * Gets the name to display for the call.
+ */
+ @NeededForTesting
+ String getNameForCall(ContactCacheEntry contactInfo) {
+ String preferredName = ContactDisplayUtils.getPreferredDisplayName(
+ contactInfo.namePrimary,
+ contactInfo.nameAlternative,
+ mContactsPreferences);
+ if (TextUtils.isEmpty(preferredName)) {
+ return contactInfo.number;
+ }
+ return preferredName;
+ }
+
+ /**
+ * Gets the number to display for a call.
+ */
+ @NeededForTesting
+ String getNumberForCall(ContactCacheEntry contactInfo) {
+ // If the name is empty, we use the number for the name...so don't show a second
+ // number in the number field
+ String preferredName = ContactDisplayUtils.getPreferredDisplayName(
+ contactInfo.namePrimary,
+ contactInfo.nameAlternative,
+ mContactsPreferences);
+ if (TextUtils.isEmpty(preferredName)) {
+ return contactInfo.location;
+ }
+ return contactInfo.number;
+ }
+
+ public void secondaryInfoClicked() {
+ if (mSecondary == null) {
+ Log.w(this, "Secondary info clicked but no secondary call.");
+ return;
+ }
+
+ Log.i(this, "Swapping call to foreground: " + mSecondary);
+ TelecomAdapter.getInstance().unholdCall(mSecondary.getId());
+ }
+
+ public void endCallClicked() {
+ if (mPrimary == null) {
+ return;
+ }
+
+ Log.i(this, "Disconnecting call: " + mPrimary);
+ final String callId = mPrimary.getId();
+ mPrimary.setState(Call.State.DISCONNECTING);
+ CallList.getInstance().onUpdate(mPrimary);
+ TelecomAdapter.getInstance().disconnectCall(callId);
+ }
+
+ private String getNumberFromHandle(Uri handle) {
+ return handle == null ? "" : handle.getSchemeSpecificPart();
+ }
+
+ /**
+ * Handles a change to the fullscreen mode of the in-call UI.
+ *
+ * @param isFullscreenMode {@code True} if the in-call UI is entering full screen mode.
+ */
+ @Override
+ public void onFullscreenModeChanged(boolean isFullscreenMode) {
+ mIsFullscreen = isFullscreenMode;
+ final CallCardUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+ ui.setCallCardVisible(!isFullscreenMode);
+ ui.setSecondaryInfoVisible(!isFullscreenMode);
+ maybeShowManageConferenceCallButton();
+ }
+
+ @Override
+ public void onSecondaryCallerInfoVisibilityChanged(boolean isVisible, int height) {
+ // No-op - the Call Card is the origin of this event.
+ }
+
+ private boolean isPrimaryCallActive() {
+ return mPrimary != null && mPrimary.getState() == Call.State.ACTIVE;
+ }
+
+ private String getConferenceString(Call call) {
+ boolean isGenericConference = call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE);
+ Log.v(this, "getConferenceString: " + isGenericConference);
+
+ final int resId = isGenericConference
+ ? R.string.card_title_in_call : R.string.card_title_conf_call;
+ return mContext.getResources().getString(resId);
+ }
+
+ private Drawable getConferencePhoto(Call call) {
+ boolean isGenericConference = call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE);
+ Log.v(this, "getConferencePhoto: " + isGenericConference);
+
+ final int resId = isGenericConference
+ ? R.drawable.img_phone : R.drawable.img_conference;
+ Drawable photo = mContext.getResources().getDrawable(resId);
+ photo.setAutoMirrored(true);
+ return photo;
+ }
+
+ private boolean shouldShowEndCallButton(Call primary, int callState) {
+ if (primary == null) {
+ return false;
+ }
+ if ((!Call.State.isConnectingOrConnected(callState)
+ && callState != Call.State.DISCONNECTING) || callState == Call.State.INCOMING) {
+ return false;
+ }
+ if (mPrimary.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ return false;
+ }
+ return true;
+ }
+
+ private void maybeSendAccessibilityEvent(InCallState oldState, InCallState newState,
+ boolean primaryChanged) {
+ if (mContext == null) {
+ return;
+ }
+ final AccessibilityManager am = (AccessibilityManager) mContext.getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (!am.isEnabled()) {
+ return;
+ }
+ // Announce the current call if it's new incoming/outgoing call or primary call is changed
+ // due to switching calls between two ongoing calls (one is on hold).
+ if ((oldState != InCallState.OUTGOING && newState == InCallState.OUTGOING)
+ || (oldState != InCallState.INCOMING && newState == InCallState.INCOMING)
+ || primaryChanged) {
+ if (getUi() != null) {
+ getUi().sendAccessibilityAnnouncement();
+ }
+ }
+ }
+
+ /**
+ * Determines whether the call subject should be visible on the UI. For the call subject to be
+ * visible, the call has to be in an incoming or waiting state, and the subject must not be
+ * empty.
+ *
+ * @param call The call.
+ * @return {@code true} if the subject should be shown, {@code false} otherwise.
+ */
+ private boolean shouldShowCallSubject(Call call) {
+ if (call == null) {
+ return false;
+ }
+
+ boolean isIncomingOrWaiting = mPrimary.getState() == Call.State.INCOMING ||
+ mPrimary.getState() == Call.State.CALL_WAITING;
+ return isIncomingOrWaiting && !TextUtils.isEmpty(call.getCallSubject()) &&
+ call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED &&
+ call.isCallSubjectSupported();
+ }
+
+ /**
+ * Determines whether the "note sent" toast should be shown. It should be shown for a new
+ * outgoing call with a subject.
+ *
+ * @param call The call
+ * @return {@code true} if the toast should be shown, {@code false} otherwise.
+ */
+ private boolean shouldShowNoteSentToast(Call call) {
+ return call != null && hasCallSubject(call) && (call.getState() == Call.State.DIALING
+ || call.getState() == Call.State.CONNECTING);
+ }
+
+ private static boolean hasCallSubject(Call call) {
+ return !TextUtils.isEmpty(call.getTelecomCall().getDetails().getIntentExtras()
+ .getString(TelecomManager.EXTRA_CALL_SUBJECT));
+ }
+
+ public interface CallCardUi extends Ui {
+ void setVisible(boolean on);
+ void setContactContextTitle(View listHeaderView);
+ void setContactContextContent(ListAdapter listAdapter);
+ void showContactContext(boolean show);
+ void setCallCardVisible(boolean visible);
+ void setPrimary(String number, String name, boolean nameIsNumber, String label,
+ Drawable photo, boolean isSipCall, boolean isContactPhotoShown, boolean isWorkCall);
+ void setSecondary(boolean show, String name, boolean nameIsNumber, String label,
+ String providerLabel, boolean isConference, boolean isVideoCall,
+ boolean isFullscreen);
+ void setSecondaryInfoVisible(boolean visible);
+ void setCallState(int state, int videoState, int sessionModificationState,
+ DisconnectCause disconnectCause, String connectionLabel,
+ Drawable connectionIcon, String gatewayNumber, boolean isWifi,
+ boolean isConference, boolean isWorkCall);
+ void setPrimaryCallElapsedTime(boolean show, long duration);
+ void setPrimaryName(String name, boolean nameIsNumber);
+ void setPrimaryImage(Drawable image, boolean isVisible);
+ void setPrimaryPhoneNumber(String phoneNumber);
+ void setPrimaryLabel(String label);
+ void setEndCallButtonEnabled(boolean enabled, boolean animate);
+ void setCallbackNumber(String number, boolean isEmergencyCalls);
+ void setCallSubject(String callSubject);
+ void setProgressSpinnerVisible(boolean visible);
+ void showHdAudioIndicator(boolean visible);
+ void showForwardIndicator(boolean visible);
+ void showManageConferenceCallButton(boolean visible);
+ boolean isManageConferenceVisible();
+ boolean isCallSubjectVisible();
+ void animateForNewOutgoingCall();
+ void sendAccessibilityAnnouncement();
+ void showNoteSentToast();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
new file mode 100644
index 000000000..d0f3c1000
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -0,0 +1,678 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.os.Handler;
+import android.os.Message;
+import android.os.Trace;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.logging.Logger;
+import com.android.incallui.util.TelecomCallUtil;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Maintains the list of active calls and notifies interested classes of changes to the call list
+ * as they are received from the telephony stack. Primary listener of changes to this class is
+ * InCallPresenter.
+ */
+public class CallList {
+
+ private static final int DISCONNECTED_CALL_SHORT_TIMEOUT_MS = 200;
+ private static final int DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS = 2000;
+ private static final int DISCONNECTED_CALL_LONG_TIMEOUT_MS = 5000;
+
+ private static final int EVENT_DISCONNECTED_TIMEOUT = 1;
+ private static final long BLOCK_QUERY_TIMEOUT_MS = 1000;
+
+ private static CallList sInstance = new CallList();
+
+ private final HashMap<String, Call> mCallById = new HashMap<>();
+ private final HashMap<android.telecom.Call, Call> mCallByTelecomCall = new HashMap<>();
+ private final HashMap<String, List<String>> mCallTextReponsesMap = Maps.newHashMap();
+ /**
+ * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
+ * load factor before resizing, 1 means we only expect a single thread to
+ * access the map so make only a single shard
+ */
+ private final Set<Listener> mListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<Listener, Boolean>(8, 0.9f, 1));
+ private final HashMap<String, List<CallUpdateListener>> mCallUpdateListenerMap = Maps
+ .newHashMap();
+ private final Set<Call> mPendingDisconnectCalls = Collections.newSetFromMap(
+ new ConcurrentHashMap<Call, Boolean>(8, 0.9f, 1));
+ private FilteredNumberAsyncQueryHandler mFilteredQueryHandler;
+
+ /**
+ * Static singleton accessor method.
+ */
+ public static CallList getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * USED ONLY FOR TESTING
+ * Testing-only constructor. Instance should only be acquired through getInstance().
+ */
+ @NeededForTesting
+ CallList() {
+ }
+
+ public void onCallAdded(final android.telecom.Call telecomCall) {
+ Trace.beginSection("onCallAdded");
+ final Call call = new Call(telecomCall);
+ Log.d(this, "onCallAdded: callState=" + call.getState());
+
+ if (call.getState() == Call.State.INCOMING ||
+ call.getState() == Call.State.CALL_WAITING) {
+ onIncoming(call, call.getCannedSmsResponses());
+ } else {
+ onUpdate(call);
+ }
+
+ call.logCallInitiationType();
+ Trace.endSection();
+ }
+
+ public void onCallRemoved(android.telecom.Call telecomCall) {
+ if (mCallByTelecomCall.containsKey(telecomCall)) {
+ Call call = mCallByTelecomCall.get(telecomCall);
+ Logger.logCall(call);
+ if (updateCallInMap(call)) {
+ Log.w(this, "Removing call not previously disconnected " + call.getId());
+ }
+ updateCallTextMap(call, null);
+ }
+ }
+
+ /**
+ * Called when a single call disconnects.
+ */
+ public void onDisconnect(Call call) {
+ if (updateCallInMap(call)) {
+ Log.i(this, "onDisconnect: " + call);
+ // notify those listening for changes on this specific change
+ notifyCallUpdateListeners(call);
+ // notify those listening for all disconnects
+ notifyListenersOfDisconnect(call);
+ }
+ }
+
+ /**
+ * Called when a single call has changed.
+ */
+ public void onIncoming(Call call, List<String> textMessages) {
+ if (updateCallInMap(call)) {
+ Log.i(this, "onIncoming - " + call);
+ }
+ updateCallTextMap(call, textMessages);
+
+ for (Listener listener : mListeners) {
+ listener.onIncomingCall(call);
+ }
+ }
+
+ public void onUpgradeToVideo(Call call){
+ Log.d(this, "onUpgradeToVideo call=" + call);
+ for (Listener listener : mListeners) {
+ listener.onUpgradeToVideo(call);
+ }
+ }
+ /**
+ * Called when a single call has changed.
+ */
+ public void onUpdate(Call call) {
+ Trace.beginSection("onUpdate");
+ onUpdateCall(call);
+ notifyGenericListeners();
+ Trace.endSection();
+ }
+
+ /**
+ * Called when a single call has changed session modification state.
+ *
+ * @param call The call.
+ * @param sessionModificationState The new session modification state.
+ */
+ public void onSessionModificationStateChange(Call call, int sessionModificationState) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onSessionModificationStateChange(sessionModificationState);
+ }
+ }
+ }
+
+ /**
+ * Called when the last forwarded number changes for a call. With IMS, the last forwarded
+ * number changes due to a supplemental service notification, so it is not pressent at the
+ * start of the call.
+ *
+ * @param call The call.
+ */
+ public void onLastForwardedNumberChange(Call call) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onLastForwardedNumberChange();
+ }
+ }
+ }
+
+ /**
+ * Called when the child number changes for a call. The child number can be received after a
+ * call is initially set up, so we need to be able to inform listeners of the change.
+ *
+ * @param call The call.
+ */
+ public void onChildNumberChange(Call call) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onChildNumberChange();
+ }
+ }
+ }
+
+ public void notifyCallUpdateListeners(Call call) {
+ final List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(call.getId());
+ if (listeners != null) {
+ for (CallUpdateListener listener : listeners) {
+ listener.onCallChanged(call);
+ }
+ }
+ }
+
+ /**
+ * Add a call update listener for a call id.
+ *
+ * @param callId The call id to get updates for.
+ * @param listener The listener to add.
+ */
+ public void addCallUpdateListener(String callId, CallUpdateListener listener) {
+ List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(callId);
+ if (listeners == null) {
+ listeners = new CopyOnWriteArrayList<CallUpdateListener>();
+ mCallUpdateListenerMap.put(callId, listeners);
+ }
+ listeners.add(listener);
+ }
+
+ /**
+ * Remove a call update listener for a call id.
+ *
+ * @param callId The call id to remove the listener for.
+ * @param listener The listener to remove.
+ */
+ public void removeCallUpdateListener(String callId, CallUpdateListener listener) {
+ List<CallUpdateListener> listeners = mCallUpdateListenerMap.get(callId);
+ if (listeners != null) {
+ listeners.remove(listener);
+ }
+ }
+
+ public void addListener(Listener listener) {
+ Preconditions.checkNotNull(listener);
+
+ mListeners.add(listener);
+
+ // Let the listener know about the active calls immediately.
+ listener.onCallListChange(this);
+ }
+
+ public void removeListener(Listener listener) {
+ if (listener != null) {
+ mListeners.remove(listener);
+ }
+ }
+
+ /**
+ * TODO: Change so that this function is not needed. Instead of assuming there is an active
+ * call, the code should rely on the status of a specific Call and allow the presenters to
+ * update the Call object when the active call changes.
+ */
+ public Call getIncomingOrActive() {
+ Call retval = getIncomingCall();
+ if (retval == null) {
+ retval = getActiveCall();
+ }
+ return retval;
+ }
+
+ public Call getOutgoingOrActive() {
+ Call retval = getOutgoingCall();
+ if (retval == null) {
+ retval = getActiveCall();
+ }
+ return retval;
+ }
+
+ /**
+ * A call that is waiting for {@link PhoneAccount} selection
+ */
+ public Call getWaitingForAccountCall() {
+ return getFirstCallWithState(Call.State.SELECT_PHONE_ACCOUNT);
+ }
+
+ public Call getPendingOutgoingCall() {
+ return getFirstCallWithState(Call.State.CONNECTING);
+ }
+
+ public Call getOutgoingCall() {
+ Call call = getFirstCallWithState(Call.State.DIALING);
+ if (call == null) {
+ call = getFirstCallWithState(Call.State.REDIALING);
+ }
+ return call;
+ }
+
+ public Call getActiveCall() {
+ return getFirstCallWithState(Call.State.ACTIVE);
+ }
+
+ public Call getSecondActiveCall() {
+ return getCallWithState(Call.State.ACTIVE, 1);
+ }
+
+ public Call getBackgroundCall() {
+ return getFirstCallWithState(Call.State.ONHOLD);
+ }
+
+ public Call getDisconnectedCall() {
+ return getFirstCallWithState(Call.State.DISCONNECTED);
+ }
+
+ public Call getDisconnectingCall() {
+ return getFirstCallWithState(Call.State.DISCONNECTING);
+ }
+
+ public Call getSecondBackgroundCall() {
+ return getCallWithState(Call.State.ONHOLD, 1);
+ }
+
+ public Call getActiveOrBackgroundCall() {
+ Call call = getActiveCall();
+ if (call == null) {
+ call = getBackgroundCall();
+ }
+ return call;
+ }
+
+ public Call getIncomingCall() {
+ Call call = getFirstCallWithState(Call.State.INCOMING);
+ if (call == null) {
+ call = getFirstCallWithState(Call.State.CALL_WAITING);
+ }
+
+ return call;
+ }
+
+ public Call getFirstCall() {
+ Call result = getIncomingCall();
+ if (result == null) {
+ result = getPendingOutgoingCall();
+ }
+ if (result == null) {
+ result = getOutgoingCall();
+ }
+ if (result == null) {
+ result = getFirstCallWithState(Call.State.ACTIVE);
+ }
+ if (result == null) {
+ result = getDisconnectingCall();
+ }
+ if (result == null) {
+ result = getDisconnectedCall();
+ }
+ return result;
+ }
+
+ public boolean hasLiveCall() {
+ Call call = getFirstCall();
+ if (call == null) {
+ return false;
+ }
+ return call != getDisconnectingCall() && call != getDisconnectedCall();
+ }
+
+ /**
+ * Returns the first call found in the call map with the specified call modification state.
+ * @param state The session modification state to search for.
+ * @return The first call with the specified state.
+ */
+ public Call getVideoUpgradeRequestCall() {
+ for(Call call : mCallById.values()) {
+ if (call.getSessionModificationState() ==
+ Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ return call;
+ }
+ }
+ return null;
+ }
+
+ public Call getCallById(String callId) {
+ return mCallById.get(callId);
+ }
+
+ public Call getCallByTelecomCall(android.telecom.Call telecomCall) {
+ return mCallByTelecomCall.get(telecomCall);
+ }
+
+ public List<String> getTextResponses(String callId) {
+ return mCallTextReponsesMap.get(callId);
+ }
+
+ /**
+ * Returns first call found in the call map with the specified state.
+ */
+ public Call getFirstCallWithState(int state) {
+ return getCallWithState(state, 0);
+ }
+
+ /**
+ * Returns the [position]th call found in the call map with the specified state.
+ * TODO: Improve this logic to sort by call time.
+ */
+ public Call getCallWithState(int state, int positionToFind) {
+ Call retval = null;
+ int position = 0;
+ for (Call call : mCallById.values()) {
+ if (call.getState() == state) {
+ if (position >= positionToFind) {
+ retval = call;
+ break;
+ } else {
+ position++;
+ }
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * This is called when the service disconnects, either expectedly or unexpectedly.
+ * For the expected case, it's because we have no calls left. For the unexpected case,
+ * it is likely a crash of phone and we need to clean up our calls manually. Without phone,
+ * there can be no active calls, so this is relatively safe thing to do.
+ */
+ public void clearOnDisconnect() {
+ for (Call call : mCallById.values()) {
+ final int state = call.getState();
+ if (state != Call.State.IDLE &&
+ state != Call.State.INVALID &&
+ state != Call.State.DISCONNECTED) {
+
+ call.setState(Call.State.DISCONNECTED);
+ call.setDisconnectCause(new DisconnectCause(DisconnectCause.UNKNOWN));
+ updateCallInMap(call);
+ }
+ }
+ notifyGenericListeners();
+ }
+
+ /**
+ * Called when the user has dismissed an error dialog. This indicates acknowledgement of
+ * the disconnect cause, and that any pending disconnects should immediately occur.
+ */
+ public void onErrorDialogDismissed() {
+ final Iterator<Call> iterator = mPendingDisconnectCalls.iterator();
+ while (iterator.hasNext()) {
+ Call call = iterator.next();
+ iterator.remove();
+ finishDisconnectedCall(call);
+ }
+ }
+
+ /**
+ * Processes an update for a single call.
+ *
+ * @param call The call to update.
+ */
+ private void onUpdateCall(Call call) {
+ Log.d(this, "\t" + call);
+ if (updateCallInMap(call)) {
+ Log.i(this, "onUpdate - " + call);
+ }
+ updateCallTextMap(call, call.getCannedSmsResponses());
+ notifyCallUpdateListeners(call);
+ }
+
+ /**
+ * Sends a generic notification to all listeners that something has changed.
+ * It is up to the listeners to call back to determine what changed.
+ */
+ private void notifyGenericListeners() {
+ for (Listener listener : mListeners) {
+ listener.onCallListChange(this);
+ }
+ }
+
+ private void notifyListenersOfDisconnect(Call call) {
+ for (Listener listener : mListeners) {
+ listener.onDisconnect(call);
+ }
+ }
+
+ /**
+ * Updates the call entry in the local map.
+ * @return false if no call previously existed and no call was added, otherwise true.
+ */
+ private boolean updateCallInMap(Call call) {
+ Preconditions.checkNotNull(call);
+
+ boolean updated = false;
+
+ if (call.getState() == Call.State.DISCONNECTED) {
+ // update existing (but do not add!!) disconnected calls
+ if (mCallById.containsKey(call.getId())) {
+ // For disconnected calls, we want to keep them alive for a few seconds so that the
+ // UI has a chance to display anything it needs when a call is disconnected.
+
+ // Set up a timer to destroy the call after X seconds.
+ final Message msg = mHandler.obtainMessage(EVENT_DISCONNECTED_TIMEOUT, call);
+ mHandler.sendMessageDelayed(msg, getDelayForDisconnect(call));
+ mPendingDisconnectCalls.add(call);
+
+ mCallById.put(call.getId(), call);
+ mCallByTelecomCall.put(call.getTelecomCall(), call);
+ updated = true;
+ }
+ } else if (!isCallDead(call)) {
+ mCallById.put(call.getId(), call);
+ mCallByTelecomCall.put(call.getTelecomCall(), call);
+ updated = true;
+ } else if (mCallById.containsKey(call.getId())) {
+ mCallById.remove(call.getId());
+ mCallByTelecomCall.remove(call.getTelecomCall());
+ updated = true;
+ }
+
+ return updated;
+ }
+
+ private int getDelayForDisconnect(Call call) {
+ Preconditions.checkState(call.getState() == Call.State.DISCONNECTED);
+
+
+ final int cause = call.getDisconnectCause().getCode();
+ final int delay;
+ switch (cause) {
+ case DisconnectCause.LOCAL:
+ delay = DISCONNECTED_CALL_SHORT_TIMEOUT_MS;
+ break;
+ case DisconnectCause.REMOTE:
+ case DisconnectCause.ERROR:
+ delay = DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS;
+ break;
+ case DisconnectCause.REJECTED:
+ case DisconnectCause.MISSED:
+ case DisconnectCause.CANCELED:
+ // no delay for missed/rejected incoming calls and canceled outgoing calls.
+ delay = 0;
+ break;
+ default:
+ delay = DISCONNECTED_CALL_LONG_TIMEOUT_MS;
+ break;
+ }
+
+ return delay;
+ }
+
+ private void updateCallTextMap(Call call, List<String> textResponses) {
+ Preconditions.checkNotNull(call);
+
+ if (!isCallDead(call)) {
+ if (textResponses != null) {
+ mCallTextReponsesMap.put(call.getId(), textResponses);
+ }
+ } else if (mCallById.containsKey(call.getId())) {
+ mCallTextReponsesMap.remove(call.getId());
+ }
+ }
+
+ private boolean isCallDead(Call call) {
+ final int state = call.getState();
+ return Call.State.IDLE == state || Call.State.INVALID == state;
+ }
+
+ /**
+ * Sets up a call for deletion and notifies listeners of change.
+ */
+ private void finishDisconnectedCall(Call call) {
+ if (mPendingDisconnectCalls.contains(call)) {
+ mPendingDisconnectCalls.remove(call);
+ }
+ call.setState(Call.State.IDLE);
+ updateCallInMap(call);
+ notifyGenericListeners();
+ }
+
+ /**
+ * Notifies all video calls of a change in device orientation.
+ *
+ * @param rotation The new rotation angle (in degrees).
+ */
+ public void notifyCallsOfDeviceRotation(int rotation) {
+ for (Call call : mCallById.values()) {
+ // First, ensure that the call videoState has video enabled (there is no need to set
+ // device orientation on a voice call which has not yet been upgraded to video).
+ // Second, ensure a VideoCall is set on the call so that the change can be sent to the
+ // provider (a VideoCall can be present for a call that does not currently have video,
+ // but can be upgraded to video).
+
+ // NOTE: is it necessary to use this order because getVideoCall references the class
+ // VideoProfile which is not available on APIs <23 (M).
+ if (VideoUtils.isVideoCall(call) && call.getVideoCall() != null) {
+ call.getVideoCall().setDeviceOrientation(rotation);
+ }
+ }
+ }
+
+ /**
+ * Handles the timeout for destroying disconnected calls.
+ */
+ private Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_DISCONNECTED_TIMEOUT:
+ Log.d(this, "EVENT_DISCONNECTED_TIMEOUT ", msg.obj);
+ finishDisconnectedCall((Call) msg.obj);
+ break;
+ default:
+ Log.wtf(this, "Message not expected: " + msg.what);
+ break;
+ }
+ }
+ };
+
+ public void setFilteredNumberQueryHandler(FilteredNumberAsyncQueryHandler handler) {
+ mFilteredQueryHandler = handler;
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of changes
+ * to the call list.
+ */
+ public interface Listener {
+ /**
+ * Called when a new incoming call comes in.
+ * This is the only method that gets called for incoming calls. Listeners
+ * that want to perform an action on incoming call should respond in this method
+ * because {@link #onCallListChange} does not automatically get called for
+ * incoming calls.
+ */
+ public void onIncomingCall(Call call);
+ /**
+ * Called when a new modify call request comes in
+ * This is the only method that gets called for modify requests.
+ */
+ public void onUpgradeToVideo(Call call);
+ /**
+ * Called anytime there are changes to the call list. The change can be switching call
+ * states, updating information, etc. This method will NOT be called for new incoming
+ * calls and for calls that switch to disconnected state. Listeners must add actions
+ * to those method implementations if they want to deal with those actions.
+ */
+ public void onCallListChange(CallList callList);
+
+ /**
+ * Called when a call switches to the disconnected state. This is the only method
+ * that will get called upon disconnection.
+ */
+ public void onDisconnect(Call call);
+
+
+ }
+
+ public interface CallUpdateListener {
+ // TODO: refactor and limit arg to be call state. Caller info is not needed.
+ public void onCallChanged(Call call);
+
+ /**
+ * Notifies of a change to the session modification state for a call.
+ *
+ * @param sessionModificationState The new session modification state.
+ */
+ public void onSessionModificationStateChange(int sessionModificationState);
+
+ /**
+ * Notifies of a change to the last forwarded number for a call.
+ */
+ public void onLastForwardedNumberChange();
+
+ /**
+ * Notifies of a change to the child number for a call.
+ */
+ public void onChildNumberChange();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallTimer.java b/InCallUI/src/com/android/incallui/CallTimer.java
new file mode 100644
index 000000000..d65e63373
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallTimer.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.os.Handler;
+import android.os.SystemClock;
+
+/**
+ * Helper class used to keep track of events requiring regular intervals.
+ */
+public class CallTimer extends Handler {
+ private Runnable mInternalCallback;
+ private Runnable mCallback;
+ private long mLastReportedTime;
+ private long mInterval;
+ private boolean mRunning;
+
+ public CallTimer(Runnable callback) {
+ Preconditions.checkNotNull(callback);
+
+ mInterval = 0;
+ mLastReportedTime = 0;
+ mRunning = false;
+ mCallback = callback;
+ mInternalCallback = new CallTimerCallback();
+ }
+
+ public boolean start(long interval) {
+ if (interval <= 0) {
+ return false;
+ }
+
+ // cancel any previous timer
+ cancel();
+
+ mInterval = interval;
+ mLastReportedTime = SystemClock.uptimeMillis();
+
+ mRunning = true;
+ periodicUpdateTimer();
+
+ return true;
+ }
+
+ public void cancel() {
+ removeCallbacks(mInternalCallback);
+ mRunning = false;
+ }
+
+ private void periodicUpdateTimer() {
+ if (!mRunning) {
+ return;
+ }
+
+ final long now = SystemClock.uptimeMillis();
+ long nextReport = mLastReportedTime + mInterval;
+ while (now >= nextReport) {
+ nextReport += mInterval;
+ }
+
+ postAtTime(mInternalCallback, nextReport);
+ mLastReportedTime = nextReport;
+
+ // Run the callback
+ mCallback.run();
+ }
+
+ private class CallTimerCallback implements Runnable {
+ @Override
+ public void run() {
+ periodicUpdateTimer();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallerInfo.java b/InCallUI/src/com/android/incallui/CallerInfo.java
new file mode 100644
index 000000000..f270678e0
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallerInfo.java
@@ -0,0 +1,585 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import com.android.dialer.util.PhoneLookupUtil;
+import com.google.common.primitives.Longs;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.PhoneLookup;
+import android.provider.ContactsContract.RawContacts;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.PhoneLookupSdkCompat;
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.contacts.common.util.TelephonyManagerUtils;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfoHelper;
+
+/**
+ * Looks up caller information for the given phone number.
+ */
+public class CallerInfo {
+ private static final String TAG = "CallerInfo";
+
+ // We should always use this projection starting from NYC onward.
+ private static final String[] DEFAULT_PHONELOOKUP_PROJECTION = new String[] {
+ PhoneLookupSdkCompat.CONTACT_ID,
+ PhoneLookup.DISPLAY_NAME,
+ PhoneLookup.LOOKUP_KEY,
+ PhoneLookup.NUMBER,
+ PhoneLookup.NORMALIZED_NUMBER,
+ PhoneLookup.LABEL,
+ PhoneLookup.TYPE,
+ PhoneLookup.PHOTO_URI,
+ PhoneLookup.CUSTOM_RINGTONE,
+ PhoneLookup.SEND_TO_VOICEMAIL
+ };
+
+ // In pre-N, contact id is stored in {@link PhoneLookup._ID} in non-sip query.
+ private static final String[] BACKWARD_COMPATIBLE_NON_SIP_DEFAULT_PHONELOOKUP_PROJECTION =
+ new String[] {
+ PhoneLookup._ID,
+ PhoneLookup.DISPLAY_NAME,
+ PhoneLookup.LOOKUP_KEY,
+ PhoneLookup.NUMBER,
+ PhoneLookup.NORMALIZED_NUMBER,
+ PhoneLookup.LABEL,
+ PhoneLookup.TYPE,
+ PhoneLookup.PHOTO_URI,
+ PhoneLookup.CUSTOM_RINGTONE,
+ PhoneLookup.SEND_TO_VOICEMAIL
+ };
+
+ public static String[] getDefaultPhoneLookupProjection(Uri phoneLookupUri) {
+ if (CompatUtils.isNCompatible()) {
+ return DEFAULT_PHONELOOKUP_PROJECTION;
+ }
+ // Pre-N
+ boolean isSip = phoneLookupUri.getBooleanQueryParameter(
+ ContactsContract.PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, false);
+ return (isSip) ? DEFAULT_PHONELOOKUP_PROJECTION
+ : BACKWARD_COMPATIBLE_NON_SIP_DEFAULT_PHONELOOKUP_PROJECTION;
+ }
+
+ /**
+ * Please note that, any one of these member variables can be null,
+ * and any accesses to them should be prepared to handle such a case.
+ *
+ * Also, it is implied that phoneNumber is more often populated than
+ * name is, (think of calls being dialed/received using numbers where
+ * names are not known to the device), so phoneNumber should serve as
+ * a dependable fallback when name is unavailable.
+ *
+ * One other detail here is that this CallerInfo object reflects
+ * information found on a connection, it is an OUTPUT that serves
+ * mainly to display information to the user. In no way is this object
+ * used as input to make a connection, so we can choose to display
+ * whatever human-readable text makes sense to the user for a
+ * connection. This is especially relevant for the phone number field,
+ * since it is the one field that is most likely exposed to the user.
+ *
+ * As an example:
+ * 1. User dials "911"
+ * 2. Device recognizes that this is an emergency number
+ * 3. We use the "Emergency Number" string instead of "911" in the
+ * phoneNumber field.
+ *
+ * What we're really doing here is treating phoneNumber as an essential
+ * field here, NOT name. We're NOT always guaranteed to have a name
+ * for a connection, but the number should be displayable.
+ */
+ public String name;
+ public String nameAlternative;
+ public String phoneNumber;
+ public String normalizedNumber;
+ public String forwardingNumber;
+ public String geoDescription;
+
+ public String cnapName;
+ public int numberPresentation;
+ public int namePresentation;
+ public boolean contactExists;
+
+ public String phoneLabel;
+ /* Split up the phoneLabel into number type and label name */
+ public int numberType;
+ public String numberLabel;
+
+ public int photoResource;
+
+ // Contact ID, which will be 0 if a contact comes from the corp CP2.
+ public long contactIdOrZero;
+ public String lookupKeyOrNull;
+ public boolean needUpdate;
+ public Uri contactRefUri;
+ public @UserType long userType;
+
+ /**
+ * Contact display photo URI. If a contact has no display photo but a thumbnail, it'll be
+ * the thumbnail URI instead.
+ */
+ public Uri contactDisplayPhotoUri;
+
+ // fields to hold individual contact preference data,
+ // including the send to voicemail flag and the ringtone
+ // uri reference.
+ public Uri contactRingtoneUri;
+ public boolean shouldSendToVoicemail;
+
+ /**
+ * Drawable representing the caller image. This is essentially
+ * a cache for the image data tied into the connection /
+ * callerinfo object.
+ *
+ * This might be a high resolution picture which is more suitable
+ * for full-screen image view than for smaller icons used in some
+ * kinds of notifications.
+ *
+ * The {@link #isCachedPhotoCurrent} flag indicates if the image
+ * data needs to be reloaded.
+ */
+ public Drawable cachedPhoto;
+ /**
+ * Bitmap representing the caller image which has possibly lower
+ * resolution than {@link #cachedPhoto} and thus more suitable for
+ * icons (like notification icons).
+ *
+ * In usual cases this is just down-scaled image of {@link #cachedPhoto}.
+ * If the down-scaling fails, this will just become null.
+ *
+ * The {@link #isCachedPhotoCurrent} flag indicates if the image
+ * data needs to be reloaded.
+ */
+ public Bitmap cachedPhotoIcon;
+ /**
+ * Boolean which indicates if {@link #cachedPhoto} and
+ * {@link #cachedPhotoIcon} is fresh enough. If it is false,
+ * those images aren't pointing to valid objects.
+ */
+ public boolean isCachedPhotoCurrent;
+
+ /**
+ * String which holds the call subject sent as extra from the lower layers for this call. This
+ * is used to display the no-caller ID reason for restricted/unknown number presentation.
+ */
+ public String callSubject;
+
+ private boolean mIsEmergency;
+ private boolean mIsVoiceMail;
+
+ public CallerInfo() {
+ // TODO: Move all the basic initialization here?
+ mIsEmergency = false;
+ mIsVoiceMail = false;
+ userType = ContactsUtils.USER_TYPE_CURRENT;
+ }
+
+ /**
+ * getCallerInfo given a Cursor.
+ * @param context the context used to retrieve string constants
+ * @param contactRef the URI to attach to this CallerInfo object
+ * @param cursor the first object in the cursor is used to build the CallerInfo object.
+ * @return the CallerInfo which contains the caller id for the given
+ * number. The returned CallerInfo is null if no number is supplied.
+ */
+ public static CallerInfo getCallerInfo(Context context, Uri contactRef, Cursor cursor) {
+ CallerInfo info = new CallerInfo();
+ info.photoResource = 0;
+ info.phoneLabel = null;
+ info.numberType = 0;
+ info.numberLabel = null;
+ info.cachedPhoto = null;
+ info.isCachedPhotoCurrent = false;
+ info.contactExists = false;
+ info.userType = ContactsUtils.USER_TYPE_CURRENT;
+
+ Log.v(TAG, "getCallerInfo() based on cursor...");
+
+ if (cursor != null) {
+ if (cursor.moveToFirst()) {
+ // TODO: photo_id is always available but not taken
+ // care of here. Maybe we should store it in the
+ // CallerInfo object as well.
+
+ long contactId = 0L;
+ int columnIndex;
+
+ // Look for the name
+ columnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
+ if (columnIndex != -1) {
+ info.name = cursor.getString(columnIndex);
+ }
+
+ // Look for the number
+ columnIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
+ if (columnIndex != -1) {
+ info.phoneNumber = cursor.getString(columnIndex);
+ }
+
+ // Look for the normalized number
+ columnIndex = cursor.getColumnIndex(PhoneLookup.NORMALIZED_NUMBER);
+ if (columnIndex != -1) {
+ info.normalizedNumber = cursor.getString(columnIndex);
+ }
+
+ // Look for the label/type combo
+ columnIndex = cursor.getColumnIndex(PhoneLookup.LABEL);
+ if (columnIndex != -1) {
+ int typeColumnIndex = cursor.getColumnIndex(PhoneLookup.TYPE);
+ if (typeColumnIndex != -1) {
+ info.numberType = cursor.getInt(typeColumnIndex);
+ info.numberLabel = cursor.getString(columnIndex);
+ info.phoneLabel = Phone.getTypeLabel(context.getResources(),
+ info.numberType, info.numberLabel)
+ .toString();
+ }
+ }
+
+ // Look for the person_id.
+ columnIndex = getColumnIndexForPersonId(contactRef, cursor);
+ if (columnIndex != -1) {
+ contactId = cursor.getLong(columnIndex);
+ // QuickContacts in M doesn't support enterprise contact id
+ if (contactId != 0 && (ContactsUtils.FLAG_N_FEATURE
+ || !Contacts.isEnterpriseContactId(contactId))) {
+ info.contactIdOrZero = contactId;
+ Log.v(TAG, "==> got info.contactIdOrZero: " + info.contactIdOrZero);
+
+ // cache the lookup key for later use with person_id to create lookup URIs
+ columnIndex = cursor.getColumnIndex(PhoneLookup.LOOKUP_KEY);
+ if (columnIndex != -1) {
+ info.lookupKeyOrNull = cursor.getString(columnIndex);
+ }
+ }
+ } else {
+ // No valid columnIndex, so we can't look up person_id.
+ Log.v(TAG, "Couldn't find contactId column for " + contactRef);
+ // Watch out: this means that anything that depends on
+ // person_id will be broken (like contact photo lookups in
+ // the in-call UI, for example.)
+ }
+
+ // Display photo URI.
+ columnIndex = cursor.getColumnIndex(PhoneLookup.PHOTO_URI);
+ if ((columnIndex != -1) && (cursor.getString(columnIndex) != null)) {
+ info.contactDisplayPhotoUri = Uri.parse(cursor.getString(columnIndex));
+ } else {
+ info.contactDisplayPhotoUri = null;
+ }
+
+ // look for the custom ringtone, create from the string stored
+ // in the database.
+ columnIndex = cursor.getColumnIndex(PhoneLookup.CUSTOM_RINGTONE);
+ if ((columnIndex != -1) && (cursor.getString(columnIndex) != null)) {
+ if (TextUtils.isEmpty(cursor.getString(columnIndex))) {
+ // make it consistent with frameworks/base/.../CallerInfo.java
+ info.contactRingtoneUri = Uri.EMPTY;
+ } else {
+ info.contactRingtoneUri = Uri.parse(cursor.getString(columnIndex));
+ }
+ } else {
+ info.contactRingtoneUri = null;
+ }
+
+ // look for the send to voicemail flag, set it to true only
+ // under certain circumstances.
+ columnIndex = cursor.getColumnIndex(PhoneLookup.SEND_TO_VOICEMAIL);
+ info.shouldSendToVoicemail = (columnIndex != -1) &&
+ ((cursor.getInt(columnIndex)) == 1);
+ info.contactExists = true;
+
+ // Determine userType by directoryId and contactId
+ final String directory = contactRef == null ? null
+ : contactRef.getQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY);
+ final Long directoryId = directory == null ? null : Longs.tryParse(directory);
+ info.userType = ContactsUtils.determineUserType(directoryId, contactId);
+
+ info.nameAlternative = ContactInfoHelper.lookUpDisplayNameAlternative(
+ context, info.lookupKeyOrNull, info.userType);
+ }
+ cursor.close();
+ }
+
+ info.needUpdate = false;
+ info.name = normalize(info.name);
+ info.contactRefUri = contactRef;
+
+ return info;
+ }
+
+ /**
+ * getCallerInfo given a URI, look up in the call-log database
+ * for the uri unique key.
+ * @param context the context used to get the ContentResolver
+ * @param contactRef the URI used to lookup caller id
+ * @return the CallerInfo which contains the caller id for the given
+ * number. The returned CallerInfo is null if no number is supplied.
+ */
+ private static CallerInfo getCallerInfo(Context context, Uri contactRef) {
+
+ return getCallerInfo(context, contactRef,
+ context.getContentResolver().query(contactRef, null, null, null, null));
+ }
+
+ /**
+ * Performs another lookup if previous lookup fails and it's a SIP call
+ * and the peer's username is all numeric. Look up the username as it
+ * could be a PSTN number in the contact database.
+ *
+ * @param context the query context
+ * @param number the original phone number, could be a SIP URI
+ * @param previousResult the result of previous lookup
+ * @return previousResult if it's not the case
+ */
+ static CallerInfo doSecondaryLookupIfNecessary(Context context,
+ String number, CallerInfo previousResult) {
+ if (!previousResult.contactExists
+ && PhoneNumberHelper.isUriNumber(number)) {
+ String username = PhoneNumberHelper.getUsernameFromUriNumber(number);
+ if (PhoneNumberUtils.isGlobalPhoneNumber(username)) {
+ previousResult = getCallerInfo(context,
+ Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+ Uri.encode(username)));
+ }
+ }
+ return previousResult;
+ }
+
+ // Accessors
+
+ /**
+ * @return true if the caller info is an emergency number.
+ */
+ public boolean isEmergencyNumber() {
+ return mIsEmergency;
+ }
+
+ /**
+ * @return true if the caller info is a voicemail number.
+ */
+ public boolean isVoiceMailNumber() {
+ return mIsVoiceMail;
+ }
+
+ /**
+ * Mark this CallerInfo as an emergency call.
+ * @param context To lookup the localized 'Emergency Number' string.
+ * @return this instance.
+ */
+ /* package */ CallerInfo markAsEmergency(Context context) {
+ name = context.getString(R.string.emergency_call_dialog_number_for_display);
+ phoneNumber = null;
+
+ photoResource = R.drawable.img_phone;
+ mIsEmergency = true;
+ return this;
+ }
+
+
+ /**
+ * Mark this CallerInfo as a voicemail call. The voicemail label
+ * is obtained from the telephony manager. Caller must hold the
+ * READ_PHONE_STATE permission otherwise the phoneNumber will be
+ * set to null.
+ * @return this instance.
+ */
+ /* package */ CallerInfo markAsVoiceMail(Context context) {
+ mIsVoiceMail = true;
+
+ try {
+ // For voicemail calls, we display the voice mail tag
+ // instead of the real phone number in the "number"
+ // field.
+ name = TelephonyManagerUtils.getVoiceMailAlphaTag(context);
+ phoneNumber = null;
+ } catch (SecurityException se) {
+ // Should never happen: if this process does not have
+ // permission to retrieve VM tag, it should not have
+ // permission to retrieve VM number and would not call
+ // this method.
+ // Leave phoneNumber untouched.
+ Log.e(TAG, "Cannot access VoiceMail.", se);
+ }
+ // TODO: There is no voicemail picture?
+ // FIXME: FIND ANOTHER ICON
+ // photoResource = android.R.drawable.badge_voicemail;
+ return this;
+ }
+
+ private static String normalize(String s) {
+ if (s == null || s.length() > 0) {
+ return s;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the column index to use to find the "person_id" field in
+ * the specified cursor, based on the contact URI that was originally
+ * queried.
+ *
+ * This is a helper function for the getCallerInfo() method that takes
+ * a Cursor. Looking up the person_id is nontrivial (compared to all
+ * the other CallerInfo fields) since the column we need to use
+ * depends on what query we originally ran.
+ *
+ * Watch out: be sure to not do any database access in this method, since
+ * it's run from the UI thread (see comments below for more info.)
+ *
+ * @return the columnIndex to use (with cursor.getLong()) to get the
+ * person_id, or -1 if we couldn't figure out what colum to use.
+ *
+ * TODO: Add a unittest for this method. (This is a little tricky to
+ * test, since we'll need a live contacts database to test against,
+ * preloaded with at least some phone numbers and SIP addresses. And
+ * we'll probably have to hardcode the column indexes we expect, so
+ * the test might break whenever the contacts schema changes. But we
+ * can at least make sure we handle all the URI patterns we claim to,
+ * and that the mime types match what we expect...)
+ */
+ private static int getColumnIndexForPersonId(Uri contactRef, Cursor cursor) {
+ // TODO: This is pretty ugly now, see bug 2269240 for
+ // more details. The column to use depends upon the type of URL:
+ // - content://com.android.contacts/data/phones ==> use the "contact_id" column
+ // - content://com.android.contacts/phone_lookup ==> use the "_ID" column
+ // - content://com.android.contacts/data ==> use the "contact_id" column
+ // If it's none of the above, we leave columnIndex=-1 which means
+ // that the person_id field will be left unset.
+ //
+ // The logic here *used* to be based on the mime type of contactRef
+ // (for example Phone.CONTENT_ITEM_TYPE would tell us to use the
+ // RawContacts.CONTACT_ID column). But looking up the mime type requires
+ // a call to context.getContentResolver().getType(contactRef), which
+ // isn't safe to do from the UI thread since it can cause an ANR if
+ // the contacts provider is slow or blocked (like during a sync.)
+ //
+ // So instead, figure out the column to use for person_id by just
+ // looking at the URI itself.
+
+ Log.v(TAG, "- getColumnIndexForPersonId: contactRef URI = '"
+ + contactRef + "'...");
+ // Warning: Do not enable the following logging (due to ANR risk.)
+ // if (VDBG) Rlog.v(TAG, "- MIME type: "
+ // + context.getContentResolver().getType(contactRef));
+
+ String url = contactRef.toString();
+ String columnName = null;
+ if (url.startsWith("content://com.android.contacts/data/phones")) {
+ // Direct lookup in the Phone table.
+ // MIME type: Phone.CONTENT_ITEM_TYPE (= "vnd.android.cursor.item/phone_v2")
+ Log.v(TAG, "'data/phones' URI; using RawContacts.CONTACT_ID");
+ columnName = RawContacts.CONTACT_ID;
+ } else if (url.startsWith("content://com.android.contacts/data")) {
+ // Direct lookup in the Data table.
+ // MIME type: Data.CONTENT_TYPE (= "vnd.android.cursor.dir/data")
+ Log.v(TAG, "'data' URI; using Data.CONTACT_ID");
+ // (Note Data.CONTACT_ID and RawContacts.CONTACT_ID are equivalent.)
+ columnName = Data.CONTACT_ID;
+ } else if (url.startsWith("content://com.android.contacts/phone_lookup")) {
+ // Lookup in the PhoneLookup table, which provides "fuzzy matching"
+ // for phone numbers.
+ // MIME type: PhoneLookup.CONTENT_TYPE (= "vnd.android.cursor.dir/phone_lookup")
+ Log.v(TAG, "'phone_lookup' URI; using PhoneLookup._ID");
+ columnName = PhoneLookupUtil.getContactIdColumnNameForUri(contactRef);
+ } else {
+ Log.v(TAG, "Unexpected prefix for contactRef '" + url + "'");
+ }
+ int columnIndex = (columnName != null) ? cursor.getColumnIndex(columnName) : -1;
+ Log.v(TAG, "==> Using column '" + columnName
+ + "' (columnIndex = " + columnIndex + ") for person_id lookup...");
+ return columnIndex;
+ }
+
+ /**
+ * Updates this CallerInfo's geoDescription field, based on the raw
+ * phone number in the phoneNumber field.
+ *
+ * (Note that the various getCallerInfo() methods do *not* set the
+ * geoDescription automatically; you need to call this method
+ * explicitly to get it.)
+ *
+ * @param context the context used to look up the current locale / country
+ * @param fallbackNumber if this CallerInfo's phoneNumber field is empty,
+ * this specifies a fallback number to use instead.
+ */
+ public void updateGeoDescription(Context context, String fallbackNumber) {
+ String number = TextUtils.isEmpty(phoneNumber) ? fallbackNumber : phoneNumber;
+ geoDescription = com.android.dialer.util.PhoneNumberUtil.getGeoDescription(context, number);
+ }
+
+ /**
+ * @return a string debug representation of this instance.
+ */
+ @Override
+ public String toString() {
+ // Warning: never check in this file with VERBOSE_DEBUG = true
+ // because that will result in PII in the system log.
+ final boolean VERBOSE_DEBUG = false;
+
+ if (VERBOSE_DEBUG) {
+ return new StringBuilder(384)
+ .append(super.toString() + " { ")
+ .append("\nname: " + name)
+ .append("\nphoneNumber: " + phoneNumber)
+ .append("\nnormalizedNumber: " + normalizedNumber)
+ .append("\forwardingNumber: " + forwardingNumber)
+ .append("\ngeoDescription: " + geoDescription)
+ .append("\ncnapName: " + cnapName)
+ .append("\nnumberPresentation: " + numberPresentation)
+ .append("\nnamePresentation: " + namePresentation)
+ .append("\ncontactExists: " + contactExists)
+ .append("\nphoneLabel: " + phoneLabel)
+ .append("\nnumberType: " + numberType)
+ .append("\nnumberLabel: " + numberLabel)
+ .append("\nphotoResource: " + photoResource)
+ .append("\ncontactIdOrZero: " + contactIdOrZero)
+ .append("\nneedUpdate: " + needUpdate)
+ .append("\ncontactRefUri: " + contactRefUri)
+ .append("\ncontactRingtoneUri: " + contactRingtoneUri)
+ .append("\ncontactDisplayPhotoUri: " + contactDisplayPhotoUri)
+ .append("\nshouldSendToVoicemail: " + shouldSendToVoicemail)
+ .append("\ncachedPhoto: " + cachedPhoto)
+ .append("\nisCachedPhotoCurrent: " + isCachedPhotoCurrent)
+ .append("\nemergency: " + mIsEmergency)
+ .append("\nvoicemail: " + mIsVoiceMail)
+ .append("\nuserType: " + userType)
+ .append(" }")
+ .toString();
+ } else {
+ return new StringBuilder(128)
+ .append(super.toString() + " { ")
+ .append("name " + ((name == null) ? "null" : "non-null"))
+ .append(", phoneNumber " + ((phoneNumber == null) ? "null" : "non-null"))
+ .append(" }")
+ .toString();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
new file mode 100644
index 000000000..f7f0cbb5d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallerInfoAsyncQuery.java
@@ -0,0 +1,599 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import com.google.common.primitives.Longs;
+
+import android.Manifest;
+import android.content.AsyncQueryHandler;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Directory;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.DirectoryCompat;
+import com.android.contacts.common.util.PermissionsUtil;
+import com.android.contacts.common.util.TelephonyManagerUtils;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+import com.android.dialerbind.ObjectFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
+
+/**
+ * Helper class to make it easier to run asynchronous caller-id lookup queries.
+ * @see CallerInfo
+ *
+ */
+public class CallerInfoAsyncQuery {
+ private static final boolean DBG = false;
+ private static final String LOG_TAG = "CallerInfoAsyncQuery";
+
+ private static final int EVENT_NEW_QUERY = 1;
+ private static final int EVENT_ADD_LISTENER = 2;
+ private static final int EVENT_END_OF_QUEUE = 3;
+ private static final int EVENT_EMERGENCY_NUMBER = 4;
+ private static final int EVENT_VOICEMAIL_NUMBER = 5;
+
+ private CallerInfoAsyncQueryHandler mHandler;
+
+ // If the CallerInfo query finds no contacts, should we use the
+ // PhoneNumberOfflineGeocoder to look up a "geo description"?
+ // (TODO: This could become a flag in config.xml if it ever needs to be
+ // configured on a per-product basis.)
+ private static final boolean ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION = true;
+
+ /**
+ * Interface for a CallerInfoAsyncQueryHandler result return.
+ */
+ public interface OnQueryCompleteListener {
+ /**
+ * Called when the query is complete.
+ */
+ public void onQueryComplete(int token, Object cookie, CallerInfo ci);
+ }
+
+
+ /**
+ * Wrap the cookie from the WorkerArgs with additional information needed by our
+ * classes.
+ */
+ private static final class CookieWrapper {
+ public OnQueryCompleteListener listener;
+ public Object cookie;
+ public int event;
+ public String number;
+ }
+
+ /**
+ * Simple exception used to communicate problems with the query pool.
+ */
+ public static class QueryPoolException extends SQLException {
+ public QueryPoolException(String error) {
+ super(error);
+ }
+ }
+
+ /**
+ * Our own implementation of the AsyncQueryHandler.
+ */
+ private class CallerInfoAsyncQueryHandler extends AsyncQueryHandler {
+
+ @Override
+ public void startQuery(int token, Object cookie, Uri uri, String[] projection,
+ String selection, String[] selectionArgs, String orderBy) {
+ if (DBG) {
+ // Show stack trace with the arguments.
+ android.util.Log.d(LOG_TAG, "InCall: startQuery: url=" + uri +
+ " projection=[" + Arrays.toString(projection) + "]" +
+ " selection=" + selection + " " +
+ " args=[" + Arrays.toString(selectionArgs) + "]",
+ new RuntimeException("STACKTRACE"));
+ }
+ super.startQuery(token, cookie, uri, projection, selection, selectionArgs, orderBy);
+ }
+
+ /**
+ * The information relevant to each CallerInfo query. Each query may have multiple
+ * listeners, so each AsyncCursorInfo is associated with 2 or more CookieWrapper
+ * objects in the queue (one with a new query event, and one with a end event, with
+ * 0 or more additional listeners in between).
+ */
+ private Context mQueryContext;
+ private Uri mQueryUri;
+ private CallerInfo mCallerInfo;
+
+ /**
+ * Our own query worker thread.
+ *
+ * This thread handles the messages enqueued in the looper. The normal sequence
+ * of events is that a new query shows up in the looper queue, followed by 0 or
+ * more add listener requests, and then an end request. Of course, these requests
+ * can be interlaced with requests from other tokens, but is irrelevant to this
+ * handler since the handler has no state.
+ *
+ * Note that we depend on the queue to keep things in order; in other words, the
+ * looper queue must be FIFO with respect to input from the synchronous startQuery
+ * calls and output to this handleMessage call.
+ *
+ * This use of the queue is required because CallerInfo objects may be accessed
+ * multiple times before the query is complete. All accesses (listeners) must be
+ * queued up and informed in order when the query is complete.
+ */
+ protected class CallerInfoWorkerHandler extends WorkerHandler {
+ public CallerInfoWorkerHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ WorkerArgs args = (WorkerArgs) msg.obj;
+ CookieWrapper cw = (CookieWrapper) args.cookie;
+
+ if (cw == null) {
+ // Normally, this should never be the case for calls originating
+ // from within this code.
+ // However, if there is any code that this Handler calls (such as in
+ // super.handleMessage) that DOES place unexpected messages on the
+ // queue, then we need pass these messages on.
+ Log.d(this, "Unexpected command (CookieWrapper is null): " + msg.what +
+ " ignored by CallerInfoWorkerHandler, passing onto parent.");
+
+ super.handleMessage(msg);
+ } else {
+ Log.d(this, "Processing event: " + cw.event + " token (arg1): " + msg.arg1 +
+ " command: " + msg.what + " query URI: " +
+ sanitizeUriToString(args.uri));
+
+ switch (cw.event) {
+ case EVENT_NEW_QUERY:
+ //start the sql command.
+ super.handleMessage(msg);
+ break;
+
+ // shortcuts to avoid query for recognized numbers.
+ case EVENT_EMERGENCY_NUMBER:
+ case EVENT_VOICEMAIL_NUMBER:
+
+ case EVENT_ADD_LISTENER:
+ case EVENT_END_OF_QUEUE:
+ // query was already completed, so just send the reply.
+ // passing the original token value back to the caller
+ // on top of the event values in arg1.
+ Message reply = args.handler.obtainMessage(msg.what);
+ reply.obj = args;
+ reply.arg1 = msg.arg1;
+
+ reply.sendToTarget();
+
+ break;
+ default:
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Asynchronous query handler class for the contact / callerinfo object.
+ */
+ private CallerInfoAsyncQueryHandler(Context context) {
+ super(context.getContentResolver());
+ }
+
+ @Override
+ protected Handler createHandler(Looper looper) {
+ return new CallerInfoWorkerHandler(looper);
+ }
+
+ /**
+ * Overrides onQueryComplete from AsyncQueryHandler.
+ *
+ * This method takes into account the state of this class; we construct the CallerInfo
+ * object only once for each set of listeners. When the query thread has done its work
+ * and calls this method, we inform the remaining listeners in the queue, until we're
+ * out of listeners. Once we get the message indicating that we should expect no new
+ * listeners for this CallerInfo object, we release the AsyncCursorInfo back into the
+ * pool.
+ */
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ try {
+ Log.d(this, "##### onQueryComplete() ##### query complete for token: " + token);
+
+ //get the cookie and notify the listener.
+ CookieWrapper cw = (CookieWrapper) cookie;
+ if (cw == null) {
+ // Normally, this should never be the case for calls originating
+ // from within this code.
+ // However, if there is any code that calls this method, we should
+ // check the parameters to make sure they're viable.
+ Log.d(this, "Cookie is null, ignoring onQueryComplete() request.");
+ return;
+ }
+
+ if (cw.event == EVENT_END_OF_QUEUE) {
+ release();
+ return;
+ }
+
+ // check the token and if needed, create the callerinfo object.
+ if (mCallerInfo == null) {
+ if ((mQueryContext == null) || (mQueryUri == null)) {
+ throw new QueryPoolException
+ ("Bad context or query uri, or CallerInfoAsyncQuery already released.");
+ }
+
+ // adjust the callerInfo data as needed, and only if it was set from the
+ // initial query request.
+ // Change the callerInfo number ONLY if it is an emergency number or the
+ // voicemail number, and adjust other data (including photoResource)
+ // accordingly.
+ if (cw.event == EVENT_EMERGENCY_NUMBER) {
+ // Note we're setting the phone number here (refer to javadoc
+ // comments at the top of CallerInfo class).
+ mCallerInfo = new CallerInfo().markAsEmergency(mQueryContext);
+ } else if (cw.event == EVENT_VOICEMAIL_NUMBER) {
+ mCallerInfo = new CallerInfo().markAsVoiceMail(mQueryContext);
+ } else {
+ mCallerInfo = CallerInfo.getCallerInfo(mQueryContext, mQueryUri, cursor);
+ Log.d(this, "==> Got mCallerInfo: " + mCallerInfo);
+
+ CallerInfo newCallerInfo = CallerInfo.doSecondaryLookupIfNecessary(
+ mQueryContext, cw.number, mCallerInfo);
+ if (newCallerInfo != mCallerInfo) {
+ mCallerInfo = newCallerInfo;
+ Log.d(this, "#####async contact look up with numeric username"
+ + mCallerInfo);
+ }
+
+ // Final step: look up the geocoded description.
+ if (ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION) {
+ // Note we do this only if we *don't* have a valid name (i.e. if
+ // no contacts matched the phone number of the incoming call),
+ // since that's the only case where the incoming-call UI cares
+ // about this field.
+ //
+ // (TODO: But if we ever want the UI to show the geoDescription
+ // even when we *do* match a contact, we'll need to either call
+ // updateGeoDescription() unconditionally here, or possibly add a
+ // new parameter to CallerInfoAsyncQuery.startQuery() to force
+ // the geoDescription field to be populated.)
+
+ if (TextUtils.isEmpty(mCallerInfo.name)) {
+ // Actually when no contacts match the incoming phone number,
+ // the CallerInfo object is totally blank here (i.e. no name
+ // *or* phoneNumber). So we need to pass in cw.number as
+ // a fallback number.
+ mCallerInfo.updateGeoDescription(mQueryContext, cw.number);
+ }
+ }
+
+ // Use the number entered by the user for display.
+ if (!TextUtils.isEmpty(cw.number)) {
+ mCallerInfo.phoneNumber = PhoneNumberUtils.formatNumber(cw.number,
+ mCallerInfo.normalizedNumber,
+ TelephonyManagerUtils.getCurrentCountryIso(mQueryContext,
+ Locale.getDefault()));
+ }
+ }
+
+ Log.d(this, "constructing CallerInfo object for token: " + token);
+
+ //notify that we can clean up the queue after this.
+ CookieWrapper endMarker = new CookieWrapper();
+ endMarker.event = EVENT_END_OF_QUEUE;
+ startQuery(token, endMarker, null, null, null, null, null);
+ }
+
+ //notify the listener that the query is complete.
+ if (cw.listener != null) {
+ Log.d(this, "notifying listener: " + cw.listener.getClass().toString() +
+ " for token: " + token + mCallerInfo);
+ cw.listener.onQueryComplete(token, cw.cookie, mCallerInfo);
+ }
+ } finally {
+ // The cursor may have been closed in CallerInfo.getCallerInfo()
+ if (cursor != null && !cursor.isClosed()) {
+ cursor.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * Private constructor for factory methods.
+ */
+ private CallerInfoAsyncQuery() {
+ }
+
+ public static void startQuery(final int token, final Context context, final CallerInfo info,
+ final OnQueryCompleteListener listener, final Object cookie) {
+ Log.d(LOG_TAG, "##### CallerInfoAsyncQuery startContactProviderQuery()... #####");
+ Log.d(LOG_TAG, "- number: " + info.phoneNumber);
+ Log.d(LOG_TAG, "- cookie: " + cookie);
+ if (!PermissionsUtil.hasPermission(context, Manifest.permission.READ_CONTACTS)) {
+ Log.w(LOG_TAG, "Dialer doesn't have permission to read contacts.");
+ listener.onQueryComplete(token, cookie, info);
+ return;
+ }
+
+ OnQueryCompleteListener contactsProviderQueryCompleteListener =
+ new OnQueryCompleteListener() {
+ @Override
+ public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
+ Log.d(LOG_TAG, "contactsProviderQueryCompleteListener done");
+ // If there are no other directory queries, make sure that the listener is
+ // notified of this result. see b/27621628
+ if ((ci != null && ci.contactExists) ||
+ !startOtherDirectoriesQuery(token, context, info, listener, cookie)) {
+ if (listener != null && ci != null) {
+ listener.onQueryComplete(token, cookie, ci);
+ }
+ }
+ }
+ };
+ startDefaultDirectoryQuery(token, context, info, contactsProviderQueryCompleteListener,
+ cookie);
+ }
+
+ // Private methods
+ private static CallerInfoAsyncQuery startDefaultDirectoryQuery(int token, Context context,
+ CallerInfo info, OnQueryCompleteListener listener, Object cookie) {
+ // Construct the URI object and query params, and start the query.
+ Uri uri = ContactInfoHelper.getContactInfoLookupUri(info.phoneNumber);
+ return startQueryInternal(token, context, info, listener, cookie, uri);
+ }
+
+ /**
+ * Factory method to start the query based on a CallerInfo object.
+ *
+ * Note: if the number contains an "@" character we treat it
+ * as a SIP address, and look it up directly in the Data table
+ * rather than using the PhoneLookup table.
+ * TODO: But eventually we should expose two separate methods, one for
+ * numbers and one for SIP addresses, and then have
+ * PhoneUtils.startGetCallerInfo() decide which one to call based on
+ * the phone type of the incoming connection.
+ */
+ private static CallerInfoAsyncQuery startQueryInternal(int token, Context context,
+ CallerInfo info, OnQueryCompleteListener listener, Object cookie, Uri contactRef) {
+ if (DBG) {
+ Log.d(LOG_TAG, "==> contactRef: " + sanitizeUriToString(contactRef));
+ }
+
+ CallerInfoAsyncQuery c = new CallerInfoAsyncQuery();
+ c.allocate(context, contactRef);
+
+ //create cookieWrapper, start query
+ CookieWrapper cw = new CookieWrapper();
+ cw.listener = listener;
+ cw.cookie = cookie;
+ cw.number = info.phoneNumber;
+
+ // check to see if these are recognized numbers, and use shortcuts if we can.
+ if (PhoneNumberUtils.isLocalEmergencyNumber(context, info.phoneNumber)) {
+ cw.event = EVENT_EMERGENCY_NUMBER;
+ } else if (info.isVoiceMailNumber()) {
+ cw.event = EVENT_VOICEMAIL_NUMBER;
+ } else {
+ cw.event = EVENT_NEW_QUERY;
+ }
+
+
+ String[] proejection = CallerInfo.getDefaultPhoneLookupProjection(contactRef);
+ c.mHandler.startQuery(token,
+ cw, // cookie
+ contactRef, // uri
+ proejection, // projection
+ null, // selection
+ null, // selectionArgs
+ null); // orderBy
+ return c;
+ }
+
+ // Return value indicates if listener was notified.
+ private static boolean startOtherDirectoriesQuery(int token, Context context, CallerInfo info,
+ OnQueryCompleteListener listener, Object cookie) {
+ long[] directoryIds = getDirectoryIds(context);
+ int size = directoryIds.length;
+ if (size == 0) {
+ return false;
+ }
+
+ DirectoryQueryCompleteListenerFactory listenerFactory =
+ new DirectoryQueryCompleteListenerFactory(context, size, listener);
+
+ // The current implementation of multiple async query runs in single handler thread
+ // in AsyncQueryHandler.
+ // intermediateListener.onQueryComplete is also called from the same caller thread.
+ // TODO(b/26019872): use thread pool instead of single thread.
+ for (int i = 0; i < size; i++) {
+ long directoryId = directoryIds[i];
+ Uri uri = ContactInfoHelper.getContactInfoLookupUri(info.phoneNumber, directoryId);
+ if (DBG) {
+ Log.d(LOG_TAG, "directoryId: " + directoryId + " uri: " + uri);
+ }
+ OnQueryCompleteListener intermediateListener =
+ listenerFactory.newListener(directoryId);
+ startQueryInternal(token, context, info, intermediateListener, cookie, uri);
+ }
+ return true;
+ }
+
+ /* Directory lookup related code - START */
+ private static final String[] DIRECTORY_PROJECTION = new String[] {Directory._ID};
+
+ private static long[] getDirectoryIds(Context context) {
+ ArrayList<Long> results = new ArrayList<>();
+
+ Uri uri = Directory.CONTENT_URI;
+ if (ContactsUtils.FLAG_N_FEATURE) {
+ uri = Uri.withAppendedPath(ContactsContract.AUTHORITY_URI, "directories_enterprise");
+ }
+
+ ContentResolver cr = context.getContentResolver();
+ Cursor cursor = cr.query(uri, DIRECTORY_PROJECTION, null, null, null);
+ addDirectoryIdsFromCursor(cursor, results);
+
+ return Longs.toArray(results);
+ }
+
+ private static void addDirectoryIdsFromCursor(Cursor cursor, ArrayList<Long> results) {
+ if (cursor != null) {
+ int idIndex = cursor.getColumnIndex(Directory._ID);
+ while (cursor.moveToNext()) {
+ long id = cursor.getLong(idIndex);
+ if (DirectoryCompat.isRemoteDirectoryId(id)) {
+ results.add(id);
+ }
+ }
+ cursor.close();
+ }
+ }
+
+ private static final class DirectoryQueryCompleteListenerFactory {
+ // Make sure listener to be called once and only once
+ private int mCount;
+ private boolean mIsListenerCalled;
+ private final OnQueryCompleteListener mListener;
+ private final Context mContext;
+ private final CachedNumberLookupService mCachedNumberLookupService =
+ ObjectFactory.newCachedNumberLookupService();
+
+ private class DirectoryQueryCompleteListener implements OnQueryCompleteListener {
+ private final long mDirectoryId;
+
+ DirectoryQueryCompleteListener(long directoryId) {
+ mDirectoryId = directoryId;
+ }
+
+ @Override
+ public void onQueryComplete(int token, Object cookie, CallerInfo ci) {
+ onDirectoryQueryComplete(token, cookie, ci, mDirectoryId);
+ }
+ }
+
+ DirectoryQueryCompleteListenerFactory(Context context, int size,
+ OnQueryCompleteListener listener) {
+ mCount = size;
+ mListener = listener;
+ mIsListenerCalled = false;
+ mContext = context;
+ }
+
+ private void onDirectoryQueryComplete(int token, Object cookie, CallerInfo ci,
+ long directoryId) {
+ boolean shouldCallListener = false;
+ synchronized (this) {
+ mCount = mCount - 1;
+ if (!mIsListenerCalled && (ci.contactExists || mCount == 0)) {
+ mIsListenerCalled = true;
+ shouldCallListener = true;
+ }
+ }
+
+ // Don't call callback in synchronized block because mListener.onQueryComplete may
+ // take long time to complete
+ if (shouldCallListener && mListener != null) {
+ addCallerInfoIntoCache(ci, directoryId);
+ mListener.onQueryComplete(token, cookie, ci);
+ }
+ }
+
+ private void addCallerInfoIntoCache(CallerInfo ci, long directoryId) {
+ if (ci.contactExists && mCachedNumberLookupService != null) {
+ // 1. Cache caller info
+ CachedContactInfo cachedContactInfo = CallerInfoUtils
+ .buildCachedContactInfo(mCachedNumberLookupService, ci);
+ String directoryLabel = mContext.getString(R.string.directory_search_label);
+ cachedContactInfo.setDirectorySource(directoryLabel, directoryId);
+ mCachedNumberLookupService.addContact(mContext, cachedContactInfo);
+
+ // 2. Cache photo
+ if (ci.contactDisplayPhotoUri != null && ci.normalizedNumber != null) {
+ try (InputStream in = mContext.getContentResolver()
+ .openInputStream(ci.contactDisplayPhotoUri)) {
+ if (in != null) {
+ mCachedNumberLookupService.addPhoto(mContext, ci.normalizedNumber, in);
+ }
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "failed to fetch directory contact photo", e);
+ }
+
+ }
+ }
+ }
+
+ public OnQueryCompleteListener newListener(long directoryId) {
+ return new DirectoryQueryCompleteListener(directoryId);
+ }
+ }
+ /* Directory lookup related code - END */
+
+ /**
+ * Method to create a new CallerInfoAsyncQueryHandler object, ensuring correct
+ * state of context and uri.
+ */
+ private void allocate(Context context, Uri contactRef) {
+ if ((context == null) || (contactRef == null)){
+ throw new QueryPoolException("Bad context or query uri.");
+ }
+ mHandler = new CallerInfoAsyncQueryHandler(context);
+ mHandler.mQueryContext = context;
+ mHandler.mQueryUri = contactRef;
+ }
+
+ /**
+ * Releases the relevant data.
+ */
+ private void release() {
+ mHandler.mQueryContext = null;
+ mHandler.mQueryUri = null;
+ mHandler.mCallerInfo = null;
+ mHandler = null;
+ }
+
+ private static String sanitizeUriToString(Uri uri) {
+ if (uri != null) {
+ String uriString = uri.toString();
+ int indexOfLastSlash = uriString.lastIndexOf('/');
+ if (indexOfLastSlash > 0) {
+ return uriString.substring(0, indexOfLastSlash) + "/xxxxxxx";
+ } else {
+ return uriString;
+ }
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
new file mode 100644
index 000000000..289b652fc
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
@@ -0,0 +1,234 @@
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.Loader;
+import android.content.Loader.OnLoadCompleteListener;
+import android.net.Uri;
+import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.contacts.common.model.Contact;
+import com.android.contacts.common.model.ContactLoader;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+import com.android.dialer.util.TelecomUtil;
+
+import java.util.Arrays;
+
+/**
+ * Utility methods for contact and caller info related functionality
+ */
+public class CallerInfoUtils {
+
+ private static final String TAG = CallerInfoUtils.class.getSimpleName();
+
+ /** Define for not a special CNAP string */
+ private static final int CNAP_SPECIAL_CASE_NO = -1;
+
+ public CallerInfoUtils() {
+ }
+
+ private static final int QUERY_TOKEN = -1;
+
+ /**
+ * This is called to get caller info for a call. This will return a CallerInfo
+ * object immediately based off information in the call, but
+ * more information is returned to the OnQueryCompleteListener (which contains
+ * information about the phone number label, user's name, etc).
+ */
+ public static CallerInfo getCallerInfoForCall(Context context, Call call,
+ CallerInfoAsyncQuery.OnQueryCompleteListener listener) {
+ CallerInfo info = buildCallerInfo(context, call);
+
+ // TODO: Have phoneapp send a Uri when it knows the contact that triggered this call.
+
+ if (info.numberPresentation == TelecomManager.PRESENTATION_ALLOWED) {
+ // Start the query with the number provided from the call.
+ Log.d(TAG, "==> Actually starting CallerInfoAsyncQuery.startQuery()...");
+ CallerInfoAsyncQuery.startQuery(QUERY_TOKEN, context, info, listener, call);
+ }
+ return info;
+ }
+
+ public static CallerInfo buildCallerInfo(Context context, Call call) {
+ CallerInfo info = new CallerInfo();
+
+ // Store CNAP information retrieved from the Connection (we want to do this
+ // here regardless of whether the number is empty or not).
+ info.cnapName = call.getCnapName();
+ info.name = info.cnapName;
+ info.numberPresentation = call.getNumberPresentation();
+ info.namePresentation = call.getCnapNamePresentation();
+ info.callSubject = call.getCallSubject();
+
+ String number = call.getNumber();
+ if (!TextUtils.isEmpty(number)) {
+ final String[] numbers = number.split("&");
+ number = numbers[0];
+ if (numbers.length > 1) {
+ info.forwardingNumber = numbers[1];
+ }
+
+ number = modifyForSpecialCnapCases(context, info, number, info.numberPresentation);
+ info.phoneNumber = number;
+ }
+
+ // Because the InCallUI is immediately launched before the call is connected, occasionally
+ // a voicemail call will be passed to InCallUI as a "voicemail:" URI without a number.
+ // This call should still be handled as a voicemail call.
+ if ((call.getHandle() != null &&
+ PhoneAccount.SCHEME_VOICEMAIL.equals(call.getHandle().getScheme())) ||
+ isVoiceMailNumber(context, call)) {
+ info.markAsVoiceMail(context);
+ }
+
+ ContactInfoCache.getInstance(context).maybeInsertCnapInformationIntoCache(context, call,
+ info);
+
+ return info;
+ }
+
+ /**
+ * Creates a new {@link CachedContactInfo} from a {@link CallerInfo}
+ *
+ * @param lookupService the {@link CachedNumberLookupService} used to build a
+ * new {@link CachedContactInfo}
+ * @param {@link CallerInfo} object
+ * @return a CachedContactInfo object created from this CallerInfo
+ * @throws NullPointerException if lookupService or ci are null
+ */
+ public static CachedContactInfo buildCachedContactInfo(CachedNumberLookupService lookupService,
+ CallerInfo ci) {
+ ContactInfo info = new ContactInfo();
+ info.name = ci.name;
+ info.type = ci.numberType;
+ info.label = ci.phoneLabel;
+ info.number = ci.phoneNumber;
+ info.normalizedNumber = ci.normalizedNumber;
+ info.photoUri = ci.contactDisplayPhotoUri;
+ info.userType = ci.userType;
+
+ CachedContactInfo cacheInfo = lookupService.buildCachedContactInfo(info);
+ cacheInfo.setLookupKey(ci.lookupKeyOrNull);
+ return cacheInfo;
+ }
+
+ public static boolean isVoiceMailNumber(Context context, Call call) {
+ return TelecomUtil.isVoicemailNumber(context,
+ call.getTelecomCall().getDetails().getAccountHandle(),
+ call.getNumber());
+ }
+
+ /**
+ * Handles certain "corner cases" for CNAP. When we receive weird phone numbers
+ * from the network to indicate different number presentations, convert them to
+ * expected number and presentation values within the CallerInfo object.
+ * @param number number we use to verify if we are in a corner case
+ * @param presentation presentation value used to verify if we are in a corner case
+ * @return the new String that should be used for the phone number
+ */
+ /* package */static String modifyForSpecialCnapCases(Context context, CallerInfo ci,
+ String number, int presentation) {
+ // Obviously we return number if ci == null, but still return number if
+ // number == null, because in these cases the correct string will still be
+ // displayed/logged after this function returns based on the presentation value.
+ if (ci == null || number == null) return number;
+
+ Log.d(TAG, "modifyForSpecialCnapCases: initially, number="
+ + toLogSafePhoneNumber(number)
+ + ", presentation=" + presentation + " ci " + ci);
+
+ // "ABSENT NUMBER" is a possible value we could get from the network as the
+ // phone number, so if this happens, change it to "Unknown" in the CallerInfo
+ // and fix the presentation to be the same.
+ final String[] absentNumberValues =
+ context.getResources().getStringArray(R.array.absent_num);
+ if (Arrays.asList(absentNumberValues).contains(number)
+ && presentation == TelecomManager.PRESENTATION_ALLOWED) {
+ number = context.getString(R.string.unknown);
+ ci.numberPresentation = TelecomManager.PRESENTATION_UNKNOWN;
+ }
+
+ // Check for other special "corner cases" for CNAP and fix them similarly. Corner
+ // cases only apply if we received an allowed presentation from the network, so check
+ // if we think we have an allowed presentation, or if the CallerInfo presentation doesn't
+ // match the presentation passed in for verification (meaning we changed it previously
+ // because it's a corner case and we're being called from a different entry point).
+ if (ci.numberPresentation == TelecomManager.PRESENTATION_ALLOWED
+ || (ci.numberPresentation != presentation
+ && presentation == TelecomManager.PRESENTATION_ALLOWED)) {
+ // For all special strings, change number & numberPrentation.
+ if (isCnapSpecialCaseRestricted(number)) {
+ number = context.getString(R.string.private_num);
+ ci.numberPresentation = TelecomManager.PRESENTATION_RESTRICTED;
+ } else if (isCnapSpecialCaseUnknown(number)) {
+ number = context.getString(R.string.unknown);
+ ci.numberPresentation = TelecomManager.PRESENTATION_UNKNOWN;
+ }
+ Log.d(TAG, "SpecialCnap: number=" + toLogSafePhoneNumber(number)
+ + "; presentation now=" + ci.numberPresentation);
+ }
+ Log.d(TAG, "modifyForSpecialCnapCases: returning number string="
+ + toLogSafePhoneNumber(number));
+ return number;
+ }
+
+ private static boolean isCnapSpecialCaseRestricted(String n) {
+ return n.equals("PRIVATE") || n.equals("P") || n.equals("RES");
+ }
+
+ private static boolean isCnapSpecialCaseUnknown(String n) {
+ return n.equals("UNAVAILABLE") || n.equals("UNKNOWN") || n.equals("UNA") || n.equals("U");
+ }
+
+ /* package */static String toLogSafePhoneNumber(String number) {
+ // For unknown number, log empty string.
+ if (number == null) {
+ return "";
+ }
+
+ // Todo: Figure out an equivalent for VDBG
+ if (false) {
+ // When VDBG is true we emit PII.
+ return number;
+ }
+
+ // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
+ // sanitized phone numbers.
+ StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < number.length(); i++) {
+ char c = number.charAt(i);
+ if (c == '-' || c == '@' || c == '.' || c == '&') {
+ builder.append(c);
+ } else {
+ builder.append('x');
+ }
+ }
+ return builder.toString();
+ }
+
+ /**
+ * Send a notification using a {@link ContactLoader} to inform the sync adapter that we are
+ * viewing a particular contact, so that it can download the high-res photo.
+ */
+ public static void sendViewNotification(Context context, Uri contactUri) {
+ final ContactLoader loader = new ContactLoader(context, contactUri,
+ true /* postViewNotification */);
+ loader.registerListener(0, new OnLoadCompleteListener<Contact>() {
+ @Override
+ public void onLoadComplete(
+ Loader<Contact> loader, Contact contact) {
+ try {
+ loader.reset();
+ } catch (RuntimeException e) {
+ Log.e(TAG, "Error resetting loader", e);
+ }
+ }
+ });
+ loader.startLoading();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/CircularRevealFragment.java b/InCallUI/src/com/android/incallui/CircularRevealFragment.java
new file mode 100644
index 000000000..01bd253ec
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/CircularRevealFragment.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.graphics.Outline;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewAnimationUtils;
+import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnPreDrawListener;
+
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.dialer.R;
+
+public class CircularRevealFragment extends Fragment {
+ static final String TAG = "CircularRevealFragment";
+
+ private Point mTouchPoint;
+ private OnCircularRevealCompleteListener mListener;
+ private boolean mAnimationStarted;
+
+ interface OnCircularRevealCompleteListener {
+ public void onCircularRevealComplete(FragmentManager fm);
+ }
+
+ public static void startCircularReveal(FragmentManager fm, Point touchPoint,
+ OnCircularRevealCompleteListener listener) {
+ if (fm.findFragmentByTag(TAG) == null) {
+ fm.beginTransaction().add(R.id.main,
+ new CircularRevealFragment(touchPoint, listener), TAG)
+ .commitAllowingStateLoss();
+ } else {
+ Log.w(TAG, "An instance of CircularRevealFragment already exists");
+ }
+ }
+
+ public static void endCircularReveal(FragmentManager fm) {
+ final Fragment fragment = fm.findFragmentByTag(TAG);
+ if (fragment != null) {
+ fm.beginTransaction().remove(fragment).commitAllowingStateLoss();
+ }
+ }
+
+ /**
+ * Empty constructor used only by the {@link FragmentManager}.
+ */
+ public CircularRevealFragment() {}
+
+ public CircularRevealFragment(Point touchPoint, OnCircularRevealCompleteListener listener) {
+ mTouchPoint = touchPoint;
+ mListener = listener;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (!mAnimationStarted) {
+ // Only run the animation once for each instance of the fragment
+ startOutgoingAnimation(InCallPresenter.getInstance().getThemeColors());
+ }
+ mAnimationStarted = true;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.outgoing_call_animation, container, false);
+ }
+
+ public void startOutgoingAnimation(MaterialPalette palette) {
+ final Activity activity = getActivity();
+ if (activity == null) {
+ Log.w(this, "Asked to do outgoing call animation when not attached");
+ return;
+ }
+
+ final View view = activity.getWindow().getDecorView();
+
+ // The circle starts from an initial size of 0 so clip it such that it is invisible.
+ // Otherwise the first frame is drawn with a fully opaque screen which causes jank. When
+ // the animation later starts, this clip will be clobbered by the circular reveal clip.
+ // See ViewAnimationUtils.createCircularReveal.
+ view.setOutlineProvider(new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ // Using (0, 0, 0, 0) will not work since the outline will simply be treated as
+ // an empty outline.
+ outline.setOval(-1, -1, 0, 0);
+ }
+ });
+ view.setClipToOutline(true);
+
+ if (palette != null) {
+ view.findViewById(R.id.outgoing_call_animation_circle).setBackgroundColor(
+ palette.mPrimaryColor);
+ activity.getWindow().setStatusBarColor(palette.mSecondaryColor);
+ }
+
+ view.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ final ViewTreeObserver vto = view.getViewTreeObserver();
+ if (vto.isAlive()) {
+ vto.removeOnPreDrawListener(this);
+ }
+ final Animator animator = getRevealAnimator(mTouchPoint);
+ if (animator != null) {
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ view.setClipToOutline(false);
+ if (mListener != null) {
+ mListener.onCircularRevealComplete(getFragmentManager());
+ }
+ }
+ });
+ animator.start();
+ }
+ return false;
+ }
+ });
+ }
+
+ private Animator getRevealAnimator(Point touchPoint) {
+ final Activity activity = getActivity();
+ if (activity == null) {
+ return null;
+ }
+ final View view = activity.getWindow().getDecorView();
+ final Display display = activity.getWindowManager().getDefaultDisplay();
+ final Point size = new Point();
+ display.getSize(size);
+
+ int startX = size.x / 2;
+ int startY = size.y / 2;
+ if (touchPoint != null) {
+ startX = touchPoint.x;
+ startY = touchPoint.y;
+ }
+
+ final Animator valueAnimator = ViewAnimationUtils.createCircularReveal(view,
+ startX, startY, 0, Math.max(size.x, size.y));
+ valueAnimator.setDuration(getResources().getInteger(R.integer.reveal_animation_duration));
+ return valueAnimator;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java b/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java
new file mode 100644
index 000000000..fe941c8c5
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerFragment.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.app.ActionBar;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.dialer.R;
+
+import java.util.List;
+
+/**
+ * Fragment that allows the user to manage a conference call.
+ */
+public class ConferenceManagerFragment
+ extends BaseFragment<ConferenceManagerPresenter,
+ ConferenceManagerPresenter.ConferenceManagerUi>
+ implements ConferenceManagerPresenter.ConferenceManagerUi {
+
+ private static final String KEY_IS_VISIBLE = "key_conference_is_visible";
+
+ private ListView mConferenceParticipantList;
+ private int mActionBarElevation;
+ private ContactPhotoManager mContactPhotoManager;
+ private LayoutInflater mInflater;
+ private ConferenceParticipantListAdapter mConferenceParticipantListAdapter;
+ private boolean mIsVisible;
+ private boolean mIsRecreating;
+
+ @Override
+ public ConferenceManagerPresenter createPresenter() {
+ return new ConferenceManagerPresenter();
+ }
+
+ @Override
+ public ConferenceManagerPresenter.ConferenceManagerUi getUi() {
+ return this;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ mIsRecreating = true;
+ mIsVisible = savedInstanceState.getBoolean(KEY_IS_VISIBLE);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View parent =
+ inflater.inflate(R.layout.conference_manager_fragment, container, false);
+
+ mConferenceParticipantList = (ListView) parent.findViewById(R.id.participantList);
+ mContactPhotoManager =
+ ContactPhotoManager.getInstance(getActivity().getApplicationContext());
+ mActionBarElevation =
+ (int) getResources().getDimension(R.dimen.incall_action_bar_elevation);
+ mInflater = LayoutInflater.from(getActivity().getApplicationContext());
+
+ return parent;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ if (mIsRecreating) {
+ onVisibilityChanged(mIsVisible);
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ outState.putBoolean(KEY_IS_VISIBLE, mIsVisible);
+ super.onSaveInstanceState(outState);
+ }
+
+ public void onVisibilityChanged(boolean isVisible) {
+ mIsVisible = isVisible;
+ ActionBar actionBar = getActivity().getActionBar();
+ if (isVisible) {
+ actionBar.setTitle(R.string.manageConferenceLabel);
+ actionBar.setElevation(mActionBarElevation);
+ actionBar.setHideOffset(0);
+ actionBar.show();
+
+ final CallList calls = CallList.getInstance();
+ getPresenter().init(getActivity(), calls);
+ // Request focus on the list of participants for accessibility purposes. This ensures
+ // that once the list of participants is shown, the first participant is announced.
+ mConferenceParticipantList.requestFocus();
+ } else {
+ actionBar.setElevation(0);
+ actionBar.setHideOffset(actionBar.getHeight());
+ }
+ }
+
+ @Override
+ public boolean isFragmentVisible() {
+ return isVisible();
+ }
+
+ @Override
+ public void update(Context context, List<Call> participants, boolean parentCanSeparate) {
+ if (mConferenceParticipantListAdapter == null) {
+ mConferenceParticipantListAdapter = new ConferenceParticipantListAdapter(
+ mConferenceParticipantList, context, mInflater, mContactPhotoManager);
+
+ mConferenceParticipantList.setAdapter(mConferenceParticipantListAdapter);
+ }
+ mConferenceParticipantListAdapter.updateParticipants(participants, parentCanSeparate);
+ }
+
+ @Override
+ public void refreshCall(Call call) {
+ mConferenceParticipantListAdapter.refreshCall(call);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
new file mode 100644
index 000000000..6fb6e5dda
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+
+import com.google.common.base.Preconditions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Logic for call buttons.
+ */
+public class ConferenceManagerPresenter
+ extends Presenter<ConferenceManagerPresenter.ConferenceManagerUi>
+ implements InCallStateListener, InCallDetailsListener, IncomingCallListener {
+
+ private Context mContext;
+
+ @Override
+ public void onUiReady(ConferenceManagerUi ui) {
+ super.onUiReady(ui);
+
+ // register for call state changes last
+ InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
+ }
+
+ @Override
+ public void onUiUnready(ConferenceManagerUi ui) {
+ super.onUiUnready(ui);
+
+ InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ }
+
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ if (getUi().isFragmentVisible()) {
+ Log.v(this, "onStateChange" + newState);
+ if (newState == InCallState.INCALL) {
+ final Call call = callList.getActiveOrBackgroundCall();
+ if (call != null && call.isConferenceCall()) {
+ Log.v(this, "Number of existing calls is " +
+ String.valueOf(call.getChildCallIds().size()));
+ update(callList);
+ } else {
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ } else {
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ }
+ }
+
+ @Override
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details) {
+ boolean canDisconnect = details.can(
+ android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
+ boolean canSeparate = details.can(
+ android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE);
+
+ if (call.can(android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE)
+ != canDisconnect
+ || call.can(android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE)
+ != canSeparate) {
+ getUi().refreshCall(call);
+ }
+
+ if (!details.can(
+ android.telecom.Call.Details.CAPABILITY_MANAGE_CONFERENCE)) {
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ }
+
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ // When incoming call exists, set conference ui invisible.
+ if (getUi().isFragmentVisible()) {
+ Log.d(this, "onIncomingCall()... Conference ui is showing, hide it.");
+ InCallPresenter.getInstance().showConferenceCallManager(false);
+ }
+ }
+
+ public void init(Context context, CallList callList) {
+ mContext = Preconditions.checkNotNull(context);
+ mContext = context;
+ update(callList);
+ }
+
+ /**
+ * Updates the conference participant adapter.
+ *
+ * @param callList The callList.
+ */
+ private void update(CallList callList) {
+ // callList is non null, but getActiveOrBackgroundCall() may return null
+ final Call currentCall = callList.getActiveOrBackgroundCall();
+ if (currentCall == null) {
+ return;
+ }
+
+ ArrayList<Call> calls = new ArrayList<>(currentCall.getChildCallIds().size());
+ for (String callerId : currentCall.getChildCallIds()) {
+ calls.add(callList.getCallById(callerId));
+ }
+
+ Log.d(this, "Number of calls is " + String.valueOf(calls.size()));
+
+ // Users can split out a call from the conference call if either the active call or the
+ // holding call is empty. If both are filled, users can not split out another call.
+ final boolean hasActiveCall = (callList.getActiveCall() != null);
+ final boolean hasHoldingCall = (callList.getBackgroundCall() != null);
+ boolean canSeparate = !(hasActiveCall && hasHoldingCall);
+
+ getUi().update(mContext, calls, canSeparate);
+ }
+
+ public interface ConferenceManagerUi extends Ui {
+ boolean isFragmentVisible();
+ void update(Context context, List<Call> participants, boolean parentCanSeparate);
+ void refreshCall(Call call);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java b/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
new file mode 100644
index 000000000..d68ae1f6f
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -0,0 +1,533 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.MoreObjects;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.R;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * Adapter for a ListView containing conference call participant information.
+ */
+public class ConferenceParticipantListAdapter extends BaseAdapter {
+
+ /**
+ * Internal class which represents a participant. Includes a reference to the {@link Call} and
+ * the corresponding {@link ContactCacheEntry} for the participant.
+ */
+ private class ParticipantInfo {
+ private Call mCall;
+ private ContactCacheEntry mContactCacheEntry;
+ private boolean mCacheLookupComplete = false;
+
+ public ParticipantInfo(Call call, ContactCacheEntry contactCacheEntry) {
+ mCall = call;
+ mContactCacheEntry = contactCacheEntry;
+ }
+
+ public Call getCall() {
+ return mCall;
+ }
+
+ public void setCall(Call call) {
+ mCall = call;
+ }
+
+ public ContactCacheEntry getContactCacheEntry() {
+ return mContactCacheEntry;
+ }
+
+ public void setContactCacheEntry(ContactCacheEntry entry) {
+ mContactCacheEntry = entry;
+ }
+
+ public boolean isCacheLookupComplete() {
+ return mCacheLookupComplete;
+ }
+
+ public void setCacheLookupComplete(boolean cacheLookupComplete) {
+ mCacheLookupComplete = cacheLookupComplete;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ParticipantInfo) {
+ ParticipantInfo p = (ParticipantInfo) o;
+ return
+ Objects.equals(p.getCall().getId(), mCall.getId());
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return mCall.getId().hashCode();
+ }
+ }
+
+ /**
+ * Callback class used when making requests to the {@link ContactInfoCache} to resolve contact
+ * info and contact photos for conference participants.
+ */
+ public static class ContactLookupCallback implements ContactInfoCache.ContactInfoCacheCallback {
+ private final WeakReference<ConferenceParticipantListAdapter> mListAdapter;
+
+ public ContactLookupCallback(ConferenceParticipantListAdapter listAdapter) {
+ mListAdapter = new WeakReference<ConferenceParticipantListAdapter>(listAdapter);
+ }
+
+ /**
+ * Called when contact info has been resolved.
+ *
+ * @param callId The call id.
+ * @param entry The new contact information.
+ */
+ @Override
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
+ update(callId, entry);
+ }
+
+ /**
+ * Called when contact photo has been loaded into the cache.
+ *
+ * @param callId The call id.
+ * @param entry The new contact information.
+ */
+ @Override
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ update(callId, entry);
+ }
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {}
+
+ /**
+ * Updates the contact information for a participant.
+ *
+ * @param callId The call id.
+ * @param entry The new contact information.
+ */
+ private void update(String callId, ContactCacheEntry entry) {
+ ConferenceParticipantListAdapter listAdapter = mListAdapter.get();
+ if (listAdapter != null) {
+ listAdapter.updateContactInfo(callId, entry);
+ }
+ }
+ }
+
+ /**
+ * Listener used to handle tap of the "disconnect' button for a participant.
+ */
+ private View.OnClickListener mDisconnectListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ View parent = (View) v.getParent();
+ String callId = (String) parent.getTag();
+ TelecomAdapter.getInstance().disconnectCall(callId);
+ }
+ };
+
+ /**
+ * Listener used to handle tap of the "separate' button for a participant.
+ */
+ private View.OnClickListener mSeparateListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ View parent = (View) v.getParent();
+ String callId = (String) parent.getTag();
+ TelecomAdapter.getInstance().separateCall(callId);
+ }
+ };
+
+ /**
+ * The ListView containing the participant information.
+ */
+ private final ListView mListView;
+
+ /**
+ * The conference participants to show in the ListView.
+ */
+ private List<ParticipantInfo> mConferenceParticipants = new ArrayList<>();
+
+ /**
+ * Hashmap to make accessing participant info by call Id faster.
+ */
+ private final HashMap<String, ParticipantInfo> mParticipantsByCallId = new HashMap<>();
+
+ /**
+ * The context.
+ */
+ private final Context mContext;
+
+ /**
+ * ContactsPreferences used to lookup displayName preferences
+ */
+ @Nullable private final ContactsPreferences mContactsPreferences;
+
+ /**
+ * The layout inflater used to inflate new views.
+ */
+ private final LayoutInflater mLayoutInflater;
+
+ /**
+ * Contact photo manager to retrieve cached contact photo information.
+ */
+ private final ContactPhotoManager mContactPhotoManager;
+
+ /**
+ * {@code True} if the conference parent supports separating calls from the conference.
+ */
+ private boolean mParentCanSeparate;
+
+ /**
+ * Creates an instance of the ConferenceParticipantListAdapter.
+ *
+ * @param listView The listview.
+ * @param context The context.
+ * @param layoutInflater The layout inflater.
+ * @param contactPhotoManager The contact photo manager, used to load contact photos.
+ */
+ public ConferenceParticipantListAdapter(ListView listView, Context context,
+ LayoutInflater layoutInflater, ContactPhotoManager contactPhotoManager) {
+
+ mListView = listView;
+ mContext = context;
+ mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+ mLayoutInflater = layoutInflater;
+ mContactPhotoManager = contactPhotoManager;
+ }
+
+ /**
+ * Updates the adapter with the new conference participant information provided.
+ *
+ * @param conferenceParticipants The list of conference participants.
+ * @param parentCanSeparate {@code True} if the parent supports separating calls from the
+ * conference.
+ */
+ public void updateParticipants(List<Call> conferenceParticipants, boolean parentCanSeparate) {
+ if (mContactsPreferences != null) {
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
+ }
+ mParentCanSeparate = parentCanSeparate;
+ updateParticipantInfo(conferenceParticipants);
+ }
+
+ /**
+ * Determines the number of participants in the conference.
+ *
+ * @return The number of participants.
+ */
+ @Override
+ public int getCount() {
+ return mConferenceParticipants.size();
+ }
+
+ /**
+ * Retrieves an item from the list of participants.
+ *
+ * @param position Position of the item whose data we want within the adapter's
+ * data set.
+ * @return The {@link ParticipantInfo}.
+ */
+ @Override
+ public Object getItem(int position) {
+ return mConferenceParticipants.get(position);
+ }
+
+ /**
+ * Retreives the adapter-specific item id for an item at a specified position.
+ *
+ * @param position The position of the item within the adapter's data set whose row id we want.
+ * @return The item id.
+ */
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ /**
+ * Refreshes call information for the call passed in.
+ *
+ * @param call The new call information.
+ */
+ public void refreshCall(Call call) {
+ String callId = call.getId();
+
+ if (mParticipantsByCallId.containsKey(callId)) {
+ ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+ participantInfo.setCall(call);
+ refreshView(callId);
+ }
+ }
+
+ /**
+ * Attempts to refresh the view for the specified call ID. This ensures the contact info and
+ * photo loaded from cache are updated.
+ *
+ * @param callId The call id.
+ */
+ private void refreshView(String callId) {
+ int first = mListView.getFirstVisiblePosition();
+ int last = mListView.getLastVisiblePosition();
+
+ for (int position = 0; position <= last - first; position++) {
+ View view = mListView.getChildAt(position);
+ String rowCallId = (String) view.getTag();
+ if (rowCallId.equals(callId)) {
+ getView(position+first, view, mListView);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Creates or populates an existing conference participant row.
+ *
+ * @param position The position of the item within the adapter's data set of the item whose view
+ * we want.
+ * @param convertView The old view to reuse, if possible.
+ * @param parent The parent that this view will eventually be attached to
+ * @return The populated view.
+ */
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ // Make sure we have a valid convertView to start with
+ final View result = convertView == null
+ ? mLayoutInflater.inflate(R.layout.caller_in_conference, parent, false)
+ : convertView;
+
+ ParticipantInfo participantInfo = mConferenceParticipants.get(position);
+ Call call = participantInfo.getCall();
+ ContactCacheEntry contactCache = participantInfo.getContactCacheEntry();
+
+ final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+
+ // If a cache lookup has not yet been performed to retrieve the contact information and
+ // photo, do it now.
+ if (!participantInfo.isCacheLookupComplete()) {
+ cache.findInfo(participantInfo.getCall(),
+ participantInfo.getCall().getState() == Call.State.INCOMING,
+ new ContactLookupCallback(this));
+ }
+
+ boolean thisRowCanSeparate = mParentCanSeparate && call.getTelecomCall().getDetails().can(
+ android.telecom.Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE);
+ boolean thisRowCanDisconnect = call.getTelecomCall().getDetails().can(
+ android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
+
+ setCallerInfoForRow(result, contactCache.namePrimary,
+ ContactDisplayUtils.getPreferredDisplayName(contactCache.namePrimary,
+ contactCache.nameAlternative, mContactsPreferences),
+ contactCache.number, contactCache.label,
+ contactCache.lookupKey, contactCache.displayPhotoUri, thisRowCanSeparate,
+ thisRowCanDisconnect);
+
+ // Tag the row in the conference participant list with the call id to make it easier to
+ // find calls when contact cache information is loaded.
+ result.setTag(call.getId());
+
+ return result;
+ }
+
+ /**
+ * Replaces the contact info for a participant and triggers a refresh of the UI.
+ *
+ * @param callId The call id.
+ * @param entry The new contact info.
+ */
+ /* package */ void updateContactInfo(String callId, ContactCacheEntry entry) {
+ if (mParticipantsByCallId.containsKey(callId)) {
+ ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+ participantInfo.setContactCacheEntry(entry);
+ participantInfo.setCacheLookupComplete(true);
+ refreshView(callId);
+ }
+ }
+
+ /**
+ * Sets the caller information for a row in the conference participant list.
+ *
+ * @param view The view to set the details on.
+ * @param callerName The participant's name.
+ * @param callerNumber The participant's phone number.
+ * @param callerNumberType The participant's phone number typ.e
+ * @param lookupKey The lookup key for the participant (for photo lookup).
+ * @param photoUri The URI of the contact photo.
+ * @param thisRowCanSeparate {@code True} if this participant can separate from the conference.
+ * @param thisRowCanDisconnect {@code True} if this participant can be disconnected.
+ */
+ private final void setCallerInfoForRow(View view, String callerName, String preferredName,
+ String callerNumber, String callerNumberType, String lookupKey, Uri photoUri,
+ boolean thisRowCanSeparate, boolean thisRowCanDisconnect) {
+
+ final ImageView photoView = (ImageView) view.findViewById(R.id.callerPhoto);
+ final TextView nameTextView = (TextView) view.findViewById(R.id.conferenceCallerName);
+ final TextView numberTextView = (TextView) view.findViewById(R.id.conferenceCallerNumber);
+ final TextView numberTypeTextView = (TextView) view.findViewById(
+ R.id.conferenceCallerNumberType);
+ final View endButton = view.findViewById(R.id.conferenceCallerDisconnect);
+ final View separateButton = view.findViewById(R.id.conferenceCallerSeparate);
+
+ endButton.setVisibility(thisRowCanDisconnect ? View.VISIBLE : View.GONE);
+ if (thisRowCanDisconnect) {
+ endButton.setOnClickListener(mDisconnectListener);
+ } else {
+ endButton.setOnClickListener(null);
+ }
+
+ separateButton.setVisibility(thisRowCanSeparate ? View.VISIBLE : View.GONE);
+ if (thisRowCanSeparate) {
+ separateButton.setOnClickListener(mSeparateListener);
+ } else {
+ separateButton.setOnClickListener(null);
+ }
+
+ DefaultImageRequest imageRequest = (photoUri != null) ? null :
+ new DefaultImageRequest(callerName, lookupKey, true /* isCircularPhoto */);
+
+ mContactPhotoManager.loadDirectoryPhoto(photoView, photoUri, false, true, imageRequest);
+
+ // set the caller name
+ nameTextView.setText(preferredName);
+
+ // set the caller number in subscript, or make the field disappear.
+ if (TextUtils.isEmpty(callerNumber)) {
+ numberTextView.setVisibility(View.GONE);
+ numberTypeTextView.setVisibility(View.GONE);
+ } else {
+ numberTextView.setVisibility(View.VISIBLE);
+ numberTextView.setText(PhoneNumberUtilsCompat.createTtsSpannable(
+ BidiFormatter.getInstance().unicodeWrap(
+ callerNumber, TextDirectionHeuristics.LTR)));
+ numberTypeTextView.setVisibility(View.VISIBLE);
+ numberTypeTextView.setText(callerNumberType);
+ }
+ }
+
+ /**
+ * Updates the participant info list which is bound to the ListView. Stores the call and
+ * contact info for all entries. The list is sorted alphabetically by participant name.
+ *
+ * @param conferenceParticipants The calls which make up the conference participants.
+ */
+ private void updateParticipantInfo(List<Call> conferenceParticipants) {
+ final ContactInfoCache cache = ContactInfoCache.getInstance(mContext);
+ boolean newParticipantAdded = false;
+ HashSet<String> newCallIds = new HashSet<>(conferenceParticipants.size());
+
+ // Update or add conference participant info.
+ for (Call call : conferenceParticipants) {
+ String callId = call.getId();
+ newCallIds.add(callId);
+ ContactCacheEntry contactCache = cache.getInfo(callId);
+ if (contactCache == null) {
+ contactCache = ContactInfoCache.buildCacheEntryFromCall(mContext, call,
+ call.getState() == Call.State.INCOMING);
+ }
+
+ if (mParticipantsByCallId.containsKey(callId)) {
+ ParticipantInfo participantInfo = mParticipantsByCallId.get(callId);
+ participantInfo.setCall(call);
+ participantInfo.setContactCacheEntry(contactCache);
+ } else {
+ newParticipantAdded = true;
+ ParticipantInfo participantInfo = new ParticipantInfo(call, contactCache);
+ mConferenceParticipants.add(participantInfo);
+ mParticipantsByCallId.put(call.getId(), participantInfo);
+ }
+ }
+
+ // Remove any participants that no longer exist.
+ Iterator<Map.Entry<String, ParticipantInfo>> it =
+ mParticipantsByCallId.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry<String, ParticipantInfo> entry = it.next();
+ String existingCallId = entry.getKey();
+ if (!newCallIds.contains(existingCallId)) {
+ ParticipantInfo existingInfo = entry.getValue();
+ mConferenceParticipants.remove(existingInfo);
+ it.remove();
+ }
+ }
+
+ if (newParticipantAdded) {
+ // Sort the list of participants by contact name.
+ sortParticipantList();
+ }
+ notifyDataSetChanged();
+ }
+
+ /**
+ * Sorts the participant list by contact name.
+ */
+ private void sortParticipantList() {
+ Collections.sort(mConferenceParticipants, new Comparator<ParticipantInfo>() {
+ public int compare(ParticipantInfo p1, ParticipantInfo p2) {
+ // Contact names might be null, so replace with empty string.
+ ContactCacheEntry c1 = p1.getContactCacheEntry();
+ String p1Name = MoreObjects.firstNonNull(
+ ContactDisplayUtils.getPreferredSortName(
+ c1.namePrimary,
+ c1.nameAlternative,
+ mContactsPreferences),
+ "");
+
+ ContactCacheEntry c2 = p2.getContactCacheEntry();
+ String p2Name = MoreObjects.firstNonNull(
+ ContactDisplayUtils.getPreferredSortName(
+ c2.namePrimary,
+ c2.nameAlternative,
+ mContactsPreferences),
+ "");
+
+ return p1Name.compareToIgnoreCase(p2Name);
+ }
+ });
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
new file mode 100644
index 000000000..9d6fc4627
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -0,0 +1,699 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.location.Address;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Looper;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.DisplayNameSources;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
+import android.util.Pair;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
+import com.android.dialer.util.MoreStrings;
+import com.android.incallui.Call.LogState;
+import com.android.incallui.service.PhoneNumberService;
+import com.android.incalluibind.ObjectFactory;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Class responsible for querying Contact Information for Call objects. Can perform asynchronous
+ * requests to the Contact Provider for information as well as respond synchronously for any data
+ * that it currently has cached from previous queries. This class always gets called from the UI
+ * thread so it does not need thread protection.
+ */
+public class ContactInfoCache implements ContactsAsyncHelper.OnImageLoadCompleteListener {
+
+ private static final String TAG = ContactInfoCache.class.getSimpleName();
+ private static final int TOKEN_UPDATE_PHOTO_FOR_CALL_STATE = 0;
+
+ private final Context mContext;
+ private final PhoneNumberService mPhoneNumberService;
+ private final CachedNumberLookupService mCachedNumberLookupService;
+ private final HashMap<String, ContactCacheEntry> mInfoMap = Maps.newHashMap();
+ private final HashMap<String, Set<ContactInfoCacheCallback>> mCallBacks = Maps.newHashMap();
+
+ private static ContactInfoCache sCache = null;
+
+ private Drawable mDefaultContactPhotoDrawable;
+ private Drawable mConferencePhotoDrawable;
+ private ContactUtils mContactUtils;
+
+ public static synchronized ContactInfoCache getInstance(Context mContext) {
+ if (sCache == null) {
+ sCache = new ContactInfoCache(mContext.getApplicationContext());
+ }
+ return sCache;
+ }
+
+ private ContactInfoCache(Context context) {
+ mContext = context;
+ mPhoneNumberService = ObjectFactory.newPhoneNumberService(context);
+ mCachedNumberLookupService =
+ com.android.dialerbind.ObjectFactory.newCachedNumberLookupService();
+ mContactUtils = ObjectFactory.getContactUtilsInstance(context);
+
+ }
+
+ public ContactCacheEntry getInfo(String callId) {
+ return mInfoMap.get(callId);
+ }
+
+ public static ContactCacheEntry buildCacheEntryFromCall(Context context, Call call,
+ boolean isIncoming) {
+ final ContactCacheEntry entry = new ContactCacheEntry();
+
+ // TODO: get rid of caller info.
+ final CallerInfo info = CallerInfoUtils.buildCallerInfo(context, call);
+ ContactInfoCache.populateCacheEntry(context, info, entry, call.getNumberPresentation(),
+ isIncoming);
+ return entry;
+ }
+
+ public void maybeInsertCnapInformationIntoCache(Context context, final Call call,
+ final CallerInfo info) {
+ if (mCachedNumberLookupService == null || TextUtils.isEmpty(info.cnapName)
+ || mInfoMap.get(call.getId()) != null) {
+ return;
+ }
+ final Context applicationContext = context.getApplicationContext();
+ Log.i(TAG, "Found contact with CNAP name - inserting into cache");
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ ContactInfo contactInfo = new ContactInfo();
+ CachedContactInfo cacheInfo = mCachedNumberLookupService.buildCachedContactInfo(
+ contactInfo);
+ cacheInfo.setSource(CachedContactInfo.SOURCE_TYPE_CNAP, "CNAP", 0);
+ contactInfo.name = info.cnapName;
+ contactInfo.number = call.getNumber();
+ contactInfo.type = ContactsContract.CommonDataKinds.Phone.TYPE_MAIN;
+ try {
+ final JSONObject contactRows = new JSONObject().put(Phone.CONTENT_ITEM_TYPE,
+ new JSONObject()
+ .put(Phone.NUMBER, contactInfo.number)
+ .put(Phone.TYPE, Phone.TYPE_MAIN));
+ final String jsonString = new JSONObject()
+ .put(Contacts.DISPLAY_NAME, contactInfo.name)
+ .put(Contacts.DISPLAY_NAME_SOURCE, DisplayNameSources.STRUCTURED_NAME)
+ .put(Contacts.CONTENT_ITEM_TYPE, contactRows).toString();
+ cacheInfo.setLookupKey(jsonString);
+ } catch (JSONException e) {
+ Log.w(TAG, "Creation of lookup key failed when caching CNAP information");
+ }
+ mCachedNumberLookupService.addContact(applicationContext, cacheInfo);
+ return null;
+ }
+ }.execute();
+ }
+
+ private class FindInfoCallback implements CallerInfoAsyncQuery.OnQueryCompleteListener {
+ private final boolean mIsIncoming;
+
+ public FindInfoCallback(boolean isIncoming) {
+ mIsIncoming = isIncoming;
+ }
+
+ @Override
+ public void onQueryComplete(int token, Object cookie, CallerInfo callerInfo) {
+ findInfoQueryComplete((Call) cookie, callerInfo, mIsIncoming, true);
+ }
+ }
+
+ /**
+ * Requests contact data for the Call object passed in.
+ * Returns the data through callback. If callback is null, no response is made, however the
+ * query is still performed and cached.
+ *
+ * @param callback The function to call back when the call is found. Can be null.
+ */
+ public void findInfo(final Call call, final boolean isIncoming,
+ ContactInfoCacheCallback callback) {
+ Preconditions.checkState(Looper.getMainLooper().getThread() == Thread.currentThread());
+ Preconditions.checkNotNull(callback);
+
+ final String callId = call.getId();
+ final ContactCacheEntry cacheEntry = mInfoMap.get(callId);
+ Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+
+ // If we have a previously obtained intermediate result return that now
+ if (cacheEntry != null) {
+ Log.d(TAG, "Contact lookup. In memory cache hit; lookup "
+ + (callBacks == null ? "complete" : "still running"));
+ callback.onContactInfoComplete(callId, cacheEntry);
+ // If no other callbacks are in flight, we're done.
+ if (callBacks == null) {
+ return;
+ }
+ }
+
+ // If the entry already exists, add callback
+ if (callBacks != null) {
+ callBacks.add(callback);
+ return;
+ }
+ Log.d(TAG, "Contact lookup. In memory cache miss; searching provider.");
+ // New lookup
+ callBacks = Sets.newHashSet();
+ callBacks.add(callback);
+ mCallBacks.put(callId, callBacks);
+
+ /**
+ * Performs a query for caller information.
+ * Save any immediate data we get from the query. An asynchronous query may also be made
+ * for any data that we do not already have. Some queries, such as those for voicemail and
+ * emergency call information, will not perform an additional asynchronous query.
+ */
+ final CallerInfo callerInfo = CallerInfoUtils.getCallerInfoForCall(
+ mContext, call, new FindInfoCallback(isIncoming));
+
+ findInfoQueryComplete(call, callerInfo, isIncoming, false);
+ }
+
+ private void findInfoQueryComplete(Call call, CallerInfo callerInfo, boolean isIncoming,
+ boolean didLocalLookup) {
+ final String callId = call.getId();
+ int presentationMode = call.getNumberPresentation();
+ if (callerInfo.contactExists || callerInfo.isEmergencyNumber() ||
+ callerInfo.isVoiceMailNumber()) {
+ presentationMode = TelecomManager.PRESENTATION_ALLOWED;
+ }
+
+ ContactCacheEntry cacheEntry = mInfoMap.get(callId);
+ // Ensure we always have a cacheEntry. Replace the existing entry if
+ // it has no name or if we found a local contact.
+ if (cacheEntry == null || TextUtils.isEmpty(cacheEntry.namePrimary) ||
+ callerInfo.contactExists) {
+ cacheEntry = buildEntry(mContext, callId, callerInfo, presentationMode, isIncoming);
+ mInfoMap.put(callId, cacheEntry);
+ }
+
+ sendInfoNotifications(callId, cacheEntry);
+
+ if (didLocalLookup) {
+ // Before issuing a request for more data from other services, we only check that the
+ // contact wasn't found in the local DB. We don't check the if the cache entry already
+ // has a name because we allow overriding cnap data with data from other services.
+ if (!callerInfo.contactExists && mPhoneNumberService != null) {
+ Log.d(TAG, "Contact lookup. Local contacts miss, checking remote");
+ final PhoneNumberServiceListener listener = new PhoneNumberServiceListener(callId);
+ mPhoneNumberService.getPhoneNumberInfo(cacheEntry.number, listener, listener,
+ isIncoming);
+ } else if (cacheEntry.displayPhotoUri != null) {
+ Log.d(TAG, "Contact lookup. Local contact found, starting image load");
+ // Load the image with a callback to update the image state.
+ // When the load is finished, onImageLoadComplete() will be called.
+ cacheEntry.isLoadingPhoto = true;
+ ContactsAsyncHelper.startObtainPhotoAsync(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE,
+ mContext, cacheEntry.displayPhotoUri, ContactInfoCache.this, callId);
+ } else {
+ if (callerInfo.contactExists) {
+ Log.d(TAG, "Contact lookup done. Local contact found, no image.");
+ } else {
+ Log.d(TAG, "Contact lookup done. Local contact not found and"
+ + " no remote lookup service available.");
+ }
+ clearCallbacks(callId);
+ }
+ }
+ }
+
+ class PhoneNumberServiceListener implements PhoneNumberService.NumberLookupListener,
+ PhoneNumberService.ImageLookupListener, ContactUtils.Listener {
+ private final String mCallId;
+
+ PhoneNumberServiceListener(String callId) {
+ mCallId = callId;
+ }
+
+ @Override
+ public void onPhoneNumberInfoComplete(
+ final PhoneNumberService.PhoneNumberInfo info) {
+ // If we got a miss, this is the end of the lookup pipeline,
+ // so clear the callbacks and return.
+ if (info == null) {
+ Log.d(TAG, "Contact lookup done. Remote contact not found.");
+ clearCallbacks(mCallId);
+ return;
+ }
+
+ ContactCacheEntry entry = new ContactCacheEntry();
+ entry.namePrimary = info.getDisplayName();
+ entry.number = info.getNumber();
+ entry.contactLookupResult = info.getLookupSource();
+ final int type = info.getPhoneType();
+ final String label = info.getPhoneLabel();
+ if (type == Phone.TYPE_CUSTOM) {
+ entry.label = label;
+ } else {
+ final CharSequence typeStr = Phone.getTypeLabel(
+ mContext.getResources(), type, label);
+ entry.label = typeStr == null ? null : typeStr.toString();
+ }
+ final ContactCacheEntry oldEntry = mInfoMap.get(mCallId);
+ if (oldEntry != null) {
+ // Location is only obtained from local lookup so persist
+ // the value for remote lookups. Once we have a name this
+ // field is no longer used; it is persisted here in case
+ // the UI is ever changed to use it.
+ entry.location = oldEntry.location;
+ // Contact specific ringtone is obtained from local lookup.
+ entry.contactRingtoneUri = oldEntry.contactRingtoneUri;
+ }
+
+ // If no image and it's a business, switch to using the default business avatar.
+ if (info.getImageUrl() == null && info.isBusiness()) {
+ Log.d(TAG, "Business has no image. Using default.");
+ entry.photo = mContext.getResources().getDrawable(R.drawable.img_business);
+ }
+
+ mInfoMap.put(mCallId, entry);
+ sendInfoNotifications(mCallId, entry);
+
+ if (mContactUtils != null) {
+ // This method will callback "onContactInteractionsFound".
+ entry.isLoadingContactInteractions =
+ mContactUtils.retrieveContactInteractionsFromLookupKey(
+ info.getLookupKey(), this);
+ }
+
+ entry.isLoadingPhoto = info.getImageUrl() != null;
+
+ // If there is no image or contact interactions then we should not expect another
+ // callback.
+ if (!entry.isLoadingPhoto && !entry.isLoadingContactInteractions) {
+ // We're done, so clear callbacks
+ clearCallbacks(mCallId);
+ }
+ }
+
+ @Override
+ public void onImageFetchComplete(Bitmap bitmap) {
+ onImageLoadComplete(TOKEN_UPDATE_PHOTO_FOR_CALL_STATE, null, bitmap, mCallId);
+ }
+
+ @Override
+ public void onContactInteractionsFound(Address address,
+ List<Pair<Calendar, Calendar>> openingHours) {
+ final ContactCacheEntry entry = mInfoMap.get(mCallId);
+ if (entry == null) {
+ Log.e(this, "Contact context received for empty search entry.");
+ clearCallbacks(mCallId);
+ return;
+ }
+
+ entry.isLoadingContactInteractions = false;
+
+ Log.v(ContactInfoCache.this, "Setting contact interactions for entry: ", entry);
+
+ entry.locationAddress = address;
+ entry.openingHours = openingHours;
+ sendContactInteractionsNotifications(mCallId, entry);
+
+ if (!entry.isLoadingPhoto) {
+ clearCallbacks(mCallId);
+ }
+ }
+ }
+
+ /**
+ * Implemented for ContactsAsyncHelper.OnImageLoadCompleteListener interface.
+ * make sure that the call state is reflected after the image is loaded.
+ */
+ @Override
+ public void onImageLoadComplete(int token, Drawable photo, Bitmap photoIcon, Object cookie) {
+ Log.d(this, "Image load complete with context: ", mContext);
+ // TODO: may be nice to update the image view again once the newer one
+ // is available on contacts database.
+
+ final String callId = (String) cookie;
+ final ContactCacheEntry entry = mInfoMap.get(callId);
+
+ if (entry == null) {
+ Log.e(this, "Image Load received for empty search entry.");
+ clearCallbacks(callId);
+ return;
+ }
+
+ entry.isLoadingPhoto = false;
+
+ Log.d(this, "setting photo for entry: ", entry);
+
+ // Conference call icons are being handled in CallCardPresenter.
+ if (photo != null) {
+ Log.v(this, "direct drawable: ", photo);
+ entry.photo = photo;
+ } else if (photoIcon != null) {
+ Log.v(this, "photo icon: ", photoIcon);
+ entry.photo = new BitmapDrawable(mContext.getResources(), photoIcon);
+ } else {
+ Log.v(this, "unknown photo");
+ entry.photo = null;
+ }
+
+ sendImageNotifications(callId, entry);
+
+ if (!entry.isLoadingContactInteractions) {
+ clearCallbacks(callId);
+ }
+ }
+
+ /**
+ * Blows away the stored cache values.
+ */
+ public void clearCache() {
+ mInfoMap.clear();
+ mCallBacks.clear();
+ }
+
+ private ContactCacheEntry buildEntry(Context context, String callId,
+ CallerInfo info, int presentation, boolean isIncoming) {
+ // The actual strings we're going to display onscreen:
+ Drawable photo = null;
+
+ final ContactCacheEntry cce = new ContactCacheEntry();
+ populateCacheEntry(context, info, cce, presentation, isIncoming);
+
+ // This will only be true for emergency numbers
+ if (info.photoResource != 0) {
+ photo = context.getResources().getDrawable(info.photoResource);
+ } else if (info.isCachedPhotoCurrent) {
+ if (info.cachedPhoto != null) {
+ photo = info.cachedPhoto;
+ } else {
+ photo = getDefaultContactPhotoDrawable();
+ }
+ } else if (info.contactDisplayPhotoUri == null) {
+ photo = getDefaultContactPhotoDrawable();
+ } else {
+ cce.displayPhotoUri = info.contactDisplayPhotoUri;
+ }
+
+ // Support any contact id in N because QuickContacts in N starts supporting enterprise
+ // contact id
+ if (info.lookupKeyOrNull != null
+ && (ContactsUtils.FLAG_N_FEATURE || info.contactIdOrZero != 0)) {
+ cce.lookupUri = Contacts.getLookupUri(info.contactIdOrZero, info.lookupKeyOrNull);
+ } else {
+ Log.v(TAG, "lookup key is null or contact ID is 0 on M. Don't create a lookup uri.");
+ cce.lookupUri = null;
+ }
+
+ cce.photo = photo;
+ cce.lookupKey = info.lookupKeyOrNull;
+ cce.contactRingtoneUri = info.contactRingtoneUri;
+ if (cce.contactRingtoneUri == null || cce.contactRingtoneUri == Uri.EMPTY) {
+ cce.contactRingtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+ }
+
+ return cce;
+ }
+
+ /**
+ * Populate a cache entry from a call (which got converted into a caller info).
+ */
+ public static void populateCacheEntry(Context context, CallerInfo info, ContactCacheEntry cce,
+ int presentation, boolean isIncoming) {
+ Preconditions.checkNotNull(info);
+ String displayName = null;
+ String displayNumber = null;
+ String displayLocation = null;
+ String label = null;
+ boolean isSipCall = false;
+
+ // It appears that there is a small change in behaviour with the
+ // PhoneUtils' startGetCallerInfo whereby if we query with an
+ // empty number, we will get a valid CallerInfo object, but with
+ // fields that are all null, and the isTemporary boolean input
+ // parameter as true.
+
+ // In the past, we would see a NULL callerinfo object, but this
+ // ends up causing null pointer exceptions elsewhere down the
+ // line in other cases, so we need to make this fix instead. It
+ // appears that this was the ONLY call to PhoneUtils
+ // .getCallerInfo() that relied on a NULL CallerInfo to indicate
+ // an unknown contact.
+
+ // Currently, infi.phoneNumber may actually be a SIP address, and
+ // if so, it might sometimes include the "sip:" prefix. That
+ // prefix isn't really useful to the user, though, so strip it off
+ // if present. (For any other URI scheme, though, leave the
+ // prefix alone.)
+ // TODO: It would be cleaner for CallerInfo to explicitly support
+ // SIP addresses instead of overloading the "phoneNumber" field.
+ // Then we could remove this hack, and instead ask the CallerInfo
+ // for a "user visible" form of the SIP address.
+ String number = info.phoneNumber;
+
+ if (!TextUtils.isEmpty(number)) {
+ isSipCall = PhoneNumberHelper.isUriNumber(number);
+ if (number.startsWith("sip:")) {
+ number = number.substring(4);
+ }
+ }
+
+ if (TextUtils.isEmpty(info.name)) {
+ // No valid "name" in the CallerInfo, so fall back to
+ // something else.
+ // (Typically, we promote the phone number up to the "name" slot
+ // onscreen, and possibly display a descriptive string in the
+ // "number" slot.)
+ if (TextUtils.isEmpty(number)) {
+ // No name *or* number! Display a generic "unknown" string
+ // (or potentially some other default based on the presentation.)
+ displayName = getPresentationString(context, presentation, info.callSubject);
+ Log.d(TAG, " ==> no name *or* number! displayName = " + displayName);
+ } else if (presentation != TelecomManager.PRESENTATION_ALLOWED) {
+ // This case should never happen since the network should never send a phone #
+ // AND a restricted presentation. However we leave it here in case of weird
+ // network behavior
+ displayName = getPresentationString(context, presentation, info.callSubject);
+ Log.d(TAG, " ==> presentation not allowed! displayName = " + displayName);
+ } else if (!TextUtils.isEmpty(info.cnapName)) {
+ // No name, but we do have a valid CNAP name, so use that.
+ displayName = info.cnapName;
+ info.name = info.cnapName;
+ displayNumber = number;
+ Log.d(TAG, " ==> cnapName available: displayName '" + displayName +
+ "', displayNumber '" + displayNumber + "'");
+ } else {
+ // No name; all we have is a number. This is the typical
+ // case when an incoming call doesn't match any contact,
+ // or if you manually dial an outgoing number using the
+ // dialpad.
+ displayNumber = number;
+
+ // Display a geographical description string if available
+ // (but only for incoming calls.)
+ if (isIncoming) {
+ // TODO (CallerInfoAsyncQuery cleanup): Fix the CallerInfo
+ // query to only do the geoDescription lookup in the first
+ // place for incoming calls.
+ displayLocation = info.geoDescription; // may be null
+ Log.d(TAG, "Geodescrption: " + info.geoDescription);
+ }
+
+ Log.d(TAG, " ==> no name; falling back to number:"
+ + " displayNumber '" + Log.pii(displayNumber)
+ + "', displayLocation '" + displayLocation + "'");
+ }
+ } else {
+ // We do have a valid "name" in the CallerInfo. Display that
+ // in the "name" slot, and the phone number in the "number" slot.
+ if (presentation != TelecomManager.PRESENTATION_ALLOWED) {
+ // This case should never happen since the network should never send a name
+ // AND a restricted presentation. However we leave it here in case of weird
+ // network behavior
+ displayName = getPresentationString(context, presentation, info.callSubject);
+ Log.d(TAG, " ==> valid name, but presentation not allowed!" +
+ " displayName = " + displayName);
+ } else {
+ // Causes cce.namePrimary to be set as info.name below. CallCardPresenter will
+ // later determine whether to use the name or nameAlternative when presenting
+ displayName = info.name;
+ cce.nameAlternative = info.nameAlternative;
+ displayNumber = number;
+ label = info.phoneLabel;
+ Log.d(TAG, " ==> name is present in CallerInfo: displayName '" + displayName
+ + "', displayNumber '" + displayNumber + "'");
+ }
+ }
+
+ cce.namePrimary = displayName;
+ cce.number = displayNumber;
+ cce.location = displayLocation;
+ cce.label = label;
+ cce.isSipCall = isSipCall;
+ cce.userType = info.userType;
+
+ if (info.contactExists) {
+ cce.contactLookupResult = LogState.LOOKUP_LOCAL_CONTACT;
+ }
+ }
+
+ /**
+ * Sends the updated information to call the callbacks for the entry.
+ */
+ private void sendInfoNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onContactInfoComplete(callId, entry);
+ }
+ }
+ }
+
+ private void sendImageNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null && entry.photo != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onImageLoadComplete(callId, entry);
+ }
+ }
+ }
+
+ private void sendContactInteractionsNotifications(String callId, ContactCacheEntry entry) {
+ final Set<ContactInfoCacheCallback> callBacks = mCallBacks.get(callId);
+ if (callBacks != null) {
+ for (ContactInfoCacheCallback callBack : callBacks) {
+ callBack.onContactInteractionsInfoComplete(callId, entry);
+ }
+ }
+ }
+
+ private void clearCallbacks(String callId) {
+ mCallBacks.remove(callId);
+ }
+
+ /**
+ * Gets name strings based on some special presentation modes and the associated custom label.
+ */
+ private static String getPresentationString(Context context, int presentation,
+ String customLabel) {
+ String name = context.getString(R.string.unknown);
+ if (!TextUtils.isEmpty(customLabel) &&
+ ((presentation == TelecomManager.PRESENTATION_UNKNOWN) ||
+ (presentation == TelecomManager.PRESENTATION_RESTRICTED))) {
+ name = customLabel;
+ return name;
+ } else {
+ if (presentation == TelecomManager.PRESENTATION_RESTRICTED) {
+ name = context.getString(R.string.private_num);
+ } else if (presentation == TelecomManager.PRESENTATION_PAYPHONE) {
+ name = context.getString(R.string.payphone);
+ }
+ }
+ return name;
+ }
+
+ public Drawable getDefaultContactPhotoDrawable() {
+ if (mDefaultContactPhotoDrawable == null) {
+ mDefaultContactPhotoDrawable =
+ mContext.getResources().getDrawable(R.drawable.img_no_image_automirrored);
+ }
+ return mDefaultContactPhotoDrawable;
+ }
+
+ public Drawable getConferenceDrawable() {
+ if (mConferencePhotoDrawable == null) {
+ mConferencePhotoDrawable =
+ mContext.getResources().getDrawable(R.drawable.img_conference_automirrored);
+ }
+ return mConferencePhotoDrawable;
+ }
+
+ /**
+ * Callback interface for the contact query.
+ */
+ public interface ContactInfoCacheCallback {
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry);
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry);
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry);
+ }
+
+ public static class ContactCacheEntry {
+ public String namePrimary;
+ public String nameAlternative;
+ public String number;
+ public String location;
+ public String label;
+ public Drawable photo;
+ public boolean isSipCall;
+ // Note in cache entry whether this is a pending async loading action to know whether to
+ // wait for its callback or not.
+ public boolean isLoadingPhoto;
+ public boolean isLoadingContactInteractions;
+ /** This will be used for the "view" notification. */
+ public Uri contactUri;
+ /** Either a display photo or a thumbnail URI. */
+ public Uri displayPhotoUri;
+ public Uri lookupUri; // Sent to NotificationMananger
+ public String lookupKey;
+ public Address locationAddress;
+ public List<Pair<Calendar, Calendar>> openingHours;
+ public int contactLookupResult = LogState.LOOKUP_NOT_FOUND;
+ public long userType = ContactsUtils.USER_TYPE_CURRENT;
+ public Uri contactRingtoneUri;
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("name", MoreStrings.toSafeString(namePrimary))
+ .add("nameAlternative", MoreStrings.toSafeString(nameAlternative))
+ .add("number", MoreStrings.toSafeString(number))
+ .add("location", MoreStrings.toSafeString(location))
+ .add("label", label)
+ .add("photo", photo)
+ .add("isSipCall", isSipCall)
+ .add("contactUri", contactUri)
+ .add("displayPhotoUri", displayPhotoUri)
+ .add("locationAddress", locationAddress)
+ .add("openingHours", openingHours)
+ .add("contactLookupResult", contactLookupResult)
+ .add("userType", userType)
+ .add("contactRingtoneUri", contactRingtoneUri)
+ .toString();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ContactUtils.java b/InCallUI/src/com/android/incallui/ContactUtils.java
new file mode 100644
index 000000000..0750af731
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactUtils.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.incallui;
+
+import android.content.Context;
+import android.location.Address;
+import android.util.Pair;
+
+import com.android.incalluibind.ObjectFactory;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * Utility functions to help manipulate contact data.
+ */
+public abstract class ContactUtils {
+ protected Context mContext;
+
+ public static ContactUtils getInstance(Context context) {
+ return ObjectFactory.getContactUtilsInstance(context);
+ }
+
+ protected ContactUtils(Context context) {
+ mContext = context;
+ }
+
+ public interface Listener {
+ public void onContactInteractionsFound(Address address,
+ List<Pair<Calendar, Calendar>> openingHours);
+ }
+
+ public abstract boolean retrieveContactInteractionsFromLookupKey(String lookupKey,
+ Listener listener);
+}
diff --git a/InCallUI/src/com/android/incallui/ContactsAsyncHelper.java b/InCallUI/src/com/android/incallui/ContactsAsyncHelper.java
new file mode 100644
index 000000000..d959fadd4
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactsAsyncHelper.java
@@ -0,0 +1,258 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.app.Notification;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+import android.provider.ContactsContract.Contacts;
+
+import com.android.dialer.R;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Helper class for loading contacts photo asynchronously.
+ */
+public class ContactsAsyncHelper {
+
+ /**
+ * Interface for a WorkerHandler result return.
+ */
+ public interface OnImageLoadCompleteListener {
+ /**
+ * Called when the image load is complete.
+ *
+ * @param token Integer passed in {@link ContactsAsyncHelper#startObtainPhotoAsync(int,
+ * Context, Uri, OnImageLoadCompleteListener, Object)}.
+ * @param photo Drawable object obtained by the async load.
+ * @param photoIcon Bitmap object obtained by the async load.
+ * @param cookie Object passed in {@link ContactsAsyncHelper#startObtainPhotoAsync(int,
+ * Context, Uri, OnImageLoadCompleteListener, Object)}. Can be null iff. the original
+ * cookie is null.
+ */
+ public void onImageLoadComplete(int token, Drawable photo, Bitmap photoIcon,
+ Object cookie);
+ }
+
+ // constants
+ private static final int EVENT_LOAD_IMAGE = 1;
+
+ private final Handler mResultHandler = new Handler() {
+ /** Called when loading is done. */
+ @Override
+ public void handleMessage(Message msg) {
+ WorkerArgs args = (WorkerArgs) msg.obj;
+ switch (msg.arg1) {
+ case EVENT_LOAD_IMAGE:
+ if (args.listener != null) {
+ Log.d(this, "Notifying listener: " + args.listener.toString() +
+ " image: " + args.displayPhotoUri + " completed");
+ args.listener.onImageLoadComplete(msg.what, args.photo, args.photoIcon,
+ args.cookie);
+ }
+ break;
+ default:
+ }
+ }
+ };
+
+ /** Handler run on a worker thread to load photo asynchronously. */
+ private static Handler sThreadHandler;
+
+ /** For forcing the system to call its constructor */
+ @SuppressWarnings("unused")
+ private static ContactsAsyncHelper sInstance;
+
+ static {
+ sInstance = new ContactsAsyncHelper();
+ }
+
+ private static final class WorkerArgs {
+ public Context context;
+ public Uri displayPhotoUri;
+ public Drawable photo;
+ public Bitmap photoIcon;
+ public Object cookie;
+ public OnImageLoadCompleteListener listener;
+ }
+
+ /**
+ * Thread worker class that handles the task of opening the stream and loading
+ * the images.
+ */
+ private class WorkerHandler extends Handler {
+ public WorkerHandler(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ WorkerArgs args = (WorkerArgs) msg.obj;
+
+ switch (msg.arg1) {
+ case EVENT_LOAD_IMAGE:
+ InputStream inputStream = null;
+ try {
+ try {
+ inputStream = args.context.getContentResolver()
+ .openInputStream(args.displayPhotoUri);
+ } catch (Exception e) {
+ Log.e(this, "Error opening photo input stream", e);
+ }
+
+ if (inputStream != null) {
+ args.photo = Drawable.createFromStream(inputStream,
+ args.displayPhotoUri.toString());
+
+ // This assumes Drawable coming from contact database is usually
+ // BitmapDrawable and thus we can have (down)scaled version of it.
+ args.photoIcon = getPhotoIconWhenAppropriate(args.context, args.photo);
+
+ Log.d(ContactsAsyncHelper.this, "Loading image: " + msg.arg1 +
+ " token: " + msg.what + " image URI: " + args.displayPhotoUri);
+ } else {
+ args.photo = null;
+ args.photoIcon = null;
+ Log.d(ContactsAsyncHelper.this, "Problem with image: " + msg.arg1 +
+ " token: " + msg.what + " image URI: " + args.displayPhotoUri +
+ ", using default image.");
+ }
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ Log.e(this, "Unable to close input stream.", e);
+ }
+ }
+ }
+ break;
+ default:
+ }
+
+ // send the reply to the enclosing class.
+ Message reply = ContactsAsyncHelper.this.mResultHandler.obtainMessage(msg.what);
+ reply.arg1 = msg.arg1;
+ reply.obj = msg.obj;
+ reply.sendToTarget();
+ }
+
+ /**
+ * Returns a Bitmap object suitable for {@link Notification}'s large icon. This might
+ * return null when the given Drawable isn't BitmapDrawable, or if the system fails to
+ * create a scaled Bitmap for the Drawable.
+ */
+ private Bitmap getPhotoIconWhenAppropriate(Context context, Drawable photo) {
+ if (!(photo instanceof BitmapDrawable)) {
+ return null;
+ }
+ int iconSize = context.getResources()
+ .getDimensionPixelSize(R.dimen.notification_icon_size);
+ Bitmap orgBitmap = ((BitmapDrawable) photo).getBitmap();
+ int orgWidth = orgBitmap.getWidth();
+ int orgHeight = orgBitmap.getHeight();
+ int longerEdge = orgWidth > orgHeight ? orgWidth : orgHeight;
+ // We want downscaled one only when the original icon is too big.
+ if (longerEdge > iconSize) {
+ float ratio = ((float) longerEdge) / iconSize;
+ int newWidth = (int) (orgWidth / ratio);
+ int newHeight = (int) (orgHeight / ratio);
+ // If the longer edge is much longer than the shorter edge, the latter may
+ // become 0 which will cause a crash.
+ if (newWidth <= 0 || newHeight <= 0) {
+ Log.w(this, "Photo icon's width or height become 0.");
+ return null;
+ }
+
+ // It is sure ratio >= 1.0f in any case and thus the newly created Bitmap
+ // should be smaller than the original.
+ return Bitmap.createScaledBitmap(orgBitmap, newWidth, newHeight, true);
+ } else {
+ return orgBitmap;
+ }
+ }
+ }
+
+ /**
+ * Private constructor for static class
+ */
+ private ContactsAsyncHelper() {
+ HandlerThread thread = new HandlerThread("ContactsAsyncWorker");
+ thread.start();
+ sThreadHandler = new WorkerHandler(thread.getLooper());
+ }
+
+ /**
+ * Starts an asynchronous image load. After finishing the load,
+ * {@link OnImageLoadCompleteListener#onImageLoadComplete(int, Drawable, Bitmap, Object)}
+ * will be called.
+ *
+ * @param token Arbitrary integer which will be returned as the first argument of
+ * {@link OnImageLoadCompleteListener#onImageLoadComplete(int, Drawable, Bitmap, Object)}
+ * @param context Context object used to do the time-consuming operation.
+ * @param displayPhotoUri Uri to be used to fetch the photo
+ * @param listener Callback object which will be used when the asynchronous load is done.
+ * Can be null, which means only the asynchronous load is done while there's no way to
+ * obtain the loaded photos.
+ * @param cookie Arbitrary object the caller wants to remember, which will become the
+ * fourth argument of {@link OnImageLoadCompleteListener#onImageLoadComplete(int, Drawable,
+ * Bitmap, Object)}. Can be null, at which the callback will also has null for the argument.
+ */
+ public static final void startObtainPhotoAsync(int token, Context context, Uri displayPhotoUri,
+ OnImageLoadCompleteListener listener, Object cookie) {
+ // in case the source caller info is null, the URI will be null as well.
+ // just update using the placeholder image in this case.
+ if (displayPhotoUri == null) {
+ Log.wtf("startObjectPhotoAsync", "Uri is missing");
+ return;
+ }
+
+ // Added additional Cookie field in the callee to handle arguments
+ // sent to the callback function.
+
+ // setup arguments
+ WorkerArgs args = new WorkerArgs();
+ args.cookie = cookie;
+ args.context = context;
+ args.displayPhotoUri = displayPhotoUri;
+ args.listener = listener;
+
+ // setup message arguments
+ Message msg = sThreadHandler.obtainMessage(token);
+ msg.arg1 = EVENT_LOAD_IMAGE;
+ msg.obj = args;
+
+ Log.d("startObjectPhotoAsync", "Begin loading image: " + args.displayPhotoUri +
+ ", displaying default image for now.");
+
+ // notify the thread to begin working
+ sThreadHandler.sendMessage(msg);
+ }
+
+
+}
diff --git a/InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java b/InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java
new file mode 100644
index 000000000..a9cc93bda
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ContactsPreferencesFactory.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import com.android.dialer.compat.UserManagerCompat;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
+
+/**
+ * Factory class for {@link ContactsPreferences}.
+ */
+public class ContactsPreferencesFactory {
+
+ private static boolean sUseTestInstance;
+ private static ContactsPreferences sTestInstance;
+
+ /**
+ * Creates a new {@link ContactsPreferences} object if possible.
+ *
+ * @param context the context to use when creating the ContactsPreferences.
+ * @return a new ContactsPreferences object or {@code null} if the user is locked.
+ */
+ @Nullable
+ public static ContactsPreferences newContactsPreferences(Context context) {
+ if (sUseTestInstance) {
+ return sTestInstance;
+ }
+ if (UserManagerCompat.isUserUnlocked(context)) {
+ return new ContactsPreferences(context);
+ }
+ return null;
+ }
+
+ /**
+ * Sets the instance to be returned by all calls to {@link #newContactsPreferences(Context)}.
+ *
+ * @param testInstance the instance to return.
+ */
+ @NeededForTesting
+ static void setTestInstance(ContactsPreferences testInstance) {
+ sUseTestInstance = true;
+ sTestInstance = testInstance;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/DialpadFragment.java b/InCallUI/src/com/android/incallui/DialpadFragment.java
new file mode 100644
index 000000000..ad288bdc6
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DialpadFragment.java
@@ -0,0 +1,563 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.Editable;
+import android.text.method.DialerKeyListener;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityManager;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.dialer.R;
+import com.android.phone.common.dialpad.DialpadKeyButton;
+import com.android.phone.common.dialpad.DialpadView;
+
+import java.util.HashMap;
+
+/**
+ * Fragment for call control buttons
+ */
+public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPresenter.DialpadUi>
+ implements DialpadPresenter.DialpadUi, View.OnTouchListener, View.OnKeyListener,
+ View.OnHoverListener, View.OnClickListener {
+
+ private static final int ACCESSIBILITY_DTMF_STOP_DELAY_MILLIS = 50;
+
+ private final int[] mButtonIds = new int[] {R.id.zero, R.id.one, R.id.two, R.id.three,
+ R.id.four, R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.star,
+ R.id.pound};
+
+ /**
+ * LinearLayout with getter and setter methods for the translationY property using floats,
+ * for animation purposes.
+ */
+ public static class DialpadSlidingLinearLayout extends LinearLayout {
+
+ public DialpadSlidingLinearLayout(Context context) {
+ super(context);
+ }
+
+ public DialpadSlidingLinearLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public DialpadSlidingLinearLayout(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public float getYFraction() {
+ final int height = getHeight();
+ if (height == 0) return 0;
+ return getTranslationY() / height;
+ }
+
+ public void setYFraction(float yFraction) {
+ setTranslationY(yFraction * getHeight());
+ }
+ }
+
+ private EditText mDtmfDialerField;
+
+ /** Hash Map to map a view id to a character*/
+ private static final HashMap<Integer, Character> mDisplayMap =
+ new HashMap<Integer, Character>();
+
+ private static final Handler sHandler = new Handler(Looper.getMainLooper());
+
+
+ /** Set up the static maps*/
+ static {
+ // Map the buttons to the display characters
+ mDisplayMap.put(R.id.one, '1');
+ mDisplayMap.put(R.id.two, '2');
+ mDisplayMap.put(R.id.three, '3');
+ mDisplayMap.put(R.id.four, '4');
+ mDisplayMap.put(R.id.five, '5');
+ mDisplayMap.put(R.id.six, '6');
+ mDisplayMap.put(R.id.seven, '7');
+ mDisplayMap.put(R.id.eight, '8');
+ mDisplayMap.put(R.id.nine, '9');
+ mDisplayMap.put(R.id.zero, '0');
+ mDisplayMap.put(R.id.pound, '#');
+ mDisplayMap.put(R.id.star, '*');
+ }
+
+ // KeyListener used with the "dialpad digits" EditText widget.
+ private DTMFKeyListener mDialerKeyListener;
+
+ private DialpadView mDialpadView;
+
+ private int mCurrentTextColor;
+
+ /**
+ * Our own key listener, specialized for dealing with DTMF codes.
+ * 1. Ignore the backspace since it is irrelevant.
+ * 2. Allow ONLY valid DTMF characters to generate a tone and be
+ * sent as a DTMF code.
+ * 3. All other remaining characters are handled by the superclass.
+ *
+ * This code is purely here to handle events from the hardware keyboard
+ * while the DTMF dialpad is up.
+ */
+ private class DTMFKeyListener extends DialerKeyListener {
+
+ private DTMFKeyListener() {
+ super();
+ }
+
+ /**
+ * Overriden to return correct DTMF-dialable characters.
+ */
+ @Override
+ protected char[] getAcceptedChars(){
+ return DTMF_CHARACTERS;
+ }
+
+ /** special key listener ignores backspace. */
+ @Override
+ public boolean backspace(View view, Editable content, int keyCode,
+ KeyEvent event) {
+ return false;
+ }
+
+ /**
+ * Return true if the keyCode is an accepted modifier key for the
+ * dialer (ALT or SHIFT).
+ */
+ private boolean isAcceptableModifierKey(int keyCode) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_ALT_LEFT:
+ case KeyEvent.KEYCODE_ALT_RIGHT:
+ case KeyEvent.KEYCODE_SHIFT_LEFT:
+ case KeyEvent.KEYCODE_SHIFT_RIGHT:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Overriden so that with each valid button press, we start sending
+ * a dtmf code and play a local dtmf tone.
+ */
+ @Override
+ public boolean onKeyDown(View view, Editable content,
+ int keyCode, KeyEvent event) {
+ // if (DBG) log("DTMFKeyListener.onKeyDown, keyCode " + keyCode + ", view " + view);
+
+ // find the character
+ char c = (char) lookup(event, content);
+
+ // if not a long press, and parent onKeyDown accepts the input
+ if (event.getRepeatCount() == 0 && super.onKeyDown(view, content, keyCode, event)) {
+
+ boolean keyOK = ok(getAcceptedChars(), c);
+
+ // if the character is a valid dtmf code, start playing the tone and send the
+ // code.
+ if (keyOK) {
+ Log.d(this, "DTMFKeyListener reading '" + c + "' from input.");
+ getPresenter().processDtmf(c);
+ } else {
+ Log.d(this, "DTMFKeyListener rejecting '" + c + "' from input.");
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Overriden so that with each valid button up, we stop sending
+ * a dtmf code and the dtmf tone.
+ */
+ @Override
+ public boolean onKeyUp(View view, Editable content,
+ int keyCode, KeyEvent event) {
+ // if (DBG) log("DTMFKeyListener.onKeyUp, keyCode " + keyCode + ", view " + view);
+
+ super.onKeyUp(view, content, keyCode, event);
+
+ // find the character
+ char c = (char) lookup(event, content);
+
+ boolean keyOK = ok(getAcceptedChars(), c);
+
+ if (keyOK) {
+ Log.d(this, "Stopping the tone for '" + c + "'");
+ getPresenter().stopDtmf();
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Handle individual keydown events when we DO NOT have an Editable handy.
+ */
+ public boolean onKeyDown(KeyEvent event) {
+ char c = lookup(event);
+ Log.d(this, "DTMFKeyListener.onKeyDown: event '" + c + "'");
+
+ // if not a long press, and parent onKeyDown accepts the input
+ if (event.getRepeatCount() == 0 && c != 0) {
+ // if the character is a valid dtmf code, start playing the tone and send the
+ // code.
+ if (ok(getAcceptedChars(), c)) {
+ Log.d(this, "DTMFKeyListener reading '" + c + "' from input.");
+ getPresenter().processDtmf(c);
+ return true;
+ } else {
+ Log.d(this, "DTMFKeyListener rejecting '" + c + "' from input.");
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Handle individual keyup events.
+ *
+ * @param event is the event we are trying to stop. If this is null,
+ * then we just force-stop the last tone without checking if the event
+ * is an acceptable dialer event.
+ */
+ public boolean onKeyUp(KeyEvent event) {
+ if (event == null) {
+ //the below piece of code sends stopDTMF event unnecessarily even when a null event
+ //is received, hence commenting it.
+ /*if (DBG) log("Stopping the last played tone.");
+ stopTone();*/
+ return true;
+ }
+
+ char c = lookup(event);
+ Log.d(this, "DTMFKeyListener.onKeyUp: event '" + c + "'");
+
+ // TODO: stopTone does not take in character input, we may want to
+ // consider checking for this ourselves.
+ if (ok(getAcceptedChars(), c)) {
+ Log.d(this, "Stopping the tone for '" + c + "'");
+ getPresenter().stopDtmf();
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Find the Dialer Key mapped to this event.
+ *
+ * @return The char value of the input event, otherwise
+ * 0 if no matching character was found.
+ */
+ private char lookup(KeyEvent event) {
+ // This code is similar to {@link DialerKeyListener#lookup(KeyEvent, Spannable) lookup}
+ int meta = event.getMetaState();
+ int number = event.getNumber();
+
+ if (!((meta & (KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON)) == 0) || (number == 0)) {
+ int match = event.getMatch(getAcceptedChars(), meta);
+ number = (match != 0) ? match : number;
+ }
+
+ return (char) number;
+ }
+
+ /**
+ * Check to see if the keyEvent is dialable.
+ */
+ boolean isKeyEventAcceptable (KeyEvent event) {
+ return (ok(getAcceptedChars(), lookup(event)));
+ }
+
+ /**
+ * Overrides the characters used in {@link DialerKeyListener#CHARACTERS}
+ * These are the valid dtmf characters.
+ */
+ public final char[] DTMF_CHARACTERS = new char[] {
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '#', '*'
+ };
+ }
+
+ @Override
+ public void onClick(View v) {
+ final AccessibilityManager accessibilityManager = (AccessibilityManager)
+ v.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+ // When accessibility is on, simulate press and release to preserve the
+ // semantic meaning of performClick(). Required for Braille support.
+ if (accessibilityManager.isEnabled()) {
+ final int id = v.getId();
+ // Checking the press state prevents double activation.
+ if (!v.isPressed() && mDisplayMap.containsKey(id)) {
+ getPresenter().processDtmf(mDisplayMap.get(id));
+ sHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ getPresenter().stopDtmf();
+ }
+ }, ACCESSIBILITY_DTMF_STOP_DELAY_MILLIS);
+ }
+ }
+ if (v.getId() == R.id.dialpad_back) {
+ getActivity().onBackPressed();
+ }
+ }
+
+ @Override
+ public boolean onHover(View v, MotionEvent event) {
+ // When touch exploration is turned on, lifting a finger while inside
+ // the button's hover target bounds should perform a click action.
+ final AccessibilityManager accessibilityManager = (AccessibilityManager)
+ v.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+
+ if (accessibilityManager.isEnabled()
+ && accessibilityManager.isTouchExplorationEnabled()) {
+ final int left = v.getPaddingLeft();
+ final int right = (v.getWidth() - v.getPaddingRight());
+ final int top = v.getPaddingTop();
+ final int bottom = (v.getHeight() - v.getPaddingBottom());
+
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_HOVER_ENTER:
+ // Lift-to-type temporarily disables double-tap activation.
+ v.setClickable(false);
+ break;
+ case MotionEvent.ACTION_HOVER_EXIT:
+ final int x = (int) event.getX();
+ final int y = (int) event.getY();
+ if ((x > left) && (x < right) && (y > top) && (y < bottom)) {
+ v.performClick();
+ }
+ v.setClickable(true);
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ Log.d(this, "onKey: keyCode " + keyCode + ", view " + v);
+
+ if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
+ int viewId = v.getId();
+ if (mDisplayMap.containsKey(viewId)) {
+ switch (event.getAction()) {
+ case KeyEvent.ACTION_DOWN:
+ if (event.getRepeatCount() == 0) {
+ getPresenter().processDtmf(mDisplayMap.get(viewId));
+ }
+ break;
+ case KeyEvent.ACTION_UP:
+ getPresenter().stopDtmf();
+ break;
+ }
+ // do not return true [handled] here, since we want the
+ // press / click animation to be handled by the framework.
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ Log.d(this, "onTouch");
+ int viewId = v.getId();
+
+ // if the button is recognized
+ if (mDisplayMap.containsKey(viewId)) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ // Append the character mapped to this button, to the display.
+ // start the tone
+ getPresenter().processDtmf(mDisplayMap.get(viewId));
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ // stop the tone on ANY other event, except for MOVE.
+ getPresenter().stopDtmf();
+ break;
+ }
+ // do not return true [handled] here, since we want the
+ // press / click animation to be handled by the framework.
+ }
+ return false;
+ }
+
+ // TODO(klp) Adds hardware keyboard listener
+
+ @Override
+ public DialpadPresenter createPresenter() {
+ return new DialpadPresenter();
+ }
+
+ @Override
+ public DialpadPresenter.DialpadUi getUi() {
+ return this;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ final View parent = inflater.inflate(
+ R.layout.incall_dialpad_fragment, container, false);
+ mDialpadView = (DialpadView) parent.findViewById(R.id.dialpad_view);
+ mDialpadView.setCanDigitsBeEdited(false);
+ mDialpadView.setBackgroundResource(R.color.incall_dialpad_background);
+ mDtmfDialerField = (EditText) parent.findViewById(R.id.digits);
+ if (mDtmfDialerField != null) {
+ mDialerKeyListener = new DTMFKeyListener();
+ mDtmfDialerField.setKeyListener(mDialerKeyListener);
+ // remove the long-press context menus that support
+ // the edit (copy / paste / select) functions.
+ mDtmfDialerField.setLongClickable(false);
+ mDtmfDialerField.setElegantTextHeight(false);
+ configureKeypadListeners();
+ }
+ View backButton = mDialpadView.findViewById(R.id.dialpad_back);
+ backButton.setVisibility(View.VISIBLE);
+ backButton.setOnClickListener(this);
+
+ return parent;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateColors();
+ }
+
+ public void updateColors() {
+ int textColor = InCallPresenter.getInstance().getThemeColors().mPrimaryColor;
+
+ if (mCurrentTextColor == textColor) {
+ return;
+ }
+
+ DialpadKeyButton dialpadKey;
+ for (int i = 0; i < mButtonIds.length; i++) {
+ dialpadKey = (DialpadKeyButton) mDialpadView.findViewById(mButtonIds[i]);
+ ((TextView) dialpadKey.findViewById(R.id.dialpad_key_number)).setTextColor(textColor);
+ }
+
+ mCurrentTextColor = textColor;
+ }
+
+ @Override
+ public void onDestroyView() {
+ mDialerKeyListener = null;
+ super.onDestroyView();
+ }
+
+ /**
+ * Getter for Dialpad text.
+ *
+ * @return String containing current Dialpad EditText text.
+ */
+ public String getDtmfText() {
+ return mDtmfDialerField.getText().toString();
+ }
+
+ /**
+ * Sets the Dialpad text field with some text.
+ *
+ * @param text Text to set Dialpad EditText to.
+ */
+ public void setDtmfText(String text) {
+ mDtmfDialerField.setText(PhoneNumberUtilsCompat.createTtsSpannable(text));
+ }
+
+ @Override
+ public void setVisible(boolean on) {
+ if (on) {
+ getView().setVisibility(View.VISIBLE);
+ } else {
+ getView().setVisibility(View.INVISIBLE);
+ }
+ }
+
+ /**
+ * Starts the slide up animation for the Dialpad keys when the Dialpad is revealed.
+ */
+ public void animateShowDialpad() {
+ final DialpadView dialpadView = (DialpadView) getView().findViewById(R.id.dialpad_view);
+ dialpadView.animateShow();
+ }
+
+ @Override
+ public void appendDigitsToField(char digit) {
+ if (mDtmfDialerField != null) {
+ // TODO: maybe *don't* manually append this digit if
+ // mDialpadDigits is focused and this key came from the HW
+ // keyboard, since in that case the EditText field will
+ // get the key event directly and automatically appends
+ // whetever the user types.
+ // (Or, a cleaner fix would be to just make mDialpadDigits
+ // *not* handle HW key presses. That seems to be more
+ // complicated than just setting focusable="false" on it,
+ // though.)
+ mDtmfDialerField.getText().append(digit);
+ }
+ }
+
+ /**
+ * Called externally (from InCallScreen) to play a DTMF Tone.
+ */
+ /* package */ boolean onDialerKeyDown(KeyEvent event) {
+ Log.d(this, "Notifying dtmf key down.");
+ if (mDialerKeyListener != null) {
+ return mDialerKeyListener.onKeyDown(event);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Called externally (from InCallScreen) to cancel the last DTMF Tone played.
+ */
+ public boolean onDialerKeyUp(KeyEvent event) {
+ Log.d(this, "Notifying dtmf key up.");
+ if (mDialerKeyListener != null) {
+ return mDialerKeyListener.onKeyUp(event);
+ } else {
+ return false;
+ }
+ }
+
+ private void configureKeypadListeners() {
+ DialpadKeyButton dialpadKey;
+ for (int i = 0; i < mButtonIds.length; i++) {
+ dialpadKey = (DialpadKeyButton) mDialpadView.findViewById(mButtonIds[i]);
+ dialpadKey.setOnTouchListener(this);
+ dialpadKey.setOnKeyListener(this);
+ dialpadKey.setOnHoverListener(this);
+ dialpadKey.setOnClickListener(this);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/DialpadPresenter.java b/InCallUI/src/com/android/incallui/DialpadPresenter.java
new file mode 100644
index 000000000..5e24bedef
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DialpadPresenter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * Logic for call buttons.
+ */
+public class DialpadPresenter extends Presenter<DialpadPresenter.DialpadUi>
+ implements InCallPresenter.InCallStateListener {
+
+ private Call mCall;
+
+ @Override
+ public void onUiReady(DialpadUi ui) {
+ super.onUiReady(ui);
+ InCallPresenter.getInstance().addListener(this);
+ mCall = CallList.getInstance().getOutgoingOrActive();
+ }
+
+ @Override
+ public void onUiUnready(DialpadUi ui) {
+ super.onUiUnready(ui);
+ InCallPresenter.getInstance().removeListener(this);
+ }
+
+ @Override
+ public void onStateChange(InCallPresenter.InCallState oldState,
+ InCallPresenter.InCallState newState, CallList callList) {
+ mCall = callList.getOutgoingOrActive();
+ Log.d(this, "DialpadPresenter mCall = " + mCall);
+ }
+
+ /**
+ * Processes the specified digit as a DTMF key, by playing the
+ * appropriate DTMF tone, and appending the digit to the EditText
+ * field that displays the DTMF digits sent so far.
+ *
+ */
+ public final void processDtmf(char c) {
+ Log.d(this, "Processing dtmf key " + c);
+ // if it is a valid key, then update the display and send the dtmf tone.
+ if (PhoneNumberUtils.is12Key(c) && mCall != null) {
+ Log.d(this, "updating display and sending dtmf tone for '" + c + "'");
+
+ // Append this key to the "digits" widget.
+ getUi().appendDigitsToField(c);
+ // Plays the tone through Telecom.
+ TelecomAdapter.getInstance().playDtmfTone(mCall.getId(), c);
+ } else {
+ Log.d(this, "ignoring dtmf request for '" + c + "'");
+ }
+ }
+
+ /**
+ * Stops the local tone based on the phone type.
+ */
+ public void stopDtmf() {
+ if (mCall != null) {
+ Log.d(this, "stopping remote tone");
+ TelecomAdapter.getInstance().stopDtmfTone(mCall.getId());
+ }
+ }
+
+ public interface DialpadUi extends Ui {
+ void setVisible(boolean on);
+ void appendDigitsToField(char digit);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/DistanceHelper.java b/InCallUI/src/com/android/incallui/DistanceHelper.java
new file mode 100644
index 000000000..a4db5fed3
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/DistanceHelper.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.incallui;
+
+import android.location.Address;
+
+/**
+ * Superclass for a helper class to get the current location and distance to other locations.
+ */
+public abstract class DistanceHelper {
+ public static final float DISTANCE_NOT_FOUND = -1;
+ public static final float MILES_PER_METER = (float) 0.000621371192;
+ public static final float KILOMETERS_PER_METER = (float) 0.001;
+
+ public interface Listener {
+ public void onLocationReady();
+ }
+
+ public void cleanUp() {}
+
+ public float calculateDistance(Address address) {
+ return DISTANCE_NOT_FOUND;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/FragmentDisplayManager.java b/InCallUI/src/com/android/incallui/FragmentDisplayManager.java
new file mode 100644
index 000000000..045d999a0
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/FragmentDisplayManager.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.app.Fragment;
+
+interface FragmentDisplayManager {
+ public void onFragmentAttached(Fragment fragment);
+}
diff --git a/InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java b/InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java
new file mode 100644
index 000000000..62a8e7829
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+import android.telecom.VideoProfile;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.dialer.R;
+
+public class GlowPadAnswerFragment extends AnswerFragment {
+
+ private GlowPadWrapper mGlowpad;
+
+ public GlowPadAnswerFragment() {
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mGlowpad = (GlowPadWrapper) inflater.inflate(R.layout.answer_fragment,
+ container, false);
+
+ Log.d(this, "Creating view for answer fragment ", this);
+ Log.d(this, "Created from activity", getActivity());
+ mGlowpad.setAnswerFragment(this);
+
+ return mGlowpad;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mGlowpad.requestFocus();
+ }
+
+ @Override
+ public void onDestroyView() {
+ Log.d(this, "onDestroyView");
+ if (mGlowpad != null) {
+ mGlowpad.stopPing();
+ mGlowpad = null;
+ }
+ super.onDestroyView();
+ }
+
+ @Override
+ public void onShowAnswerUi(boolean shown) {
+ Log.d(this, "Show answer UI: " + shown);
+ if (shown) {
+ mGlowpad.startPing();
+ } else {
+ mGlowpad.stopPing();
+ }
+ }
+
+ /**
+ * Sets targets on the glowpad according to target set identified by the parameter.
+ *
+ * @param targetSet Integer identifying the set of targets to use.
+ */
+ public void showTargets(int targetSet) {
+ showTargets(targetSet, VideoProfile.STATE_BIDIRECTIONAL);
+ }
+
+ /**
+ * Sets targets on the glowpad according to target set identified by the parameter.
+ *
+ * @param targetSet Integer identifying the set of targets to use.
+ */
+ @Override
+ public void showTargets(int targetSet, int videoState) {
+ final int targetResourceId;
+ final int targetDescriptionsResourceId;
+ final int directionDescriptionsResourceId;
+ final int handleDrawableResourceId;
+ mGlowpad.setVideoState(videoState);
+
+ switch (targetSet) {
+ case TARGET_SET_FOR_AUDIO_WITH_SMS:
+ targetResourceId = R.array.incoming_call_widget_audio_with_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_with_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_with_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_audio_handle;
+ break;
+ case TARGET_SET_FOR_VIDEO_WITHOUT_SMS:
+ targetResourceId = R.array.incoming_call_widget_video_without_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_video_without_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_video_without_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_video_handle;
+ break;
+ case TARGET_SET_FOR_VIDEO_WITH_SMS:
+ targetResourceId = R.array.incoming_call_widget_video_with_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_video_with_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_video_with_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_video_handle;
+ break;
+ case TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST:
+ targetResourceId =
+ R.array.incoming_call_widget_video_request_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_video_request_target_descriptions;
+ directionDescriptionsResourceId = R.array
+ .incoming_call_widget_video_request_target_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_video_handle;
+ break;
+ case TARGET_SET_FOR_AUDIO_WITHOUT_SMS:
+ default:
+ targetResourceId = R.array.incoming_call_widget_audio_without_sms_targets;
+ targetDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_without_sms_target_descriptions;
+ directionDescriptionsResourceId =
+ R.array.incoming_call_widget_audio_without_sms_direction_descriptions;
+ handleDrawableResourceId = R.drawable.ic_incall_audio_handle;
+ break;
+ }
+
+ if (targetResourceId != mGlowpad.getTargetResourceId()) {
+ mGlowpad.setTargetResources(targetResourceId);
+ mGlowpad.setTargetDescriptionsResourceId(targetDescriptionsResourceId);
+ mGlowpad.setDirectionDescriptionsResourceId(directionDescriptionsResourceId);
+ mGlowpad.setHandleDrawable(handleDrawableResourceId);
+ mGlowpad.reset(false);
+ }
+ }
+
+ @Override
+ protected void onMessageDialogCancel() {
+ if (mGlowpad != null) {
+ mGlowpad.startPing();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/GlowPadWrapper.java b/InCallUI/src/com/android/incallui/GlowPadWrapper.java
new file mode 100644
index 000000000..342f6b4fd
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/GlowPadWrapper.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.telecom.VideoProfile;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.android.dialer.R;
+import com.android.incallui.widget.multiwaveview.GlowPadView;
+
+/**
+ *
+ */
+public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTriggerListener {
+
+ // Parameters for the GlowPadView "ping" animation; see triggerPing().
+ private static final int PING_MESSAGE_WHAT = 101;
+ private static final boolean ENABLE_PING_AUTO_REPEAT = true;
+ private static final long PING_REPEAT_DELAY_MS = 1200;
+
+ private final Handler mPingHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case PING_MESSAGE_WHAT:
+ triggerPing();
+ break;
+ }
+ }
+ };
+
+ private AnswerFragment mAnswerFragment;
+ private boolean mPingEnabled = true;
+ private boolean mTargetTriggered = false;
+ private int mVideoState = VideoProfile.STATE_BIDIRECTIONAL;
+
+ public GlowPadWrapper(Context context) {
+ super(context);
+ Log.d(this, "class created " + this + " ");
+ }
+
+ public GlowPadWrapper(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Log.d(this, "class created " + this);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ Log.d(this, "onFinishInflate()");
+ super.onFinishInflate();
+ setOnTriggerListener(this);
+ }
+
+ public void startPing() {
+ Log.d(this, "startPing");
+ mPingEnabled = true;
+ triggerPing();
+ }
+
+ public void stopPing() {
+ Log.d(this, "stopPing");
+ mPingEnabled = false;
+ mPingHandler.removeMessages(PING_MESSAGE_WHAT);
+ }
+
+ private void triggerPing() {
+ Log.d(this, "triggerPing(): " + mPingEnabled + " " + this);
+ if (mPingEnabled && !mPingHandler.hasMessages(PING_MESSAGE_WHAT)) {
+ ping();
+
+ if (ENABLE_PING_AUTO_REPEAT) {
+ mPingHandler.sendEmptyMessageDelayed(PING_MESSAGE_WHAT, PING_REPEAT_DELAY_MS);
+ }
+ }
+ }
+
+ @Override
+ public void onGrabbed(View v, int handle) {
+ Log.d(this, "onGrabbed()");
+ stopPing();
+ }
+
+ @Override
+ public void onReleased(View v, int handle) {
+ Log.d(this, "onReleased()");
+ if (mTargetTriggered) {
+ mTargetTriggered = false;
+ } else {
+ startPing();
+ }
+ }
+
+ @Override
+ public void onTrigger(View v, int target) {
+ Log.d(this, "onTrigger() view=" + v + " target=" + target);
+ final int resId = getResourceIdForTarget(target);
+ if (resId == R.drawable.ic_lockscreen_answer) {
+ mAnswerFragment.onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext());
+ mTargetTriggered = true;
+ } else if (resId == R.drawable.ic_lockscreen_decline) {
+ mAnswerFragment.onDecline(getContext());
+ mTargetTriggered = true;
+ } else if (resId == R.drawable.ic_lockscreen_text) {
+ mAnswerFragment.onText();
+ mTargetTriggered = true;
+ } else if (resId == R.drawable.ic_videocam || resId == R.drawable.ic_lockscreen_answer_video) {
+ mAnswerFragment.onAnswer(mVideoState, getContext());
+ mTargetTriggered = true;
+ } else if (resId == R.drawable.ic_lockscreen_decline_video) {
+ mAnswerFragment.onDeclineUpgradeRequest(getContext());
+ mTargetTriggered = true;
+ } else {
+ // Code should never reach here.
+ Log.e(this, "Trigger detected on unhandled resource. Skipping.");
+ }
+ }
+
+ @Override
+ public void onGrabbedStateChange(View v, int handle) {
+
+ }
+
+ @Override
+ public void onFinishFinalAnimation() {
+
+ }
+
+ public void setAnswerFragment(AnswerFragment fragment) {
+ mAnswerFragment = fragment;
+ }
+
+ /**
+ * Sets the video state represented by the "video" icon on the glow pad.
+ *
+ * @param videoState The new video state.
+ */
+ public void setVideoState(int videoState) {
+ mVideoState = videoState;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
new file mode 100644
index 000000000..eca79f8a7
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -0,0 +1,964 @@
+/*
+ * Copyright (C) 2006 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.graphics.Point;
+import android.hardware.SensorManager;
+import android.os.Bundle;
+import android.os.Trace;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.OrientationEventListener;
+import android.view.Surface;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+
+import com.android.contacts.common.activity.TransactionSafeActivity;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
+import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener;
+import com.android.dialer.R;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
+import com.android.incallui.Call.State;
+import com.android.incallui.util.AccessibilityUtil;
+import com.android.phone.common.animation.AnimUtils;
+import com.android.phone.common.animation.AnimationListenerAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Main activity that the user interacts with while in a live call.
+ */
+public class InCallActivity extends TransactionSafeActivity implements FragmentDisplayManager {
+
+ public static final String TAG = InCallActivity.class.getSimpleName();
+
+ public static final String SHOW_DIALPAD_EXTRA = "InCallActivity.show_dialpad";
+ public static final String DIALPAD_TEXT_EXTRA = "InCallActivity.dialpad_text";
+ public static final String NEW_OUTGOING_CALL_EXTRA = "InCallActivity.new_outgoing_call";
+
+ private static final String TAG_DIALPAD_FRAGMENT = "tag_dialpad_fragment";
+ private static final String TAG_CONFERENCE_FRAGMENT = "tag_conference_manager_fragment";
+ private static final String TAG_CALLCARD_FRAGMENT = "tag_callcard_fragment";
+ private static final String TAG_ANSWER_FRAGMENT = "tag_answer_fragment";
+ private static final String TAG_SELECT_ACCT_FRAGMENT = "tag_select_acct_fragment";
+
+ private static final int DIALPAD_REQUEST_NONE = 1;
+ private static final int DIALPAD_REQUEST_SHOW = 2;
+ private static final int DIALPAD_REQUEST_HIDE = 3;
+
+ /**
+ * This is used to relaunch the activity if resizing beyond which it needs to load different
+ * layout file.
+ */
+ private static final int SCREEN_HEIGHT_RESIZE_THRESHOLD = 500;
+
+ private CallButtonFragment mCallButtonFragment;
+ private CallCardFragment mCallCardFragment;
+ private AnswerFragment mAnswerFragment;
+ private DialpadFragment mDialpadFragment;
+ private ConferenceManagerFragment mConferenceManagerFragment;
+ private FragmentManager mChildFragmentManager;
+
+ private AlertDialog mDialog;
+ private InCallOrientationEventListener mInCallOrientationEventListener;
+
+ /**
+ * Used to indicate whether the dialpad should be hidden or shown {@link #onResume}.
+ * {@code #DIALPAD_REQUEST_SHOW} indicates that the dialpad should be shown.
+ * {@code #DIALPAD_REQUEST_HIDE} indicates that the dialpad should be hidden.
+ * {@code #DIALPAD_REQUEST_NONE} indicates no change should be made to dialpad visibility.
+ */
+ private int mShowDialpadRequest = DIALPAD_REQUEST_NONE;
+
+ /**
+ * Use to determine if the dialpad should be animated on show.
+ */
+ private boolean mAnimateDialpadOnShow;
+
+ /**
+ * Use to determine the DTMF Text which should be pre-populated in the dialpad.
+ */
+ private String mDtmfText;
+
+ /**
+ * Use to pass parameters for showing the PostCharDialog to {@link #onResume}
+ */
+ private boolean mShowPostCharWaitDialogOnResume;
+ private String mShowPostCharWaitDialogCallId;
+ private String mShowPostCharWaitDialogChars;
+
+ private boolean mIsLandscape;
+ private Animation mSlideIn;
+ private Animation mSlideOut;
+ private boolean mDismissKeyguard = false;
+
+ AnimationListenerAdapter mSlideOutListener = new AnimationListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animation animation) {
+ showFragment(TAG_DIALPAD_FRAGMENT, false, true);
+ }
+ };
+
+ private OnTouchListener mDispatchTouchEventListener;
+
+ private SelectPhoneAccountListener mSelectAcctListener = new SelectPhoneAccountListener() {
+ @Override
+ public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
+ boolean setDefault) {
+ InCallPresenter.getInstance().handleAccountSelection(selectedAccountHandle,
+ setDefault);
+ }
+
+ @Override
+ public void onDialogDismissed() {
+ InCallPresenter.getInstance().cancelAccountSelection();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ Log.d(this, "onCreate()... this = " + this);
+
+ super.onCreate(icicle);
+
+ // set this flag so this activity will stay in front of the keyguard
+ // Have the WindowManager filter out touch events that are "too fat".
+ int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES;
+
+ getWindow().addFlags(flags);
+
+ // Setup action bar for the conference call manager.
+ requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
+ ActionBar actionBar = getActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.hide();
+ }
+
+ // TODO(klp): Do we need to add this back when prox sensor is not available?
+ // lp.inputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_DISABLE_USER_ACTIVITY;
+
+ setContentView(R.layout.incall_screen);
+
+ internalResolveIntent(getIntent());
+
+ mIsLandscape = getResources().getConfiguration().orientation ==
+ Configuration.ORIENTATION_LANDSCAPE;
+
+ final boolean isRtl = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ==
+ View.LAYOUT_DIRECTION_RTL;
+
+ if (mIsLandscape) {
+ mSlideIn = AnimationUtils.loadAnimation(this,
+ isRtl ? R.anim.dialpad_slide_in_left : R.anim.dialpad_slide_in_right);
+ mSlideOut = AnimationUtils.loadAnimation(this,
+ isRtl ? R.anim.dialpad_slide_out_left : R.anim.dialpad_slide_out_right);
+ } else {
+ mSlideIn = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_in_bottom);
+ mSlideOut = AnimationUtils.loadAnimation(this, R.anim.dialpad_slide_out_bottom);
+ }
+
+ mSlideIn.setInterpolator(AnimUtils.EASE_IN);
+ mSlideOut.setInterpolator(AnimUtils.EASE_OUT);
+
+ mSlideOut.setAnimationListener(mSlideOutListener);
+
+ // If the dialpad fragment already exists, retrieve it. This is important when rotating as
+ // we will not be able to hide or show the dialpad after the rotation otherwise.
+ Fragment existingFragment =
+ getFragmentManager().findFragmentByTag(DialpadFragment.class.getName());
+ if (existingFragment != null) {
+ mDialpadFragment = (DialpadFragment) existingFragment;
+ }
+
+ if (icicle != null) {
+ // If the dialpad was shown before, set variables indicating it should be shown and
+ // populated with the previous DTMF text. The dialpad is actually shown and populated
+ // in onResume() to ensure the hosting CallCardFragment has been inflated and is ready
+ // to receive it.
+ if (icicle.containsKey(SHOW_DIALPAD_EXTRA)) {
+ boolean showDialpad = icicle.getBoolean(SHOW_DIALPAD_EXTRA);
+ mShowDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_HIDE;
+ mAnimateDialpadOnShow = false;
+ }
+ mDtmfText = icicle.getString(DIALPAD_TEXT_EXTRA);
+
+ SelectPhoneAccountDialogFragment dialogFragment = (SelectPhoneAccountDialogFragment)
+ getFragmentManager().findFragmentByTag(TAG_SELECT_ACCT_FRAGMENT);
+ if (dialogFragment != null) {
+ dialogFragment.setListener(mSelectAcctListener);
+ }
+ }
+ mInCallOrientationEventListener = new InCallOrientationEventListener(this);
+
+ Log.d(this, "onCreate(): exit");
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle out) {
+ // TODO: The dialpad fragment should handle this as part of its own state
+ out.putBoolean(SHOW_DIALPAD_EXTRA,
+ mCallButtonFragment != null && mCallButtonFragment.isDialpadVisible());
+ if (mDialpadFragment != null) {
+ out.putString(DIALPAD_TEXT_EXTRA, mDialpadFragment.getDtmfText());
+ }
+ super.onSaveInstanceState(out);
+ }
+
+ @Override
+ protected void onStart() {
+ Log.d(this, "onStart()...");
+ super.onStart();
+
+ // setting activity should be last thing in setup process
+ InCallPresenter.getInstance().setActivity(this);
+ enableInCallOrientationEventListener(getRequestedOrientation() ==
+ InCallOrientationEventListener.FULL_SENSOR_SCREEN_ORIENTATION);
+
+ InCallPresenter.getInstance().onActivityStarted();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.i(this, "onResume()...");
+ super.onResume();
+
+ InCallPresenter.getInstance().setThemeColors();
+ InCallPresenter.getInstance().onUiShowing(true);
+
+ // Clear fullscreen state onResume; the stored value may not match reality.
+ InCallPresenter.getInstance().clearFullscreen();
+
+ // If there is a pending request to show or hide the dialpad, handle that now.
+ if (mShowDialpadRequest != DIALPAD_REQUEST_NONE) {
+ if (mShowDialpadRequest == DIALPAD_REQUEST_SHOW) {
+ // Exit fullscreen so that the user has access to the dialpad hide/show button and
+ // can hide the dialpad. Important when showing the dialpad from within dialer.
+ InCallPresenter.getInstance().setFullScreen(false, true /* force */);
+
+ mCallButtonFragment.displayDialpad(true /* show */,
+ mAnimateDialpadOnShow /* animate */);
+ mAnimateDialpadOnShow = false;
+
+ if (mDialpadFragment != null) {
+ mDialpadFragment.setDtmfText(mDtmfText);
+ mDtmfText = null;
+ }
+ } else {
+ Log.v(this, "onResume : force hide dialpad");
+ if (mDialpadFragment != null) {
+ mCallButtonFragment.displayDialpad(false /* show */, false /* animate */);
+ }
+ }
+ mShowDialpadRequest = DIALPAD_REQUEST_NONE;
+ }
+
+ if (mShowPostCharWaitDialogOnResume) {
+ showPostCharWaitDialog(mShowPostCharWaitDialogCallId, mShowPostCharWaitDialogChars);
+ }
+ }
+
+ // onPause is guaranteed to be called when the InCallActivity goes
+ // in the background.
+ @Override
+ protected void onPause() {
+ Log.d(this, "onPause()...");
+ if (mDialpadFragment != null) {
+ mDialpadFragment.onDialerKeyUp(null);
+ }
+
+ InCallPresenter.getInstance().onUiShowing(false);
+ if (isFinishing()) {
+ InCallPresenter.getInstance().unsetActivity(this);
+ }
+ super.onPause();
+ }
+
+ @Override
+ protected void onStop() {
+ Log.d(this, "onStop()...");
+ enableInCallOrientationEventListener(false);
+ InCallPresenter.getInstance().updateIsChangingConfigurations();
+ InCallPresenter.getInstance().onActivityStopped();
+ super.onStop();
+ }
+
+ @Override
+ protected void onDestroy() {
+ Log.d(this, "onDestroy()... this = " + this);
+ InCallPresenter.getInstance().unsetActivity(this);
+ InCallPresenter.getInstance().updateIsChangingConfigurations();
+ super.onDestroy();
+ }
+
+ /**
+ * When fragments have a parent fragment, onAttachFragment is not called on the parent
+ * activity. To fix this, register our own callback instead that is always called for
+ * all fragments.
+ *
+ * @see {@link BaseFragment#onAttach(Activity)}
+ */
+ @Override
+ public void onFragmentAttached(Fragment fragment) {
+ if (fragment instanceof DialpadFragment) {
+ mDialpadFragment = (DialpadFragment) fragment;
+ } else if (fragment instanceof AnswerFragment) {
+ mAnswerFragment = (AnswerFragment) fragment;
+ } else if (fragment instanceof CallCardFragment) {
+ mCallCardFragment = (CallCardFragment) fragment;
+ mChildFragmentManager = mCallCardFragment.getChildFragmentManager();
+ } else if (fragment instanceof ConferenceManagerFragment) {
+ mConferenceManagerFragment = (ConferenceManagerFragment) fragment;
+ } else if (fragment instanceof CallButtonFragment) {
+ mCallButtonFragment = (CallButtonFragment) fragment;
+ }
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ Configuration oldConfig = getResources().getConfiguration();
+ Log.v(this, String.format(
+ "incallui config changed, screen size: w%ddp x h%ddp old:w%ddp x h%ddp",
+ newConfig.screenWidthDp, newConfig.screenHeightDp,
+ oldConfig.screenWidthDp, oldConfig.screenHeightDp));
+ // Recreate this activity if height is changing beyond the threshold to load different
+ // layout file.
+ if (oldConfig.screenHeightDp < SCREEN_HEIGHT_RESIZE_THRESHOLD &&
+ newConfig.screenHeightDp > SCREEN_HEIGHT_RESIZE_THRESHOLD ||
+ oldConfig.screenHeightDp > SCREEN_HEIGHT_RESIZE_THRESHOLD &&
+ newConfig.screenHeightDp < SCREEN_HEIGHT_RESIZE_THRESHOLD) {
+ Log.i(this, String.format(
+ "Recreate activity due to resize beyond threshold: %d dp",
+ SCREEN_HEIGHT_RESIZE_THRESHOLD));
+ recreate();
+ }
+ }
+
+ /**
+ * Returns true when the Activity is currently visible.
+ */
+ /* package */ boolean isVisible() {
+ return isSafeToCommitTransactions();
+ }
+
+ private boolean hasPendingDialogs() {
+ return mDialog != null || (mAnswerFragment != null && mAnswerFragment.hasPendingDialogs());
+ }
+
+ @Override
+ public void finish() {
+ Log.i(this, "finish(). Dialog showing: " + (mDialog != null));
+
+ // skip finish if we are still showing a dialog.
+ if (!hasPendingDialogs()) {
+ super.finish();
+ }
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ Log.d(this, "onNewIntent: intent = " + intent);
+
+ // We're being re-launched with a new Intent. Since it's possible for a
+ // single InCallActivity instance to persist indefinitely (even if we
+ // finish() ourselves), this sequence can potentially happen any time
+ // the InCallActivity needs to be displayed.
+
+ // Stash away the new intent so that we can get it in the future
+ // by calling getIntent(). (Otherwise getIntent() will return the
+ // original Intent from when we first got created!)
+ setIntent(intent);
+
+ // Activities are always paused before receiving a new intent, so
+ // we can count on our onResume() method being called next.
+
+ // Just like in onCreate(), handle the intent.
+ internalResolveIntent(intent);
+ }
+
+ @Override
+ public void onBackPressed() {
+ Log.i(this, "onBackPressed");
+
+ // BACK is also used to exit out of any "special modes" of the
+ // in-call UI:
+ if (!isVisible()) {
+ return;
+ }
+
+ if ((mConferenceManagerFragment == null || !mConferenceManagerFragment.isVisible())
+ && (mCallCardFragment == null || !mCallCardFragment.isVisible())) {
+ return;
+ }
+
+ if (mDialpadFragment != null && mDialpadFragment.isVisible()) {
+ mCallButtonFragment.displayDialpad(false /* show */, true /* animate */);
+ return;
+ } else if (mConferenceManagerFragment != null && mConferenceManagerFragment.isVisible()) {
+ showConferenceFragment(false);
+ return;
+ }
+
+ // Always disable the Back key while an incoming call is ringing
+ final Call call = CallList.getInstance().getIncomingCall();
+ if (call != null) {
+ Log.i(this, "Consume Back press for an incoming call");
+ return;
+ }
+
+ // Nothing special to do. Fall back to the default behavior.
+ super.onBackPressed();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ final int itemId = item.getItemId();
+ if (itemId == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ // push input to the dialer.
+ if (mDialpadFragment != null && (mDialpadFragment.isVisible()) &&
+ (mDialpadFragment.onDialerKeyUp(event))) {
+ return true;
+ } else if (keyCode == KeyEvent.KEYCODE_CALL) {
+ // Always consume CALL to be sure the PhoneWindow won't do anything with it
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (mDispatchTouchEventListener != null) {
+ boolean handled = mDispatchTouchEventListener.onTouch(null, ev);
+ if (handled) {
+ return true;
+ }
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_CALL:
+ boolean handled = InCallPresenter.getInstance().handleCallKey();
+ if (!handled) {
+ Log.w(this, "InCallActivity should always handle KEYCODE_CALL in onKeyDown");
+ }
+ // Always consume CALL to be sure the PhoneWindow won't do anything with it
+ return true;
+
+ // Note there's no KeyEvent.KEYCODE_ENDCALL case here.
+ // The standard system-wide handling of the ENDCALL key
+ // (see PhoneWindowManager's handling of KEYCODE_ENDCALL)
+ // already implements exactly what the UI spec wants,
+ // namely (1) "hang up" if there's a current active call,
+ // or (2) "don't answer" if there's a current ringing call.
+
+ case KeyEvent.KEYCODE_CAMERA:
+ // Disable the CAMERA button while in-call since it's too
+ // easy to press accidentally.
+ return true;
+
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ // Ringer silencing handled by PhoneWindowManager.
+ break;
+
+ case KeyEvent.KEYCODE_MUTE:
+ // toggle mute
+ TelecomAdapter.getInstance().mute(!AudioModeProvider.getInstance().getMute());
+ return true;
+
+ // Various testing/debugging features, enabled ONLY when VERBOSE == true.
+ case KeyEvent.KEYCODE_SLASH:
+ if (Log.VERBOSE) {
+ Log.v(this, "----------- InCallActivity View dump --------------");
+ // Dump starting from the top-level view of the entire activity:
+ Window w = this.getWindow();
+ View decorView = w.getDecorView();
+ Log.d(this, "View dump:" + decorView);
+ return true;
+ }
+ break;
+ case KeyEvent.KEYCODE_EQUALS:
+ // TODO: Dump phone state?
+ break;
+ }
+
+ if (event.getRepeatCount() == 0 && handleDialerKeyDown(keyCode, event)) {
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ private boolean handleDialerKeyDown(int keyCode, KeyEvent event) {
+ Log.v(this, "handleDialerKeyDown: keyCode " + keyCode + ", event " + event + "...");
+
+ // As soon as the user starts typing valid dialable keys on the
+ // keyboard (presumably to type DTMF tones) we start passing the
+ // key events to the DTMFDialer's onDialerKeyDown.
+ if (mDialpadFragment != null && mDialpadFragment.isVisible()) {
+ return mDialpadFragment.onDialerKeyDown(event);
+ }
+
+ return false;
+ }
+
+ public CallButtonFragment getCallButtonFragment() {
+ return mCallButtonFragment;
+ }
+
+ public CallCardFragment getCallCardFragment() {
+ return mCallCardFragment;
+ }
+
+ public AnswerFragment getAnswerFragment() {
+ return mAnswerFragment;
+ }
+
+ private void internalResolveIntent(Intent intent) {
+ final String action = intent.getAction();
+ if (action.equals(Intent.ACTION_MAIN)) {
+ // This action is the normal way to bring up the in-call UI.
+ //
+ // But we do check here for one extra that can come along with the
+ // ACTION_MAIN intent:
+
+ if (intent.hasExtra(SHOW_DIALPAD_EXTRA)) {
+ // SHOW_DIALPAD_EXTRA can be used here to specify whether the DTMF
+ // dialpad should be initially visible. If the extra isn't
+ // present at all, we just leave the dialpad in its previous state.
+
+ final boolean showDialpad = intent.getBooleanExtra(SHOW_DIALPAD_EXTRA, false);
+ Log.d(this, "- internalResolveIntent: SHOW_DIALPAD_EXTRA: " + showDialpad);
+
+ relaunchedFromDialer(showDialpad);
+ }
+
+ boolean newOutgoingCall = false;
+ if (intent.getBooleanExtra(NEW_OUTGOING_CALL_EXTRA, false)) {
+ intent.removeExtra(NEW_OUTGOING_CALL_EXTRA);
+ Call call = CallList.getInstance().getOutgoingCall();
+ if (call == null) {
+ call = CallList.getInstance().getPendingOutgoingCall();
+ }
+
+ Bundle extras = null;
+ if (call != null) {
+ extras = call.getTelecomCall().getDetails().getIntentExtras();
+ }
+ if (extras == null) {
+ // Initialize the extras bundle to avoid NPE
+ extras = new Bundle();
+ }
+
+ Point touchPoint = null;
+ if (TouchPointManager.getInstance().hasValidPoint()) {
+ // Use the most immediate touch point in the InCallUi if available
+ touchPoint = TouchPointManager.getInstance().getPoint();
+ } else {
+ // Otherwise retrieve the touch point from the call intent
+ if (call != null) {
+ touchPoint = (Point) extras.getParcelable(TouchPointManager.TOUCH_POINT);
+ }
+ }
+
+ // Start animation for new outgoing call
+ CircularRevealFragment.startCircularReveal(getFragmentManager(), touchPoint,
+ InCallPresenter.getInstance());
+
+ // InCallActivity is responsible for disconnecting a new outgoing call if there
+ // is no way of making it (i.e. no valid call capable accounts).
+ // If the version is not MSIM compatible, then ignore this code.
+ if (CompatUtils.isMSIMCompatible()
+ && InCallPresenter.isCallWithNoValidAccounts(call)) {
+ TelecomAdapter.getInstance().disconnectCall(call.getId());
+ }
+
+ dismissKeyguard(true);
+ newOutgoingCall = true;
+ }
+
+ Call pendingAccountSelectionCall = CallList.getInstance().getWaitingForAccountCall();
+ if (pendingAccountSelectionCall != null) {
+ showCallCardFragment(false);
+ Bundle extras =
+ pendingAccountSelectionCall.getTelecomCall().getDetails().getIntentExtras();
+
+ final List<PhoneAccountHandle> phoneAccountHandles;
+ if (extras != null) {
+ phoneAccountHandles = extras.getParcelableArrayList(
+ android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+ } else {
+ phoneAccountHandles = new ArrayList<>();
+ }
+
+ DialogFragment dialogFragment = SelectPhoneAccountDialogFragment.newInstance(
+ R.string.select_phone_account_for_calls, true, phoneAccountHandles,
+ mSelectAcctListener);
+ dialogFragment.show(getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT);
+ } else if (!newOutgoingCall) {
+ showCallCardFragment(true);
+ }
+ return;
+ }
+ }
+
+ /**
+ * When relaunching from the dialer app, {@code showDialpad} indicates whether the dialpad
+ * should be shown on launch.
+ *
+ * @param showDialpad {@code true} to indicate the dialpad should be shown on launch, and
+ * {@code false} to indicate no change should be made to the
+ * dialpad visibility.
+ */
+ private void relaunchedFromDialer(boolean showDialpad) {
+ mShowDialpadRequest = showDialpad ? DIALPAD_REQUEST_SHOW : DIALPAD_REQUEST_NONE;
+ mAnimateDialpadOnShow = true;
+
+ if (mShowDialpadRequest == DIALPAD_REQUEST_SHOW) {
+ // If there's only one line in use, AND it's on hold, then we're sure the user
+ // wants to use the dialpad toward the exact line, so un-hold the holding line.
+ final Call call = CallList.getInstance().getActiveOrBackgroundCall();
+ if (call != null && call.getState() == State.ONHOLD) {
+ TelecomAdapter.getInstance().unholdCall(call.getId());
+ }
+ }
+ }
+
+ public void dismissKeyguard(boolean dismiss) {
+ if (mDismissKeyguard == dismiss) {
+ return;
+ }
+ mDismissKeyguard = dismiss;
+ if (dismiss) {
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+ } else {
+ getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+ }
+ }
+
+ private void showFragment(String tag, boolean show, boolean executeImmediately) {
+ Trace.beginSection("showFragment - " + tag);
+ final FragmentManager fm = getFragmentManagerForTag(tag);
+
+ if (fm == null) {
+ Log.w(TAG, "Fragment manager is null for : " + tag);
+ return;
+ }
+
+ Fragment fragment = fm.findFragmentByTag(tag);
+ if (!show && fragment == null) {
+ // Nothing to show, so bail early.
+ return;
+ }
+
+ final FragmentTransaction transaction = fm.beginTransaction();
+ if (show) {
+ if (fragment == null) {
+ fragment = createNewFragmentForTag(tag);
+ transaction.add(getContainerIdForFragment(tag), fragment, tag);
+ } else {
+ transaction.show(fragment);
+ }
+ Logger.logScreenView(getScreenTypeForTag(tag), this);
+ } else {
+ transaction.hide(fragment);
+ }
+
+ transaction.commitAllowingStateLoss();
+ if (executeImmediately) {
+ fm.executePendingTransactions();
+ }
+ Trace.endSection();
+ }
+
+ private Fragment createNewFragmentForTag(String tag) {
+ if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
+ mDialpadFragment = new DialpadFragment();
+ return mDialpadFragment;
+ } else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
+ if (AccessibilityUtil.isTalkBackEnabled(this)) {
+ mAnswerFragment = new AccessibleAnswerFragment();
+ } else {
+ mAnswerFragment = new GlowPadAnswerFragment();
+ }
+ return mAnswerFragment;
+ } else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
+ mConferenceManagerFragment = new ConferenceManagerFragment();
+ return mConferenceManagerFragment;
+ } else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
+ mCallCardFragment = new CallCardFragment();
+ return mCallCardFragment;
+ }
+ throw new IllegalStateException("Unexpected fragment: " + tag);
+ }
+
+ private FragmentManager getFragmentManagerForTag(String tag) {
+ if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
+ return mChildFragmentManager;
+ } else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
+ return mChildFragmentManager;
+ } else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
+ return getFragmentManager();
+ } else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
+ return getFragmentManager();
+ }
+ throw new IllegalStateException("Unexpected fragment: " + tag);
+ }
+
+ private int getScreenTypeForTag(String tag) {
+ switch (tag) {
+ case TAG_DIALPAD_FRAGMENT:
+ return ScreenEvent.INCALL_DIALPAD;
+ case TAG_CALLCARD_FRAGMENT:
+ return ScreenEvent.INCALL;
+ case TAG_CONFERENCE_FRAGMENT:
+ return ScreenEvent.CONFERENCE_MANAGEMENT;
+ case TAG_ANSWER_FRAGMENT:
+ return ScreenEvent.INCOMING_CALL;
+ default:
+ return ScreenEvent.UNKNOWN;
+ }
+ }
+
+ private int getContainerIdForFragment(String tag) {
+ if (TAG_DIALPAD_FRAGMENT.equals(tag)) {
+ return R.id.answer_and_dialpad_container;
+ } else if (TAG_ANSWER_FRAGMENT.equals(tag)) {
+ return R.id.answer_and_dialpad_container;
+ } else if (TAG_CONFERENCE_FRAGMENT.equals(tag)) {
+ return R.id.main;
+ } else if (TAG_CALLCARD_FRAGMENT.equals(tag)) {
+ return R.id.main;
+ }
+ throw new IllegalStateException("Unexpected fragment: " + tag);
+ }
+
+ /**
+ * @return {@code true} while the visibility of the dialpad has actually changed.
+ */
+ public boolean showDialpadFragment(boolean show, boolean animate) {
+ // If the dialpad is already visible, don't animate in. If it's gone, don't animate out.
+ if ((show && isDialpadVisible()) || (!show && !isDialpadVisible())) {
+ return false;
+ }
+ // We don't do a FragmentTransaction on the hide case because it will be dealt with when
+ // the listener is fired after an animation finishes.
+ if (!animate) {
+ showFragment(TAG_DIALPAD_FRAGMENT, show, true);
+ } else {
+ if (show) {
+ showFragment(TAG_DIALPAD_FRAGMENT, true, true);
+ mDialpadFragment.animateShowDialpad();
+ }
+ mDialpadFragment.getView().startAnimation(show ? mSlideIn : mSlideOut);
+ }
+ // Note: onDialpadVisibilityChange is called here to ensure that the dialpad FAB
+ // repositions itself.
+ mCallCardFragment.onDialpadVisibilityChange(show);
+
+ final ProximitySensor sensor = InCallPresenter.getInstance().getProximitySensor();
+ if (sensor != null) {
+ sensor.onDialpadVisible(show);
+ }
+ return true;
+ }
+
+ public boolean isDialpadVisible() {
+ return mDialpadFragment != null && mDialpadFragment.isVisible();
+ }
+
+ public void showCallCardFragment(boolean show) {
+ showFragment(TAG_CALLCARD_FRAGMENT, show, true);
+ }
+
+ /**
+ * Hides or shows the conference manager fragment.
+ *
+ * @param show {@code true} if the conference manager should be shown, {@code false} if it
+ * should be hidden.
+ */
+ public void showConferenceFragment(boolean show) {
+ showFragment(TAG_CONFERENCE_FRAGMENT, show, true);
+ mConferenceManagerFragment.onVisibilityChanged(show);
+
+ // Need to hide the call card fragment to ensure that accessibility service does not try to
+ // give focus to the call card when the conference manager is visible.
+ mCallCardFragment.getView().setVisibility(show ? View.GONE : View.VISIBLE);
+ }
+
+ public void showAnswerFragment(boolean show) {
+ showFragment(TAG_ANSWER_FRAGMENT, show, true);
+ }
+
+ public void showPostCharWaitDialog(String callId, String chars) {
+ if (isVisible()) {
+ final PostCharDialogFragment fragment = new PostCharDialogFragment(callId, chars);
+ fragment.show(getFragmentManager(), "postCharWait");
+
+ mShowPostCharWaitDialogOnResume = false;
+ mShowPostCharWaitDialogCallId = null;
+ mShowPostCharWaitDialogChars = null;
+ } else {
+ mShowPostCharWaitDialogOnResume = true;
+ mShowPostCharWaitDialogCallId = callId;
+ mShowPostCharWaitDialogChars = chars;
+ }
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ if (mCallCardFragment != null) {
+ mCallCardFragment.dispatchPopulateAccessibilityEvent(event);
+ }
+ return super.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ public void maybeShowErrorDialogOnDisconnect(DisconnectCause disconnectCause) {
+ Log.d(this, "maybeShowErrorDialogOnDisconnect");
+
+ if (!isFinishing() && !TextUtils.isEmpty(disconnectCause.getDescription())
+ && (disconnectCause.getCode() == DisconnectCause.ERROR ||
+ disconnectCause.getCode() == DisconnectCause.RESTRICTED)) {
+ showErrorDialog(disconnectCause.getDescription());
+ }
+ }
+
+ public void dismissPendingDialogs() {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ mDialog = null;
+ }
+ if (mAnswerFragment != null) {
+ mAnswerFragment.dismissPendingDialogs();
+ }
+ }
+
+ /**
+ * Utility function to bring up a generic "error" dialog.
+ */
+ private void showErrorDialog(CharSequence msg) {
+ Log.i(this, "Show Dialog: " + msg);
+
+ dismissPendingDialogs();
+
+ mDialog = new AlertDialog.Builder(this)
+ .setMessage(msg)
+ .setPositiveButton(android.R.string.ok, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ onDialogDismissed();
+ }
+ })
+ .setOnCancelListener(new OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ onDialogDismissed();
+ }
+ })
+ .create();
+
+ mDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+ mDialog.show();
+ }
+
+ private void onDialogDismissed() {
+ mDialog = null;
+ CallList.getInstance().onErrorDialogDismissed();
+ InCallPresenter.getInstance().onDismissDialog();
+ }
+
+ public void setExcludeFromRecents(boolean exclude) {
+ ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+ List<ActivityManager.AppTask> tasks = am.getAppTasks();
+ int taskId = getTaskId();
+ for (int i = 0; i < tasks.size(); i++) {
+ ActivityManager.AppTask task = tasks.get(i);
+ if (task.getTaskInfo().id == taskId) {
+ try {
+ task.setExcludeFromRecents(exclude);
+ } catch (RuntimeException e) {
+ Log.e(TAG, "RuntimeException when excluding task from recents.", e);
+ }
+ }
+ }
+ }
+
+
+ public OnTouchListener getDispatchTouchEventListener() {
+ return mDispatchTouchEventListener;
+ }
+
+ public void setDispatchTouchEventListener(OnTouchListener mDispatchTouchEventListener) {
+ this.mDispatchTouchEventListener = mDispatchTouchEventListener;
+ }
+
+ /**
+ * Enables the OrientationEventListener if enable flag is true. Disables it if enable is
+ * false
+ * @param enable true or false.
+ */
+ public void enableInCallOrientationEventListener(boolean enable) {
+ if (enable) {
+ mInCallOrientationEventListener.enable(enable);
+ } else {
+ mInCallOrientationEventListener.disable();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallAnimationUtils.java b/InCallUI/src/com/android/incallui/InCallAnimationUtils.java
new file mode 100644
index 000000000..44bb369e6
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallAnimationUtils.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.view.ViewPropertyAnimator;
+import android.widget.ImageView;
+
+/**
+ * Utilities for Animation.
+ */
+public class InCallAnimationUtils {
+ private static final String LOG_TAG = InCallAnimationUtils.class.getSimpleName();
+ /**
+ * Turn on when you're interested in fading animation. Intentionally untied from other debug
+ * settings.
+ */
+ private static final boolean FADE_DBG = false;
+
+ /**
+ * Duration for animations in msec, which can be used with
+ * {@link ViewPropertyAnimator#setDuration(long)} for example.
+ */
+ public static final int ANIMATION_DURATION = 250;
+
+ private InCallAnimationUtils() {
+ }
+
+ /**
+ * Drawable achieving cross-fade, just like TransitionDrawable. We can have
+ * call-backs via animator object (see also {@link CrossFadeDrawable#getAnimator()}).
+ */
+ private static class CrossFadeDrawable extends LayerDrawable {
+ private final ObjectAnimator mAnimator;
+
+ public CrossFadeDrawable(Drawable[] layers) {
+ super(layers);
+ mAnimator = ObjectAnimator.ofInt(this, "crossFadeAlpha", 0xff, 0);
+ }
+
+ private int mCrossFadeAlpha;
+
+ /**
+ * This will be used from ObjectAnimator.
+ * Note: this method is protected by proguard.flags so that it won't be removed
+ * automatically.
+ */
+ @SuppressWarnings("unused")
+ public void setCrossFadeAlpha(int alpha) {
+ mCrossFadeAlpha = alpha;
+ invalidateSelf();
+ }
+
+ public ObjectAnimator getAnimator() {
+ return mAnimator;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ Drawable first = getDrawable(0);
+ Drawable second = getDrawable(1);
+
+ if (mCrossFadeAlpha > 0) {
+ first.setAlpha(mCrossFadeAlpha);
+ first.draw(canvas);
+ first.setAlpha(255);
+ }
+
+ if (mCrossFadeAlpha < 0xff) {
+ second.setAlpha(0xff - mCrossFadeAlpha);
+ second.draw(canvas);
+ second.setAlpha(0xff);
+ }
+ }
+ }
+
+ private static CrossFadeDrawable newCrossFadeDrawable(Drawable first, Drawable second) {
+ Drawable[] layers = new Drawable[2];
+ layers[0] = first;
+ layers[1] = second;
+ return new CrossFadeDrawable(layers);
+ }
+
+ /**
+ * Starts cross-fade animation using TransitionDrawable. Nothing will happen if "from" and "to"
+ * are the same.
+ */
+ public static void startCrossFade(
+ final ImageView imageView, final Drawable from, final Drawable to) {
+ // We skip the cross-fade when those two Drawables are equal, or they are BitmapDrawables
+ // pointing to the same Bitmap.
+ final boolean drawableIsEqual = (from != null && to != null && from.equals(to));
+ final boolean hasFromImage = ((from instanceof BitmapDrawable) &&
+ ((BitmapDrawable) from).getBitmap() != null);
+ final boolean hasToImage = ((to instanceof BitmapDrawable) &&
+ ((BitmapDrawable) to).getBitmap() != null);
+ final boolean areSameImage = drawableIsEqual || (hasFromImage && hasToImage &&
+ ((BitmapDrawable) from).getBitmap().equals(((BitmapDrawable) to).getBitmap()));
+
+ if (!areSameImage) {
+ if (FADE_DBG) {
+ log("Start cross-fade animation for " + imageView
+ + "(" + Integer.toHexString(from.hashCode()) + " -> "
+ + Integer.toHexString(to.hashCode()) + ")");
+ }
+
+ CrossFadeDrawable crossFadeDrawable = newCrossFadeDrawable(from, to);
+ ObjectAnimator animator = crossFadeDrawable.getAnimator();
+ imageView.setImageDrawable(crossFadeDrawable);
+ animator.setDuration(ANIMATION_DURATION);
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ if (FADE_DBG) {
+ log("cross-fade animation start ("
+ + Integer.toHexString(from.hashCode()) + " -> "
+ + Integer.toHexString(to.hashCode()) + ")");
+ }
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (FADE_DBG) {
+ log("cross-fade animation ended ("
+ + Integer.toHexString(from.hashCode()) + " -> "
+ + Integer.toHexString(to.hashCode()) + ")");
+ }
+ animation.removeAllListeners();
+ // Workaround for issue 6300562; this will force the drawable to the
+ // resultant one regardless of animation glitch.
+ imageView.setImageDrawable(to);
+ }
+ });
+ animator.start();
+
+ /* We could use TransitionDrawable here, but it may cause some weird animation in
+ * some corner cases. See issue 6300562
+ * TODO: decide which to be used in the long run. TransitionDrawable is old but system
+ * one. Ours uses new animation framework and thus have callback (great for testing),
+ * while no framework support for the exact class.
+
+ Drawable[] layers = new Drawable[2];
+ layers[0] = from;
+ layers[1] = to;
+ TransitionDrawable transitionDrawable = new TransitionDrawable(layers);
+ imageView.setImageDrawable(transitionDrawable);
+ transitionDrawable.startTransition(ANIMATION_DURATION); */
+ imageView.setTag(to);
+ } else if (!hasFromImage && hasToImage) {
+ imageView.setImageDrawable(to);
+ imageView.setTag(to);
+ } else {
+ if (FADE_DBG) {
+ log("*Not* start cross-fade. " + imageView);
+ }
+ }
+ }
+
+ // Debugging / testing code
+
+ private static void log(String msg) {
+ Log.d(LOG_TAG, msg);
+ }
+} \ No newline at end of file
diff --git a/InCallUI/src/com/android/incallui/InCallCameraManager.java b/InCallUI/src/com/android/incallui/InCallCameraManager.java
new file mode 100644
index 000000000..53000f1dd
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallCameraManager.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.graphics.SurfaceTexture;
+import android.hardware.camera2.CameraAccessException;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.params.StreamConfigurationMap;
+import android.util.Size;
+
+import java.lang.String;
+import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Set;
+
+/**
+ * Used to track which camera is used for outgoing video.
+ */
+public class InCallCameraManager {
+
+ public interface Listener {
+ void onActiveCameraSelectionChanged(boolean isUsingFrontFacingCamera);
+ }
+
+ private final Set<Listener> mCameraSelectionListeners = Collections.
+ newSetFromMap(new ConcurrentHashMap<Listener, Boolean>(8,0.9f,1));
+
+ /**
+ * The camera ID for the front facing camera.
+ */
+ private String mFrontFacingCameraId;
+
+ /**
+ * The camera ID for the rear facing camera.
+ */
+ private String mRearFacingCameraId;
+
+ /**
+ * The currently active camera.
+ */
+ private boolean mUseFrontFacingCamera;
+
+ /**
+ * Indicates whether the list of cameras has been initialized yet. Initialization is delayed
+ * until a video call is present.
+ */
+ private boolean mIsInitialized = false;
+
+ /**
+ * The context.
+ */
+ private Context mContext;
+
+ /**
+ * Initializes the InCall CameraManager.
+ *
+ * @param context The current context.
+ */
+ public InCallCameraManager(Context context) {
+ mUseFrontFacingCamera = true;
+ mContext = context;
+ }
+
+ /**
+ * Sets whether the front facing camera should be used or not.
+ *
+ * @param useFrontFacingCamera {@code True} if the front facing camera is to be used.
+ */
+ public void setUseFrontFacingCamera(boolean useFrontFacingCamera) {
+ mUseFrontFacingCamera = useFrontFacingCamera;
+ for (Listener listener : mCameraSelectionListeners) {
+ listener.onActiveCameraSelectionChanged(mUseFrontFacingCamera);
+ }
+ }
+
+ /**
+ * Determines whether the front facing camera is currently in use.
+ *
+ * @return {@code True} if the front facing camera is in use.
+ */
+ public boolean isUsingFrontFacingCamera() {
+ return mUseFrontFacingCamera;
+ }
+
+ /**
+ * Determines the active camera ID.
+ *
+ * @return The active camera ID.
+ */
+ public String getActiveCameraId() {
+ maybeInitializeCameraList(mContext);
+
+ if (mUseFrontFacingCamera) {
+ return mFrontFacingCameraId;
+ } else {
+ return mRearFacingCameraId;
+ }
+ }
+
+ /**
+ * Get the list of cameras available for use.
+ *
+ * @param context The context.
+ */
+ private void maybeInitializeCameraList(Context context) {
+ if (mIsInitialized || context == null) {
+ return;
+ }
+
+ Log.v(this, "initializeCameraList");
+
+ CameraManager cameraManager = null;
+ try {
+ cameraManager = (CameraManager) context.getSystemService(
+ Context.CAMERA_SERVICE);
+ } catch (Exception e) {
+ Log.e(this, "Could not get camera service.");
+ return;
+ }
+
+ if (cameraManager == null) {
+ return;
+ }
+
+ String[] cameraIds = {};
+ try {
+ cameraIds = cameraManager.getCameraIdList();
+ } catch (CameraAccessException e) {
+ Log.d(this, "Could not access camera: "+e);
+ // Camera disabled by device policy.
+ return;
+ }
+
+ for (int i = 0; i < cameraIds.length; i++) {
+ CameraCharacteristics c = null;
+ try {
+ c = cameraManager.getCameraCharacteristics(cameraIds[i]);
+ } catch (IllegalArgumentException e) {
+ // Device Id is unknown.
+ } catch (CameraAccessException e) {
+ // Camera disabled by device policy.
+ }
+ if (c != null) {
+ int facingCharacteristic = c.get(CameraCharacteristics.LENS_FACING);
+ if (facingCharacteristic == CameraCharacteristics.LENS_FACING_FRONT) {
+ mFrontFacingCameraId = cameraIds[i];
+ } else if (facingCharacteristic == CameraCharacteristics.LENS_FACING_BACK) {
+ mRearFacingCameraId = cameraIds[i];
+ }
+ }
+ }
+
+ mIsInitialized = true;
+ Log.v(this, "initializeCameraList : done");
+ }
+
+ public void addCameraSelectionListener(Listener listener) {
+ if (listener != null) {
+ mCameraSelectionListeners.add(listener);
+ }
+ }
+
+ public void removeCameraSelectionListener(Listener listener) {
+ if (listener != null) {
+ mCameraSelectionListeners.remove(listener);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallContactInteractions.java b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
new file mode 100644
index 000000000..88070fe37
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallContactInteractions.java
@@ -0,0 +1,399 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import android.content.Context;
+import android.location.Address;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.util.Pair;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+import android.widget.RelativeLayout;
+import android.widget.RelativeLayout.LayoutParams;
+import android.widget.TextView;
+
+import com.android.dialer.R;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Wrapper class for objects that are used in generating the context about the contact in the InCall
+ * screen.
+ *
+ * This handles generating the appropriate resource for the ListAdapter based on whether the contact
+ * is a business contact or not and logic for the manipulation of data for the call context.
+ */
+public class InCallContactInteractions {
+ private static final String TAG = InCallContactInteractions.class.getSimpleName();
+
+ private Context mContext;
+ private InCallContactInteractionsListAdapter mListAdapter;
+ private boolean mIsBusiness;
+ private View mBusinessHeaderView;
+ private LayoutInflater mInflater;
+
+ public InCallContactInteractions(Context context, boolean isBusiness) {
+ mContext = context;
+ mInflater = (LayoutInflater)
+ context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ switchContactType(isBusiness);
+ }
+
+ public InCallContactInteractionsListAdapter getListAdapter() {
+ return mListAdapter;
+ }
+
+ /**
+ * Switches the "isBusiness" value, if applicable. Recreates the list adapter with the resource
+ * corresponding to the new isBusiness value if the "isBusiness" value is switched.
+ *
+ * @param isBusiness Whether or not the contact is a business.
+ *
+ * @return {@code true} if a new list adapter was created, {@code} otherwise.
+ */
+ public boolean switchContactType(boolean isBusiness) {
+ if (mIsBusiness != isBusiness || mListAdapter == null) {
+ mIsBusiness = isBusiness;
+ mListAdapter = new InCallContactInteractionsListAdapter(mContext,
+ mIsBusiness ? R.layout.business_context_info_list_item
+ : R.layout.person_context_info_list_item);
+ return true;
+ }
+ return false;
+ }
+
+ public View getBusinessListHeaderView() {
+ if (mBusinessHeaderView == null) {
+ mBusinessHeaderView = mInflater.inflate(
+ R.layout.business_contact_context_list_header, null);
+ }
+ return mBusinessHeaderView;
+ }
+
+ public void setBusinessInfo(Address address, float distance,
+ List<Pair<Calendar, Calendar>> openingHours) {
+ mListAdapter.clear();
+ List<ContactContextInfo> info = new ArrayList<ContactContextInfo>();
+
+ // Hours of operation
+ if (openingHours != null) {
+ BusinessContextInfo hoursInfo = constructHoursInfo(openingHours);
+ if (hoursInfo != null) {
+ info.add(hoursInfo);
+ }
+ }
+
+ // Location information
+ if (address != null) {
+ BusinessContextInfo locationInfo = constructLocationInfo(address, distance);
+ info.add(locationInfo);
+ }
+
+ mListAdapter.addAll(info);
+ }
+
+ /**
+ * Construct a BusinessContextInfo object containing hours of operation information.
+ * The format is:
+ * [Open now/Closed now]
+ * [Hours]
+ *
+ * @param openingHours
+ * @return BusinessContextInfo object with the schedule icon, the heading set to whether the
+ * business is open or not and the details set to the hours of operation.
+ */
+ private BusinessContextInfo constructHoursInfo(List<Pair<Calendar, Calendar>> openingHours) {
+ try {
+ return constructHoursInfo(Calendar.getInstance(), openingHours);
+ } catch (Exception e) {
+ // Catch all exceptions here because we don't want any crashes if something goes wrong.
+ Log.e(TAG, "Error constructing hours info: ", e);
+ }
+ return null;
+ }
+
+ /**
+ * Pass in arbitrary current calendar time.
+ */
+ @VisibleForTesting
+ BusinessContextInfo constructHoursInfo(Calendar currentTime,
+ List<Pair<Calendar, Calendar>> openingHours) {
+ if (currentTime == null || openingHours == null || openingHours.size() == 0) {
+ return null;
+ }
+
+ BusinessContextInfo hoursInfo = new BusinessContextInfo();
+ hoursInfo.iconId = R.drawable.ic_schedule_white_24dp;
+
+ boolean isOpenNow = false;
+ // This variable records which interval the current time is after. 0 denotes none of the
+ // intervals, 1 after the first interval, etc. It is also the index of the interval the
+ // current time is in (if open) or the next interval (if closed).
+ int afterInterval = 0;
+ // This variable counts the number of time intervals in today's opening hours.
+ int todaysIntervalCount = 0;
+
+ for (Pair<Calendar, Calendar> hours : openingHours) {
+ if (hours.first.compareTo(currentTime) <= 0
+ && currentTime.compareTo(hours.second) < 0) {
+ // If the current time is on or after the opening time and strictly before the
+ // closing time, then this business is open.
+ isOpenNow = true;
+ }
+
+ if (currentTime.get(Calendar.DAY_OF_YEAR) == hours.first.get(Calendar.DAY_OF_YEAR)) {
+ todaysIntervalCount += 1;
+ }
+
+ if (currentTime.compareTo(hours.second) > 0) {
+ // This assumes that the list of intervals is sorted by time.
+ afterInterval += 1;
+ }
+ }
+
+ hoursInfo.heading = isOpenNow ? mContext.getString(R.string.open_now)
+ : mContext.getString(R.string.closed_now);
+
+ /*
+ * The following logic determines what to display in various cases for hours of operation.
+ *
+ * - Display all intervals if open now and number of intervals is <=2.
+ * - Display next closing time if open now and number of intervals is >2.
+ * - Display next opening time if currently closed but opens later today.
+ * - Display last time it closed today if closed now and tomorrow's hours are unknown.
+ * - Display tomorrow's first open time if closed today and tomorrow's hours are known.
+ *
+ * NOTE: The logic below assumes that the intervals are sorted by ascending time. Possible
+ * TODO to modify the logic above and ensure this is true.
+ */
+ if (isOpenNow) {
+ if (todaysIntervalCount == 1) {
+ hoursInfo.detail = getTimeSpanStringForHours(openingHours.get(0));
+ } else if (todaysIntervalCount == 2) {
+ hoursInfo.detail = mContext.getString(
+ R.string.opening_hours,
+ getTimeSpanStringForHours(openingHours.get(0)),
+ getTimeSpanStringForHours(openingHours.get(1)));
+ } else if (afterInterval < openingHours.size()) {
+ // This check should not be necessary since if it is currently open, we should not
+ // be after the last interval, but just in case, we don't want to crash.
+ hoursInfo.detail = mContext.getString(
+ R.string.closes_today_at,
+ getFormattedTimeForCalendar(openingHours.get(afterInterval).second));
+ }
+ } else { // Currently closed
+ final int lastIntervalToday = todaysIntervalCount - 1;
+ if (todaysIntervalCount == 0) { // closed today
+ hoursInfo.detail = mContext.getString(
+ R.string.opens_tomorrow_at,
+ getFormattedTimeForCalendar(openingHours.get(0).first));
+ } else if (currentTime.after(openingHours.get(lastIntervalToday).second)) {
+ // Passed hours for today
+ if (todaysIntervalCount < openingHours.size()) {
+ // If all of today's intervals are exhausted, assume the next are tomorrow's.
+ hoursInfo.detail = mContext.getString(
+ R.string.opens_tomorrow_at,
+ getFormattedTimeForCalendar(
+ openingHours.get(todaysIntervalCount).first));
+ } else {
+ // Grab the last time it was open today.
+ hoursInfo.detail = mContext.getString(
+ R.string.closed_today_at,
+ getFormattedTimeForCalendar(
+ openingHours.get(lastIntervalToday).second));
+ }
+ } else if (afterInterval < openingHours.size()) {
+ // This check should not be necessary since if it is currently before the last
+ // interval, afterInterval should be less than the count of intervals, but just in
+ // case, we don't want to crash.
+ hoursInfo.detail = mContext.getString(
+ R.string.opens_today_at,
+ getFormattedTimeForCalendar(openingHours.get(afterInterval).first));
+ }
+ }
+
+ return hoursInfo;
+ }
+
+ String getFormattedTimeForCalendar(Calendar calendar) {
+ return DateFormat.getTimeFormat(mContext).format(calendar.getTime());
+ }
+
+ String getTimeSpanStringForHours(Pair<Calendar, Calendar> hours) {
+ return mContext.getString(R.string.open_time_span,
+ getFormattedTimeForCalendar(hours.first),
+ getFormattedTimeForCalendar(hours.second));
+ }
+
+ /**
+ * Construct a BusinessContextInfo object with the location information of the business.
+ * The format is:
+ * [Straight line distance in miles or kilometers]
+ * [Address without state/country/etc.]
+ *
+ * @param address An Address object containing address details of the business
+ * @param distance The distance to the location in meters
+ * @return A BusinessContextInfo object with the location icon, the heading as the distance to
+ * the business and the details containing the address.
+ */
+ private BusinessContextInfo constructLocationInfo(Address address, float distance) {
+ return constructLocationInfo(Locale.getDefault(), address, distance);
+ }
+
+ @VisibleForTesting
+ BusinessContextInfo constructLocationInfo(Locale locale, Address address,
+ float distance) {
+ if (address == null) {
+ return null;
+ }
+
+ BusinessContextInfo locationInfo = new BusinessContextInfo();
+ locationInfo.iconId = R.drawable.ic_location_on_white_24dp;
+ if (distance != DistanceHelper.DISTANCE_NOT_FOUND) {
+ //TODO: add a setting to allow the user to select "KM" or "MI" as their distance units.
+ if (Locale.US.equals(locale)) {
+ locationInfo.heading = mContext.getString(R.string.distance_imperial_away,
+ distance * DistanceHelper.MILES_PER_METER);
+ } else {
+ locationInfo.heading = mContext.getString(R.string.distance_metric_away,
+ distance * DistanceHelper.KILOMETERS_PER_METER);
+ }
+ }
+ if (address.getLocality() != null) {
+ locationInfo.detail = mContext.getString(
+ R.string.display_address,
+ address.getAddressLine(0),
+ address.getLocality());
+ } else {
+ locationInfo.detail = address.getAddressLine(0);
+ }
+ return locationInfo;
+ }
+
+ /**
+ * Get the appropriate title for the context.
+ * @return The "Business info" title for a business contact and the "Recent messages" title for
+ * personal contacts.
+ */
+ public String getContactContextTitle() {
+ return mIsBusiness
+ ? mContext.getResources().getString(R.string.business_contact_context_title)
+ : mContext.getResources().getString(R.string.person_contact_context_title);
+ }
+
+ public static abstract class ContactContextInfo {
+ public abstract void bindView(View listItem);
+ }
+
+ public static class BusinessContextInfo extends ContactContextInfo {
+ int iconId;
+ String heading;
+ String detail;
+
+ @Override
+ public void bindView(View listItem) {
+ ImageView imageView = (ImageView) listItem.findViewById(R.id.icon);
+ TextView headingTextView = (TextView) listItem.findViewById(R.id.heading);
+ TextView detailTextView = (TextView) listItem.findViewById(R.id.detail);
+
+ if (this.iconId == 0 || (this.heading == null && this.detail == null)) {
+ return;
+ }
+
+ imageView.setImageDrawable(listItem.getContext().getDrawable(this.iconId));
+
+ headingTextView.setText(this.heading);
+ headingTextView.setVisibility(TextUtils.isEmpty(this.heading)
+ ? View.GONE : View.VISIBLE);
+
+ detailTextView.setText(this.detail);
+ detailTextView.setVisibility(TextUtils.isEmpty(this.detail)
+ ? View.GONE : View.VISIBLE);
+
+ }
+ }
+
+ public static class PersonContextInfo extends ContactContextInfo {
+ boolean isIncoming;
+ String message;
+ String detail;
+
+ @Override
+ public void bindView(View listItem) {
+ TextView messageTextView = (TextView) listItem.findViewById(R.id.message);
+ TextView detailTextView = (TextView) listItem.findViewById(R.id.detail);
+
+ if (this.message == null || this.detail == null) {
+ return;
+ }
+
+ messageTextView.setBackgroundResource(this.isIncoming ?
+ R.drawable.incoming_sms_background : R.drawable.outgoing_sms_background);
+ messageTextView.setText(this.message);
+ LayoutParams messageLayoutParams = (LayoutParams) messageTextView.getLayoutParams();
+ messageLayoutParams.addRule(this.isIncoming?
+ RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END);
+ messageTextView.setLayoutParams(messageLayoutParams);
+
+ LayoutParams detailLayoutParams = (LayoutParams) detailTextView.getLayoutParams();
+ detailLayoutParams.addRule(this.isIncoming ?
+ RelativeLayout.ALIGN_PARENT_START : RelativeLayout.ALIGN_PARENT_END);
+ detailTextView.setLayoutParams(detailLayoutParams);
+ detailTextView.setText(this.detail);
+ }
+ }
+
+ /**
+ * A list adapter for call context information. We use the same adapter for both business and
+ * contact context.
+ */
+ private class InCallContactInteractionsListAdapter extends ArrayAdapter<ContactContextInfo> {
+ // The resource id of the list item layout.
+ int mResId;
+
+ public InCallContactInteractionsListAdapter(Context context, int resource) {
+ super(context, resource);
+ mResId = resource;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View listItem = mInflater.inflate(mResId, null);
+ ContactContextInfo item = getItem(position);
+
+ if (item == null) {
+ return listItem;
+ }
+
+ item.bindView(listItem);
+ return listItem;
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallDateUtils.java b/InCallUI/src/com/android/incallui/InCallDateUtils.java
new file mode 100644
index 000000000..e6089d5f1
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallDateUtils.java
@@ -0,0 +1,56 @@
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.res.Resources;
+
+import com.android.dialer.R;
+
+/**
+ * Methods to parse time and date information in the InCallUi
+ */
+public class InCallDateUtils {
+
+ /**
+ * Return given duration in a human-friendly format. For example, "4 minutes 3 seconds" or
+ * "3 hours 1 second". Returns the hours, minutes and seconds in that order if they exist.
+ */
+ public static String formatDuration(Context context, long millis) {
+ int hours = 0;
+ int minutes = 0;
+ int seconds = 0;
+ int elapsedSeconds = (int) (millis / 1000);
+ if (elapsedSeconds >= 3600) {
+ hours = elapsedSeconds / 3600;
+ elapsedSeconds -= hours * 3600;
+ }
+ if (elapsedSeconds >= 60) {
+ minutes = elapsedSeconds / 60;
+ elapsedSeconds -= minutes * 60;
+ }
+ seconds = elapsedSeconds;
+
+ final Resources res = context.getResources();
+ StringBuilder duration = new StringBuilder();
+ try {
+ if (hours > 0) {
+ duration.append(res.getQuantityString(R.plurals.duration_hours, hours, hours));
+ }
+ if (minutes > 0) {
+ if (hours > 0) {
+ duration.append(' ');
+ }
+ duration.append(res.getQuantityString(R.plurals.duration_minutes, minutes, minutes));
+ }
+ if (seconds > 0) {
+ if (hours > 0 || minutes > 0) {
+ duration.append(' ');
+ }
+ duration.append(res.getQuantityString(R.plurals.duration_seconds, seconds, seconds));
+ }
+ } catch (Resources.NotFoundException e) {
+ // Ignore; plurals throws an exception for an untranslated quantity for a given locale.
+ return null;
+ }
+ return duration.toString();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallOrientationEventListener.java b/InCallUI/src/com/android/incallui/InCallOrientationEventListener.java
new file mode 100644
index 000000000..d3334a3ef
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallOrientationEventListener.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.view.OrientationEventListener;
+import android.hardware.SensorManager;
+import android.view.Surface;
+import android.content.pm.ActivityInfo;
+
+/**
+ * This class listens to Orientation events and overrides onOrientationChanged which gets
+ * invoked when an orientation change occurs. When that happens, we notify InCallUI registrants
+ * of the change.
+ */
+public class InCallOrientationEventListener extends OrientationEventListener {
+
+ /**
+ * Screen orientation angles one of 0, 90, 180, 270, 360 in degrees.
+ */
+ public static int SCREEN_ORIENTATION_0 = 0;
+ public static int SCREEN_ORIENTATION_90 = 90;
+ public static int SCREEN_ORIENTATION_180 = 180;
+ public static int SCREEN_ORIENTATION_270 = 270;
+ public static int SCREEN_ORIENTATION_360 = 360;
+
+ public static int FULL_SENSOR_SCREEN_ORIENTATION =
+ ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR;
+
+ public static int NO_SENSOR_SCREEN_ORIENTATION =
+ ActivityInfo.SCREEN_ORIENTATION_NOSENSOR;
+
+ /**
+ * This is to identify dead zones where we won't notify others of orientation changed.
+ * Say for e.g our threshold is x degrees. We will only notify UI when our current rotation is
+ * within x degrees right or left of the screen orientation angles. If it's not within those
+ * ranges, we return SCREEN_ORIENTATION_UNKNOWN and ignore it.
+ */
+ private static int SCREEN_ORIENTATION_UNKNOWN = -1;
+
+ // Rotation threshold is 10 degrees. So if the rotation angle is within 10 degrees of any of
+ // the above angles, we will notify orientation changed.
+ private static int ROTATION_THRESHOLD = 10;
+
+
+ /**
+ * Cache the current rotation of the device.
+ */
+ private static int sCurrentOrientation = SCREEN_ORIENTATION_0;
+
+ public InCallOrientationEventListener(Context context) {
+ super(context);
+ }
+
+ /**
+ * Handles changes in device orientation. Notifies InCallPresenter of orientation changes.
+ *
+ * Note that this API receives sensor rotation in degrees as a param and we convert that to
+ * one of our screen orientation constants - (one of: {@link SCREEN_ORIENTATION_0},
+ * {@link SCREEN_ORIENTATION_90}, {@link SCREEN_ORIENTATION_180},
+ * {@link SCREEN_ORIENTATION_270}).
+ *
+ * @param rotation The new device sensor rotation in degrees
+ */
+ @Override
+ public void onOrientationChanged(int rotation) {
+ if (rotation == OrientationEventListener.ORIENTATION_UNKNOWN) {
+ return;
+ }
+
+ final int orientation = toScreenOrientation(rotation);
+
+ if (orientation != SCREEN_ORIENTATION_UNKNOWN && sCurrentOrientation != orientation) {
+ sCurrentOrientation = orientation;
+ InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
+ }
+ }
+
+ /**
+ * Enables the OrientationEventListener and notifies listeners of current orientation if
+ * notify flag is true
+ * @param notify true or false. Notify device orientation changed if true.
+ */
+ public void enable(boolean notify) {
+ super.enable();
+ if (notify) {
+ InCallPresenter.getInstance().onDeviceOrientationChange(sCurrentOrientation);
+ }
+ }
+
+ /**
+ * Enables the OrientationEventListener with notify flag defaulting to false.
+ */
+ public void enable() {
+ enable(false);
+ }
+
+ /**
+ * Converts sensor rotation in degrees to screen orientation constants.
+ * @param rotation sensor rotation angle in degrees
+ * @return Screen orientation angle in degrees (0, 90, 180, 270). Returns -1 for degrees not
+ * within threshold to identify zones where orientation change should not be trigerred.
+ */
+ private int toScreenOrientation(int rotation) {
+ // Sensor orientation 90 is equivalent to screen orientation 270 and vice versa. This
+ // function returns the screen orientation. So we convert sensor rotation 90 to 270 and
+ // vice versa here.
+ if (isInLeftRange(rotation, SCREEN_ORIENTATION_360, ROTATION_THRESHOLD) ||
+ isInRightRange(rotation, SCREEN_ORIENTATION_0, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_0;
+ } else if (isWithinThreshold(rotation, SCREEN_ORIENTATION_90, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_270;
+ } else if (isWithinThreshold(rotation, SCREEN_ORIENTATION_180, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_180;
+ } else if (isWithinThreshold(rotation, SCREEN_ORIENTATION_270, ROTATION_THRESHOLD)) {
+ return SCREEN_ORIENTATION_90;
+ }
+ return SCREEN_ORIENTATION_UNKNOWN;
+ }
+
+ private static boolean isWithinRange(int value, int begin, int end) {
+ return value >= begin && value < end;
+ }
+
+ private static boolean isWithinThreshold(int value, int center, int threshold) {
+ return isWithinRange(value, center - threshold, center + threshold);
+ }
+
+ private static boolean isInLeftRange(int value, int center, int threshold) {
+ return isWithinRange(value, center - threshold, center);
+ }
+
+ private static boolean isInRightRange(int value, int center, int threshold) {
+ return isWithinRange(value, center, center + threshold);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
new file mode 100644
index 000000000..0109d7ee6
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -0,0 +1,1887 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.app.ActivityManager.TaskDescription;
+import android.app.FragmentManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.graphics.Point;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.CallLog;
+import android.telecom.DisconnectCause;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
+import android.telecom.VideoProfile;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.dialer.R;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil.OnCallLogQueryFinishedListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.filterednumber.FilteredNumbersUtil;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.util.TelecomUtil;
+import com.android.incallui.util.TelecomCallUtil;
+import com.android.incalluibind.ObjectFactory;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Takes updates from the CallList and notifies the InCallActivity (UI)
+ * of the changes.
+ * Responsible for starting the activity for a new call and finishing the activity when all calls
+ * are disconnected.
+ * Creates and manages the in-call state and provides a listener pattern for the presenters
+ * that want to listen in on the in-call state changes.
+ * TODO: This class has become more of a state machine at this point. Consider renaming.
+ */
+public class InCallPresenter implements CallList.Listener,
+ CircularRevealFragment.OnCircularRevealCompleteListener,
+ InCallVideoCallCallbackNotifier.SessionModificationListener {
+
+ private static final String EXTRA_FIRST_TIME_SHOWN =
+ "com.android.incallui.intent.extra.FIRST_TIME_SHOWN";
+
+ private static final long BLOCK_QUERY_TIMEOUT_MS = 1000;
+
+ private static final Bundle EMPTY_EXTRAS = new Bundle();
+
+ private static InCallPresenter sInCallPresenter;
+
+ /**
+ * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
+ * load factor before resizing, 1 means we only expect a single thread to
+ * access the map so make only a single shard
+ */
+ private final Set<InCallStateListener> mListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallStateListener, Boolean>(8, 0.9f, 1));
+ private final List<IncomingCallListener> mIncomingCallListeners = new CopyOnWriteArrayList<>();
+ private final Set<InCallDetailsListener> mDetailsListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallDetailsListener, Boolean>(8, 0.9f, 1));
+ private final Set<CanAddCallListener> mCanAddCallListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<CanAddCallListener, Boolean>(8, 0.9f, 1));
+ private final Set<InCallUiListener> mInCallUiListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallUiListener, Boolean>(8, 0.9f, 1));
+ private final Set<InCallOrientationListener> mOrientationListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallOrientationListener, Boolean>(8, 0.9f, 1));
+ private final Set<InCallEventListener> mInCallEventListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<InCallEventListener, Boolean>(8, 0.9f, 1));
+
+ private AudioModeProvider mAudioModeProvider;
+ private StatusBarNotifier mStatusBarNotifier;
+ private ContactInfoCache mContactInfoCache;
+ private Context mContext;
+ private CallList mCallList;
+ private InCallActivity mInCallActivity;
+ private InCallState mInCallState = InCallState.NO_CALLS;
+ private ProximitySensor mProximitySensor;
+ private boolean mServiceConnected = false;
+ private boolean mAccountSelectionCancelled = false;
+ private InCallCameraManager mInCallCameraManager = null;
+ private AnswerPresenter mAnswerPresenter = new AnswerPresenter();
+ private FilteredNumberAsyncQueryHandler mFilteredQueryHandler;
+
+ /**
+ * Whether or not we are currently bound and waiting for Telecom to send us a new call.
+ */
+ private boolean mBoundAndWaitingForOutgoingCall;
+
+ /**
+ * If there is no actual call currently in the call list, this will be used as a fallback
+ * to determine the theme color for InCallUI.
+ */
+ private PhoneAccountHandle mPendingPhoneAccountHandle;
+
+ /**
+ * Determines if the InCall UI is in fullscreen mode or not.
+ */
+ private boolean mIsFullScreen = false;
+
+ private final android.telecom.Call.Callback mCallCallback = new android.telecom.Call.Callback() {
+ @Override
+ public void onPostDialWait(android.telecom.Call telecomCall,
+ String remainingPostDialSequence) {
+ final Call call = mCallList.getCallByTelecomCall(telecomCall);
+ if (call == null) {
+ Log.w(this, "Call not found in call list: " + telecomCall);
+ return;
+ }
+ onPostDialCharWait(call.getId(), remainingPostDialSequence);
+ }
+
+ @Override
+ public void onDetailsChanged(android.telecom.Call telecomCall,
+ android.telecom.Call.Details details) {
+ final Call call = mCallList.getCallByTelecomCall(telecomCall);
+ if (call == null) {
+ Log.w(this, "Call not found in call list: " + telecomCall);
+ return;
+ }
+ for (InCallDetailsListener listener : mDetailsListeners) {
+ listener.onDetailsChanged(call, details);
+ }
+ }
+
+ @Override
+ public void onConferenceableCallsChanged(android.telecom.Call telecomCall,
+ List<android.telecom.Call> conferenceableCalls) {
+ Log.i(this, "onConferenceableCallsChanged: " + telecomCall);
+ onDetailsChanged(telecomCall, telecomCall.getDetails());
+ }
+ };
+
+ private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+ public void onCallStateChanged(int state, String incomingNumber) {
+ if (state == TelephonyManager.CALL_STATE_RINGING) {
+ if (FilteredNumbersUtil.hasRecentEmergencyCall(mContext)) {
+ return;
+ }
+ // Check if the number is blocked, to silence the ringer.
+ String countryIso = GeoUtil.getCurrentCountryIso(mContext);
+ mFilteredQueryHandler.isBlockedNumber(
+ mOnCheckBlockedListener, incomingNumber, countryIso);
+ }
+ }
+ };
+
+ private final OnCheckBlockedListener mOnCheckBlockedListener = new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(final Integer id) {
+ if (id != null) {
+ // Silence the ringer now to prevent ringing and vibration before the call is
+ // terminated when Telecom attempts to add it.
+ TelecomUtil.silenceRinger(mContext);
+ }
+ }
+ };
+
+ /**
+ * Observes the CallLog to delete the call log entry for the blocked call after it is added.
+ * Times out if too much time has passed.
+ */
+ private class BlockedNumberContentObserver extends ContentObserver {
+ private static final int TIMEOUT_MS = 5000;
+
+ private Handler mHandler;
+ private String mNumber;
+ private long mTimeAddedMs;
+
+ private Runnable mTimeoutRunnable = new Runnable() {
+ @Override
+ public void run() {
+ unregister();
+ }
+ };
+
+ public BlockedNumberContentObserver(Handler handler, String number, long timeAddedMs) {
+ super(handler);
+
+ mHandler = handler;
+ mNumber = number;
+ mTimeAddedMs = timeAddedMs;
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ CallLogAsyncTaskUtil.deleteBlockedCall(mContext, mNumber, mTimeAddedMs,
+ new OnCallLogQueryFinishedListener() {
+ @Override
+ public void onQueryFinished(boolean hasEntry) {
+ if (mContext != null && hasEntry) {
+ unregister();
+ }
+ }
+ });
+ }
+
+ public void register() {
+ if (mContext != null) {
+ mContext.getContentResolver().registerContentObserver(
+ CallLog.CONTENT_URI, true, this);
+ mHandler.postDelayed(mTimeoutRunnable, TIMEOUT_MS);
+ }
+ }
+
+ private void unregister() {
+ if (mContext != null) {
+ mHandler.removeCallbacks(mTimeoutRunnable);
+ mContext.getContentResolver().unregisterContentObserver(this);
+ }
+ }
+ };
+
+ /**
+ * Is true when the activity has been previously started. Some code needs to know not just if
+ * the activity is currently up, but if it had been previously shown in foreground for this
+ * in-call session (e.g., StatusBarNotifier). This gets reset when the session ends in the
+ * tear-down method.
+ */
+ private boolean mIsActivityPreviouslyStarted = false;
+
+ /**
+ * Whether or not InCallService is bound to Telecom.
+ */
+ private boolean mServiceBound = false;
+
+ /**
+ * When configuration changes Android kills the current activity and starts a new one.
+ * The flag is used to check if full clean up is necessary (activity is stopped and new
+ * activity won't be started), or if a new activity will be started right after the current one
+ * is destroyed, and therefore no need in release all resources.
+ */
+ private boolean mIsChangingConfigurations = false;
+
+ /** Display colors for the UI. Consists of a primary color and secondary (darker) color */
+ private MaterialPalette mThemeColors;
+
+ private TelecomManager mTelecomManager;
+ private TelephonyManager mTelephonyManager;
+
+ public static synchronized InCallPresenter getInstance() {
+ if (sInCallPresenter == null) {
+ sInCallPresenter = new InCallPresenter();
+ }
+ return sInCallPresenter;
+ }
+
+ @NeededForTesting
+ static synchronized void setInstance(InCallPresenter inCallPresenter) {
+ sInCallPresenter = inCallPresenter;
+ }
+
+ public InCallState getInCallState() {
+ return mInCallState;
+ }
+
+ public CallList getCallList() {
+ return mCallList;
+ }
+
+ public void setUp(Context context,
+ CallList callList,
+ AudioModeProvider audioModeProvider,
+ StatusBarNotifier statusBarNotifier,
+ ContactInfoCache contactInfoCache,
+ ProximitySensor proximitySensor) {
+ if (mServiceConnected) {
+ Log.i(this, "New service connection replacing existing one.");
+ // retain the current resources, no need to create new ones.
+ Preconditions.checkState(context == mContext);
+ Preconditions.checkState(callList == mCallList);
+ Preconditions.checkState(audioModeProvider == mAudioModeProvider);
+ return;
+ }
+
+ Preconditions.checkNotNull(context);
+ mContext = context;
+
+ mContactInfoCache = contactInfoCache;
+
+ mStatusBarNotifier = statusBarNotifier;
+ addListener(mStatusBarNotifier);
+
+ mAudioModeProvider = audioModeProvider;
+
+ mProximitySensor = proximitySensor;
+ addListener(mProximitySensor);
+
+ addIncomingCallListener(mAnswerPresenter);
+ addInCallUiListener(mAnswerPresenter);
+
+ mCallList = callList;
+
+ // This only gets called by the service so this is okay.
+ mServiceConnected = true;
+
+ // The final thing we do in this set up is add ourselves as a listener to CallList. This
+ // will kick off an update and the whole process can start.
+ mCallList.addListener(this);
+
+ VideoPauseController.getInstance().setUp(this);
+ InCallVideoCallCallbackNotifier.getInstance().addSessionModificationListener(this);
+
+ mFilteredQueryHandler = new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+ mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+ mCallList.setFilteredNumberQueryHandler(mFilteredQueryHandler);
+
+ Log.d(this, "Finished InCallPresenter.setUp");
+ }
+
+ /**
+ * Called when the telephony service has disconnected from us. This will happen when there are
+ * no more active calls. However, we may still want to continue showing the UI for
+ * certain cases like showing "Call Ended".
+ * What we really want is to wait for the activity and the service to both disconnect before we
+ * tear things down. This method sets a serviceConnected boolean and calls a secondary method
+ * that performs the aforementioned logic.
+ */
+ public void tearDown() {
+ Log.d(this, "tearDown");
+ mCallList.clearOnDisconnect();
+
+ mServiceConnected = false;
+ attemptCleanup();
+
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+ VideoPauseController.getInstance().tearDown();
+ InCallVideoCallCallbackNotifier.getInstance().removeSessionModificationListener(this);
+ }
+
+ private void attemptFinishActivity() {
+ final boolean doFinish = (mInCallActivity != null && isActivityStarted());
+ Log.i(this, "Hide in call UI: " + doFinish);
+ if (doFinish) {
+ mInCallActivity.setExcludeFromRecents(true);
+ mInCallActivity.finish();
+
+ if (mAccountSelectionCancelled) {
+ // This finish is a result of account selection cancellation
+ // do not include activity ending transition
+ mInCallActivity.overridePendingTransition(0, 0);
+ }
+ }
+ }
+
+ /**
+ * Called when the UI begins, and starts the callstate callbacks if necessary.
+ */
+ public void setActivity(InCallActivity inCallActivity) {
+ if (inCallActivity == null) {
+ throw new IllegalArgumentException("registerActivity cannot be called with null");
+ }
+ if (mInCallActivity != null && mInCallActivity != inCallActivity) {
+ Log.w(this, "Setting a second activity before destroying the first.");
+ }
+ updateActivity(inCallActivity);
+ }
+
+ /**
+ * Called when the UI ends. Attempts to tear down everything if necessary. See
+ * {@link #tearDown()} for more insight on the tear-down process.
+ */
+ public void unsetActivity(InCallActivity inCallActivity) {
+ if (inCallActivity == null) {
+ throw new IllegalArgumentException("unregisterActivity cannot be called with null");
+ }
+ if (mInCallActivity == null) {
+ Log.i(this, "No InCallActivity currently set, no need to unset.");
+ return;
+ }
+ if (mInCallActivity != inCallActivity) {
+ Log.w(this, "Second instance of InCallActivity is trying to unregister when another"
+ + " instance is active. Ignoring.");
+ return;
+ }
+ updateActivity(null);
+ }
+
+ /**
+ * Updates the current instance of {@link InCallActivity} with the provided one. If a
+ * {@code null} activity is provided, it means that the activity was finished and we should
+ * attempt to cleanup.
+ */
+ private void updateActivity(InCallActivity inCallActivity) {
+ boolean updateListeners = false;
+ boolean doAttemptCleanup = false;
+
+ if (inCallActivity != null) {
+ if (mInCallActivity == null) {
+ updateListeners = true;
+ Log.i(this, "UI Initialized");
+ } else {
+ // since setActivity is called onStart(), it can be called multiple times.
+ // This is fine and ignorable, but we do not want to update the world every time
+ // this happens (like going to/from background) so we do not set updateListeners.
+ }
+
+ mInCallActivity = inCallActivity;
+ mInCallActivity.setExcludeFromRecents(false);
+
+ // By the time the UI finally comes up, the call may already be disconnected.
+ // If that's the case, we may need to show an error dialog.
+ if (mCallList != null && mCallList.getDisconnectedCall() != null) {
+ maybeShowErrorDialogOnDisconnect(mCallList.getDisconnectedCall());
+ }
+
+ // When the UI comes up, we need to first check the in-call state.
+ // If we are showing NO_CALLS, that means that a call probably connected and
+ // then immediately disconnected before the UI was able to come up.
+ // If we dont have any calls, start tearing down the UI instead.
+ // NOTE: This code relies on {@link #mInCallActivity} being set so we run it after
+ // it has been set.
+ if (mInCallState == InCallState.NO_CALLS) {
+ Log.i(this, "UI Initialized, but no calls left. shut down.");
+ attemptFinishActivity();
+ return;
+ }
+ } else {
+ Log.i(this, "UI Destroyed");
+ updateListeners = true;
+ mInCallActivity = null;
+
+ // We attempt cleanup for the destroy case but only after we recalculate the state
+ // to see if we need to come back up or stay shut down. This is why we do the
+ // cleanup after the call to onCallListChange() instead of directly here.
+ doAttemptCleanup = true;
+ }
+
+ // Messages can come from the telephony layer while the activity is coming up
+ // and while the activity is going down. So in both cases we need to recalculate what
+ // state we should be in after they complete.
+ // Examples: (1) A new incoming call could come in and then get disconnected before
+ // the activity is created.
+ // (2) All calls could disconnect and then get a new incoming call before the
+ // activity is destroyed.
+ //
+ // b/1122139 - We previously had a check for mServiceConnected here as well, but there are
+ // cases where we need to recalculate the current state even if the service in not
+ // connected. In particular the case where startOrFinish() is called while the app is
+ // already finish()ing. In that case, we skip updating the state with the knowledge that
+ // we will check again once the activity has finished. That means we have to recalculate the
+ // state here even if the service is disconnected since we may not have finished a state
+ // transition while finish()ing.
+ if (updateListeners) {
+ onCallListChange(mCallList);
+ }
+
+ if (doAttemptCleanup) {
+ attemptCleanup();
+ }
+ }
+
+ private boolean mAwaitingCallListUpdate = false;
+
+ public void onBringToForeground(boolean showDialpad) {
+ Log.i(this, "Bringing UI to foreground.");
+ bringToForeground(showDialpad);
+ }
+
+ public void onCallAdded(final android.telecom.Call call) {
+ if (shouldAttemptBlocking(call)) {
+ maybeBlockCall(call);
+ } else {
+ mCallList.onCallAdded(call);
+ }
+
+ // Since a call has been added we are no longer waiting for Telecom to send us a call.
+ setBoundAndWaitingForOutgoingCall(false, null);
+ call.registerCallback(mCallCallback);
+ }
+
+ private boolean shouldAttemptBlocking(android.telecom.Call call) {
+ if (call.getState() != android.telecom.Call.STATE_RINGING) {
+ return false;
+ }
+ if (TelecomCallUtil.isEmergencyCall(call)) {
+ Log.i(this, "Not attempting to block incoming emergency call");
+ return false;
+ }
+ if (FilteredNumbersUtil.hasRecentEmergencyCall(mContext)) {
+ Log.i(this, "Not attempting to block incoming call due to recent emergency call");
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks whether a call should be blocked, and blocks it if so. Otherwise, it adds the call
+ * to the CallList so it can proceed as normal. There is a timeout, so if the function for
+ * checking whether a function is blocked does not return in a reasonable time, we proceed
+ * with adding the call anyways.
+ */
+ private void maybeBlockCall(final android.telecom.Call call) {
+ final String countryIso = GeoUtil.getCurrentCountryIso(mContext);
+ final String number = TelecomCallUtil.getNumber(call);
+ final long timeAdded = System.currentTimeMillis();
+
+ // Though AtomicBoolean's can be scary, don't fear, as in this case it is only used on the
+ // main UI thread. It is needed so we can change its value within different scopes, since
+ // that cannot be done with a final boolean.
+ final AtomicBoolean hasTimedOut = new AtomicBoolean(false);
+
+ final Handler handler = new Handler();
+
+ // Proceed if the query is slow; the call may still be blocked after the query returns.
+ final Runnable runnable = new Runnable() {
+ public void run() {
+ hasTimedOut.set(true);
+ mCallList.onCallAdded(call);
+ }
+ };
+ handler.postDelayed(runnable, BLOCK_QUERY_TIMEOUT_MS);
+
+ OnCheckBlockedListener onCheckBlockedListener = new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(final Integer id) {
+ if (!hasTimedOut.get()) {
+ handler.removeCallbacks(runnable);
+ }
+ if (id == null) {
+ if (!hasTimedOut.get()) {
+ mCallList.onCallAdded(call);
+ }
+ } else {
+ Log.i(this, "Rejecting incoming call from blocked number");
+ call.reject(false, null);
+ Logger.logInteraction(InteractionEvent.CALL_BLOCKED);
+
+ mFilteredQueryHandler.incrementFilteredCount(id);
+
+ // Register observer to update the call log.
+ // BlockedNumberContentObserver will unregister after successful log or timeout.
+ BlockedNumberContentObserver contentObserver =
+ new BlockedNumberContentObserver(new Handler(), number, timeAdded);
+ contentObserver.register();
+ }
+ }
+ };
+
+ final boolean success = mFilteredQueryHandler.isBlockedNumber(
+ onCheckBlockedListener, number, countryIso);
+ if (!success) {
+ Log.d(this, "checkForBlockedCall: invalid number, skipping block checking");
+ if (!hasTimedOut.get()) {
+ handler.removeCallbacks(runnable);
+ mCallList.onCallAdded(call);
+ }
+ }
+ }
+
+ public void onCallRemoved(android.telecom.Call call) {
+ mCallList.onCallRemoved(call);
+ call.unregisterCallback(mCallCallback);
+ }
+
+ public void onCanAddCallChanged(boolean canAddCall) {
+ for (CanAddCallListener listener : mCanAddCallListeners) {
+ listener.onCanAddCallChanged(canAddCall);
+ }
+ }
+
+ /**
+ * Called when there is a change to the call list.
+ * Sets the In-Call state for the entire in-call app based on the information it gets from
+ * CallList. Dispatches the in-call state to all listeners. Can trigger the creation or
+ * destruction of the UI based on the states that is calculates.
+ */
+ @Override
+ public void onCallListChange(CallList callList) {
+ if (mInCallActivity != null && mInCallActivity.getCallCardFragment() != null &&
+ mInCallActivity.getCallCardFragment().isAnimating()) {
+ mAwaitingCallListUpdate = true;
+ return;
+ }
+ if (callList == null) {
+ return;
+ }
+
+ mAwaitingCallListUpdate = false;
+
+ InCallState newState = getPotentialStateFromCallList(callList);
+ InCallState oldState = mInCallState;
+ Log.d(this, "onCallListChange oldState= " + oldState + " newState=" + newState);
+ newState = startOrFinishUi(newState);
+ Log.d(this, "onCallListChange newState changed to " + newState);
+
+ // Set the new state before announcing it to the world
+ Log.i(this, "Phone switching state: " + oldState + " -> " + newState);
+ mInCallState = newState;
+
+ // notify listeners of new state
+ for (InCallStateListener listener : mListeners) {
+ Log.d(this, "Notify " + listener + " of state " + mInCallState.toString());
+ listener.onStateChange(oldState, mInCallState, callList);
+ }
+
+ if (isActivityStarted()) {
+ final boolean hasCall = callList.getActiveOrBackgroundCall() != null ||
+ callList.getOutgoingCall() != null;
+ mInCallActivity.dismissKeyguard(hasCall);
+ }
+ }
+
+ /**
+ * Called when there is a new incoming call.
+ *
+ * @param call
+ */
+ @Override
+ public void onIncomingCall(Call call) {
+ InCallState newState = startOrFinishUi(InCallState.INCOMING);
+ InCallState oldState = mInCallState;
+
+ Log.i(this, "Phone switching state: " + oldState + " -> " + newState);
+ mInCallState = newState;
+
+ for (IncomingCallListener listener : mIncomingCallListeners) {
+ listener.onIncomingCall(oldState, mInCallState, call);
+ }
+ }
+
+ @Override
+ public void onUpgradeToVideo(Call call) {
+ //NO-OP
+ }
+ /**
+ * Called when a call becomes disconnected. Called everytime an existing call
+ * changes from being connected (incoming/outgoing/active) to disconnected.
+ */
+ @Override
+ public void onDisconnect(Call call) {
+ maybeShowErrorDialogOnDisconnect(call);
+
+ // We need to do the run the same code as onCallListChange.
+ onCallListChange(mCallList);
+
+ if (isActivityStarted()) {
+ mInCallActivity.dismissKeyguard(false);
+ }
+
+ if (call.isEmergencyCall()) {
+ FilteredNumbersUtil.recordLastEmergencyCallTime(mContext);
+ }
+ }
+
+ @Override
+ public void onUpgradeToVideoRequest(Call call, int videoState) {
+ Log.d(this, "onUpgradeToVideoRequest call = " + call + " video state = " + videoState);
+
+ if (call == null) {
+ return;
+ }
+
+ call.setRequestedVideoState(videoState);
+ }
+
+ /**
+ * Given the call list, return the state in which the in-call screen should be.
+ */
+ public InCallState getPotentialStateFromCallList(CallList callList) {
+
+ InCallState newState = InCallState.NO_CALLS;
+
+ if (callList == null) {
+ return newState;
+ }
+ if (callList.getIncomingCall() != null) {
+ newState = InCallState.INCOMING;
+ } else if (callList.getWaitingForAccountCall() != null) {
+ newState = InCallState.WAITING_FOR_ACCOUNT;
+ } else if (callList.getPendingOutgoingCall() != null) {
+ newState = InCallState.PENDING_OUTGOING;
+ } else if (callList.getOutgoingCall() != null) {
+ newState = InCallState.OUTGOING;
+ } else if (callList.getActiveCall() != null ||
+ callList.getBackgroundCall() != null ||
+ callList.getDisconnectedCall() != null ||
+ callList.getDisconnectingCall() != null) {
+ newState = InCallState.INCALL;
+ }
+
+ if (newState == InCallState.NO_CALLS) {
+ if (mBoundAndWaitingForOutgoingCall) {
+ return InCallState.OUTGOING;
+ }
+ }
+
+ return newState;
+ }
+
+ public boolean isBoundAndWaitingForOutgoingCall() {
+ return mBoundAndWaitingForOutgoingCall;
+ }
+
+ public void setBoundAndWaitingForOutgoingCall(boolean isBound, PhoneAccountHandle handle) {
+ // NOTE: It is possible for there to be a race and have handle become null before
+ // the circular reveal starts. This should not cause any problems because CallCardFragment
+ // should fallback to the actual call in the CallList at that point in time to determine
+ // the theme color.
+ Log.i(this, "setBoundAndWaitingForOutgoingCall: " + isBound);
+ mBoundAndWaitingForOutgoingCall = isBound;
+ mPendingPhoneAccountHandle = handle;
+ if (isBound && mInCallState == InCallState.NO_CALLS) {
+ mInCallState = InCallState.OUTGOING;
+ }
+ }
+
+ @Override
+ public void onCircularRevealComplete(FragmentManager fm) {
+ if (mInCallActivity != null) {
+ mInCallActivity.showCallCardFragment(true);
+ mInCallActivity.getCallCardFragment().animateForNewOutgoingCall();
+ CircularRevealFragment.endCircularReveal(mInCallActivity.getFragmentManager());
+ }
+ }
+
+ public void onShrinkAnimationComplete() {
+ if (mAwaitingCallListUpdate) {
+ onCallListChange(mCallList);
+ }
+ }
+
+ public void addIncomingCallListener(IncomingCallListener listener) {
+ Preconditions.checkNotNull(listener);
+ mIncomingCallListeners.add(listener);
+ }
+
+ public void removeIncomingCallListener(IncomingCallListener listener) {
+ if (listener != null) {
+ mIncomingCallListeners.remove(listener);
+ }
+ }
+
+ public void addListener(InCallStateListener listener) {
+ Preconditions.checkNotNull(listener);
+ mListeners.add(listener);
+ }
+
+ public void removeListener(InCallStateListener listener) {
+ if (listener != null) {
+ mListeners.remove(listener);
+ }
+ }
+
+ public void addDetailsListener(InCallDetailsListener listener) {
+ Preconditions.checkNotNull(listener);
+ mDetailsListeners.add(listener);
+ }
+
+ public void removeDetailsListener(InCallDetailsListener listener) {
+ if (listener != null) {
+ mDetailsListeners.remove(listener);
+ }
+ }
+
+ public void addCanAddCallListener(CanAddCallListener listener) {
+ Preconditions.checkNotNull(listener);
+ mCanAddCallListeners.add(listener);
+ }
+
+ public void removeCanAddCallListener(CanAddCallListener listener) {
+ if (listener != null) {
+ mCanAddCallListeners.remove(listener);
+ }
+ }
+
+ public void addOrientationListener(InCallOrientationListener listener) {
+ Preconditions.checkNotNull(listener);
+ mOrientationListeners.add(listener);
+ }
+
+ public void removeOrientationListener(InCallOrientationListener listener) {
+ if (listener != null) {
+ mOrientationListeners.remove(listener);
+ }
+ }
+
+ public void addInCallEventListener(InCallEventListener listener) {
+ Preconditions.checkNotNull(listener);
+ mInCallEventListeners.add(listener);
+ }
+
+ public void removeInCallEventListener(InCallEventListener listener) {
+ if (listener != null) {
+ mInCallEventListeners.remove(listener);
+ }
+ }
+
+ public ProximitySensor getProximitySensor() {
+ return mProximitySensor;
+ }
+
+ public void handleAccountSelection(PhoneAccountHandle accountHandle, boolean setDefault) {
+ if (mCallList != null) {
+ Call call = mCallList.getWaitingForAccountCall();
+ if (call != null) {
+ String callId = call.getId();
+ TelecomAdapter.getInstance().phoneAccountSelected(callId, accountHandle, setDefault);
+ }
+ }
+ }
+
+ public void cancelAccountSelection() {
+ mAccountSelectionCancelled = true;
+ if (mCallList != null) {
+ Call call = mCallList.getWaitingForAccountCall();
+ if (call != null) {
+ String callId = call.getId();
+ TelecomAdapter.getInstance().disconnectCall(callId);
+ }
+ }
+ }
+
+ /**
+ * Hangs up any active or outgoing calls.
+ */
+ public void hangUpOngoingCall(Context context) {
+ // By the time we receive this intent, we could be shut down and call list
+ // could be null. Bail in those cases.
+ if (mCallList == null) {
+ if (mStatusBarNotifier == null) {
+ // The In Call UI has crashed but the notification still stayed up. We should not
+ // come to this stage.
+ StatusBarNotifier.clearAllCallNotifications(context);
+ }
+ return;
+ }
+
+ Call call = mCallList.getOutgoingCall();
+ if (call == null) {
+ call = mCallList.getActiveOrBackgroundCall();
+ }
+
+ if (call != null) {
+ TelecomAdapter.getInstance().disconnectCall(call.getId());
+ call.setState(Call.State.DISCONNECTING);
+ mCallList.onUpdate(call);
+ }
+ }
+
+ /**
+ * Answers any incoming call.
+ */
+ public void answerIncomingCall(Context context, int videoState) {
+ // By the time we receive this intent, we could be shut down and call list
+ // could be null. Bail in those cases.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ return;
+ }
+
+ Call call = mCallList.getIncomingCall();
+ if (call != null) {
+ TelecomAdapter.getInstance().answerCall(call.getId(), videoState);
+ showInCall(false, false/* newOutgoingCall */);
+ }
+ }
+
+ /**
+ * Declines any incoming call.
+ */
+ public void declineIncomingCall(Context context) {
+ // By the time we receive this intent, we could be shut down and call list
+ // could be null. Bail in those cases.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ return;
+ }
+
+ Call call = mCallList.getIncomingCall();
+ if (call != null) {
+ TelecomAdapter.getInstance().rejectCall(call.getId(), false, null);
+ }
+ }
+
+ public void acceptUpgradeRequest(int videoState, Context context) {
+ Log.d(this, " acceptUpgradeRequest videoState " + videoState);
+ // Bail if we have been shut down and the call list is null.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ Log.e(this, " acceptUpgradeRequest mCallList is empty so returning");
+ return;
+ }
+
+ Call call = mCallList.getVideoUpgradeRequestCall();
+ if (call != null) {
+ VideoProfile videoProfile = new VideoProfile(videoState);
+ call.getVideoCall().sendSessionModifyResponse(videoProfile);
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+ }
+
+ public void declineUpgradeRequest(Context context) {
+ Log.d(this, " declineUpgradeRequest");
+ // Bail if we have been shut down and the call list is null.
+ if (mCallList == null) {
+ StatusBarNotifier.clearAllCallNotifications(context);
+ Log.e(this, " declineUpgradeRequest mCallList is empty so returning");
+ return;
+ }
+
+ Call call = mCallList.getVideoUpgradeRequestCall();
+ if (call != null) {
+ VideoProfile videoProfile =
+ new VideoProfile(call.getVideoState());
+ call.getVideoCall().sendSessionModifyResponse(videoProfile);
+ call.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+ }
+
+ /*package*/
+ void declineUpgradeRequest() {
+ // Pass mContext if InCallActivity is destroyed.
+ // Ex: When user pressed back key while in active call and
+ // then modify request is received followed by MT call.
+ declineUpgradeRequest(mInCallActivity != null ? mInCallActivity : mContext);
+ }
+
+ /**
+ * Returns true if the incall app is the foreground application.
+ */
+ public boolean isShowingInCallUi() {
+ return (isActivityStarted() && mInCallActivity.isVisible());
+ }
+
+ /**
+ * Returns true if the activity has been created and is running.
+ * Returns true as long as activity is not destroyed or finishing. This ensures that we return
+ * true even if the activity is paused (not in foreground).
+ */
+ public boolean isActivityStarted() {
+ return (mInCallActivity != null &&
+ !mInCallActivity.isDestroyed() &&
+ !mInCallActivity.isFinishing());
+ }
+
+ public boolean isActivityPreviouslyStarted() {
+ return mIsActivityPreviouslyStarted;
+ }
+
+ /**
+ * Determines if the In-Call app is currently changing configuration.
+ *
+ * @return {@code true} if the In-Call app is changing configuration.
+ */
+ public boolean isChangingConfigurations() {
+ return mIsChangingConfigurations;
+ }
+
+ /**
+ * Tracks whether the In-Call app is currently in the process of changing configuration (i.e.
+ * screen orientation).
+ */
+ /*package*/
+ void updateIsChangingConfigurations() {
+ mIsChangingConfigurations = false;
+ if (mInCallActivity != null) {
+ mIsChangingConfigurations = mInCallActivity.isChangingConfigurations();
+ }
+ Log.v(this, "updateIsChangingConfigurations = " + mIsChangingConfigurations);
+ }
+
+
+ /**
+ * Called when the activity goes in/out of the foreground.
+ */
+ public void onUiShowing(boolean showing) {
+ // We need to update the notification bar when we leave the UI because that
+ // could trigger it to show again.
+ if (mStatusBarNotifier != null) {
+ mStatusBarNotifier.updateNotification(mInCallState, mCallList);
+ }
+
+ if (mProximitySensor != null) {
+ mProximitySensor.onInCallShowing(showing);
+ }
+
+ Intent broadcastIntent = ObjectFactory.getUiReadyBroadcastIntent(mContext);
+ if (broadcastIntent != null) {
+ broadcastIntent.putExtra(EXTRA_FIRST_TIME_SHOWN, !mIsActivityPreviouslyStarted);
+
+ if (showing) {
+ Log.d(this, "Sending sticky broadcast: ", broadcastIntent);
+ mContext.sendStickyBroadcast(broadcastIntent);
+ } else {
+ Log.d(this, "Removing sticky broadcast: ", broadcastIntent);
+ mContext.removeStickyBroadcast(broadcastIntent);
+ }
+ }
+
+ if (showing) {
+ mIsActivityPreviouslyStarted = true;
+ } else {
+ updateIsChangingConfigurations();
+ }
+
+ for (InCallUiListener listener : mInCallUiListeners) {
+ listener.onUiShowing(showing);
+ }
+ }
+
+ public void addInCallUiListener(InCallUiListener listener) {
+ mInCallUiListeners.add(listener);
+ }
+
+ public boolean removeInCallUiListener(InCallUiListener listener) {
+ return mInCallUiListeners.remove(listener);
+ }
+
+ /*package*/
+ void onActivityStarted() {
+ Log.d(this, "onActivityStarted");
+ notifyVideoPauseController(true);
+ }
+
+ /*package*/
+ void onActivityStopped() {
+ Log.d(this, "onActivityStopped");
+ notifyVideoPauseController(false);
+ }
+
+ private void notifyVideoPauseController(boolean showing) {
+ Log.d(this, "notifyVideoPauseController: mIsChangingConfigurations=" +
+ mIsChangingConfigurations);
+ if (!mIsChangingConfigurations) {
+ VideoPauseController.getInstance().onUiShowing(showing);
+ }
+ }
+
+ /**
+ * Brings the app into the foreground if possible.
+ */
+ public void bringToForeground(boolean showDialpad) {
+ // Before we bring the incall UI to the foreground, we check to see if:
+ // 1. It is not currently in the foreground
+ // 2. We are in a state where we want to show the incall ui (i.e. there are calls to
+ // be displayed)
+ // If the activity hadn't actually been started previously, yet there are still calls
+ // present (e.g. a call was accepted by a bluetooth or wired headset), we want to
+ // bring it up the UI regardless.
+ if (!isShowingInCallUi() && mInCallState != InCallState.NO_CALLS) {
+ showInCall(showDialpad, false /* newOutgoingCall */);
+ }
+ }
+
+ public void onPostDialCharWait(String callId, String chars) {
+ if (isActivityStarted()) {
+ mInCallActivity.showPostCharWaitDialog(callId, chars);
+ }
+ }
+
+ /**
+ * Handles the green CALL key while in-call.
+ * @return true if we consumed the event.
+ */
+ public boolean handleCallKey() {
+ Log.v(this, "handleCallKey");
+
+ // The green CALL button means either "Answer", "Unhold", or
+ // "Swap calls", or can be a no-op, depending on the current state
+ // of the Phone.
+
+ /**
+ * INCOMING CALL
+ */
+ final CallList calls = mCallList;
+ final Call incomingCall = calls.getIncomingCall();
+ Log.v(this, "incomingCall: " + incomingCall);
+
+ // (1) Attempt to answer a call
+ if (incomingCall != null) {
+ TelecomAdapter.getInstance().answerCall(
+ incomingCall.getId(), VideoProfile.STATE_AUDIO_ONLY);
+ return true;
+ }
+
+ /**
+ * STATE_ACTIVE CALL
+ */
+ final Call activeCall = calls.getActiveCall();
+ if (activeCall != null) {
+ // TODO: This logic is repeated from CallButtonPresenter.java. We should
+ // consolidate this logic.
+ final boolean canMerge = activeCall.can(
+ android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE);
+ final boolean canSwap = activeCall.can(
+ android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE);
+
+ Log.v(this, "activeCall: " + activeCall + ", canMerge: " + canMerge +
+ ", canSwap: " + canSwap);
+
+ // (2) Attempt actions on conference calls
+ if (canMerge) {
+ TelecomAdapter.getInstance().merge(activeCall.getId());
+ return true;
+ } else if (canSwap) {
+ TelecomAdapter.getInstance().swap(activeCall.getId());
+ return true;
+ }
+ }
+
+ /**
+ * BACKGROUND CALL
+ */
+ final Call heldCall = calls.getBackgroundCall();
+ if (heldCall != null) {
+ // We have a hold call so presumeable it will always support HOLD...but
+ // there is no harm in double checking.
+ final boolean canHold = heldCall.can(android.telecom.Call.Details.CAPABILITY_HOLD);
+
+ Log.v(this, "heldCall: " + heldCall + ", canHold: " + canHold);
+
+ // (4) unhold call
+ if (heldCall.getState() == Call.State.ONHOLD && canHold) {
+ TelecomAdapter.getInstance().unholdCall(heldCall.getId());
+ return true;
+ }
+ }
+
+ // Always consume hard keys
+ return true;
+ }
+
+ /**
+ * A dialog could have prevented in-call screen from being previously finished.
+ * This function checks to see if there should be any UI left and if not attempts
+ * to tear down the UI.
+ */
+ public void onDismissDialog() {
+ Log.i(this, "Dialog dismissed");
+ if (mInCallState == InCallState.NO_CALLS) {
+ attemptFinishActivity();
+ attemptCleanup();
+ }
+ }
+
+ /**
+ * Toggles whether the application is in fullscreen mode or not.
+ *
+ * @return {@code true} if in-call is now in fullscreen mode.
+ */
+ public boolean toggleFullscreenMode() {
+ boolean isFullScreen = !mIsFullScreen;
+ Log.v(this, "toggleFullscreenMode = " + isFullScreen);
+ setFullScreen(isFullScreen);
+ return mIsFullScreen;
+ }
+
+ /**
+ * Clears the previous fullscreen state.
+ */
+ public void clearFullscreen() {
+ mIsFullScreen = false;
+ }
+
+ /**
+ * Changes the fullscreen mode of the in-call UI.
+ *
+ * @param isFullScreen {@code true} if in-call should be in fullscreen mode, {@code false}
+ * otherwise.
+ */
+ public void setFullScreen(boolean isFullScreen) {
+ setFullScreen(isFullScreen, false /* force */);
+ }
+
+ /**
+ * Changes the fullscreen mode of the in-call UI.
+ *
+ * @param isFullScreen {@code true} if in-call should be in fullscreen mode, {@code false}
+ * otherwise.
+ * @param force {@code true} if fullscreen mode should be set regardless of its current state.
+ */
+ public void setFullScreen(boolean isFullScreen, boolean force) {
+ Log.v(this, "setFullScreen = " + isFullScreen);
+
+ // As a safeguard, ensure we cannot enter fullscreen if the dialpad is shown.
+ if (isDialpadVisible()) {
+ isFullScreen = false;
+ Log.v(this, "setFullScreen overridden as dialpad is shown = " + isFullScreen);
+ }
+
+ if (mIsFullScreen == isFullScreen && !force) {
+ Log.v(this, "setFullScreen ignored as already in that state.");
+ return;
+ }
+ mIsFullScreen = isFullScreen;
+ notifyFullscreenModeChange(mIsFullScreen);
+ }
+
+ /**
+ * @return {@code true} if the in-call ui is currently in fullscreen mode, {@code false}
+ * otherwise.
+ */
+ public boolean isFullscreen() {
+ return mIsFullScreen;
+ }
+
+
+ /**
+ * Called by the {@link VideoCallPresenter} to inform of a change in full screen video status.
+ *
+ * @param isFullscreenMode {@code True} if entering full screen mode.
+ */
+ public void notifyFullscreenModeChange(boolean isFullscreenMode) {
+ for (InCallEventListener listener : mInCallEventListeners) {
+ listener.onFullscreenModeChanged(isFullscreenMode);
+ }
+ }
+
+ /**
+ * Called by the {@link CallCardPresenter} to inform of a change in visibility of the secondary
+ * caller info bar.
+ *
+ * @param isVisible {@code true} if the secondary caller info is visible, {@code false}
+ * otherwise.
+ * @param height the height of the secondary caller info bar.
+ */
+ public void notifySecondaryCallerInfoVisibilityChanged(boolean isVisible, int height) {
+ for (InCallEventListener listener : mInCallEventListeners) {
+ listener.onSecondaryCallerInfoVisibilityChanged(isVisible, height);
+ }
+ }
+
+
+ /**
+ * For some disconnected causes, we show a dialog. This calls into the activity to show
+ * the dialog if appropriate for the call.
+ */
+ private void maybeShowErrorDialogOnDisconnect(Call call) {
+ // For newly disconnected calls, we may want to show a dialog on specific error conditions
+ if (isActivityStarted() && call.getState() == Call.State.DISCONNECTED) {
+ if (call.getAccountHandle() == null && !call.isConferenceCall()) {
+ setDisconnectCauseForMissingAccounts(call);
+ }
+ mInCallActivity.maybeShowErrorDialogOnDisconnect(call.getDisconnectCause());
+ }
+ }
+
+ /**
+ * When the state of in-call changes, this is the first method to get called. It determines if
+ * the UI needs to be started or finished depending on the new state and does it.
+ */
+ private InCallState startOrFinishUi(InCallState newState) {
+ Log.d(this, "startOrFinishUi: " + mInCallState + " -> " + newState);
+
+ // TODO: Consider a proper state machine implementation
+
+ // If the state isn't changing we have already done any starting/stopping of activities in
+ // a previous pass...so lets cut out early
+ if (newState == mInCallState) {
+ return newState;
+ }
+
+ // A new Incoming call means that the user needs to be notified of the the call (since
+ // it wasn't them who initiated it). We do this through full screen notifications and
+ // happens indirectly through {@link StatusBarNotifier}.
+ //
+ // The process for incoming calls is as follows:
+ //
+ // 1) CallList - Announces existence of new INCOMING call
+ // 2) InCallPresenter - Gets announcement and calculates that the new InCallState
+ // - should be set to INCOMING.
+ // 3) InCallPresenter - This method is called to see if we need to start or finish
+ // the app given the new state.
+ // 4) StatusBarNotifier - Listens to InCallState changes. InCallPresenter calls
+ // StatusBarNotifier explicitly to issue a FullScreen Notification
+ // that will either start the InCallActivity or show the user a
+ // top-level notification dialog if the user is in an immersive app.
+ // That notification can also start the InCallActivity.
+ // 5) InCallActivity - Main activity starts up and at the end of its onCreate will
+ // call InCallPresenter::setActivity() to let the presenter
+ // know that start-up is complete.
+ //
+ // [ AND NOW YOU'RE IN THE CALL. voila! ]
+ //
+ // Our app is started using a fullScreen notification. We need to do this whenever
+ // we get an incoming call. Depending on the current context of the device, either a
+ // incoming call HUN or the actual InCallActivity will be shown.
+ final boolean startIncomingCallSequence = (InCallState.INCOMING == newState);
+
+ // A dialog to show on top of the InCallUI to select a PhoneAccount
+ final boolean showAccountPicker = (InCallState.WAITING_FOR_ACCOUNT == newState);
+
+ // A new outgoing call indicates that the user just now dialed a number and when that
+ // happens we need to display the screen immediately or show an account picker dialog if
+ // no default is set. However, if the main InCallUI is already visible, we do not want to
+ // re-initiate the start-up animation, so we do not need to do anything here.
+ //
+ // It is also possible to go into an intermediate state where the call has been initiated
+ // but Telecom has not yet returned with the details of the call (handle, gateway, etc.).
+ // This pending outgoing state can also launch the call screen.
+ //
+ // This is different from the incoming call sequence because we do not need to shock the
+ // user with a top-level notification. Just show the call UI normally.
+ final boolean mainUiNotVisible = !isShowingInCallUi() || !getCallCardFragmentVisible();
+ boolean showCallUi = InCallState.OUTGOING == newState && mainUiNotVisible;
+
+ // Direct transition from PENDING_OUTGOING -> INCALL means that there was an error in the
+ // outgoing call process, so the UI should be brought up to show an error dialog.
+ showCallUi |= (InCallState.PENDING_OUTGOING == mInCallState
+ && InCallState.INCALL == newState && !isShowingInCallUi());
+
+ // Another exception - InCallActivity is in charge of disconnecting a call with no
+ // valid accounts set. Bring the UI up if this is true for the current pending outgoing
+ // call so that:
+ // 1) The call can be disconnected correctly
+ // 2) The UI comes up and correctly displays the error dialog.
+ // TODO: Remove these special case conditions by making InCallPresenter a true state
+ // machine. Telecom should also be the component responsible for disconnecting a call
+ // with no valid accounts.
+ showCallUi |= InCallState.PENDING_OUTGOING == newState && mainUiNotVisible
+ && isCallWithNoValidAccounts(mCallList.getPendingOutgoingCall());
+
+ // The only time that we have an instance of mInCallActivity and it isn't started is
+ // when it is being destroyed. In that case, lets avoid bringing up another instance of
+ // the activity. When it is finally destroyed, we double check if we should bring it back
+ // up so we aren't going to lose anything by avoiding a second startup here.
+ boolean activityIsFinishing = mInCallActivity != null && !isActivityStarted();
+ if (activityIsFinishing) {
+ Log.i(this, "Undo the state change: " + newState + " -> " + mInCallState);
+ return mInCallState;
+ }
+
+ if (showCallUi || showAccountPicker) {
+ Log.i(this, "Start in call UI");
+ showInCall(false /* showDialpad */, !showAccountPicker /* newOutgoingCall */);
+ } else if (startIncomingCallSequence) {
+ Log.i(this, "Start Full Screen in call UI");
+
+ // We're about the bring up the in-call UI for an incoming call. If we still have
+ // dialogs up, we need to clear them out before showing incoming screen.
+ if (isActivityStarted()) {
+ mInCallActivity.dismissPendingDialogs();
+ }
+ if (!startUi(newState)) {
+ // startUI refused to start the UI. This indicates that it needed to restart the
+ // activity. When it finally restarts, it will call us back, so we do not actually
+ // change the state yet (we return mInCallState instead of newState).
+ return mInCallState;
+ }
+ } else if (newState == InCallState.NO_CALLS) {
+ // The new state is the no calls state. Tear everything down.
+ attemptFinishActivity();
+ attemptCleanup();
+ }
+
+ return newState;
+ }
+
+ /**
+ * Determines whether or not a call has no valid phone accounts that can be used to make the
+ * call with. Emergency calls do not require a phone account.
+ *
+ * @param call to check accounts for.
+ * @return {@code true} if the call has no call capable phone accounts set, {@code false} if
+ * the call contains a phone account that could be used to initiate it with, or is an emergency
+ * call.
+ */
+ public static boolean isCallWithNoValidAccounts(Call call) {
+ if (call != null && !call.isEmergencyCall()) {
+ Bundle extras = call.getIntentExtras();
+
+ if (extras == null) {
+ extras = EMPTY_EXTRAS;
+ }
+
+ final List<PhoneAccountHandle> phoneAccountHandles = extras
+ .getParcelableArrayList(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+
+ if ((call.getAccountHandle() == null &&
+ (phoneAccountHandles == null || phoneAccountHandles.isEmpty()))) {
+ Log.i(InCallPresenter.getInstance(), "No valid accounts for call " + call);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Sets the DisconnectCause for a call that was disconnected because it was missing a
+ * PhoneAccount or PhoneAccounts to select from.
+ * @param call
+ */
+ private void setDisconnectCauseForMissingAccounts(Call call) {
+ android.telecom.Call telecomCall = call.getTelecomCall();
+
+ Bundle extras = telecomCall.getDetails().getIntentExtras();
+ // Initialize the extras bundle to avoid NPE
+ if (extras == null) {
+ extras = new Bundle();
+ }
+
+ final List<PhoneAccountHandle> phoneAccountHandles = extras.getParcelableArrayList(
+ android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS);
+
+ if (phoneAccountHandles == null || phoneAccountHandles.isEmpty()) {
+ String scheme = telecomCall.getDetails().getHandle().getScheme();
+ final String errorMsg = PhoneAccount.SCHEME_TEL.equals(scheme) ?
+ mContext.getString(R.string.callFailed_simError) :
+ mContext.getString(R.string.incall_error_supp_service_unknown);
+ DisconnectCause disconnectCause =
+ new DisconnectCause(DisconnectCause.ERROR, null, errorMsg, errorMsg);
+ call.setDisconnectCause(disconnectCause);
+ }
+ }
+
+ private boolean startUi(InCallState inCallState) {
+ boolean isCallWaiting = mCallList.getActiveCall() != null &&
+ mCallList.getIncomingCall() != null;
+
+ // If the screen is off, we need to make sure it gets turned on for incoming calls.
+ // This normally works just fine thanks to FLAG_TURN_SCREEN_ON but that only works
+ // when the activity is first created. Therefore, to ensure the screen is turned on
+ // for the call waiting case, we finish() the current activity and start a new one.
+ // There should be no jank from this since the screen is already off and will remain so
+ // until our new activity is up.
+
+ if (isCallWaiting) {
+ if (mProximitySensor.isScreenReallyOff() && isActivityStarted()) {
+ Log.i(this, "Restarting InCallActivity to turn screen on for call waiting");
+ mInCallActivity.finish();
+ // When the activity actually finishes, we will start it again if there are
+ // any active calls, so we do not need to start it explicitly here. Note, we
+ // actually get called back on this function to restart it.
+
+ // We return false to indicate that we did not actually start the UI.
+ return false;
+ } else {
+ showInCall(false, false);
+ }
+ } else {
+ mStatusBarNotifier.updateNotification(inCallState, mCallList);
+ }
+ return true;
+ }
+
+ /**
+ * Checks to see if both the UI is gone and the service is disconnected. If so, tear it all
+ * down.
+ */
+ private void attemptCleanup() {
+ boolean shouldCleanup = (mInCallActivity == null && !mServiceConnected &&
+ mInCallState == InCallState.NO_CALLS);
+ Log.i(this, "attemptCleanup? " + shouldCleanup);
+
+ if (shouldCleanup) {
+ mIsActivityPreviouslyStarted = false;
+ mIsChangingConfigurations = false;
+
+ // blow away stale contact info so that we get fresh data on
+ // the next set of calls
+ if (mContactInfoCache != null) {
+ mContactInfoCache.clearCache();
+ }
+ mContactInfoCache = null;
+
+ if (mProximitySensor != null) {
+ removeListener(mProximitySensor);
+ mProximitySensor.tearDown();
+ }
+ mProximitySensor = null;
+
+ mAudioModeProvider = null;
+
+ if (mStatusBarNotifier != null) {
+ removeListener(mStatusBarNotifier);
+ }
+ mStatusBarNotifier = null;
+
+ if (mCallList != null) {
+ mCallList.removeListener(this);
+ }
+ mCallList = null;
+
+ mContext = null;
+ mInCallActivity = null;
+
+ mListeners.clear();
+ mIncomingCallListeners.clear();
+ mDetailsListeners.clear();
+ mCanAddCallListeners.clear();
+ mOrientationListeners.clear();
+ mInCallEventListeners.clear();
+
+ Log.d(this, "Finished InCallPresenter.CleanUp");
+ }
+ }
+
+ public void showInCall(final boolean showDialpad, final boolean newOutgoingCall) {
+ Log.i(this, "Showing InCallActivity");
+ mContext.startActivity(getInCallIntent(showDialpad, newOutgoingCall));
+ }
+
+ public void onServiceBind() {
+ mServiceBound = true;
+ }
+
+ public void onServiceUnbind() {
+ InCallPresenter.getInstance().setBoundAndWaitingForOutgoingCall(false, null);
+ mServiceBound = false;
+ }
+
+ public boolean isServiceBound() {
+ return mServiceBound;
+ }
+
+ public void maybeStartRevealAnimation(Intent intent) {
+ if (intent == null || mInCallActivity != null) {
+ return;
+ }
+ final Bundle extras = intent.getBundleExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
+ if (extras == null) {
+ // Incoming call, just show the in-call UI directly.
+ return;
+ }
+
+ if (extras.containsKey(android.telecom.Call.AVAILABLE_PHONE_ACCOUNTS)) {
+ // Account selection dialog will show up so don't show the animation.
+ return;
+ }
+
+ final PhoneAccountHandle accountHandle =
+ intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE);
+ final Point touchPoint = extras.getParcelable(TouchPointManager.TOUCH_POINT);
+
+ InCallPresenter.getInstance().setBoundAndWaitingForOutgoingCall(true, accountHandle);
+
+ final Intent incallIntent = getInCallIntent(false, true);
+ incallIntent.putExtra(TouchPointManager.TOUCH_POINT, touchPoint);
+ mContext.startActivity(incallIntent);
+ }
+
+ public Intent getInCallIntent(boolean showDialpad, boolean newOutgoingCall) {
+ final Intent intent = new Intent(Intent.ACTION_MAIN, null);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION | Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ intent.setClass(mContext, InCallActivity.class);
+ if (showDialpad) {
+ intent.putExtra(InCallActivity.SHOW_DIALPAD_EXTRA, true);
+ }
+ intent.putExtra(InCallActivity.NEW_OUTGOING_CALL_EXTRA, newOutgoingCall);
+ return intent;
+ }
+
+ /**
+ * Retrieves the current in-call camera manager instance, creating if necessary.
+ *
+ * @return The {@link InCallCameraManager}.
+ */
+ public InCallCameraManager getInCallCameraManager() {
+ synchronized(this) {
+ if (mInCallCameraManager == null) {
+ mInCallCameraManager = new InCallCameraManager(mContext);
+ }
+
+ return mInCallCameraManager;
+ }
+ }
+
+ /**
+ * Notifies listeners of changes in orientation and notify calls of rotation angle change.
+ *
+ * @param orientation The screen orientation of the device (one of:
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ */
+ public void onDeviceOrientationChange(int orientation) {
+ Log.d(this, "onDeviceOrientationChange: orientation= " + orientation);
+
+ if (mCallList != null) {
+ mCallList.notifyCallsOfDeviceRotation(orientation);
+ } else {
+ Log.w(this, "onDeviceOrientationChange: CallList is null.");
+ }
+
+ // Notify listeners of device orientation changed.
+ for (InCallOrientationListener listener : mOrientationListeners) {
+ listener.onDeviceOrientationChanged(orientation);
+ }
+ }
+
+ /**
+ * Configures the in-call UI activity so it can change orientations or not. Enables the
+ * orientation event listener if allowOrientationChange is true, disables it if false.
+ *
+ * @param allowOrientationChange {@code True} if the in-call UI can change between portrait
+ * and landscape. {@Code False} if the in-call UI should be locked in portrait.
+ */
+ public void setInCallAllowsOrientationChange(boolean allowOrientationChange) {
+ if (mInCallActivity == null) {
+ Log.e(this, "InCallActivity is null. Can't set requested orientation.");
+ return;
+ }
+
+ if (!allowOrientationChange) {
+ mInCallActivity.setRequestedOrientation(
+ InCallOrientationEventListener.NO_SENSOR_SCREEN_ORIENTATION);
+ } else {
+ // Using SCREEN_ORIENTATION_FULL_SENSOR allows for reverse-portrait orientation, where
+ // SCREEN_ORIENTATION_SENSOR does not.
+ mInCallActivity.setRequestedOrientation(
+ InCallOrientationEventListener.FULL_SENSOR_SCREEN_ORIENTATION);
+ }
+ mInCallActivity.enableInCallOrientationEventListener(allowOrientationChange);
+ }
+
+ public void enableScreenTimeout(boolean enable) {
+ Log.v(this, "enableScreenTimeout: value=" + enable);
+ if (mInCallActivity == null) {
+ Log.e(this, "enableScreenTimeout: InCallActivity is null.");
+ return;
+ }
+
+ final Window window = mInCallActivity.getWindow();
+ if (enable) {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ } else {
+ window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+ }
+
+ /**
+ * Returns the space available beside the call card.
+ *
+ * @return The space beside the call card.
+ */
+ public float getSpaceBesideCallCard() {
+ if (mInCallActivity != null && mInCallActivity.getCallCardFragment() != null) {
+ return mInCallActivity.getCallCardFragment().getSpaceBesideCallCard();
+ }
+ return 0;
+ }
+
+ /**
+ * Returns whether the call card fragment is currently visible.
+ *
+ * @return True if the call card fragment is visible.
+ */
+ public boolean getCallCardFragmentVisible() {
+ if (mInCallActivity != null && mInCallActivity.getCallCardFragment() != null) {
+ return mInCallActivity.getCallCardFragment().isVisible();
+ }
+ return false;
+ }
+
+ /**
+ * Hides or shows the conference manager fragment.
+ *
+ * @param show {@code true} if the conference manager should be shown, {@code false} if it
+ * should be hidden.
+ */
+ public void showConferenceCallManager(boolean show) {
+ if (mInCallActivity == null) {
+ return;
+ }
+
+ mInCallActivity.showConferenceFragment(show);
+ }
+
+ /**
+ * Determines if the dialpad is visible.
+ *
+ * @return {@code true} if the dialpad is visible, {@code false} otherwise.
+ */
+ public boolean isDialpadVisible() {
+ if (mInCallActivity == null) {
+ return false;
+ }
+ return mInCallActivity.isDialpadVisible();
+ }
+
+ /**
+ * @return True if the application is currently running in a right-to-left locale.
+ */
+ public static boolean isRtl() {
+ return TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ==
+ View.LAYOUT_DIRECTION_RTL;
+ }
+
+ /**
+ * Extract background color from call object. The theme colors will include a primary color
+ * and a secondary color.
+ */
+ public void setThemeColors() {
+ // This method will set the background to default if the color is PhoneAccount.NO_COLOR.
+ mThemeColors = getColorsFromCall(mCallList.getFirstCall());
+
+ if (mInCallActivity == null) {
+ return;
+ }
+
+ final Resources resources = mInCallActivity.getResources();
+ final int color;
+ if (resources.getBoolean(R.bool.is_layout_landscape)) {
+ // TODO use ResourcesCompat.getColor(Resources, int, Resources.Theme) when available
+ // {@link Resources#getColor(int)} used for compatibility
+ color = resources.getColor(R.color.statusbar_background_color);
+ } else {
+ color = mThemeColors.mSecondaryColor;
+ }
+
+ mInCallActivity.getWindow().setStatusBarColor(color);
+ final TaskDescription td = new TaskDescription(
+ resources.getString(R.string.notification_ongoing_call), null, color);
+ mInCallActivity.setTaskDescription(td);
+ }
+
+ /**
+ * @return A palette for colors to display in the UI.
+ */
+ public MaterialPalette getThemeColors() {
+ return mThemeColors;
+ }
+
+ private MaterialPalette getColorsFromCall(Call call) {
+ if (call == null) {
+ return getColorsFromPhoneAccountHandle(mPendingPhoneAccountHandle);
+ } else {
+ return getColorsFromPhoneAccountHandle(call.getAccountHandle());
+ }
+ }
+
+ private MaterialPalette getColorsFromPhoneAccountHandle(PhoneAccountHandle phoneAccountHandle) {
+ int highlightColor = PhoneAccount.NO_HIGHLIGHT_COLOR;
+ if (phoneAccountHandle != null) {
+ final TelecomManager tm = getTelecomManager();
+
+ if (tm != null) {
+ final PhoneAccount account =
+ TelecomManagerCompat.getPhoneAccount(tm, phoneAccountHandle);
+ // For single-sim devices, there will be no selected highlight color, so the phone
+ // account will default to NO_HIGHLIGHT_COLOR.
+ if (account != null && CompatUtils.isLollipopMr1Compatible()) {
+ highlightColor = account.getHighlightColor();
+ }
+ }
+ }
+ return new InCallUIMaterialColorMapUtils(
+ mContext.getResources()).calculatePrimaryAndSecondaryColor(highlightColor);
+ }
+
+ /**
+ * @return An instance of TelecomManager.
+ */
+ public TelecomManager getTelecomManager() {
+ if (mTelecomManager == null) {
+ mTelecomManager = (TelecomManager)
+ mContext.getSystemService(Context.TELECOM_SERVICE);
+ }
+ return mTelecomManager;
+ }
+
+ /**
+ * @return An instance of TelephonyManager
+ */
+ public TelephonyManager getTelephonyManager() {
+ return mTelephonyManager;
+ }
+
+ InCallActivity getActivity() {
+ return mInCallActivity;
+ }
+
+ AnswerPresenter getAnswerPresenter() {
+ return mAnswerPresenter;
+ }
+
+ /**
+ * Private constructor. Must use getInstance() to get this singleton.
+ */
+ private InCallPresenter() {
+ }
+
+ /**
+ * All the main states of InCallActivity.
+ */
+ public enum InCallState {
+ // InCall Screen is off and there are no calls
+ NO_CALLS,
+
+ // Incoming-call screen is up
+ INCOMING,
+
+ // In-call experience is showing
+ INCALL,
+
+ // Waiting for user input before placing outgoing call
+ WAITING_FOR_ACCOUNT,
+
+ // UI is starting up but no call has been initiated yet.
+ // The UI is waiting for Telecom to respond.
+ PENDING_OUTGOING,
+
+ // User is dialing out
+ OUTGOING;
+
+ public boolean isIncoming() {
+ return (this == INCOMING);
+ }
+
+ public boolean isConnectingOrConnected() {
+ return (this == INCOMING ||
+ this == OUTGOING ||
+ this == INCALL);
+ }
+ }
+
+ /**
+ * Interface implemented by classes that need to know about the InCall State.
+ */
+ public interface InCallStateListener {
+ // TODO: Enhance state to contain the call objects instead of passing CallList
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList);
+ }
+
+ public interface IncomingCallListener {
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call);
+ }
+
+ public interface CanAddCallListener {
+ public void onCanAddCallChanged(boolean canAddCall);
+ }
+
+ public interface InCallDetailsListener {
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details);
+ }
+
+ public interface InCallOrientationListener {
+ public void onDeviceOrientationChanged(int orientation);
+ }
+
+ /**
+ * Interface implemented by classes that need to know about events which occur within the
+ * In-Call UI. Used as a means of communicating between fragments that make up the UI.
+ */
+ public interface InCallEventListener {
+ public void onFullscreenModeChanged(boolean isFullscreenMode);
+ public void onSecondaryCallerInfoVisibilityChanged(boolean isVisible, int height);
+ }
+
+ public interface InCallUiListener {
+ void onUiShowing(boolean showing);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallServiceImpl.java b/InCallUI/src/com/android/incallui/InCallServiceImpl.java
new file mode 100644
index 000000000..86936973e
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallServiceImpl.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+import android.telecom.Call;
+import android.telecom.CallAudioState;
+import android.telecom.InCallService;
+
+/**
+ * Used to receive updates about calls from the Telecom component. This service is bound to
+ * Telecom while there exist calls which potentially require UI. This includes ringing (incoming),
+ * dialing (outgoing), and active calls. When the last call is disconnected, Telecom will unbind to
+ * the service triggering InCallActivity (via CallList) to finish soon after.
+ */
+public class InCallServiceImpl extends InCallService {
+
+ @Override
+ public void onCallAudioStateChanged(CallAudioState audioState) {
+ AudioModeProvider.getInstance().onAudioStateChanged(audioState.isMuted(),
+ audioState.getRoute(), audioState.getSupportedRouteMask());
+ }
+
+ @Override
+ public void onBringToForeground(boolean showDialpad) {
+ InCallPresenter.getInstance().onBringToForeground(showDialpad);
+ }
+
+ @Override
+ public void onCallAdded(Call call) {
+ InCallPresenter.getInstance().onCallAdded(call);
+ }
+
+ @Override
+ public void onCallRemoved(Call call) {
+ InCallPresenter.getInstance().onCallRemoved(call);
+ }
+
+ @Override
+ public void onCanAddCallChanged(boolean canAddCall) {
+ InCallPresenter.getInstance().onCanAddCallChanged(canAddCall);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ final Context context = getApplicationContext();
+ final ContactInfoCache contactInfoCache = ContactInfoCache.getInstance(context);
+ InCallPresenter.getInstance().setUp(
+ getApplicationContext(),
+ CallList.getInstance(),
+ AudioModeProvider.getInstance(),
+ new StatusBarNotifier(context, contactInfoCache),
+ contactInfoCache,
+ new ProximitySensor(
+ context,
+ AudioModeProvider.getInstance(),
+ new AccelerometerListener(context))
+ );
+ InCallPresenter.getInstance().onServiceBind();
+ InCallPresenter.getInstance().maybeStartRevealAnimation(intent);
+ TelecomAdapter.getInstance().setInCallService(this);
+
+ return super.onBind(intent);
+ }
+
+ @Override
+ public boolean onUnbind(Intent intent) {
+ super.onUnbind(intent);
+
+ InCallPresenter.getInstance().onServiceUnbind();
+ tearDown();
+
+ return false;
+ }
+
+ private void tearDown() {
+ Log.v(this, "tearDown");
+ // Tear down the InCall system
+ TelecomAdapter.getInstance().clearInCallService();
+ InCallPresenter.getInstance().tearDown();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallServiceListener.java b/InCallUI/src/com/android/incallui/InCallServiceListener.java
new file mode 100644
index 000000000..11a5b08ef
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallServiceListener.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.telecom.InCallService;
+
+/**
+ * Interface implemented by In-Call components that maintain a reference to the Telecom API
+ * {@code InCallService} object. Clarifies the expectations associated with the relevant method
+ * calls.
+ */
+public interface InCallServiceListener {
+
+ /**
+ * Called once at {@code InCallService} startup time with a valid instance. At
+ * that time, there will be no existing {@code Call}s.
+ *
+ * @param inCallService The {@code InCallService} object.
+ */
+ void setInCallService(InCallService inCallService);
+
+ /**
+ * Called once at {@code InCallService} shutdown time. At that time, any {@code Call}s
+ * will have transitioned through the disconnected state and will no longer exist.
+ */
+ void clearInCallService();
+}
diff --git a/InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java b/InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java
new file mode 100644
index 000000000..9c108b855
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallUIMaterialColorMapUtils.java
@@ -0,0 +1,55 @@
+package com.android.incallui;
+
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.telecom.PhoneAccount;
+
+import com.android.contacts.common.util.MaterialColorMapUtils;
+import com.android.contacts.common.util.MaterialColorMapUtils.MaterialPalette;
+import com.android.dialer.R;
+
+public class InCallUIMaterialColorMapUtils extends MaterialColorMapUtils {
+ private final TypedArray sPrimaryColors;
+ private final TypedArray sSecondaryColors;
+ private final Resources mResources;
+
+ public InCallUIMaterialColorMapUtils(Resources resources) {
+ super(resources);
+ sPrimaryColors = resources.obtainTypedArray(R.array.background_colors);
+ sSecondaryColors = resources.obtainTypedArray(R.array.background_colors_dark);
+ mResources = resources;
+ }
+
+ /**
+ * Currently the InCallUI color will only vary by SIM color which is a list of colors
+ * defined in the background_colors array, so first search the list for the matching color and
+ * fall back to the closest matching color if an exact match does not exist.
+ */
+ @Override
+ public MaterialPalette calculatePrimaryAndSecondaryColor(int color) {
+ if (color == PhoneAccount.NO_HIGHLIGHT_COLOR) {
+ return getDefaultPrimaryAndSecondaryColors(mResources);
+ }
+
+ for (int i = 0; i < sPrimaryColors.length(); i++) {
+ if (sPrimaryColors.getColor(i, 0) == color) {
+ return new MaterialPalette(
+ sPrimaryColors.getColor(i, 0),
+ sSecondaryColors.getColor(i, 0));
+ }
+ }
+
+ // The color isn't in the list, so use the superclass to find an approximate color.
+ return super.calculatePrimaryAndSecondaryColor(color);
+ }
+
+ /**
+ * {@link Resources#getColor(int) used for compatibility
+ */
+ @SuppressWarnings("deprecation")
+ public static MaterialPalette getDefaultPrimaryAndSecondaryColors(Resources resources) {
+ final int primaryColor = resources.getColor(R.color.dialer_theme_color);
+ final int secondaryColor = resources.getColor(R.color.dialer_theme_color_dark);
+ return new MaterialPalette(primaryColor, secondaryColor);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallVideoCallCallback.java b/InCallUI/src/com/android/incallui/InCallVideoCallCallback.java
new file mode 100644
index 000000000..99e6d5129
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallVideoCallCallback.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.telecom.Connection;
+import android.telecom.Connection.VideoProvider;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.VideoProfile;
+import android.telecom.VideoProfile.CameraCapabilities;
+
+/**
+ * Implements the InCallUI VideoCall Callback.
+ */
+public class InCallVideoCallCallback extends VideoCall.Callback {
+
+ /**
+ * The call associated with this {@link InCallVideoCallCallback}.
+ */
+ private Call mCall;
+
+ /**
+ * Creates an instance of the call video client, specifying the call it is related to.
+ *
+ * @param call The call.
+ */
+ public InCallVideoCallCallback(Call call) {
+ mCall = call;
+ }
+
+ /**
+ * Handles an incoming session modification request.
+ *
+ * @param videoProfile The requested video call profile.
+ */
+ @Override
+ public void onSessionModifyRequestReceived(VideoProfile videoProfile) {
+ Log.d(this, " onSessionModifyRequestReceived videoProfile=" + videoProfile);
+ int previousVideoState = VideoUtils.getUnPausedVideoState(mCall.getVideoState());
+ int newVideoState = VideoUtils.getUnPausedVideoState(videoProfile.getVideoState());
+
+ boolean wasVideoCall = VideoUtils.isVideoCall(previousVideoState);
+ boolean isVideoCall = VideoUtils.isVideoCall(newVideoState);
+
+ // Check for upgrades to video.
+ if (!wasVideoCall && isVideoCall && previousVideoState != newVideoState) {
+ InCallVideoCallCallbackNotifier.getInstance().upgradeToVideoRequest(mCall,
+ newVideoState);
+ }
+ }
+
+ /**
+ * Handles a session modification response.
+ *
+ * @param status Status of the session modify request. Valid values are
+ * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_SUCCESS},
+ * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_FAIL},
+ * {@link Connection.VideoProvider#SESSION_MODIFY_REQUEST_INVALID}
+ * @param requestedProfile
+ * @param responseProfile The actual profile changes made by the peer device.
+ */
+ @Override
+ public void onSessionModifyResponseReceived(int status, VideoProfile requestedProfile,
+ VideoProfile responseProfile) {
+ Log.d(this, "onSessionModifyResponseReceived status=" + status + " requestedProfile="
+ + requestedProfile + " responseProfile=" + responseProfile);
+ if (status != VideoProvider.SESSION_MODIFY_REQUEST_SUCCESS) {
+ // Report the reason the upgrade failed as the new session modification state.
+ if (status == VideoProvider.SESSION_MODIFY_REQUEST_TIMED_OUT) {
+ mCall.setSessionModificationState(
+ Call.SessionModificationState.UPGRADE_TO_VIDEO_REQUEST_TIMED_OUT);
+ } else {
+ if (status == VideoProvider.SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE) {
+ mCall.setSessionModificationState(
+ Call.SessionModificationState.REQUEST_REJECTED);
+ } else {
+ mCall.setSessionModificationState(
+ Call.SessionModificationState.REQUEST_FAILED);
+ }
+ }
+ }
+
+ // Finally clear the outstanding request.
+ mCall.setSessionModificationState(Call.SessionModificationState.NO_REQUEST);
+ }
+
+ /**
+ * Handles a call session event.
+ *
+ * @param event The event.
+ */
+ @Override
+ public void onCallSessionEvent(int event) {
+ InCallVideoCallCallbackNotifier.getInstance().callSessionEvent(event);
+ }
+
+ /**
+ * Handles a change to the peer video dimensions.
+ *
+ * @param width The updated peer video width.
+ * @param height The updated peer video height.
+ */
+ @Override
+ public void onPeerDimensionsChanged(int width, int height) {
+ InCallVideoCallCallbackNotifier.getInstance().peerDimensionsChanged(mCall, width, height);
+ }
+
+ /**
+ * Handles a change to the video quality of the call.
+ *
+ * @param videoQuality The updated video call quality.
+ */
+ @Override
+ public void onVideoQualityChanged(int videoQuality) {
+ InCallVideoCallCallbackNotifier.getInstance().videoQualityChanged(mCall, videoQuality);
+ }
+
+ /**
+ * Handles a change to the call data usage. No implementation as the in-call UI does not
+ * display data usage.
+ *
+ * @param dataUsage The updated data usage.
+ */
+ @Override
+ public void onCallDataUsageChanged(long dataUsage) {
+ Log.d(this, "onCallDataUsageChanged: dataUsage = " + dataUsage);
+ InCallVideoCallCallbackNotifier.getInstance().callDataUsageChanged(dataUsage);
+ }
+
+ /**
+ * Handles changes to the camera capabilities. No implementation as the in-call UI does not
+ * make use of camera capabilities.
+ *
+ * @param cameraCapabilities The changed camera capabilities.
+ */
+ @Override
+ public void onCameraCapabilitiesChanged(CameraCapabilities cameraCapabilities) {
+ if (cameraCapabilities != null) {
+ InCallVideoCallCallbackNotifier.getInstance().cameraDimensionsChanged(
+ mCall, cameraCapabilities.getWidth(), cameraCapabilities.getHeight());
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java b/InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java
new file mode 100644
index 000000000..bb7529205
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/InCallVideoCallCallbackNotifier.java
@@ -0,0 +1,284 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Class used by {@link InCallService.VideoCallCallback} to notify interested parties of incoming
+ * events.
+ */
+public class InCallVideoCallCallbackNotifier {
+ /**
+ * Singleton instance of this class.
+ */
+ private static InCallVideoCallCallbackNotifier sInstance =
+ new InCallVideoCallCallbackNotifier();
+
+ /**
+ * ConcurrentHashMap constructor params: 8 is initial table size, 0.9f is
+ * load factor before resizing, 1 means we only expect a single thread to
+ * access the map so make only a single shard
+ */
+ private final Set<SessionModificationListener> mSessionModificationListeners =
+ Collections.newSetFromMap(new ConcurrentHashMap<SessionModificationListener, Boolean>
+ (8, 0.9f, 1));
+ private final Set<VideoEventListener> mVideoEventListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<VideoEventListener, Boolean>(8, 0.9f, 1));
+ private final Set<SurfaceChangeListener> mSurfaceChangeListeners = Collections.newSetFromMap(
+ new ConcurrentHashMap<SurfaceChangeListener, Boolean>(8, 0.9f, 1));
+
+ /**
+ * Static singleton accessor method.
+ */
+ public static InCallVideoCallCallbackNotifier getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * Private constructor. Instance should only be acquired through getInstance().
+ */
+ private InCallVideoCallCallbackNotifier() {
+ }
+
+ /**
+ * Adds a new {@link SessionModificationListener}.
+ *
+ * @param listener The listener.
+ */
+ public void addSessionModificationListener(SessionModificationListener listener) {
+ Preconditions.checkNotNull(listener);
+ mSessionModificationListeners.add(listener);
+ }
+
+ /**
+ * Remove a {@link SessionModificationListener}.
+ *
+ * @param listener The listener.
+ */
+ public void removeSessionModificationListener(SessionModificationListener listener) {
+ if (listener != null) {
+ mSessionModificationListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Adds a new {@link VideoEventListener}.
+ *
+ * @param listener The listener.
+ */
+ public void addVideoEventListener(VideoEventListener listener) {
+ Preconditions.checkNotNull(listener);
+ mVideoEventListeners.add(listener);
+ }
+
+ /**
+ * Remove a {@link VideoEventListener}.
+ *
+ * @param listener The listener.
+ */
+ public void removeVideoEventListener(VideoEventListener listener) {
+ if (listener != null) {
+ mVideoEventListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Adds a new {@link SurfaceChangeListener}.
+ *
+ * @param listener The listener.
+ */
+ public void addSurfaceChangeListener(SurfaceChangeListener listener) {
+ Preconditions.checkNotNull(listener);
+ mSurfaceChangeListeners.add(listener);
+ }
+
+ /**
+ * Remove a {@link SurfaceChangeListener}.
+ *
+ * @param listener The listener.
+ */
+ public void removeSurfaceChangeListener(SurfaceChangeListener listener) {
+ if (listener != null) {
+ mSurfaceChangeListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Inform listeners of an upgrade to video request for a call.
+ * @param call The call.
+ * @param videoState The video state we want to upgrade to.
+ */
+ public void upgradeToVideoRequest(Call call, int videoState) {
+ Log.d(this, "upgradeToVideoRequest call = " + call + " new video state = " + videoState);
+ for (SessionModificationListener listener : mSessionModificationListeners) {
+ listener.onUpgradeToVideoRequest(call, videoState);
+ }
+ }
+
+ /**
+ * Inform listeners of a call session event.
+ *
+ * @param event The call session event.
+ */
+ public void callSessionEvent(int event) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onCallSessionEvent(event);
+ }
+ }
+
+ /**
+ * Inform listeners of a downgrade to audio.
+ *
+ * @param call The call.
+ * @param paused The paused state.
+ */
+ public void peerPausedStateChanged(Call call, boolean paused) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onPeerPauseStateChanged(call, paused);
+ }
+ }
+
+ /**
+ * Inform listeners of any change in the video quality of the call
+ *
+ * @param call The call.
+ * @param videoQuality The updated video quality of the call.
+ */
+ public void videoQualityChanged(Call call, int videoQuality) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onVideoQualityChanged(call, videoQuality);
+ }
+ }
+
+ /**
+ * Inform listeners of a change to peer dimensions.
+ *
+ * @param call The call.
+ * @param width New peer width.
+ * @param height New peer height.
+ */
+ public void peerDimensionsChanged(Call call, int width, int height) {
+ for (SurfaceChangeListener listener : mSurfaceChangeListeners) {
+ listener.onUpdatePeerDimensions(call, width, height);
+ }
+ }
+
+ /**
+ * Inform listeners of a change to camera dimensions.
+ *
+ * @param call The call.
+ * @param width The new camera video width.
+ * @param height The new camera video height.
+ */
+ public void cameraDimensionsChanged(Call call, int width, int height) {
+ for (SurfaceChangeListener listener : mSurfaceChangeListeners) {
+ listener.onCameraDimensionsChange(call, width, height);
+ }
+ }
+
+ /**
+ * Inform listeners of a change to call data usage.
+ *
+ * @param dataUsage data usage value
+ */
+ public void callDataUsageChanged(long dataUsage) {
+ for (VideoEventListener listener : mVideoEventListeners) {
+ listener.onCallDataUsageChange(dataUsage);
+ }
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of upgrade to video request.
+ */
+ public interface SessionModificationListener {
+ /**
+ * Called when a peer request is received to upgrade an audio-only call to a video call.
+ *
+ * @param call The call the request was received for.
+ * @param videoState The requested video state.
+ */
+ public void onUpgradeToVideoRequest(Call call, int videoState);
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of video events, including pause
+ * and un-pause of peer video, video quality changes.
+ */
+ public interface VideoEventListener {
+ /**
+ * Called when the peer pauses or un-pauses video transmission.
+ *
+ * @param call The call which paused or un-paused video transmission.
+ * @param paused {@code True} when the video transmission is paused, {@code false}
+ * otherwise.
+ */
+ public void onPeerPauseStateChanged(Call call, boolean paused);
+
+ /**
+ * Called when the video quality changes.
+ *
+ * @param call The call whose video quality changes.
+ * @param videoCallQuality - values are QUALITY_HIGH, MEDIUM, LOW and UNKNOWN.
+ */
+ public void onVideoQualityChanged(Call call, int videoCallQuality);
+
+ /*
+ * Called when call data usage value is requested or when call data usage value is updated
+ * because of a call state change
+ *
+ * @param dataUsage call data usage value
+ */
+ public void onCallDataUsageChange(long dataUsage);
+
+ /**
+ * Called when call session event is raised.
+ *
+ * @param event The call session event.
+ */
+ public void onCallSessionEvent(int event);
+ }
+
+ /**
+ * Listener interface for any class that wants to be notified of changes to the video surfaces.
+ */
+ public interface SurfaceChangeListener {
+ /**
+ * Called when the peer video feed changes dimensions. This can occur when the peer rotates
+ * their device, changing the aspect ratio of the video signal.
+ *
+ * @param call The call which experienced a peer video
+ * @param width
+ * @param height
+ */
+ public void onUpdatePeerDimensions(Call call, int width, int height);
+
+ /**
+ * Called when the local camera changes dimensions. This occurs when a change in camera
+ * occurs.
+ *
+ * @param call The call which experienced the camera dimension change.
+ * @param width The new camera video width.
+ * @param height The new camera video height.
+ */
+ public void onCameraDimensionsChange(Call call, int width, int height);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Log.java b/InCallUI/src/com/android/incallui/Log.java
new file mode 100644
index 000000000..07a0e61ca
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Log.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.net.Uri;
+import android.telecom.PhoneAccount;
+import android.telephony.PhoneNumberUtils;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Manages logging for the entire class.
+ */
+public class Log {
+
+ // Generic tag for all In Call logging
+ public static final String TAG = "InCall";
+
+ public static final boolean FORCE_DEBUG = false; /* STOPSHIP if true */
+ public static final boolean DEBUG = FORCE_DEBUG ||
+ android.util.Log.isLoggable(TAG, android.util.Log.DEBUG);
+ public static final boolean VERBOSE = FORCE_DEBUG ||
+ android.util.Log.isLoggable(TAG, android.util.Log.VERBOSE);
+ public static final String TAG_DELIMETER = " - ";
+
+ public static void d(String tag, String msg) {
+ if (DEBUG) {
+ android.util.Log.d(TAG, delimit(tag) + msg);
+ }
+ }
+
+ public static void d(Object obj, String msg) {
+ if (DEBUG) {
+ android.util.Log.d(TAG, getPrefix(obj) + msg);
+ }
+ }
+
+ public static void d(Object obj, String str1, Object str2) {
+ if (DEBUG) {
+ android.util.Log.d(TAG, getPrefix(obj) + str1 + str2);
+ }
+ }
+
+ public static void v(Object obj, String msg) {
+ if (VERBOSE) {
+ android.util.Log.v(TAG, getPrefix(obj) + msg);
+ }
+ }
+
+ public static void v(Object obj, String str1, Object str2) {
+ if (VERBOSE) {
+ android.util.Log.d(TAG, getPrefix(obj) + str1 + str2);
+ }
+ }
+
+ public static void e(String tag, String msg, Exception e) {
+ android.util.Log.e(TAG, delimit(tag) + msg, e);
+ }
+
+ public static void e(String tag, String msg) {
+ android.util.Log.e(TAG, delimit(tag) + msg);
+ }
+
+ public static void e(Object obj, String msg, Exception e) {
+ android.util.Log.e(TAG, getPrefix(obj) + msg, e);
+ }
+
+ public static void e(Object obj, String msg) {
+ android.util.Log.e(TAG, getPrefix(obj) + msg);
+ }
+
+ public static void i(String tag, String msg) {
+ android.util.Log.i(TAG, delimit(tag) + msg);
+ }
+
+ public static void i(Object obj, String msg) {
+ android.util.Log.i(TAG, getPrefix(obj) + msg);
+ }
+
+ public static void w(Object obj, String msg) {
+ android.util.Log.w(TAG, getPrefix(obj) + msg);
+ }
+
+ public static void wtf(Object obj, String msg) {
+ android.util.Log.wtf(TAG, getPrefix(obj) + msg);
+ }
+
+ public static String piiHandle(Object pii) {
+ if (pii == null || VERBOSE) {
+ return String.valueOf(pii);
+ }
+
+ if (pii instanceof Uri) {
+ Uri uri = (Uri) pii;
+
+ // All Uri's which are not "tel" go through normal pii() method.
+ if (!PhoneAccount.SCHEME_TEL.equals(uri.getScheme())) {
+ return pii(pii);
+ } else {
+ pii = uri.getSchemeSpecificPart();
+ }
+ }
+
+ String originalString = String.valueOf(pii);
+ StringBuilder stringBuilder = new StringBuilder(originalString.length());
+ for (char c : originalString.toCharArray()) {
+ if (PhoneNumberUtils.isDialable(c)) {
+ stringBuilder.append('*');
+ } else {
+ stringBuilder.append(c);
+ }
+ }
+ return stringBuilder.toString();
+ }
+
+ /**
+ * Redact personally identifiable information for production users.
+ * If we are running in verbose mode, return the original string, otherwise
+ * return a SHA-1 hash of the input string.
+ */
+ public static String pii(Object pii) {
+ if (pii == null || VERBOSE) {
+ return String.valueOf(pii);
+ }
+ return "[" + secureHash(String.valueOf(pii).getBytes()) + "]";
+ }
+
+ private static String secureHash(byte[] input) {
+ MessageDigest messageDigest;
+ try {
+ messageDigest = MessageDigest.getInstance("SHA-1");
+ } catch (NoSuchAlgorithmException e) {
+ return null;
+ }
+ messageDigest.update(input);
+ byte[] result = messageDigest.digest();
+ return encodeHex(result);
+ }
+
+ private static String encodeHex(byte[] bytes) {
+ StringBuffer hex = new StringBuffer(bytes.length * 2);
+
+ for (int i = 0; i < bytes.length; i++) {
+ int byteIntValue = bytes[i] & 0xff;
+ if (byteIntValue < 0x10) {
+ hex.append("0");
+ }
+ hex.append(Integer.toString(byteIntValue, 16));
+ }
+
+ return hex.toString();
+ }
+
+ private static String getPrefix(Object obj) {
+ return (obj == null ? "" : (obj.getClass().getSimpleName() + TAG_DELIMETER));
+ }
+
+ private static String delimit(String tag) {
+ return tag + TAG_DELIMETER;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/NeededForReflection.java b/InCallUI/src/com/android/incallui/NeededForReflection.java
new file mode 100644
index 000000000..363a0a548
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/NeededForReflection.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that the class, constructor, method or field is used for reflection and therefore cannot
+ * be removed by tools like ProGuard.
+ */
+@Retention(RetentionPolicy.CLASS)
+@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD})
+public @interface NeededForReflection {}
diff --git a/InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java b/InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java
new file mode 100644
index 000000000..2543b783d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/NotificationBroadcastReceiver.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.VideoProfile;
+
+/**
+ * Accepts broadcast Intents which will be prepared by {@link StatusBarNotifier} and thus
+ * sent from the notification manager.
+ * This should be visible from outside, but shouldn't be exported.
+ */
+public class NotificationBroadcastReceiver extends BroadcastReceiver {
+
+ /**
+ * Intent Action used for hanging up the current call from Notification bar. This will
+ * choose first ringing call, first active call, or first background call (typically in
+ * STATE_HOLDING state).
+ */
+ public static final String ACTION_DECLINE_INCOMING_CALL =
+ "com.android.incallui.ACTION_DECLINE_INCOMING_CALL";
+ public static final String ACTION_HANG_UP_ONGOING_CALL =
+ "com.android.incallui.ACTION_HANG_UP_ONGOING_CALL";
+ public static final String ACTION_ANSWER_VIDEO_INCOMING_CALL =
+ "com.android.incallui.ACTION_ANSWER_VIDEO_INCOMING_CALL";
+ public static final String ACTION_ANSWER_VOICE_INCOMING_CALL =
+ "com.android.incallui.ACTION_ANSWER_VOICE_INCOMING_CALL";
+ public static final String ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST =
+ "com.android.incallui.ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST";
+ public static final String ACTION_DECLINE_VIDEO_UPGRADE_REQUEST =
+ "com.android.incallui.ACTION_DECLINE_VIDEO_UPGRADE_REQUEST";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ final String action = intent.getAction();
+ Log.i(this, "Broadcast from Notification: " + action);
+
+ // TODO: Commands of this nature should exist in the CallList.
+ if (action.equals(ACTION_ANSWER_VIDEO_INCOMING_CALL)) {
+ InCallPresenter.getInstance().answerIncomingCall(
+ context, VideoProfile.STATE_BIDIRECTIONAL);
+ } else if (action.equals(ACTION_ANSWER_VOICE_INCOMING_CALL)) {
+ InCallPresenter.getInstance().answerIncomingCall(
+ context, VideoProfile.STATE_AUDIO_ONLY);
+ } else if (action.equals(ACTION_DECLINE_INCOMING_CALL)) {
+ InCallPresenter.getInstance().declineIncomingCall(context);
+ } else if (action.equals(ACTION_HANG_UP_ONGOING_CALL)) {
+ InCallPresenter.getInstance().hangUpOngoingCall(context);
+ } else if (action.equals(ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST)) {
+ //TODO: Change calltype after adding support for TX and RX
+ InCallPresenter.getInstance().acceptUpgradeRequest(
+ VideoProfile.STATE_BIDIRECTIONAL, context);
+ } else if (action.equals(ACTION_DECLINE_VIDEO_UPGRADE_REQUEST)) {
+ InCallPresenter.getInstance().declineUpgradeRequest(context);
+ }
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/PostCharDialogFragment.java b/InCallUI/src/com/android/incallui/PostCharDialogFragment.java
new file mode 100644
index 000000000..6f904ad9e
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/PostCharDialogFragment.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import com.android.dialer.R;
+
+/**
+ * Pop up an alert dialog with OK and Cancel buttons to allow user to Accept or Reject the WAIT
+ * inserted as part of the Dial string.
+ */
+public class PostCharDialogFragment extends DialogFragment {
+
+ private static final String STATE_CALL_ID = "CALL_ID";
+ private static final String STATE_POST_CHARS = "POST_CHARS";
+
+ private String mCallId;
+ private String mPostDialStr;
+
+ public PostCharDialogFragment() {
+ }
+
+ public PostCharDialogFragment(String callId, String postDialStr) {
+ mCallId = callId;
+ mPostDialStr = postDialStr;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ super.onCreateDialog(savedInstanceState);
+
+ if (mPostDialStr == null && savedInstanceState != null) {
+ mCallId = savedInstanceState.getString(STATE_CALL_ID);
+ mPostDialStr = savedInstanceState.getString(STATE_POST_CHARS);
+ }
+
+ final StringBuilder buf = new StringBuilder();
+ buf.append(getResources().getText(R.string.wait_prompt_str));
+ buf.append(mPostDialStr);
+
+ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+ builder.setMessage(buf.toString());
+
+ builder.setPositiveButton(R.string.pause_prompt_yes, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ TelecomAdapter.getInstance().postDialContinue(mCallId, true);
+ }
+ });
+ builder.setNegativeButton(R.string.pause_prompt_no, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dialog.cancel();
+ }
+ });
+
+ final AlertDialog dialog = builder.create();
+ return dialog;
+ }
+
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ super.onCancel(dialog);
+
+ TelecomAdapter.getInstance().postDialContinue(mCallId, false);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+
+ outState.putString(STATE_CALL_ID, mCallId);
+ outState.putString(STATE_POST_CHARS, mPostDialStr);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Presenter.java b/InCallUI/src/com/android/incallui/Presenter.java
new file mode 100644
index 000000000..4e1fa978d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Presenter.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+
+/**
+ * Base class for Presenters.
+ */
+public abstract class Presenter<U extends Ui> {
+
+ private U mUi;
+
+ /**
+ * Called after the UI view has been created. That is when fragment.onViewCreated() is called.
+ *
+ * @param ui The Ui implementation that is now ready to be used.
+ */
+ public void onUiReady(U ui) {
+ mUi = ui;
+ }
+
+ /**
+ * Called when the UI view is destroyed in Fragment.onDestroyView().
+ */
+ public final void onUiDestroy(U ui) {
+ onUiUnready(ui);
+ mUi = null;
+ }
+
+ /**
+ * To be overriden by Presenter implementations. Called when the fragment is being
+ * destroyed but before ui is set to null.
+ */
+ public void onUiUnready(U ui) {
+ }
+
+ public void onSaveInstanceState(Bundle outState) {}
+
+ public void onRestoreInstanceState(Bundle savedInstanceState) {}
+
+ public U getUi() {
+ return mUi;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ProximitySensor.java b/InCallUI/src/com/android/incallui/ProximitySensor.java
new file mode 100644
index 000000000..3c9fd9370
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ProximitySensor.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Objects;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.hardware.display.DisplayManager;
+import android.hardware.display.DisplayManager.DisplayListener;
+import android.os.PowerManager;
+import android.telecom.CallAudioState;
+import android.view.Display;
+
+import com.android.incallui.AudioModeProvider.AudioModeListener;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+
+/**
+ * Class manages the proximity sensor for the in-call UI.
+ * We enable the proximity sensor while the user in a phone call. The Proximity sensor turns off
+ * the touchscreen and display when the user is close to the screen to prevent user's cheek from
+ * causing touch events.
+ * The class requires special knowledge of the activity and device state to know when the proximity
+ * sensor should be enabled and disabled. Most of that state is fed into this class through
+ * public methods.
+ */
+public class ProximitySensor implements AccelerometerListener.OrientationListener,
+ InCallStateListener, AudioModeListener {
+ private static final String TAG = ProximitySensor.class.getSimpleName();
+
+ private final PowerManager mPowerManager;
+ private final PowerManager.WakeLock mProximityWakeLock;
+ private final AudioModeProvider mAudioModeProvider;
+ private final AccelerometerListener mAccelerometerListener;
+ private final ProximityDisplayListener mDisplayListener;
+ private int mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
+ private boolean mUiShowing = false;
+ private boolean mIsPhoneOffhook = false;
+ private boolean mDialpadVisible;
+
+ // True if the keyboard is currently *not* hidden
+ // Gets updated whenever there is a Configuration change
+ private boolean mIsHardKeyboardOpen;
+
+ public ProximitySensor(Context context, AudioModeProvider audioModeProvider,
+ AccelerometerListener accelerometerListener) {
+ mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ if (mPowerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
+ mProximityWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, TAG);
+ } else {
+ Log.w(TAG, "Device does not support proximity wake lock.");
+ mProximityWakeLock = null;
+ }
+ mAccelerometerListener = accelerometerListener;
+ mAccelerometerListener.setListener(this);
+
+ mDisplayListener = new ProximityDisplayListener(
+ (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE));
+ mDisplayListener.register();
+
+ mAudioModeProvider = audioModeProvider;
+ mAudioModeProvider.addListener(this);
+ }
+
+ public void tearDown() {
+ mAudioModeProvider.removeListener(this);
+
+ mAccelerometerListener.enable(false);
+ mDisplayListener.unregister();
+
+ turnOffProximitySensor(true);
+ }
+
+ /**
+ * Called to identify when the device is laid down flat.
+ */
+ @Override
+ public void orientationChanged(int orientation) {
+ mOrientation = orientation;
+ updateProximitySensorMode();
+ }
+
+ /**
+ * Called to keep track of the overall UI state.
+ */
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ // We ignore incoming state because we do not want to enable proximity
+ // sensor during incoming call screen. We check hasLiveCall() because a disconnected call
+ // can also put the in-call screen in the INCALL state.
+ boolean hasOngoingCall = InCallState.INCALL == newState && callList.hasLiveCall();
+ boolean isOffhook = (InCallState.OUTGOING == newState) || hasOngoingCall;
+
+ if (isOffhook != mIsPhoneOffhook) {
+ mIsPhoneOffhook = isOffhook;
+
+ mOrientation = AccelerometerListener.ORIENTATION_UNKNOWN;
+ mAccelerometerListener.enable(mIsPhoneOffhook);
+
+ updateProximitySensorMode();
+ }
+ }
+
+ @Override
+ public void onSupportedAudioMode(int modeMask) {
+ }
+
+ @Override
+ public void onMute(boolean muted) {
+ }
+
+ /**
+ * Called when the audio mode changes during a call.
+ */
+ @Override
+ public void onAudioMode(int mode) {
+ updateProximitySensorMode();
+ }
+
+ public void onDialpadVisible(boolean visible) {
+ mDialpadVisible = visible;
+ updateProximitySensorMode();
+ }
+
+ /**
+ * Called by InCallActivity to listen for hard keyboard events.
+ */
+ public void onConfigurationChanged(Configuration newConfig) {
+ mIsHardKeyboardOpen = newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO;
+
+ // Update the Proximity sensor based on keyboard state
+ updateProximitySensorMode();
+ }
+
+ /**
+ * Used to save when the UI goes in and out of the foreground.
+ */
+ public void onInCallShowing(boolean showing) {
+ if (showing) {
+ mUiShowing = true;
+
+ // We only consider the UI not showing for instances where another app took the foreground.
+ // If we stopped showing because the screen is off, we still consider that showing.
+ } else if (mPowerManager.isScreenOn()) {
+ mUiShowing = false;
+ }
+ updateProximitySensorMode();
+ }
+
+ void onDisplayStateChanged(boolean isDisplayOn) {
+ Log.i(this, "isDisplayOn: " + isDisplayOn);
+ mAccelerometerListener.enable(isDisplayOn);
+ }
+
+ /**
+ * TODO: There is no way to determine if a screen is off due to proximity or if it is
+ * legitimately off, but if ever we can do that in the future, it would be useful here.
+ * Until then, this function will simply return true of the screen is off.
+ * TODO: Investigate whether this can be replaced with the ProximityDisplayListener.
+ */
+ public boolean isScreenReallyOff() {
+ return !mPowerManager.isScreenOn();
+ }
+
+ private void turnOnProximitySensor() {
+ if (mProximityWakeLock != null) {
+ if (!mProximityWakeLock.isHeld()) {
+ Log.i(this, "Acquiring proximity wake lock");
+ mProximityWakeLock.acquire();
+ } else {
+ Log.i(this, "Proximity wake lock already acquired");
+ }
+ }
+ }
+
+ private void turnOffProximitySensor(boolean screenOnImmediately) {
+ if (mProximityWakeLock != null) {
+ if (mProximityWakeLock.isHeld()) {
+ Log.i(this, "Releasing proximity wake lock");
+ int flags =
+ (screenOnImmediately ? 0 : PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY);
+ mProximityWakeLock.release(flags);
+ } else {
+ Log.i(this, "Proximity wake lock already released");
+ }
+ }
+ }
+
+ /**
+ * Updates the wake lock used to control proximity sensor behavior,
+ * based on the current state of the phone.
+ *
+ * On devices that have a proximity sensor, to avoid false touches
+ * during a call, we hold a PROXIMITY_SCREEN_OFF_WAKE_LOCK wake lock
+ * whenever the phone is off hook. (When held, that wake lock causes
+ * the screen to turn off automatically when the sensor detects an
+ * object close to the screen.)
+ *
+ * This method is a no-op for devices that don't have a proximity
+ * sensor.
+ *
+ * Proximity wake lock will *not* be held if any one of the
+ * conditions is true while on a call:
+ * 1) If the audio is routed via Bluetooth
+ * 2) If a wired headset is connected
+ * 3) if the speaker is ON
+ * 4) If the slider is open(i.e. the hardkeyboard is *not* hidden)
+ */
+ private synchronized void updateProximitySensorMode() {
+ final int audioMode = mAudioModeProvider.getAudioMode();
+
+ // turn proximity sensor off and turn screen on immediately if
+ // we are using a headset, the keyboard is open, or the device
+ // is being held in a horizontal position.
+ boolean screenOnImmediately = (CallAudioState.ROUTE_WIRED_HEADSET == audioMode
+ || CallAudioState.ROUTE_SPEAKER == audioMode
+ || CallAudioState.ROUTE_BLUETOOTH == audioMode
+ || mIsHardKeyboardOpen);
+
+ // We do not keep the screen off when the user is outside in-call screen and we are
+ // horizontal, but we do not force it on when we become horizontal until the
+ // proximity sensor goes negative.
+ final boolean horizontal =
+ (mOrientation == AccelerometerListener.ORIENTATION_HORIZONTAL);
+ screenOnImmediately |= !mUiShowing && horizontal;
+
+ // We do not keep the screen off when dialpad is visible, we are horizontal, and
+ // the in-call screen is being shown.
+ // At that moment we're pretty sure users want to use it, instead of letting the
+ // proximity sensor turn off the screen by their hands.
+ screenOnImmediately |= mDialpadVisible && horizontal;
+
+ Log.v(this, "screenonImmediately: ", screenOnImmediately);
+
+ Log.i(this, Objects.toStringHelper(this)
+ .add("keybrd", mIsHardKeyboardOpen ? 1 : 0)
+ .add("dpad", mDialpadVisible ? 1 : 0)
+ .add("offhook", mIsPhoneOffhook ? 1 : 0)
+ .add("hor", horizontal ? 1 : 0)
+ .add("ui", mUiShowing ? 1 : 0)
+ .add("aud", CallAudioState.audioRouteToString(audioMode))
+ .toString());
+
+ if (mIsPhoneOffhook && !screenOnImmediately) {
+ Log.d(this, "Turning on proximity sensor");
+ // Phone is in use! Arrange for the screen to turn off
+ // automatically when the sensor detects a close object.
+ turnOnProximitySensor();
+ } else {
+ Log.d(this, "Turning off proximity sensor");
+ // Phone is either idle, or ringing. We don't want any special proximity sensor
+ // behavior in either case.
+ turnOffProximitySensor(screenOnImmediately);
+ }
+ }
+
+ /**
+ * Implementation of a {@link DisplayListener} that maintains a binary state:
+ * Screen on vs screen off. Used by the proximity sensor manager to decide whether or not
+ * it needs to listen to accelerometer events.
+ */
+ public class ProximityDisplayListener implements DisplayListener {
+ private DisplayManager mDisplayManager;
+ private boolean mIsDisplayOn = true;
+
+ ProximityDisplayListener(DisplayManager displayManager) {
+ mDisplayManager = displayManager;
+ }
+
+ void register() {
+ mDisplayManager.registerDisplayListener(this, null);
+ }
+
+ void unregister() {
+ mDisplayManager.unregisterDisplayListener(this);
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ if (displayId == Display.DEFAULT_DISPLAY) {
+ final Display display = mDisplayManager.getDisplay(displayId);
+
+ final boolean isDisplayOn = display.getState() != Display.STATE_OFF;
+ // For call purposes, we assume that as long as the screen is not truly off, it is
+ // considered on, even if it is in an unknown or low power idle state.
+ if (isDisplayOn != mIsDisplayOn) {
+ mIsDisplayOn = isDisplayOn;
+ onDisplayStateChanged(mIsDisplayOn);
+ }
+ }
+ }
+
+ @Override
+ public void onDisplayAdded(int displayId) {
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
new file mode 100644
index 000000000..5bf8e169c
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -0,0 +1,767 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui;
+
+import static com.android.contacts.common.compat.CallSdkCompat.Details.PROPERTY_ENTERPRISE_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ANSWER_VIDEO_INCOMING_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_ANSWER_VOICE_INCOMING_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_DECLINE_INCOMING_CALL;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_DECLINE_VIDEO_UPGRADE_REQUEST;
+import static com.android.incallui.NotificationBroadcastReceiver.ACTION_HANG_UP_ONGOING_CALL;
+
+import com.google.common.base.Preconditions;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
+import android.media.AudioAttributes;
+import android.net.Uri;
+import android.provider.ContactsContract.Contacts;
+import android.support.annotation.Nullable;
+import android.telecom.Call.Details;
+import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.contacts.common.util.BitmapUtil;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.R;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.async.PausableExecutorImpl;
+import com.android.incallui.ringtone.DialerRingtoneManager;
+import com.android.incallui.ringtone.InCallTonePlayer;
+import com.android.incallui.ringtone.ToneGeneratorFactory;
+
+import java.util.Objects;
+
+/**
+ * This class adds Notifications to the status bar for the in-call experience.
+ */
+public class StatusBarNotifier implements InCallPresenter.InCallStateListener,
+ CallList.CallUpdateListener {
+
+ // Notification types
+ // Indicates that no notification is currently showing.
+ private static final int NOTIFICATION_NONE = 0;
+ // Notification for an active call. This is non-interruptive, but cannot be dismissed.
+ private static final int NOTIFICATION_IN_CALL = 1;
+ // Notification for incoming calls. This is interruptive and will show up as a HUN.
+ private static final int NOTIFICATION_INCOMING_CALL = 2;
+
+ private static final long[] VIBRATE_PATTERN = new long[] {0, 1000, 1000};
+
+ private final Context mContext;
+ @Nullable private ContactsPreferences mContactsPreferences;
+ private final ContactInfoCache mContactInfoCache;
+ private final NotificationManager mNotificationManager;
+ private final DialerRingtoneManager mDialerRingtoneManager;
+ private int mCurrentNotification = NOTIFICATION_NONE;
+ private int mCallState = Call.State.INVALID;
+ private int mSavedIcon = 0;
+ private String mSavedContent = null;
+ private Bitmap mSavedLargeIcon;
+ private String mSavedContentTitle;
+ private String mCallId = null;
+ private InCallState mInCallState;
+ private Uri mRingtone;
+
+ public StatusBarNotifier(Context context, ContactInfoCache contactInfoCache) {
+ Preconditions.checkNotNull(context);
+ mContext = context;
+ mContactsPreferences = ContactsPreferencesFactory.newContactsPreferences(mContext);
+ mContactInfoCache = contactInfoCache;
+ mNotificationManager =
+ (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ mDialerRingtoneManager = new DialerRingtoneManager(
+ new InCallTonePlayer(new ToneGeneratorFactory(), new PausableExecutorImpl()),
+ CallList.getInstance());
+ mCurrentNotification = NOTIFICATION_NONE;
+ }
+
+ /**
+ * Creates notifications according to the state we receive from {@link InCallPresenter}.
+ */
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ Log.d(this, "onStateChange");
+ mInCallState = newState;
+ updateNotification(newState, callList);
+ }
+
+ /**
+ * Updates the phone app's status bar notification *and* launches the
+ * incoming call UI in response to a new incoming call.
+ *
+ * If an incoming call is ringing (or call-waiting), the notification
+ * will also include a "fullScreenIntent" that will cause the
+ * InCallScreen to be launched, unless the current foreground activity
+ * is marked as "immersive".
+ *
+ * (This is the mechanism that actually brings up the incoming call UI
+ * when we receive a "new ringing connection" event from the telephony
+ * layer.)
+ *
+ * Also note that this method is safe to call even if the phone isn't
+ * actually ringing (or, more likely, if an incoming call *was*
+ * ringing briefly but then disconnected). In that case, we'll simply
+ * update or cancel the in-call notification based on the current
+ * phone state.
+ *
+ * @see #updateInCallNotification(InCallState,CallList)
+ */
+ public void updateNotification(InCallState state, CallList callList) {
+ updateInCallNotification(state, callList);
+ }
+
+ /**
+ * Take down the in-call notification.
+ * @see #updateInCallNotification(InCallState,CallList)
+ */
+ private void cancelNotification() {
+ if (!TextUtils.isEmpty(mCallId)) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ mCallId = null;
+ }
+ if (mCurrentNotification != NOTIFICATION_NONE) {
+ Log.d(this, "cancelInCall()...");
+ mNotificationManager.cancel(mCurrentNotification);
+ }
+ mCurrentNotification = NOTIFICATION_NONE;
+ }
+
+ /**
+ * Should only be called from a irrecoverable state where it is necessary to dismiss all
+ * notifications.
+ */
+ static void clearAllCallNotifications(Context backupContext) {
+ Log.i(StatusBarNotifier.class.getSimpleName(),
+ "Something terrible happened. Clear all InCall notifications");
+
+ NotificationManager notificationManager =
+ (NotificationManager) backupContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(NOTIFICATION_IN_CALL);
+ notificationManager.cancel(NOTIFICATION_INCOMING_CALL);
+ }
+
+ /**
+ * Helper method for updateInCallNotification() and
+ * updateNotification(): Update the phone app's
+ * status bar notification based on the current telephony state, or
+ * cancels the notification if the phone is totally idle.
+ */
+ private void updateInCallNotification(final InCallState state, CallList callList) {
+ Log.d(this, "updateInCallNotification...");
+
+ final Call call = getCallToShow(callList);
+
+ if (call != null) {
+ showNotification(call);
+ } else {
+ cancelNotification();
+ }
+ }
+
+ private void showNotification(final Call call) {
+ final boolean isIncoming = (call.getState() == Call.State.INCOMING ||
+ call.getState() == Call.State.CALL_WAITING);
+ if (!TextUtils.isEmpty(mCallId)) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+ mCallId = call.getId();
+ CallList.getInstance().addCallUpdateListener(call.getId(), this);
+
+ // we make a call to the contact info cache to query for supplemental data to what the
+ // call provides. This includes the contact name and photo.
+ // This callback will always get called immediately and synchronously with whatever data
+ // it has available, and may make a subsequent call later (same thread) if it had to
+ // call into the contacts provider for more data.
+ mContactInfoCache.findInfo(call, isIncoming, new ContactInfoCacheCallback() {
+ @Override
+ public void onContactInfoComplete(String callId, ContactCacheEntry entry) {
+ Call call = CallList.getInstance().getCallById(callId);
+ if (call != null) {
+ call.getLogState().contactLookupResult = entry.contactLookupResult;
+ buildAndSendNotification(call, entry);
+ }
+ }
+
+ @Override
+ public void onImageLoadComplete(String callId, ContactCacheEntry entry) {
+ Call call = CallList.getInstance().getCallById(callId);
+ if (call != null) {
+ buildAndSendNotification(call, entry);
+ }
+ }
+
+ @Override
+ public void onContactInteractionsInfoComplete(String callId, ContactCacheEntry entry) {}
+ });
+ }
+
+ /**
+ * Sets up the main Ui for the notification
+ */
+ private void buildAndSendNotification(Call originalCall, ContactCacheEntry contactInfo) {
+ // This can get called to update an existing notification after contact information has come
+ // back. However, it can happen much later. Before we continue, we need to make sure that
+ // the call being passed in is still the one we want to show in the notification.
+ final Call call = getCallToShow(CallList.getInstance());
+ if (call == null || !call.getId().equals(originalCall.getId())) {
+ return;
+ }
+
+ final int callState = call.getState();
+
+ // Check if data has changed; if nothing is different, don't issue another notification.
+ final int iconResId = getIconToDisplay(call);
+ Bitmap largeIcon = getLargeIconToDisplay(contactInfo, call);
+ final String content =
+ getContentString(call, contactInfo.userType);
+ final String contentTitle = getContentTitle(contactInfo, call);
+
+ final int notificationType;
+ if (callState == Call.State.INCOMING || callState == Call.State.CALL_WAITING) {
+ notificationType = NOTIFICATION_INCOMING_CALL;
+ } else {
+ notificationType = NOTIFICATION_IN_CALL;
+ }
+
+ if (!checkForChangeAndSaveData(iconResId, content, largeIcon, contentTitle, callState,
+ notificationType, contactInfo.contactRingtoneUri)) {
+ return;
+ }
+
+ if (largeIcon != null) {
+ largeIcon = getRoundedIcon(largeIcon);
+ }
+
+ /*
+ * This builder is used for the notification shown when the device is locked and the user
+ * has set their notification settings to 'hide sensitive content'
+ * {@see Notification.Builder#setPublicVersion}.
+ */
+ Notification.Builder publicBuilder = new Notification.Builder(mContext);
+ publicBuilder.setSmallIcon(iconResId)
+ .setColor(mContext.getResources().getColor(R.color.dialer_theme_color))
+ // Hide work call state for the lock screen notification
+ .setContentTitle(getContentString(call, ContactsUtils.USER_TYPE_CURRENT));
+ setNotificationWhen(call, callState, publicBuilder);
+
+ /*
+ * Builder for the notification shown when the device is unlocked or the user has set their
+ * notification settings to 'show all notification content'.
+ */
+ final Notification.Builder builder = getNotificationBuilder();
+ builder.setPublicVersion(publicBuilder.build());
+
+ // Set up the main intent to send the user to the in-call screen
+ final PendingIntent inCallPendingIntent = createLaunchPendingIntent();
+ builder.setContentIntent(inCallPendingIntent);
+
+ // Set the intent as a full screen intent as well if a call is incoming
+ if (notificationType == NOTIFICATION_INCOMING_CALL
+ && !InCallPresenter.getInstance().isShowingInCallUi()) {
+ configureFullScreenIntent(builder, inCallPendingIntent, call);
+ // Set the notification category for incoming calls
+ builder.setCategory(Notification.CATEGORY_CALL);
+ }
+
+ // Set the content
+ builder.setContentText(content);
+ builder.setSmallIcon(iconResId);
+ builder.setContentTitle(contentTitle);
+ builder.setLargeIcon(largeIcon);
+ builder.setColor(mContext.getResources().getColor(R.color.dialer_theme_color));
+
+ final boolean isVideoUpgradeRequest = call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST;
+ if (isVideoUpgradeRequest) {
+ builder.setUsesChronometer(false);
+ addDismissUpgradeRequestAction(builder);
+ addAcceptUpgradeRequestAction(builder);
+ } else {
+ createIncomingCallNotification(call, callState, builder);
+ }
+
+ addPersonReference(builder, contactInfo, call);
+
+ /*
+ * Fire off the notification
+ */
+ Notification notification = builder.build();
+
+ if (mDialerRingtoneManager.shouldPlayRingtone(callState, contactInfo.contactRingtoneUri)) {
+ notification.flags |= Notification.FLAG_INSISTENT;
+ notification.sound = contactInfo.contactRingtoneUri;
+ AudioAttributes.Builder audioAttributes = new AudioAttributes.Builder();
+ audioAttributes.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
+ audioAttributes.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
+ notification.audioAttributes = audioAttributes.build();
+ if (mDialerRingtoneManager.shouldVibrate(mContext.getContentResolver())) {
+ notification.vibrate = VIBRATE_PATTERN;
+ }
+ }
+ if (mDialerRingtoneManager.shouldPlayCallWaitingTone(callState)) {
+ Log.v(this, "Playing call waiting tone");
+ mDialerRingtoneManager.playCallWaitingTone();
+ }
+ if (mCurrentNotification != notificationType && mCurrentNotification != NOTIFICATION_NONE) {
+ Log.i(this, "Previous notification already showing - cancelling "
+ + mCurrentNotification);
+ mNotificationManager.cancel(mCurrentNotification);
+ }
+ Log.i(this, "Displaying notification for " + notificationType);
+ mNotificationManager.notify(notificationType, notification);
+ mCurrentNotification = notificationType;
+ }
+
+ private void createIncomingCallNotification(
+ Call call, int state, Notification.Builder builder) {
+ setNotificationWhen(call, state, builder);
+
+ // Add hang up option for any active calls (active | onhold), outgoing calls (dialing).
+ if (state == Call.State.ACTIVE ||
+ state == Call.State.ONHOLD ||
+ Call.State.isDialing(state)) {
+ addHangupAction(builder);
+ } else if (state == Call.State.INCOMING || state == Call.State.CALL_WAITING) {
+ addDismissAction(builder);
+ if (call.isVideoCall(mContext)) {
+ addVoiceAction(builder);
+ addVideoCallAction(builder);
+ } else {
+ addAnswerAction(builder);
+ }
+ }
+ }
+
+ /*
+ * Sets the notification's when section as needed. For active calls, this is explicitly set as
+ * the duration of the call. For all other states, the notification will automatically show the
+ * time at which the notification was created.
+ */
+ private void setNotificationWhen(Call call, int state, Notification.Builder builder) {
+ if (state == Call.State.ACTIVE) {
+ builder.setUsesChronometer(true);
+ builder.setWhen(call.getConnectTimeMillis());
+ } else {
+ builder.setUsesChronometer(false);
+ }
+ }
+
+ /**
+ * Checks the new notification data and compares it against any notification that we
+ * are already displaying. If the data is exactly the same, we return false so that
+ * we do not issue a new notification for the exact same data.
+ */
+ private boolean checkForChangeAndSaveData(int icon, String content, Bitmap largeIcon,
+ String contentTitle, int state, int notificationType, Uri ringtone) {
+
+ // The two are different:
+ // if new title is not null, it should be different from saved version OR
+ // if new title is null, the saved version should not be null
+ final boolean contentTitleChanged =
+ (contentTitle != null && !contentTitle.equals(mSavedContentTitle)) ||
+ (contentTitle == null && mSavedContentTitle != null);
+
+ // any change means we are definitely updating
+ boolean retval = (mSavedIcon != icon) || !Objects.equals(mSavedContent, content)
+ || (mCallState != state) || (mSavedLargeIcon != largeIcon)
+ || contentTitleChanged || !Objects.equals(mRingtone, ringtone);
+
+ // If we aren't showing a notification right now or the notification type is changing,
+ // definitely do an update.
+ if (mCurrentNotification != notificationType) {
+ if (mCurrentNotification == NOTIFICATION_NONE) {
+ Log.d(this, "Showing notification for first time.");
+ }
+ retval = true;
+ }
+
+ mSavedIcon = icon;
+ mSavedContent = content;
+ mCallState = state;
+ mSavedLargeIcon = largeIcon;
+ mSavedContentTitle = contentTitle;
+ mRingtone = ringtone;
+
+ if (retval) {
+ Log.d(this, "Data changed. Showing notification");
+ }
+
+ return retval;
+ }
+
+ /**
+ * Returns the main string to use in the notification.
+ */
+ @NeededForTesting
+ String getContentTitle(ContactCacheEntry contactInfo, Call call) {
+ if (call.isConferenceCall() && !call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)) {
+ return mContext.getResources().getString(R.string.card_title_conf_call);
+ }
+
+ String preferredName = ContactDisplayUtils.getPreferredDisplayName(contactInfo.namePrimary,
+ contactInfo.nameAlternative, mContactsPreferences);
+ if (TextUtils.isEmpty(preferredName)) {
+ return TextUtils.isEmpty(contactInfo.number) ? null : BidiFormatter.getInstance()
+ .unicodeWrap(contactInfo.number, TextDirectionHeuristics.LTR);
+ }
+ return preferredName;
+ }
+
+ private void addPersonReference(Notification.Builder builder, ContactCacheEntry contactInfo,
+ Call call) {
+ // Query {@link Contacts#CONTENT_LOOKUP_URI} directly with work lookup key is not allowed.
+ // So, do not pass {@link Contacts#CONTENT_LOOKUP_URI} to NotificationManager to avoid
+ // NotificationManager using it.
+ if (contactInfo.lookupUri != null && contactInfo.userType != ContactsUtils.USER_TYPE_WORK) {
+ builder.addPerson(contactInfo.lookupUri.toString());
+ } else if (!TextUtils.isEmpty(call.getNumber())) {
+ builder.addPerson(Uri.fromParts(PhoneAccount.SCHEME_TEL,
+ call.getNumber(), null).toString());
+ }
+ }
+
+ /**
+ * Gets a large icon from the contact info object to display in the notification.
+ */
+ private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo, Call call) {
+ Bitmap largeIcon = null;
+ if (call.isConferenceCall() && !call.hasProperty(Details.PROPERTY_GENERIC_CONFERENCE)) {
+ largeIcon = BitmapFactory.decodeResource(mContext.getResources(),
+ R.drawable.img_conference);
+ }
+ if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) {
+ largeIcon = ((BitmapDrawable) contactInfo.photo).getBitmap();
+ }
+ return largeIcon;
+ }
+
+ private Bitmap getRoundedIcon(Bitmap bitmap) {
+ if (bitmap == null) {
+ return null;
+ }
+ final int height = (int) mContext.getResources().getDimension(
+ android.R.dimen.notification_large_icon_height);
+ final int width = (int) mContext.getResources().getDimension(
+ android.R.dimen.notification_large_icon_width);
+ return BitmapUtil.getRoundedBitmap(bitmap, width, height);
+ }
+
+ /**
+ * Returns the appropriate icon res Id to display based on the call for which
+ * we want to display information.
+ */
+ private int getIconToDisplay(Call call) {
+ // Even if both lines are in use, we only show a single item in
+ // the expanded Notifications UI. It's labeled "Ongoing call"
+ // (or "On hold" if there's only one call, and it's on hold.)
+ // Also, we don't have room to display caller-id info from two
+ // different calls. So if both lines are in use, display info
+ // from the foreground call. And if there's a ringing call,
+ // display that regardless of the state of the other calls.
+ if (call.getState() == Call.State.ONHOLD) {
+ return R.drawable.ic_phone_paused_white_24dp;
+ } else if (call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ return R.drawable.ic_videocam;
+ }
+ return R.drawable.ic_call_white_24dp;
+ }
+
+ /**
+ * Returns the message to use with the notification.
+ */
+ private String getContentString(Call call, @UserType long userType) {
+ boolean isIncomingOrWaiting = call.getState() == Call.State.INCOMING ||
+ call.getState() == Call.State.CALL_WAITING;
+
+ if (isIncomingOrWaiting &&
+ call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED) {
+
+ if (!TextUtils.isEmpty(call.getChildNumber())) {
+ return mContext.getString(R.string.child_number, call.getChildNumber());
+ } else if (!TextUtils.isEmpty(call.getCallSubject()) && call.isCallSubjectSupported()) {
+ return call.getCallSubject();
+ }
+ }
+
+ int resId = R.string.notification_ongoing_call;
+ if (call.hasProperty(Details.PROPERTY_WIFI)) {
+ resId = R.string.notification_ongoing_call_wifi;
+ }
+
+ if (isIncomingOrWaiting) {
+ if (call.hasProperty(Details.PROPERTY_WIFI)) {
+ resId = R.string.notification_incoming_call_wifi;
+ } else {
+ resId = R.string.notification_incoming_call;
+ }
+ } else if (call.getState() == Call.State.ONHOLD) {
+ resId = R.string.notification_on_hold;
+ } else if (Call.State.isDialing(call.getState())) {
+ resId = R.string.notification_dialing;
+ } else if (call.getSessionModificationState()
+ == Call.SessionModificationState.RECEIVED_UPGRADE_TO_VIDEO_REQUEST) {
+ resId = R.string.notification_requesting_video_call;
+ }
+
+ // Is the call placed through work connection service.
+ boolean isWorkCall = call.hasProperty(PROPERTY_ENTERPRISE_CALL);
+ if(userType == ContactsUtils.USER_TYPE_WORK || isWorkCall) {
+ resId = getWorkStringFromPersonalString(resId);
+ }
+
+ return mContext.getString(resId);
+ }
+
+ private static int getWorkStringFromPersonalString(int resId) {
+ if (resId == R.string.notification_ongoing_call) {
+ return R.string.notification_ongoing_work_call;
+ } else if (resId == R.string.notification_ongoing_call_wifi) {
+ return R.string.notification_ongoing_work_call_wifi;
+ } else if (resId == R.string.notification_incoming_call_wifi) {
+ return R.string.notification_incoming_work_call_wifi;
+ } else if (resId == R.string.notification_incoming_call) {
+ return R.string.notification_incoming_work_call;
+ } else {
+ return resId;
+ }
+ }
+
+ /**
+ * Gets the most relevant call to display in the notification.
+ */
+ private Call getCallToShow(CallList callList) {
+ if (callList == null) {
+ return null;
+ }
+ Call call = callList.getIncomingCall();
+ if (call == null) {
+ call = callList.getOutgoingCall();
+ }
+ if (call == null) {
+ call = callList.getVideoUpgradeRequestCall();
+ }
+ if (call == null) {
+ call = callList.getActiveOrBackgroundCall();
+ }
+ return call;
+ }
+
+ private void addAnswerAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"answer\" action in the incoming call Notification");
+
+ PendingIntent answerVoicePendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ANSWER_VOICE_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_call_white_24dp,
+ mContext.getText(R.string.notification_action_answer),
+ answerVoicePendingIntent);
+ }
+
+ private void addDismissAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"dismiss\" action in the incoming call Notification");
+
+ PendingIntent declinePendingIntent =
+ createNotificationPendingIntent(mContext, ACTION_DECLINE_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_close_dk,
+ mContext.getText(R.string.notification_action_dismiss),
+ declinePendingIntent);
+ }
+
+ private void addHangupAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"hang-up\" action in the ongoing active call Notification");
+
+ PendingIntent hangupPendingIntent =
+ createNotificationPendingIntent(mContext, ACTION_HANG_UP_ONGOING_CALL);
+ builder.addAction(R.drawable.ic_call_end_white_24dp,
+ mContext.getText(R.string.notification_action_end_call),
+ hangupPendingIntent);
+ }
+
+ private void addVideoCallAction(Notification.Builder builder) {
+ Log.i(this, "Will show \"video\" action in the incoming call Notification");
+
+ PendingIntent answerVideoPendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ANSWER_VIDEO_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_videocam,
+ mContext.getText(R.string.notification_action_answer_video),
+ answerVideoPendingIntent);
+ }
+
+ private void addVoiceAction(Notification.Builder builder) {
+ Log.d(this, "Will show \"voice\" action in the incoming call Notification");
+
+ PendingIntent answerVoicePendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ANSWER_VOICE_INCOMING_CALL);
+ builder.addAction(R.drawable.ic_call_white_24dp,
+ mContext.getText(R.string.notification_action_answer_voice),
+ answerVoicePendingIntent);
+ }
+
+ private void addAcceptUpgradeRequestAction(Notification.Builder builder) {
+ Log.i(this, "Will show \"accept upgrade\" action in the incoming call Notification");
+
+ PendingIntent acceptVideoPendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_ACCEPT_VIDEO_UPGRADE_REQUEST);
+ builder.addAction(0, mContext.getText(R.string.notification_action_accept),
+ acceptVideoPendingIntent);
+ }
+
+ private void addDismissUpgradeRequestAction(Notification.Builder builder) {
+ Log.i(this, "Will show \"dismiss upgrade\" action in the incoming call Notification");
+
+ PendingIntent declineVideoPendingIntent = createNotificationPendingIntent(
+ mContext, ACTION_DECLINE_VIDEO_UPGRADE_REQUEST);
+ builder.addAction(0, mContext.getText(R.string.notification_action_dismiss),
+ declineVideoPendingIntent);
+ }
+
+ /**
+ * Adds fullscreen intent to the builder.
+ */
+ private void configureFullScreenIntent(Notification.Builder builder, PendingIntent intent,
+ Call call) {
+ // Ok, we actually want to launch the incoming call
+ // UI at this point (in addition to simply posting a notification
+ // to the status bar). Setting fullScreenIntent will cause
+ // the InCallScreen to be launched immediately *unless* the
+ // current foreground activity is marked as "immersive".
+ Log.d(this, "- Setting fullScreenIntent: " + intent);
+ builder.setFullScreenIntent(intent, true);
+
+ // Ugly hack alert:
+ //
+ // The NotificationManager has the (undocumented) behavior
+ // that it will *ignore* the fullScreenIntent field if you
+ // post a new Notification that matches the ID of one that's
+ // already active. Unfortunately this is exactly what happens
+ // when you get an incoming call-waiting call: the
+ // "ongoing call" notification is already visible, so the
+ // InCallScreen won't get launched in this case!
+ // (The result: if you bail out of the in-call UI while on a
+ // call and then get a call-waiting call, the incoming call UI
+ // won't come up automatically.)
+ //
+ // The workaround is to just notice this exact case (this is a
+ // call-waiting call *and* the InCallScreen is not in the
+ // foreground) and manually cancel the in-call notification
+ // before (re)posting it.
+ //
+ // TODO: there should be a cleaner way of avoiding this
+ // problem (see discussion in bug 3184149.)
+
+ // If a call is onhold during an incoming call, the call actually comes in as
+ // INCOMING. For that case *and* traditional call-waiting, we want to
+ // cancel the notification.
+ boolean isCallWaiting = (call.getState() == Call.State.CALL_WAITING ||
+ (call.getState() == Call.State.INCOMING &&
+ CallList.getInstance().getBackgroundCall() != null));
+
+ if (isCallWaiting) {
+ Log.i(this, "updateInCallNotification: call-waiting! force relaunch...");
+ // Cancel the IN_CALL_NOTIFICATION immediately before
+ // (re)posting it; this seems to force the
+ // NotificationManager to launch the fullScreenIntent.
+ mNotificationManager.cancel(NOTIFICATION_IN_CALL);
+ }
+ }
+
+ private Notification.Builder getNotificationBuilder() {
+ final Notification.Builder builder = new Notification.Builder(mContext);
+ builder.setOngoing(true);
+
+ // Make the notification prioritized over the other normal notifications.
+ builder.setPriority(Notification.PRIORITY_HIGH);
+
+ return builder;
+ }
+
+ private PendingIntent createLaunchPendingIntent() {
+
+ final Intent intent = InCallPresenter.getInstance().getInCallIntent(
+ false /* showDialpad */, false /* newOutgoingCall */);
+
+ // PendingIntent that can be used to launch the InCallActivity. The
+ // system fires off this intent if the user pulls down the windowshade
+ // and clicks the notification's expanded view. It's also used to
+ // launch the InCallActivity immediately when when there's an incoming
+ // call (see the "fullScreenIntent" field below).
+ PendingIntent inCallPendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
+
+ return inCallPendingIntent;
+ }
+
+ /**
+ * Returns PendingIntent for answering a phone call. This will typically be used from
+ * Notification context.
+ */
+ private static PendingIntent createNotificationPendingIntent(Context context, String action) {
+ final Intent intent = new Intent(action, null,
+ context, NotificationBroadcastReceiver.class);
+ return PendingIntent.getBroadcast(context, 0, intent, 0);
+ }
+
+ @Override
+ public void onCallChanged(Call call) {
+ if (CallList.getInstance().getIncomingCall() == null) {
+ mDialerRingtoneManager.stopCallWaitingTone();
+ }
+ }
+
+ /**
+ * Responds to changes in the session modification state for the call by dismissing the
+ * status bar notification as required.
+ *
+ * @param sessionModificationState The new session modification state.
+ */
+ @Override
+ public void onSessionModificationStateChange(int sessionModificationState) {
+ if (sessionModificationState == Call.SessionModificationState.NO_REQUEST) {
+ if (mCallId != null) {
+ CallList.getInstance().removeCallUpdateListener(mCallId, this);
+ }
+
+ updateNotification(mInCallState, CallList.getInstance());
+ }
+ }
+
+ @Override
+ public void onLastForwardedNumberChange() {
+ // no-op
+ }
+
+ @Override
+ public void onChildNumberChange() {
+ // no-op
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/TelecomAdapter.java b/InCallUI/src/com/android/incallui/TelecomAdapter.java
new file mode 100644
index 000000000..f172270dd
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/TelecomAdapter.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.google.common.base.Preconditions;
+
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.os.Looper;
+import android.telecom.InCallService;
+import android.telecom.PhoneAccountHandle;
+
+import java.util.List;
+
+final class TelecomAdapter implements InCallServiceListener {
+ private static final String ADD_CALL_MODE_KEY = "add_call_mode";
+
+ private static TelecomAdapter sInstance;
+ private InCallService mInCallService;
+
+ static TelecomAdapter getInstance() {
+ Preconditions.checkState(Looper.getMainLooper().getThread() == Thread.currentThread());
+ if (sInstance == null) {
+ sInstance = new TelecomAdapter();
+ }
+ return sInstance;
+ }
+
+ private TelecomAdapter() {
+ }
+
+ @Override
+ public void setInCallService(InCallService inCallService) {
+ mInCallService = inCallService;
+ }
+
+ @Override
+ public void clearInCallService() {
+ mInCallService = null;
+ }
+
+ private android.telecom.Call getTelecomCallById(String callId) {
+ Call call = CallList.getInstance().getCallById(callId);
+ return call == null ? null : call.getTelecomCall();
+ }
+
+ void answerCall(String callId, int videoState) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.answer(videoState);
+ } else {
+ Log.e(this, "error answerCall, call not in call list: " + callId);
+ }
+ }
+
+ void rejectCall(String callId, boolean rejectWithMessage, String message) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.reject(rejectWithMessage, message);
+ } else {
+ Log.e(this, "error rejectCall, call not in call list: " + callId);
+ }
+ }
+
+ void disconnectCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.disconnect();
+ } else {
+ Log.e(this, "error disconnectCall, call not in call list " + callId);
+ }
+ }
+
+ void holdCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.hold();
+ } else {
+ Log.e(this, "error holdCall, call not in call list " + callId);
+ }
+ }
+
+ void unholdCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.unhold();
+ } else {
+ Log.e(this, "error unholdCall, call not in call list " + callId);
+ }
+ }
+
+ void mute(boolean shouldMute) {
+ if (mInCallService != null) {
+ mInCallService.setMuted(shouldMute);
+ } else {
+ Log.e(this, "error mute, mInCallService is null");
+ }
+ }
+
+ void setAudioRoute(int route) {
+ if (mInCallService != null) {
+ mInCallService.setAudioRoute(route);
+ } else {
+ Log.e(this, "error setAudioRoute, mInCallService is null");
+ }
+ }
+
+ void separateCall(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.splitFromConference();
+ } else {
+ Log.e(this, "error separateCall, call not in call list " + callId);
+ }
+ }
+
+ void merge(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ List<android.telecom.Call> conferenceable = call.getConferenceableCalls();
+ if (!conferenceable.isEmpty()) {
+ call.conference(conferenceable.get(0));
+ } else {
+ if (call.getDetails().can(android.telecom.Call.Details.CAPABILITY_MERGE_CONFERENCE)) {
+ call.mergeConference();
+ }
+ }
+ } else {
+ Log.e(this, "error merge, call not in call list " + callId);
+ }
+ }
+
+ void swap(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ if (call.getDetails().can(android.telecom.Call.Details.CAPABILITY_SWAP_CONFERENCE)) {
+ call.swapConference();
+ }
+ } else {
+ Log.e(this, "error swap, call not in call list " + callId);
+ }
+ }
+
+ void addCall() {
+ if (mInCallService != null) {
+ Intent intent = new Intent(Intent.ACTION_DIAL);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ // when we request the dialer come up, we also want to inform
+ // it that we're going through the "add call" option from the
+ // InCallScreen / PhoneUtils.
+ intent.putExtra(ADD_CALL_MODE_KEY, true);
+ try {
+ Log.d(this, "Sending the add Call intent");
+ mInCallService.startActivity(intent);
+ } catch (ActivityNotFoundException e) {
+ // This is rather rare but possible.
+ // Note: this method is used even when the phone is encrypted. At that moment
+ // the system may not find any Activity which can accept this Intent.
+ Log.e(this, "Activity for adding calls isn't found.", e);
+ }
+ }
+ }
+
+ void playDtmfTone(String callId, char digit) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.playDtmfTone(digit);
+ } else {
+ Log.e(this, "error playDtmfTone, call not in call list " + callId);
+ }
+ }
+
+ void stopDtmfTone(String callId) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.stopDtmfTone();
+ } else {
+ Log.e(this, "error stopDtmfTone, call not in call list " + callId);
+ }
+ }
+
+ void postDialContinue(String callId, boolean proceed) {
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.postDialContinue(proceed);
+ } else {
+ Log.e(this, "error postDialContinue, call not in call list " + callId);
+ }
+ }
+
+ void phoneAccountSelected(String callId, PhoneAccountHandle accountHandle, boolean setDefault) {
+ if (accountHandle == null) {
+ Log.e(this, "error phoneAccountSelected, accountHandle is null");
+ // TODO: Do we really want to send null accountHandle?
+ }
+
+ android.telecom.Call call = getTelecomCallById(callId);
+ if (call != null) {
+ call.phoneAccountSelected(accountHandle, setDefault);
+ } else {
+ Log.e(this, "error phoneAccountSelected, call not in call list " + callId);
+ }
+ }
+
+ boolean canAddCall() {
+ if (mInCallService != null) {
+ return mInCallService.canAddCall();
+ }
+ return false;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/Ui.java b/InCallUI/src/com/android/incallui/Ui.java
new file mode 100644
index 000000000..e453ccb1c
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/Ui.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+/**
+ * Base class for all presenter ui.
+ */
+public interface Ui {
+
+}
diff --git a/InCallUI/src/com/android/incallui/VideoCallFragment.java b/InCallUI/src/com/android/incallui/VideoCallFragment.java
new file mode 100644
index 000000000..cb8c6449b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoCallFragment.java
@@ -0,0 +1,899 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.graphics.Matrix;
+import android.graphics.Point;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.Surface;
+import android.view.TextureView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewStub;
+import android.view.ViewTreeObserver;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+
+import com.android.dialer.R;
+import com.android.phone.common.animation.AnimUtils;
+import com.google.common.base.Objects;
+
+/**
+ * Fragment containing video calling surfaces.
+ */
+public class VideoCallFragment extends BaseFragment<VideoCallPresenter,
+ VideoCallPresenter.VideoCallUi> implements VideoCallPresenter.VideoCallUi {
+ private static final String TAG = VideoCallFragment.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
+ /**
+ * Used to indicate that the surface dimensions are not set.
+ */
+ private static final int DIMENSIONS_NOT_SET = -1;
+
+ /**
+ * Surface ID for the display surface.
+ */
+ public static final int SURFACE_DISPLAY = 1;
+
+ /**
+ * Surface ID for the preview surface.
+ */
+ public static final int SURFACE_PREVIEW = 2;
+
+ /**
+ * Used to indicate that the UI rotation is unknown.
+ */
+ public static final int ORIENTATION_UNKNOWN = -1;
+
+ // Static storage used to retain the video surfaces across Activity restart.
+ // TextureViews are not parcelable, so it is not possible to store them in the saved state.
+ private static boolean sVideoSurfacesInUse = false;
+ private static VideoCallSurface sPreviewSurface = null;
+ private static VideoCallSurface sDisplaySurface = null;
+ private static Point sDisplaySize = null;
+
+ /**
+ * {@link ViewStub} holding the video call surfaces. This is the parent for the
+ * {@link VideoCallFragment}. Used to ensure that the video surfaces are only inflated when
+ * required.
+ */
+ private ViewStub mVideoViewsStub;
+
+ /**
+ * Inflated view containing the video call surfaces represented by the {@link ViewStub}.
+ */
+ private View mVideoViews;
+
+ /**
+ * The {@link FrameLayout} containing the preview surface.
+ */
+ private View mPreviewVideoContainer;
+
+ /**
+ * Icon shown to indicate that the outgoing camera has been turned off.
+ */
+ private View mCameraOff;
+
+ /**
+ * {@link ImageView} containing the user's profile photo.
+ */
+ private ImageView mPreviewPhoto;
+
+ /**
+ * {@code True} when the layout of the activity has been completed.
+ */
+ private boolean mIsLayoutComplete = false;
+
+ /**
+ * {@code True} if in landscape mode.
+ */
+ private boolean mIsLandscape;
+
+ private int mAnimationDuration;
+
+ /**
+ * Inner-class representing a {@link TextureView} and its associated {@link SurfaceTexture} and
+ * {@link Surface}. Used to manage the lifecycle of these objects across device orientation
+ * changes.
+ */
+ private static class VideoCallSurface implements TextureView.SurfaceTextureListener,
+ View.OnClickListener, View.OnAttachStateChangeListener {
+ private int mSurfaceId;
+ private VideoCallPresenter mPresenter;
+ private TextureView mTextureView;
+ private SurfaceTexture mSavedSurfaceTexture;
+ private Surface mSavedSurface;
+ private boolean mIsDoneWithSurface;
+ private int mWidth = DIMENSIONS_NOT_SET;
+ private int mHeight = DIMENSIONS_NOT_SET;
+
+ /**
+ * Creates an instance of a {@link VideoCallSurface}.
+ *
+ * @param surfaceId The surface ID of the surface.
+ * @param textureView The {@link TextureView} for the surface.
+ */
+ public VideoCallSurface(VideoCallPresenter presenter, int surfaceId,
+ TextureView textureView) {
+ this(presenter, surfaceId, textureView, DIMENSIONS_NOT_SET, DIMENSIONS_NOT_SET);
+ }
+
+ /**
+ * Creates an instance of a {@link VideoCallSurface}.
+ *
+ * @param surfaceId The surface ID of the surface.
+ * @param textureView The {@link TextureView} for the surface.
+ * @param width The width of the surface.
+ * @param height The height of the surface.
+ */
+ public VideoCallSurface(VideoCallPresenter presenter,int surfaceId, TextureView textureView,
+ int width, int height) {
+ Log.d(this, "VideoCallSurface: surfaceId=" + surfaceId +
+ " width=" + width + " height=" + height);
+ mPresenter = presenter;
+ mWidth = width;
+ mHeight = height;
+ mSurfaceId = surfaceId;
+
+ recreateView(textureView);
+ }
+
+ /**
+ * Recreates a {@link VideoCallSurface} after a device orientation change. Re-applies the
+ * saved {@link SurfaceTexture} to the
+ *
+ * @param view The {@link TextureView}.
+ */
+ public void recreateView(TextureView view) {
+ if (DEBUG) {
+ Log.i(TAG, "recreateView: " + view);
+ }
+
+ if (mTextureView == view) {
+ return;
+ }
+
+ mTextureView = view;
+ mTextureView.setSurfaceTextureListener(this);
+ mTextureView.setOnClickListener(this);
+
+ final boolean areSameSurfaces =
+ Objects.equal(mSavedSurfaceTexture, mTextureView.getSurfaceTexture());
+ Log.d(this, "recreateView: SavedSurfaceTexture=" + mSavedSurfaceTexture
+ + " areSameSurfaces=" + areSameSurfaces);
+ if (mSavedSurfaceTexture != null && !areSameSurfaces) {
+ mTextureView.setSurfaceTexture(mSavedSurfaceTexture);
+ if (createSurface(mWidth, mHeight)) {
+ onSurfaceCreated();
+ }
+ }
+ mIsDoneWithSurface = false;
+ }
+
+ public void resetPresenter(VideoCallPresenter presenter) {
+ Log.d(this, "resetPresenter: CurrentPresenter=" + mPresenter + " NewPresenter="
+ + presenter);
+ mPresenter = presenter;
+ }
+
+ /**
+ * Handles {@link SurfaceTexture} callback to indicate that a {@link SurfaceTexture} has
+ * been successfully created.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture} which has been created.
+ * @param width The width of the {@link SurfaceTexture}.
+ * @param height The height of the {@link SurfaceTexture}.
+ */
+ @Override
+ public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
+ int height) {
+ boolean surfaceCreated;
+ if (DEBUG) {
+ Log.i(TAG, "onSurfaceTextureAvailable: " + surfaceTexture);
+ }
+ // Where there is no saved {@link SurfaceTexture} available, use the newly created one.
+ // If a saved {@link SurfaceTexture} is available, we are re-creating after an
+ // orientation change.
+ Log.d(this, " onSurfaceTextureAvailable mSurfaceId=" + mSurfaceId + " surfaceTexture="
+ + surfaceTexture + " width=" + width
+ + " height=" + height + " mSavedSurfaceTexture=" + mSavedSurfaceTexture);
+ Log.d(this, " onSurfaceTextureAvailable VideoCallPresenter=" + mPresenter);
+ if (mSavedSurfaceTexture == null) {
+ mSavedSurfaceTexture = surfaceTexture;
+ surfaceCreated = createSurface(width, height);
+ } else {
+ // A saved SurfaceTexture was found.
+ Log.d(this, " onSurfaceTextureAvailable: Replacing with cached surface...");
+ mTextureView.setSurfaceTexture(mSavedSurfaceTexture);
+ surfaceCreated = true;
+ }
+
+ // Inform presenter that the surface is available.
+ if (surfaceCreated) {
+ onSurfaceCreated();
+ }
+ }
+
+ private void onSurfaceCreated() {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceCreated(mSurfaceId);
+ } else {
+ Log.e(this, "onSurfaceTextureAvailable: Presenter is null");
+ }
+ }
+
+ /**
+ * Handles a change in the {@link SurfaceTexture}'s size.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture}.
+ * @param width The new width.
+ * @param height The new height.
+ */
+ @Override
+ public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
+ int height) {
+ // Not handled
+ }
+
+ /**
+ * Handles {@link SurfaceTexture} destruct callback, indicating that it has been destroyed.
+ *
+ * @param surfaceTexture The {@link SurfaceTexture}.
+ * @return {@code True} if the {@link TextureView} can release the {@link SurfaceTexture}.
+ */
+ @Override
+ public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
+ /**
+ * Destroying the surface texture; inform the presenter so it can null the surfaces.
+ */
+ Log.d(this, " onSurfaceTextureDestroyed mSurfaceId=" + mSurfaceId + " surfaceTexture="
+ + surfaceTexture + " SavedSurfaceTexture=" + mSavedSurfaceTexture
+ + " SavedSurface=" + mSavedSurface);
+ Log.d(this, " onSurfaceTextureDestroyed VideoCallPresenter=" + mPresenter);
+
+ // Notify presenter if it is not null.
+ onSurfaceDestroyed();
+
+ if (mIsDoneWithSurface) {
+ onSurfaceReleased();
+ if (mSavedSurface != null) {
+ mSavedSurface.release();
+ mSavedSurface = null;
+ }
+ }
+ return mIsDoneWithSurface;
+ }
+
+ private void onSurfaceDestroyed() {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceDestroyed(mSurfaceId);
+ } else {
+ Log.e(this, "onSurfaceTextureDestroyed: Presenter is null.");
+ }
+ }
+
+ /**
+ * Handles {@link SurfaceTexture} update callback.
+ * @param surface
+ */
+ @Override
+ public void onSurfaceTextureUpdated(SurfaceTexture surface) {
+ // Not Handled
+ }
+
+ @Override
+ public void onViewAttachedToWindow(View v) {
+ if (DEBUG) {
+ Log.i(TAG, "OnViewAttachedToWindow");
+ }
+ if (mSavedSurfaceTexture != null) {
+ mTextureView.setSurfaceTexture(mSavedSurfaceTexture);
+ }
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(View v) {}
+
+ /**
+ * Retrieves the current {@link TextureView}.
+ *
+ * @return The {@link TextureView}.
+ */
+ public TextureView getTextureView() {
+ return mTextureView;
+ }
+
+ /**
+ * Called by the user presenter to indicate that the surface is no longer required due to a
+ * change in video state. Releases and clears out the saved surface and surface textures.
+ */
+ public void setDoneWithSurface() {
+ Log.d(this, "setDoneWithSurface: SavedSurface=" + mSavedSurface
+ + " SavedSurfaceTexture=" + mSavedSurfaceTexture);
+ mIsDoneWithSurface = true;
+ if (mTextureView != null && mTextureView.isAvailable()) {
+ return;
+ }
+
+ if (mSavedSurface != null) {
+ onSurfaceReleased();
+ mSavedSurface.release();
+ mSavedSurface = null;
+ }
+ if (mSavedSurfaceTexture != null) {
+ mSavedSurfaceTexture.release();
+ mSavedSurfaceTexture = null;
+ }
+ }
+
+ private void onSurfaceReleased() {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceReleased(mSurfaceId);
+ } else {
+ Log.d(this, "setDoneWithSurface: Presenter is null.");
+ }
+ }
+
+ /**
+ * Retrieves the saved surface instance.
+ *
+ * @return The surface.
+ */
+ public Surface getSurface() {
+ return mSavedSurface;
+ }
+
+ /**
+ * Sets the dimensions of the surface.
+ *
+ * @param width The width of the surface, in pixels.
+ * @param height The height of the surface, in pixels.
+ */
+ public void setSurfaceDimensions(int width, int height) {
+ Log.d(this, "setSurfaceDimensions, width=" + width + " height=" + height);
+ mWidth = width;
+ mHeight = height;
+
+ if (width != DIMENSIONS_NOT_SET && height != DIMENSIONS_NOT_SET
+ && mSavedSurfaceTexture != null) {
+ Log.d(this, "setSurfaceDimensions, mSavedSurfaceTexture is NOT equal to null.");
+ mSavedSurfaceTexture.setDefaultBufferSize(width, height);
+ }
+ }
+
+ /**
+ * Creates the {@link Surface}, adjusting the {@link SurfaceTexture} buffer size.
+ * @param width The width of the surface to create.
+ * @param height The height of the surface to create.
+ */
+ private boolean createSurface(int width, int height) {
+ Log.d(this, "createSurface mSavedSurfaceTexture=" + mSavedSurfaceTexture
+ + " mSurfaceId =" + mSurfaceId + " mWidth " + width + " mHeight=" + height);
+ if (width != DIMENSIONS_NOT_SET && height != DIMENSIONS_NOT_SET
+ && mSavedSurfaceTexture != null) {
+ mSavedSurfaceTexture.setDefaultBufferSize(width, height);
+ mSavedSurface = new Surface(mSavedSurfaceTexture);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Handles a user clicking the surface, which is the trigger to toggle the full screen
+ * Video UI.
+ *
+ * @param view The view receiving the click.
+ */
+ @Override
+ public void onClick(View view) {
+ if (mPresenter != null) {
+ mPresenter.onSurfaceClick(mSurfaceId);
+ } else {
+ Log.e(this, "onClick: Presenter is null.");
+ }
+ }
+
+ /**
+ * Returns the dimensions of the surface.
+ *
+ * @return The dimensions of the surface.
+ */
+ public Point getSurfaceDimensions() {
+ return new Point(mWidth, mHeight);
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ mAnimationDuration = getResources().getInteger(R.integer.video_animation_duration);
+ }
+
+ /**
+ * Handles creation of the activity and initialization of the presenter.
+ *
+ * @param savedInstanceState The saved instance state.
+ */
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ mIsLandscape = getResources().getBoolean(R.bool.is_layout_landscape);
+
+ Log.d(this, "onActivityCreated: IsLandscape=" + mIsLandscape);
+ getPresenter().init(getActivity());
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ super.onCreateView(inflater, container, savedInstanceState);
+
+ final View view = inflater.inflate(R.layout.video_call_fragment, container, false);
+
+ return view;
+ }
+
+ /**
+ * Centers the display view vertically for portrait orientations. The view is centered within
+ * the available space not occupied by the call card. This is a no-op for landscape mode.
+ *
+ * @param displayVideo The video view to center.
+ */
+ private void centerDisplayView(View displayVideo) {
+ if (!mIsLandscape) {
+ ViewGroup.LayoutParams p = displayVideo.getLayoutParams();
+ int height = p.height;
+
+ float spaceBesideCallCard = InCallPresenter.getInstance().getSpaceBesideCallCard();
+ // If space beside call card is zeo, layout hasn't happened yet so there is no point
+ // in attempting to center the view.
+ if (Math.abs(spaceBesideCallCard - 0.0f) < 0.0001) {
+ return;
+ }
+ float videoViewTranslation = height / 2 - spaceBesideCallCard / 2;
+ displayVideo.setTranslationY(videoViewTranslation);
+ }
+ }
+
+ /**
+ * After creation of the fragment view, retrieves the required views.
+ *
+ * @param view The fragment view.
+ * @param savedInstanceState The saved instance state.
+ */
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+ Log.d(this, "onViewCreated: VideoSurfacesInUse=" + sVideoSurfacesInUse);
+
+ mVideoViewsStub = (ViewStub) view.findViewById(R.id.videoCallViewsStub);
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+ Log.d(this, "onStop:");
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ Log.d(this, "onPause:");
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ Log.d(this, "onDestroyView:");
+ }
+
+ /**
+ * Creates the presenter for the {@link VideoCallFragment}.
+ * @return The presenter instance.
+ */
+ @Override
+ public VideoCallPresenter createPresenter() {
+ Log.d(this, "createPresenter");
+ VideoCallPresenter presenter = new VideoCallPresenter();
+ onPresenterChanged(presenter);
+ return presenter;
+ }
+
+ /**
+ * @return The user interface for the presenter, which is this fragment.
+ */
+ @Override
+ public VideoCallPresenter.VideoCallUi getUi() {
+ return this;
+ }
+
+ /**
+ * Inflate video surfaces.
+ *
+ * @param show {@code True} if the video surfaces should be shown.
+ */
+ private void inflateVideoUi(boolean show) {
+ int visibility = show ? View.VISIBLE : View.GONE;
+ getView().setVisibility(visibility);
+
+ if (show) {
+ inflateVideoCallViews();
+ }
+
+ if (mVideoViews != null) {
+ mVideoViews.setVisibility(visibility);
+ }
+ }
+
+ /**
+ * Hides and shows the incoming video view and changes the outgoing video view's state based on
+ * whether outgoing view is enabled or not.
+ */
+ public void showVideoViews(boolean previewPaused, boolean showIncoming) {
+ inflateVideoUi(true);
+
+ View incomingVideoView = mVideoViews.findViewById(R.id.incomingVideo);
+ if (incomingVideoView != null) {
+ incomingVideoView.setVisibility(showIncoming ? View.VISIBLE : View.INVISIBLE);
+ }
+ if (mCameraOff != null) {
+ mCameraOff.setVisibility(!previewPaused ? View.VISIBLE : View.INVISIBLE);
+ }
+ if (mPreviewPhoto != null) {
+ mPreviewPhoto.setVisibility(!previewPaused ? View.VISIBLE : View.INVISIBLE);
+ }
+ }
+
+ /**
+ * Hide all video views.
+ */
+ public void hideVideoUi() {
+ inflateVideoUi(false);
+ }
+
+ /**
+ * Cleans up the video telephony surfaces. Used when the presenter indicates a change to an
+ * audio-only state. Since the surfaces are static, it is important to ensure they are cleaned
+ * up promptly.
+ */
+ @Override
+ public void cleanupSurfaces() {
+ Log.d(this, "cleanupSurfaces");
+ if (sDisplaySurface != null) {
+ sDisplaySurface.setDoneWithSurface();
+ sDisplaySurface = null;
+ }
+ if (sPreviewSurface != null) {
+ sPreviewSurface.setDoneWithSurface();
+ sPreviewSurface = null;
+ }
+ sVideoSurfacesInUse = false;
+ }
+
+ @Override
+ public ImageView getPreviewPhotoView() {
+ return mPreviewPhoto;
+ }
+
+ /**
+ * Adjusts the location of the video preview view by the specified offset.
+ *
+ * @param shiftUp {@code true} if the preview should shift up, {@code false} if it should shift
+ * down.
+ * @param offset The offset.
+ */
+ @Override
+ public void adjustPreviewLocation(boolean shiftUp, int offset) {
+ if (sPreviewSurface == null || mPreviewVideoContainer == null) {
+ return;
+ }
+
+ // Set the position of the secondary call info card to its starting location.
+ mPreviewVideoContainer.setTranslationY(shiftUp ? 0 : -offset);
+
+ // Animate the secondary card info slide up/down as it appears and disappears.
+ mPreviewVideoContainer.animate()
+ .setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
+ .setDuration(mAnimationDuration)
+ .translationY(shiftUp ? -offset : 0)
+ .start();
+ }
+
+ private void onPresenterChanged(VideoCallPresenter presenter) {
+ Log.d(this, "onPresenterChanged: Presenter=" + presenter);
+ if (sDisplaySurface != null) {
+ sDisplaySurface.resetPresenter(presenter);;
+ }
+ if (sPreviewSurface != null) {
+ sPreviewSurface.resetPresenter(presenter);
+ }
+ }
+
+ /**
+ * @return {@code True} if the display video surface has been created.
+ */
+ @Override
+ public boolean isDisplayVideoSurfaceCreated() {
+ boolean ret = sDisplaySurface != null && sDisplaySurface.getSurface() != null;
+ Log.d(this, " isDisplayVideoSurfaceCreated returns " + ret);
+ return ret;
+ }
+
+ /**
+ * @return {@code True} if the preview video surface has been created.
+ */
+ @Override
+ public boolean isPreviewVideoSurfaceCreated() {
+ boolean ret = sPreviewSurface != null && sPreviewSurface.getSurface() != null;
+ Log.d(this, " isPreviewVideoSurfaceCreated returns " + ret);
+ return ret;
+ }
+
+ /**
+ * {@link android.view.Surface} on which incoming video for a video call is displayed.
+ * {@code Null} until the video views {@link android.view.ViewStub} is inflated.
+ */
+ @Override
+ public Surface getDisplayVideoSurface() {
+ return sDisplaySurface == null ? null : sDisplaySurface.getSurface();
+ }
+
+ /**
+ * {@link android.view.Surface} on which a preview of the outgoing video for a video call is
+ * displayed. {@code Null} until the video views {@link android.view.ViewStub} is inflated.
+ */
+ @Override
+ public Surface getPreviewVideoSurface() {
+ return sPreviewSurface == null ? null : sPreviewSurface.getSurface();
+ }
+
+ /**
+ * Changes the dimensions of the preview surface. Called when the dimensions change due to a
+ * device orientation change.
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ @Override
+ public void setPreviewSize(int width, int height) {
+ Log.d(this, "setPreviewSize: width=" + width + " height=" + height);
+ if (sPreviewSurface != null) {
+ TextureView preview = sPreviewSurface.getTextureView();
+
+ if (preview == null ) {
+ return;
+ }
+
+ // Set the dimensions of both the video surface and the FrameLayout containing it.
+ ViewGroup.LayoutParams params = preview.getLayoutParams();
+ params.width = width;
+ params.height = height;
+ preview.setLayoutParams(params);
+
+ if (mPreviewVideoContainer != null) {
+ ViewGroup.LayoutParams containerParams = mPreviewVideoContainer.getLayoutParams();
+ containerParams.width = width;
+ containerParams.height = height;
+ mPreviewVideoContainer.setLayoutParams(containerParams);
+ }
+
+ // The width and height are interchanged outside of this method based on the current
+ // orientation, so we can transform using "width", which will be either the width or
+ // the height.
+ Matrix transform = new Matrix();
+ transform.setScale(-1, 1, width/2, 0);
+ preview.setTransform(transform);
+ }
+ }
+
+ /**
+ * Sets the rotation of the preview surface. Called when the dimensions change due to a
+ * device orientation change.
+ *
+ * Please note that the screen orientation passed in is subtracted from 360 to get the actual
+ * preview rotation values.
+ *
+ * @param rotation The screen orientation. One of -
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ */
+ @Override
+ public void setPreviewRotation(int orientation) {
+ Log.d(this, "setPreviewRotation: orientation=" + orientation);
+ if (sPreviewSurface != null) {
+ TextureView preview = sPreviewSurface.getTextureView();
+
+ if (preview == null ) {
+ return;
+ }
+
+ preview.setRotation(orientation);
+ }
+ }
+
+ @Override
+ public void setPreviewSurfaceSize(int width, int height) {
+ final boolean isPreviewSurfaceAvailable = sPreviewSurface != null;
+ Log.d(this, "setPreviewSurfaceSize: width=" + width + " height=" + height +
+ " isPreviewSurfaceAvailable=" + isPreviewSurfaceAvailable);
+ if (isPreviewSurfaceAvailable) {
+ sPreviewSurface.setSurfaceDimensions(width, height);
+ }
+ }
+
+ /**
+ * returns UI's current orientation.
+ */
+ @Override
+ public int getCurrentRotation() {
+ try {
+ return getActivity().getWindowManager().getDefaultDisplay().getRotation();
+ } catch (Exception e) {
+ Log.e(this, "getCurrentRotation: Retrieving current rotation failed. Ex=" + e);
+ }
+ return ORIENTATION_UNKNOWN;
+ }
+
+ /**
+ * Changes the dimensions of the display video surface. Called when the dimensions change due to
+ * a peer resolution update
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ @Override
+ public void setDisplayVideoSize(int width, int height) {
+ Log.v(this, "setDisplayVideoSize: width=" + width + " height=" + height);
+ if (sDisplaySurface != null) {
+ TextureView displayVideo = sDisplaySurface.getTextureView();
+ if (displayVideo == null) {
+ Log.e(this, "Display Video texture view is null. Bail out");
+ return;
+ }
+ sDisplaySize = new Point(width, height);
+ setSurfaceSizeAndTranslation(displayVideo, sDisplaySize);
+ } else {
+ Log.e(this, "Display Video Surface is null. Bail out");
+ }
+ }
+
+ /**
+ * Determines the size of the device screen.
+ *
+ * @return {@link Point} specifying the width and height of the screen.
+ */
+ @Override
+ public Point getScreenSize() {
+ // Get current screen size.
+ Display display = getActivity().getWindowManager().getDefaultDisplay();
+ Point size = new Point();
+ display.getSize(size);
+
+ return size;
+ }
+
+ /**
+ * Determines the size of the preview surface.
+ *
+ * @return {@link Point} specifying the width and height of the preview surface.
+ */
+ @Override
+ public Point getPreviewSize() {
+ if (sPreviewSurface == null) {
+ return null;
+ }
+ return sPreviewSurface.getSurfaceDimensions();
+ }
+
+ /**
+ * Inflates the {@link ViewStub} containing the incoming and outgoing surfaces, if necessary,
+ * and creates {@link VideoCallSurface} instances to track the surfaces.
+ */
+ private void inflateVideoCallViews() {
+ Log.d(this, "inflateVideoCallViews");
+ if (mVideoViews == null ) {
+ mVideoViews = mVideoViewsStub.inflate();
+ }
+
+ if (mVideoViews != null) {
+ mPreviewVideoContainer = mVideoViews.findViewById(R.id.previewVideoContainer);
+ mCameraOff = mVideoViews.findViewById(R.id.previewCameraOff);
+ mPreviewPhoto = (ImageView) mVideoViews.findViewById(R.id.previewProfilePhoto);
+
+ TextureView displaySurface = (TextureView) mVideoViews.findViewById(R.id.incomingVideo);
+
+ Log.d(this, "inflateVideoCallViews: sVideoSurfacesInUse=" + sVideoSurfacesInUse);
+ //If peer adjusted screen size is not available, set screen size to default display size
+ Point screenSize = sDisplaySize == null ? getScreenSize() : sDisplaySize;
+ setSurfaceSizeAndTranslation(displaySurface, screenSize);
+
+ if (!sVideoSurfacesInUse) {
+ // Where the video surfaces are not already in use (first time creating them),
+ // setup new VideoCallSurface instances to track them.
+ Log.d(this, " inflateVideoCallViews screenSize" + screenSize);
+
+ sDisplaySurface = new VideoCallSurface(getPresenter(), SURFACE_DISPLAY,
+ (TextureView) mVideoViews.findViewById(R.id.incomingVideo), screenSize.x,
+ screenSize.y);
+ sPreviewSurface = new VideoCallSurface(getPresenter(), SURFACE_PREVIEW,
+ (TextureView) mVideoViews.findViewById(R.id.previewVideo));
+ sVideoSurfacesInUse = true;
+ } else {
+ // In this case, the video surfaces are already in use (we are recreating the
+ // Fragment after a destroy/create cycle resulting from a rotation.
+ sDisplaySurface.recreateView((TextureView) mVideoViews.findViewById(
+ R.id.incomingVideo));
+ sPreviewSurface.recreateView((TextureView) mVideoViews.findViewById(
+ R.id.previewVideo));
+ }
+
+ // Attempt to center the incoming video view, if it is in the layout.
+ final ViewTreeObserver observer = mVideoViews.getViewTreeObserver();
+ observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ // Check if the layout includes the incoming video surface -- this will only be the
+ // case for a video call.
+ View displayVideo = mVideoViews.findViewById(R.id.incomingVideo);
+ if (displayVideo != null) {
+ centerDisplayView(displayVideo);
+ }
+ mIsLayoutComplete = true;
+
+ // Remove the listener so we don't continually re-layout.
+ ViewTreeObserver observer = mVideoViews.getViewTreeObserver();
+ if (observer.isAlive()) {
+ observer.removeOnGlobalLayoutListener(this);
+ }
+ }
+ });
+ }
+ }
+
+ /**
+ * Resizes a surface so that it has the same size as the full screen and so that it is
+ * centered vertically below the call card.
+ *
+ * @param textureView The {@link TextureView} to resize and position.
+ * @param size The size of the screen.
+ */
+ private void setSurfaceSizeAndTranslation(TextureView textureView, Point size) {
+ // Set the surface to have that size.
+ ViewGroup.LayoutParams params = textureView.getLayoutParams();
+ params.width = size.x;
+ params.height = size.y;
+ textureView.setLayoutParams(params);
+ Log.d(this, "setSurfaceSizeAndTranslation: Size=" + size + "IsLayoutComplete=" +
+ mIsLayoutComplete + "IsLandscape=" + mIsLandscape);
+
+ // It is only possible to center the display view if layout of the views has completed.
+ // It is only after layout is complete that the dimensions of the Call Card has been
+ // established, which is a prerequisite to centering the view.
+ // Incoming video calls will center the view
+ if (mIsLayoutComplete) {
+ centerDisplayView(textureView);
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/VideoCallPresenter.java b/InCallUI/src/com/android/incallui/VideoCallPresenter.java
new file mode 100644
index 000000000..9a33d80eb
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoCallPresenter.java
@@ -0,0 +1,1297 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Point;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.ContactsContract;
+import android.telecom.Connection;
+import android.telecom.InCallService.VideoCall;
+import android.telecom.VideoProfile;
+import android.telecom.VideoProfile.CameraCapabilities;
+import android.view.Surface;
+import android.widget.ImageView;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.R;
+import com.android.incallui.InCallPresenter.InCallDetailsListener;
+import com.android.incallui.InCallPresenter.InCallOrientationListener;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+import com.android.incallui.InCallVideoCallCallbackNotifier.SurfaceChangeListener;
+import com.android.incallui.InCallVideoCallCallbackNotifier.VideoEventListener;
+
+import java.util.Objects;
+
+/**
+ * Logic related to the {@link VideoCallFragment} and for managing changes to the video calling
+ * surfaces based on other user interface events and incoming events from the
+ * {@class VideoCallListener}.
+ * <p>
+ * When a call's video state changes to bi-directional video, the
+ * {@link com.android.incallui.VideoCallPresenter} performs the following negotiation with the
+ * telephony layer:
+ * <ul>
+ * <li>{@code VideoCallPresenter} creates and informs telephony of the display surface.</li>
+ * <li>{@code VideoCallPresenter} creates the preview surface.</li>
+ * <li>{@code VideoCallPresenter} informs telephony of the currently selected camera.</li>
+ * <li>Telephony layer sends {@link CameraCapabilities}, including the
+ * dimensions of the video for the current camera.</li>
+ * <li>{@code VideoCallPresenter} adjusts size of the preview surface to match the aspect
+ * ratio of the camera.</li>
+ * <li>{@code VideoCallPresenter} informs telephony of the new preview surface.</li>
+ * </ul>
+ * <p>
+ * When downgrading to an audio-only video state, the {@code VideoCallPresenter} nulls both
+ * surfaces.
+ */
+public class VideoCallPresenter extends Presenter<VideoCallPresenter.VideoCallUi> implements
+ IncomingCallListener, InCallOrientationListener, InCallStateListener,
+ InCallDetailsListener, SurfaceChangeListener, VideoEventListener,
+ InCallPresenter.InCallEventListener {
+ public static final String TAG = "VideoCallPresenter";
+
+ public static final boolean DEBUG = false;
+
+ /**
+ * Runnable which is posted to schedule automatically entering fullscreen mode. Will not auto
+ * enter fullscreen mode if the dialpad is visible (doing so would make it impossible to exit
+ * the dialpad).
+ */
+ private Runnable mAutoFullscreenRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mAutoFullScreenPending && !InCallPresenter.getInstance().isDialpadVisible()) {
+ Log.v(this, "Automatically entering fullscreen mode.");
+ InCallPresenter.getInstance().setFullScreen(true);
+ mAutoFullScreenPending = false;
+ } else {
+ Log.v(this, "Skipping scheduled fullscreen mode.");
+ }
+ }
+ };
+
+ /**
+ * Defines the state of the preview surface negotiation with the telephony layer.
+ */
+ private class PreviewSurfaceState {
+ /**
+ * The camera has not yet been set on the {@link VideoCall}; negotiation has not yet
+ * started.
+ */
+ private static final int NONE = 0;
+
+ /**
+ * The camera has been set on the {@link VideoCall}, but camera capabilities have not yet
+ * been received.
+ */
+ private static final int CAMERA_SET = 1;
+
+ /**
+ * The camera capabilties have been received from telephony, but the surface has not yet
+ * been set on the {@link VideoCall}.
+ */
+ private static final int CAPABILITIES_RECEIVED = 2;
+
+ /**
+ * The surface has been set on the {@link VideoCall}.
+ */
+ private static final int SURFACE_SET = 3;
+ }
+
+ /**
+ * The minimum width or height of the preview surface. Used when re-sizing the preview surface
+ * to match the aspect ratio of the currently selected camera.
+ */
+ private float mMinimumVideoDimension;
+
+ /**
+ * The current context.
+ */
+ private Context mContext;
+
+ /**
+ * The call the video surfaces are currently related to
+ */
+ private Call mPrimaryCall;
+
+ /**
+ * The {@link VideoCall} used to inform the video telephony layer of changes to the video
+ * surfaces.
+ */
+ private VideoCall mVideoCall;
+
+ /**
+ * Determines if the current UI state represents a video call.
+ */
+ private int mCurrentVideoState;
+
+ /**
+ * Call's current state
+ */
+ private int mCurrentCallState = Call.State.INVALID;
+
+ /**
+ * Determines the device orientation (portrait/lanscape).
+ */
+ private int mDeviceOrientation = InCallOrientationEventListener.SCREEN_ORIENTATION_0;
+
+ /**
+ * Tracks the state of the preview surface negotiation with the telephony layer.
+ */
+ private int mPreviewSurfaceState = PreviewSurfaceState.NONE;
+
+ private static boolean mIsVideoMode = false;
+
+ /**
+ * Contact photo manager to retrieve cached contact photo information.
+ */
+ private ContactPhotoManager mContactPhotoManager = null;
+
+ /**
+ * The URI for the user's profile photo, or {@code null} if not specified.
+ */
+ private ContactInfoCache.ContactCacheEntry mProfileInfo = null;
+
+ /**
+ * UI thread handler used for delayed task execution.
+ */
+ private Handler mHandler;
+
+ /**
+ * Determines whether video calls should automatically enter full screen mode after
+ * {@link #mAutoFullscreenTimeoutMillis} milliseconds.
+ */
+ private boolean mIsAutoFullscreenEnabled = false;
+
+ /**
+ * Determines the number of milliseconds after which a video call will automatically enter
+ * fullscreen mode. Requires {@link #mIsAutoFullscreenEnabled} to be {@code true}.
+ */
+ private int mAutoFullscreenTimeoutMillis = 0;
+
+ /**
+ * Determines if the countdown is currently running to automatically enter full screen video
+ * mode.
+ */
+ private boolean mAutoFullScreenPending = false;
+
+ /**
+ * Initializes the presenter.
+ *
+ * @param context The current context.
+ */
+ public void init(Context context) {
+ mContext = context;
+ mMinimumVideoDimension = mContext.getResources().getDimension(
+ R.dimen.video_preview_small_dimension);
+ mHandler = new Handler(Looper.getMainLooper());
+ mIsAutoFullscreenEnabled = mContext.getResources()
+ .getBoolean(R.bool.video_call_auto_fullscreen);
+ mAutoFullscreenTimeoutMillis = mContext.getResources().getInteger(
+ R.integer.video_call_auto_fullscreen_timeout);
+ }
+
+ /**
+ * Called when the user interface is ready to be used.
+ *
+ * @param ui The Ui implementation that is now ready to be used.
+ */
+ @Override
+ public void onUiReady(VideoCallUi ui) {
+ super.onUiReady(ui);
+ Log.d(this, "onUiReady:");
+
+ // Do not register any listeners if video calling is not compatible to safeguard against
+ // any accidental calls of video calling code.
+ if (!CompatUtils.isVideoCompatible()) {
+ return;
+ }
+
+ // Register for call state changes last
+ InCallPresenter.getInstance().addListener(this);
+ InCallPresenter.getInstance().addDetailsListener(this);
+ InCallPresenter.getInstance().addIncomingCallListener(this);
+ InCallPresenter.getInstance().addOrientationListener(this);
+ // To get updates of video call details changes
+ InCallPresenter.getInstance().addDetailsListener(this);
+ InCallPresenter.getInstance().addInCallEventListener(this);
+
+ // Register for surface and video events from {@link InCallVideoCallListener}s.
+ InCallVideoCallCallbackNotifier.getInstance().addSurfaceChangeListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().addVideoEventListener(this);
+ mCurrentVideoState = VideoProfile.STATE_AUDIO_ONLY;
+ mCurrentCallState = Call.State.INVALID;
+ }
+
+ /**
+ * Called when the user interface is no longer ready to be used.
+ *
+ * @param ui The Ui implementation that is no longer ready to be used.
+ */
+ @Override
+ public void onUiUnready(VideoCallUi ui) {
+ super.onUiUnready(ui);
+ Log.d(this, "onUiUnready:");
+
+ if (!CompatUtils.isVideoCompatible()) {
+ return;
+ }
+
+ InCallPresenter.getInstance().removeListener(this);
+ InCallPresenter.getInstance().removeDetailsListener(this);
+ InCallPresenter.getInstance().removeIncomingCallListener(this);
+ InCallPresenter.getInstance().removeOrientationListener(this);
+ InCallPresenter.getInstance().removeInCallEventListener(this);
+
+ InCallVideoCallCallbackNotifier.getInstance().removeSurfaceChangeListener(this);
+ InCallVideoCallCallbackNotifier.getInstance().removeVideoEventListener(this);
+ }
+
+ /**
+ * Handles the creation of a surface in the {@link VideoCallFragment}.
+ *
+ * @param surface The surface which was created.
+ */
+ public void onSurfaceCreated(int surface) {
+ Log.d(this, "onSurfaceCreated surface=" + surface + " mVideoCall=" + mVideoCall);
+ Log.d(this, "onSurfaceCreated PreviewSurfaceState=" + mPreviewSurfaceState);
+ Log.d(this, "onSurfaceCreated presenter=" + this);
+
+ final VideoCallUi ui = getUi();
+ if (ui == null || mVideoCall == null) {
+ Log.w(this, "onSurfaceCreated: Error bad state VideoCallUi=" + ui + " mVideoCall="
+ + mVideoCall);
+ return;
+ }
+
+ // If the preview surface has just been created and we have already received camera
+ // capabilities, but not yet set the surface, we will set the surface now.
+ if (surface == VideoCallFragment.SURFACE_PREVIEW ) {
+ if (mPreviewSurfaceState == PreviewSurfaceState.CAPABILITIES_RECEIVED) {
+ mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+ mVideoCall.setPreviewSurface(ui.getPreviewVideoSurface());
+ } else if (mPreviewSurfaceState == PreviewSurfaceState.NONE && isCameraRequired()){
+ enableCamera(mVideoCall, true);
+ }
+ } else if (surface == VideoCallFragment.SURFACE_DISPLAY) {
+ mVideoCall.setDisplaySurface(ui.getDisplayVideoSurface());
+ }
+ }
+
+ /**
+ * Handles structural changes (format or size) to a surface.
+ *
+ * @param surface The surface which changed.
+ * @param format The new PixelFormat of the surface.
+ * @param width The new width of the surface.
+ * @param height The new height of the surface.
+ */
+ public void onSurfaceChanged(int surface, int format, int width, int height) {
+ //Do stuff
+ }
+
+ /**
+ * Handles the destruction of a surface in the {@link VideoCallFragment}.
+ * Note: The surface is being released, that is, it is no longer valid.
+ *
+ * @param surface The surface which was destroyed.
+ */
+ public void onSurfaceReleased(int surface) {
+ Log.d(this, "onSurfaceReleased: mSurfaceId=" + surface);
+ if ( mVideoCall == null) {
+ Log.w(this, "onSurfaceReleased: VideoCall is null. mSurfaceId=" +
+ surface);
+ return;
+ }
+
+ if (surface == VideoCallFragment.SURFACE_DISPLAY) {
+ mVideoCall.setDisplaySurface(null);
+ } else if (surface == VideoCallFragment.SURFACE_PREVIEW) {
+ mVideoCall.setPreviewSurface(null);
+ enableCamera(mVideoCall, false);
+ }
+ }
+
+ /**
+ * Called by {@link VideoCallFragment} when the surface is detached from UI (TextureView).
+ * Note: The surface will be cached by {@link VideoCallFragment}, so we don't immediately
+ * null out incoming video surface.
+ * @see VideoCallPresenter#onSurfaceReleased(int)
+ *
+ * @param surface The surface which was detached.
+ */
+ public void onSurfaceDestroyed(int surface) {
+ Log.d(this, "onSurfaceDestroyed: mSurfaceId=" + surface);
+ if (mVideoCall == null) {
+ return;
+ }
+
+ final boolean isChangingConfigurations =
+ InCallPresenter.getInstance().isChangingConfigurations();
+ Log.d(this, "onSurfaceDestroyed: isChangingConfigurations=" + isChangingConfigurations);
+
+ if (surface == VideoCallFragment.SURFACE_PREVIEW) {
+ if (!isChangingConfigurations) {
+ enableCamera(mVideoCall, false);
+ } else {
+ Log.w(this, "onSurfaceDestroyed: Activity is being destroyed due "
+ + "to configuration changes. Not closing the camera.");
+ }
+ }
+ }
+
+ /**
+ * Handles clicks on the video surfaces by toggling full screen state.
+ * Informs the {@link InCallPresenter} of the change so that it can inform the
+ * {@link CallCardPresenter} of the change.
+ *
+ * @param surfaceId The video surface receiving the click.
+ */
+ public void onSurfaceClick(int surfaceId) {
+ boolean isFullscreen = InCallPresenter.getInstance().toggleFullscreenMode();
+ Log.v(this, "toggleFullScreen = " + isFullscreen);
+ }
+
+ /**
+ * Handles incoming calls.
+ *
+ * @param oldState The old in call state.
+ * @param newState The new in call state.
+ * @param call The call.
+ */
+ @Override
+ public void onIncomingCall(InCallPresenter.InCallState oldState,
+ InCallPresenter.InCallState newState, Call call) {
+ // same logic should happen as with onStateChange()
+ onStateChange(oldState, newState, CallList.getInstance());
+ }
+
+ /**
+ * Handles state changes (including incoming calls)
+ *
+ * @param newState The in call state.
+ * @param callList The call list.
+ */
+ @Override
+ public void onStateChange(InCallPresenter.InCallState oldState,
+ InCallPresenter.InCallState newState, CallList callList) {
+ Log.d(this, "onStateChange oldState" + oldState + " newState=" + newState +
+ " isVideoMode=" + isVideoMode());
+
+ if (newState == InCallPresenter.InCallState.NO_CALLS) {
+ if (isVideoMode()) {
+ exitVideoMode();
+ }
+
+ cleanupSurfaces();
+ }
+
+ // Determine the primary active call).
+ Call primary = null;
+
+ // Determine the call which is the focus of the user's attention. In the case of an
+ // incoming call waiting call, the primary call is still the active video call, however
+ // the determination of whether we should be in fullscreen mode is based on the type of the
+ // incoming call, not the active video call.
+ Call currentCall = null;
+
+ if (newState == InCallPresenter.InCallState.INCOMING) {
+ // We don't want to replace active video call (primary call)
+ // with a waiting call, since user may choose to ignore/decline the waiting call and
+ // this should have no impact on current active video call, that is, we should not
+ // change the camera or UI unless the waiting VT call becomes active.
+ primary = callList.getActiveCall();
+ currentCall = callList.getIncomingCall();
+ if (!VideoUtils.isActiveVideoCall(primary)) {
+ primary = callList.getIncomingCall();
+ }
+ } else if (newState == InCallPresenter.InCallState.OUTGOING) {
+ currentCall = primary = callList.getOutgoingCall();
+ } else if (newState == InCallPresenter.InCallState.PENDING_OUTGOING) {
+ currentCall = primary = callList.getPendingOutgoingCall();
+ } else if (newState == InCallPresenter.InCallState.INCALL) {
+ currentCall = primary = callList.getActiveCall();
+ }
+
+ final boolean primaryChanged = !Objects.equals(mPrimaryCall, primary);
+ Log.d(this, "onStateChange primaryChanged=" + primaryChanged);
+ Log.d(this, "onStateChange primary= " + primary);
+ Log.d(this, "onStateChange mPrimaryCall = " + mPrimaryCall);
+ if (primaryChanged) {
+ onPrimaryCallChanged(primary);
+ } else if (mPrimaryCall != null) {
+ updateVideoCall(primary);
+ }
+ updateCallCache(primary);
+
+ // If the call context changed, potentially exit fullscreen or schedule auto enter of
+ // fullscreen mode.
+ // If the current call context is no longer a video call, exit fullscreen mode.
+ maybeExitFullscreen(currentCall);
+ // Schedule auto-enter of fullscreen mode if the current call context is a video call
+ maybeAutoEnterFullscreen(currentCall);
+ }
+
+ /**
+ * Handles a change to the fullscreen mode of the app.
+ *
+ * @param isFullscreenMode {@code true} if the app is now fullscreen, {@code false} otherwise.
+ */
+ @Override
+ public void onFullscreenModeChanged(boolean isFullscreenMode) {
+ cancelAutoFullScreen();
+ }
+
+ /**
+ * Handles changes to the visibility of the secondary caller info bar.
+ *
+ * @param isVisible {@code true} if the secondary caller info is showing, {@code false}
+ * otherwise.
+ * @param height the height of the secondary caller info bar.
+ */
+ @Override
+ public void onSecondaryCallerInfoVisibilityChanged(boolean isVisible, int height) {
+ Log.d(this,
+ "onSecondaryCallerInfoVisibilityChanged : isVisible = " + isVisible + " height = "
+ + height);
+ getUi().adjustPreviewLocation(isVisible /* shiftUp */, height);
+ }
+
+ private void checkForVideoStateChange(Call call) {
+ final boolean isVideoCall = VideoUtils.isVideoCall(call);
+ final boolean hasVideoStateChanged = mCurrentVideoState != call.getVideoState();
+
+ Log.d(this, "checkForVideoStateChange: isVideoCall= " + isVideoCall
+ + " hasVideoStateChanged=" + hasVideoStateChanged + " isVideoMode="
+ + isVideoMode() + " previousVideoState: " +
+ VideoProfile.videoStateToString(mCurrentVideoState) + " newVideoState: "
+ + VideoProfile.videoStateToString(call.getVideoState()));
+
+ if (!hasVideoStateChanged) {
+ return;
+ }
+
+ updateCameraSelection(call);
+
+ if (isVideoCall) {
+ enterVideoMode(call);
+ } else if (isVideoMode()) {
+ exitVideoMode();
+ }
+ }
+
+ private void checkForCallStateChange(Call call) {
+ final boolean isVideoCall = VideoUtils.isVideoCall(call);
+ final boolean hasCallStateChanged = mCurrentCallState != call.getState();
+
+ Log.d(this, "checkForCallStateChange: isVideoCall= " + isVideoCall
+ + " hasCallStateChanged=" +
+ hasCallStateChanged + " isVideoMode=" + isVideoMode());
+
+ if (!hasCallStateChanged) {
+ return;
+ }
+
+ if (isVideoCall) {
+ final InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+
+ String prevCameraId = cameraManager.getActiveCameraId();
+ updateCameraSelection(call);
+ String newCameraId = cameraManager.getActiveCameraId();
+
+ if (!Objects.equals(prevCameraId, newCameraId) && VideoUtils.isActiveVideoCall(call)) {
+ enableCamera(call.getVideoCall(), true);
+ }
+ }
+
+ // Make sure we hide or show the video UI if needed.
+ showVideoUi(call.getVideoState(), call.getState());
+ }
+
+ private void cleanupSurfaces() {
+ final VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.w(this, "cleanupSurfaces");
+ return;
+ }
+ ui.cleanupSurfaces();
+ }
+
+ private void onPrimaryCallChanged(Call newPrimaryCall) {
+ final boolean isVideoCall = VideoUtils.isVideoCall(newPrimaryCall);
+ final boolean isVideoMode = isVideoMode();
+
+ Log.d(this, "onPrimaryCallChanged: isVideoCall=" + isVideoCall + " isVideoMode="
+ + isVideoMode);
+
+ if (!isVideoCall && isVideoMode) {
+ // Terminate video mode if new primary call is not a video call
+ // and we are currently in video mode.
+ Log.d(this, "onPrimaryCallChanged: Exiting video mode...");
+ exitVideoMode();
+ } else if (isVideoCall) {
+ Log.d(this, "onPrimaryCallChanged: Entering video mode...");
+
+ updateCameraSelection(newPrimaryCall);
+ enterVideoMode(newPrimaryCall);
+ }
+ }
+
+ private boolean isVideoMode() {
+ return mIsVideoMode;
+ }
+
+ private void updateCallCache(Call call) {
+ if (call == null) {
+ mCurrentVideoState = VideoProfile.STATE_AUDIO_ONLY;
+ mCurrentCallState = Call.State.INVALID;
+ mVideoCall = null;
+ mPrimaryCall = null;
+ } else {
+ mCurrentVideoState = call.getVideoState();
+ mVideoCall = call.getVideoCall();
+ mCurrentCallState = call.getState();
+ mPrimaryCall = call;
+ }
+ }
+
+ /**
+ * Handles changes to the details of the call. The {@link VideoCallPresenter} is interested in
+ * changes to the video state.
+ *
+ * @param call The call for which the details changed.
+ * @param details The new call details.
+ */
+ @Override
+ public void onDetailsChanged(Call call, android.telecom.Call.Details details) {
+ Log.d(this, " onDetailsChanged call=" + call + " details=" + details + " mPrimaryCall="
+ + mPrimaryCall);
+ if (call == null) {
+ return;
+ }
+ // If the details change is not for the currently active call no update is required.
+ if (!call.equals(mPrimaryCall)) {
+ Log.d(this, " onDetailsChanged: Details not for current active call so returning. ");
+ return;
+ }
+
+ updateVideoCall(call);
+
+ updateCallCache(call);
+ }
+
+ private void updateVideoCall(Call call) {
+ checkForVideoCallChange(call);
+ checkForVideoStateChange(call);
+ checkForCallStateChange(call);
+ checkForOrientationAllowedChange(call);
+ }
+
+ private void checkForOrientationAllowedChange(Call call) {
+ InCallPresenter.getInstance().setInCallAllowsOrientationChange(
+ VideoUtils.isVideoCall(call));
+ }
+
+ /**
+ * Checks for a change to the video call and changes it if required.
+ */
+ private void checkForVideoCallChange(Call call) {
+ final VideoCall videoCall = call.getTelecomCall().getVideoCall();
+ Log.d(this, "checkForVideoCallChange: videoCall=" + videoCall + " mVideoCall="
+ + mVideoCall);
+ if (!Objects.equals(videoCall, mVideoCall)) {
+ changeVideoCall(call);
+ }
+ }
+
+ /**
+ * Handles a change to the video call. Sets the surfaces on the previous call to null and sets
+ * the surfaces on the new video call accordingly.
+ *
+ * @param videoCall The new video call.
+ */
+ private void changeVideoCall(Call call) {
+ final VideoCall videoCall = call.getTelecomCall().getVideoCall();
+ Log.d(this, "changeVideoCall to videoCall=" + videoCall + " mVideoCall=" + mVideoCall);
+ // Null out the surfaces on the previous video call.
+ if (mVideoCall != null) {
+ // Log.d(this, "Null out the surfaces on the previous video call.");
+ // mVideoCall.setDisplaySurface(null);
+ // mVideoCall.setPreviewSurface(null);
+ }
+
+ final boolean hasChanged = mVideoCall == null && videoCall != null;
+
+ mVideoCall = videoCall;
+ if (mVideoCall == null || call == null) {
+ Log.d(this, "Video call or primary call is null. Return");
+ return;
+ }
+
+ if (VideoUtils.isVideoCall(call) && hasChanged) {
+ enterVideoMode(call);
+ }
+ }
+
+ private static boolean isCameraRequired(int videoState) {
+ return VideoProfile.isBidirectional(videoState) ||
+ VideoProfile.isTransmissionEnabled(videoState);
+ }
+
+ private boolean isCameraRequired() {
+ return mPrimaryCall != null && isCameraRequired(mPrimaryCall.getVideoState());
+ }
+
+ /**
+ * Enters video mode by showing the video surfaces and making other adjustments (eg. audio).
+ * TODO(vt): Need to adjust size and orientation of preview surface here.
+ */
+ private void enterVideoMode(Call call) {
+ VideoCall videoCall = call.getVideoCall();
+ int newVideoState = call.getVideoState();
+
+ Log.d(this, "enterVideoMode videoCall= " + videoCall + " videoState: " + newVideoState);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "Error VideoCallUi is null so returning");
+ return;
+ }
+
+ showVideoUi(newVideoState, call.getState());
+
+ // Communicate the current camera to telephony and make a request for the camera
+ // capabilities.
+ if (videoCall != null) {
+ if (ui.isDisplayVideoSurfaceCreated()) {
+ Log.d(this, "Calling setDisplaySurface with " + ui.getDisplayVideoSurface());
+ videoCall.setDisplaySurface(ui.getDisplayVideoSurface());
+ }
+
+ videoCall.setDeviceOrientation(mDeviceOrientation);
+ enableCamera(videoCall, isCameraRequired(newVideoState));
+ }
+ mCurrentVideoState = newVideoState;
+
+ mIsVideoMode = true;
+
+ maybeAutoEnterFullscreen(call);
+ }
+
+ private static boolean isSpeakerEnabledForVideoCalls() {
+ // TODO: Make this a carrier configurable setting. For now this is always true. b/20090407
+ return true;
+ }
+
+ private void enableCamera(VideoCall videoCall, boolean isCameraRequired) {
+ Log.d(this, "enableCamera: VideoCall=" + videoCall + " enabling=" + isCameraRequired);
+ if (videoCall == null) {
+ Log.w(this, "enableCamera: VideoCall is null.");
+ return;
+ }
+
+ if (isCameraRequired) {
+ InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+ videoCall.setCamera(cameraManager.getActiveCameraId());
+ mPreviewSurfaceState = PreviewSurfaceState.CAMERA_SET;
+
+ videoCall.requestCameraCapabilities();
+ } else {
+ mPreviewSurfaceState = PreviewSurfaceState.NONE;
+ videoCall.setCamera(null);
+ }
+ }
+
+ /**
+ * Exits video mode by hiding the video surfaces and making other adjustments (eg. audio).
+ */
+ private void exitVideoMode() {
+ Log.d(this, "exitVideoMode");
+
+ showVideoUi(VideoProfile.STATE_AUDIO_ONLY, Call.State.ACTIVE);
+ enableCamera(mVideoCall, false);
+ InCallPresenter.getInstance().setFullScreen(false);
+
+ mIsVideoMode = false;
+ }
+
+ /**
+ * Based on the current video state and call state, show or hide the incoming and
+ * outgoing video surfaces. The outgoing video surface is shown any time video is transmitting.
+ * The incoming video surface is shown whenever the video is un-paused and active.
+ *
+ * @param videoState The video state.
+ * @param callState The call state.
+ */
+ private void showVideoUi(int videoState, int callState) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "showVideoUi, VideoCallUi is null returning");
+ return;
+ }
+ boolean showIncomingVideo = showIncomingVideo(videoState, callState);
+ boolean showOutgoingVideo = showOutgoingVideo(videoState);
+ Log.v(this, "showVideoUi : showIncoming = " + showIncomingVideo + " showOutgoing = "
+ + showOutgoingVideo);
+ if (showIncomingVideo || showOutgoingVideo) {
+ ui.showVideoViews(showOutgoingVideo, showIncomingVideo);
+
+ if (VideoProfile.isReceptionEnabled(videoState)) {
+ loadProfilePhotoAsync();
+ }
+ } else {
+ ui.hideVideoUi();
+ }
+
+ InCallPresenter.getInstance().enableScreenTimeout(
+ VideoProfile.isAudioOnly(videoState));
+ }
+
+ /**
+ * Determines if the incoming video surface should be shown based on the current videoState and
+ * callState. The video surface is shown when incoming video is not paused, the call is active,
+ * and video reception is enabled.
+ *
+ * @param videoState The current video state.
+ * @param callState The current call state.
+ * @return {@code true} if the incoming video surface should be shown, {@code false} otherwise.
+ */
+ public static boolean showIncomingVideo(int videoState, int callState) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ boolean isPaused = VideoProfile.isPaused(videoState);
+ boolean isCallActive = callState == Call.State.ACTIVE;
+
+ return !isPaused && isCallActive && VideoProfile.isReceptionEnabled(videoState);
+ }
+
+ /**
+ * Determines if the outgoing video surface should be shown based on the current videoState.
+ * The video surface is shown if video transmission is enabled.
+ *
+ * @param videoState The current video state.
+ * @return {@code true} if the the outgoing video surface should be shown, {@code false}
+ * otherwise.
+ */
+ public static boolean showOutgoingVideo(int videoState) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ return VideoProfile.isTransmissionEnabled(videoState);
+ }
+
+ /**
+ * Handles peer video pause state changes.
+ *
+ * @param call The call which paused or un-pausedvideo transmission.
+ * @param paused {@code True} when the video transmission is paused, {@code false} when video
+ * transmission resumes.
+ */
+ @Override
+ public void onPeerPauseStateChanged(Call call, boolean paused) {
+ if (!call.equals(mPrimaryCall)) {
+ return;
+ }
+
+ // TODO(vt): Show/hide the peer contact photo.
+ }
+
+ /**
+ * Handles peer video dimension changes.
+ *
+ * @param call The call which experienced a peer video dimension change.
+ * @param width The new peer video width .
+ * @param height The new peer video height.
+ */
+ @Override
+ public void onUpdatePeerDimensions(Call call, int width, int height) {
+ Log.d(this, "onUpdatePeerDimensions: width= " + width + " height= " + height);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "VideoCallUi is null. Bail out");
+ return;
+ }
+ if (!call.equals(mPrimaryCall)) {
+ Log.e(this, "Current call is not equal to primary call. Bail out");
+ return;
+ }
+
+ // Change size of display surface to match the peer aspect ratio
+ if (width > 0 && height > 0) {
+ setDisplayVideoSize(width, height);
+ }
+ }
+
+ /**
+ * Handles any video quality changes in the call.
+ *
+ * @param call The call which experienced a video quality change.
+ * @param videoQuality The new video call quality.
+ */
+ @Override
+ public void onVideoQualityChanged(Call call, int videoQuality) {
+ // No-op
+ }
+
+ /**
+ * Handles a change to the dimensions of the local camera. Receiving the camera capabilities
+ * triggers the creation of the video
+ *
+ * @param call The call which experienced the camera dimension change.
+ * @param width The new camera video width.
+ * @param height The new camera video height.
+ */
+ @Override
+ public void onCameraDimensionsChange(Call call, int width, int height) {
+ Log.d(this, "onCameraDimensionsChange call=" + call + " width=" + width + " height="
+ + height);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "onCameraDimensionsChange ui is null");
+ return;
+ }
+
+ if (!call.equals(mPrimaryCall)) {
+ Log.e(this, "Call is not primary call");
+ return;
+ }
+
+ mPreviewSurfaceState = PreviewSurfaceState.CAPABILITIES_RECEIVED;
+ changePreviewDimensions(width, height);
+
+ // Check if the preview surface is ready yet; if it is, set it on the {@code VideoCall}.
+ // If it not yet ready, it will be set when when creation completes.
+ if (ui.isPreviewVideoSurfaceCreated()) {
+ mPreviewSurfaceState = PreviewSurfaceState.SURFACE_SET;
+ mVideoCall.setPreviewSurface(ui.getPreviewVideoSurface());
+ }
+ }
+
+ /**
+ * Changes the dimensions of the preview surface.
+ *
+ * @param width The new width.
+ * @param height The new height.
+ */
+ private void changePreviewDimensions(int width, int height) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ // Resize the surface used to display the preview video
+ ui.setPreviewSurfaceSize(width, height);
+
+ // Configure the preview surface to the correct aspect ratio.
+ float aspectRatio = 1.0f;
+ if (width > 0 && height > 0) {
+ aspectRatio = (float) width / (float) height;
+ }
+
+ // Resize the textureview housing the preview video and rotate it appropriately based on
+ // the device orientation
+ setPreviewSize(mDeviceOrientation, aspectRatio);
+ }
+
+ /**
+ * Called when call session event is raised.
+ *
+ * @param event The call session event.
+ */
+ @Override
+ public void onCallSessionEvent(int event) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("onCallSessionEvent = ");
+
+ switch (event) {
+ case Connection.VideoProvider.SESSION_EVENT_RX_PAUSE:
+ sb.append("rx_pause");
+ break;
+ case Connection.VideoProvider.SESSION_EVENT_RX_RESUME:
+ sb.append("rx_resume");
+ break;
+ case Connection.VideoProvider.SESSION_EVENT_CAMERA_FAILURE:
+ sb.append("camera_failure");
+ break;
+ case Connection.VideoProvider.SESSION_EVENT_CAMERA_READY:
+ sb.append("camera_ready");
+ break;
+ default:
+ sb.append("unknown event = ");
+ sb.append(event);
+ break;
+ }
+ Log.d(this, sb.toString());
+ }
+
+ /**
+ * Handles a change to the call data usage
+ *
+ * @param dataUsage call data usage value
+ */
+ @Override
+ public void onCallDataUsageChange(long dataUsage) {
+ Log.d(this, "onCallDataUsageChange dataUsage=" + dataUsage);
+ }
+
+ /**
+ * Handles changes to the device orientation.
+ * @param orientation The screen orientation of the device (one of:
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ */
+ @Override
+ public void onDeviceOrientationChanged(int orientation) {
+ mDeviceOrientation = orientation;
+
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ Log.e(this, "onDeviceOrientationChanged: VideoCallUi is null");
+ return;
+ }
+
+ Point previewDimensions = ui.getPreviewSize();
+ if (previewDimensions == null) {
+ return;
+ }
+ Log.d(this, "onDeviceOrientationChanged: orientation=" + orientation + " size: "
+ + previewDimensions);
+ changePreviewDimensions(previewDimensions.x, previewDimensions.y);
+
+ ui.setPreviewRotation(mDeviceOrientation);
+ }
+
+ /**
+ * Sets the preview surface size based on the current device orientation.
+ * See: {@link InCallOrientationEventListener#SCREEN_ORIENTATION_0},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_90},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_180},
+ * {@link InCallOrientationEventListener#SCREEN_ORIENTATION_270}).
+ *
+ * @param orientation The device orientation
+ * @param aspectRatio The aspect ratio of the camera (width / height).
+ */
+ private void setPreviewSize(int orientation, float aspectRatio) {
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ int height;
+ int width;
+
+ if (orientation == InCallOrientationEventListener.SCREEN_ORIENTATION_90 ||
+ orientation == InCallOrientationEventListener.SCREEN_ORIENTATION_270) {
+ width = (int) (mMinimumVideoDimension * aspectRatio);
+ height = (int) mMinimumVideoDimension;
+ } else {
+ // Portrait or reverse portrait orientation.
+ width = (int) mMinimumVideoDimension;
+ height = (int) (mMinimumVideoDimension * aspectRatio);
+ }
+ ui.setPreviewSize(width, height);
+ }
+
+ /**
+ * Sets the display video surface size based on peer width and height
+ *
+ * @param width peer width
+ * @param height peer height
+ */
+ private void setDisplayVideoSize(int width, int height) {
+ Log.v(this, "setDisplayVideoSize: Received peer width=" + width + " height=" + height);
+ VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ // Get current display size
+ Point size = ui.getScreenSize();
+ Log.v(this, "setDisplayVideoSize: windowmgr width=" + size.x
+ + " windowmgr height=" + size.y);
+ if (size.y * width > size.x * height) {
+ // current display height is too much. Correct it
+ size.y = (int) (size.x * height / width);
+ } else if (size.y * width < size.x * height) {
+ // current display width is too much. Correct it
+ size.x = (int) (size.y * width / height);
+ }
+ ui.setDisplayVideoSize(size.x, size.y);
+ }
+
+ /**
+ * Exits fullscreen mode if the current call context has changed to a non-video call.
+ *
+ * @param call The call.
+ */
+ protected void maybeExitFullscreen(Call call) {
+ if (call == null) {
+ return;
+ }
+
+ if (!VideoUtils.isVideoCall(call) || call.getState() == Call.State.INCOMING) {
+ InCallPresenter.getInstance().setFullScreen(false);
+ }
+ }
+
+ /**
+ * Schedules auto-entering of fullscreen mode.
+ * Will not enter full screen mode if any of the following conditions are met:
+ * 1. No call
+ * 2. Call is not active
+ * 3. Call is not video call
+ * 4. Already in fullscreen mode
+ *
+ * @param call The current call.
+ */
+ protected void maybeAutoEnterFullscreen(Call call) {
+ if (!mIsAutoFullscreenEnabled) {
+ return;
+ }
+
+ if (call == null || (
+ call != null && (call.getState() != Call.State.ACTIVE ||
+ !VideoUtils.isVideoCall(call)) ||
+ InCallPresenter.getInstance().isFullscreen())) {
+ // Ensure any previously scheduled attempt to enter fullscreen is cancelled.
+ cancelAutoFullScreen();
+ return;
+ }
+
+ if (mAutoFullScreenPending) {
+ Log.v(this, "maybeAutoEnterFullscreen : already pending.");
+ return;
+ }
+ Log.v(this, "maybeAutoEnterFullscreen : scheduled");
+ mAutoFullScreenPending = true;
+ mHandler.postDelayed(mAutoFullscreenRunnable, mAutoFullscreenTimeoutMillis);
+ }
+
+ /**
+ * Cancels pending auto fullscreen mode.
+ */
+ public void cancelAutoFullScreen() {
+ if (!mAutoFullScreenPending) {
+ Log.v(this, "cancelAutoFullScreen : none pending.");
+ return;
+ }
+ Log.v(this, "cancelAutoFullScreen : cancelling pending");
+ mAutoFullScreenPending = false;
+ }
+
+ private static boolean isAudioRouteEnabled(int audioRoute, int audioRouteMask) {
+ return ((audioRoute & audioRouteMask) != 0);
+ }
+
+ private static void updateCameraSelection(Call call) {
+ Log.d(TAG, "updateCameraSelection: call=" + call);
+ Log.d(TAG, "updateCameraSelection: call=" + toSimpleString(call));
+
+ final Call activeCall = CallList.getInstance().getActiveCall();
+ int cameraDir = Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+
+ // this function should never be called with null call object, however if it happens we
+ // should handle it gracefully.
+ if (call == null) {
+ cameraDir = Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+ com.android.incallui.Log.e(TAG, "updateCameraSelection: Call object is null."
+ + " Setting camera direction to default value (CAMERA_DIRECTION_UNKNOWN)");
+ }
+
+ // Clear camera direction if this is not a video call.
+ else if (VideoUtils.isAudioCall(call)) {
+ cameraDir = Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+ call.getVideoSettings().setCameraDir(cameraDir);
+ }
+
+ // If this is a waiting video call, default to active call's camera,
+ // since we don't want to change the current camera for waiting call
+ // without user's permission.
+ else if (VideoUtils.isVideoCall(activeCall) && VideoUtils.isIncomingVideoCall(call)) {
+ cameraDir = activeCall.getVideoSettings().getCameraDir();
+ }
+
+ // Infer the camera direction from the video state and store it,
+ // if this is an outgoing video call.
+ else if (VideoUtils.isOutgoingVideoCall(call) && !isCameraDirectionSet(call) ) {
+ cameraDir = toCameraDirection(call.getVideoState());
+ call.getVideoSettings().setCameraDir(cameraDir);
+ }
+
+ // Use the stored camera dir if this is an outgoing video call for which camera direction
+ // is set.
+ else if (VideoUtils.isOutgoingVideoCall(call)) {
+ cameraDir = call.getVideoSettings().getCameraDir();
+ }
+
+ // Infer the camera direction from the video state and store it,
+ // if this is an active video call and camera direction is not set.
+ else if (VideoUtils.isActiveVideoCall(call) && !isCameraDirectionSet(call)) {
+ cameraDir = toCameraDirection(call.getVideoState());
+ call.getVideoSettings().setCameraDir(cameraDir);
+ }
+
+ // Use the stored camera dir if this is an active video call for which camera direction
+ // is set.
+ else if (VideoUtils.isActiveVideoCall(call)) {
+ cameraDir = call.getVideoSettings().getCameraDir();
+ }
+
+ // For all other cases infer the camera direction but don't store it in the call object.
+ else {
+ cameraDir = toCameraDirection(call.getVideoState());
+ }
+
+ com.android.incallui.Log.d(TAG, "updateCameraSelection: Setting camera direction to " +
+ cameraDir + " Call=" + call);
+ final InCallCameraManager cameraManager = InCallPresenter.getInstance().
+ getInCallCameraManager();
+ cameraManager.setUseFrontFacingCamera(cameraDir ==
+ Call.VideoSettings.CAMERA_DIRECTION_FRONT_FACING);
+ }
+
+ private static int toCameraDirection(int videoState) {
+ return VideoProfile.isTransmissionEnabled(videoState) &&
+ !VideoProfile.isBidirectional(videoState)
+ ? Call.VideoSettings.CAMERA_DIRECTION_BACK_FACING
+ : Call.VideoSettings.CAMERA_DIRECTION_FRONT_FACING;
+ }
+
+ private static boolean isCameraDirectionSet(Call call) {
+ return VideoUtils.isVideoCall(call) && call.getVideoSettings().getCameraDir()
+ != Call.VideoSettings.CAMERA_DIRECTION_UNKNOWN;
+ }
+
+ private static String toSimpleString(Call call) {
+ return call == null ? null : call.toSimpleString();
+ }
+
+ /**
+ * Starts an asynchronous load of the user's profile photo.
+ */
+ public void loadProfilePhotoAsync() {
+ final VideoCallUi ui = getUi();
+ if (ui == null) {
+ return;
+ }
+
+ final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
+ /**
+ * Performs asynchronous load of the user profile information.
+ *
+ * @param params The parameters of the task.
+ *
+ * @return {@code null}.
+ */
+ @Override
+ protected Void doInBackground(Void... params) {
+ if (mProfileInfo == null) {
+ // Try and read the photo URI from the local profile.
+ mProfileInfo = new ContactInfoCache.ContactCacheEntry();
+ final Cursor cursor = mContext.getContentResolver().query(
+ ContactsContract.Profile.CONTENT_URI, new String[]{
+ ContactsContract.CommonDataKinds.Phone._ID,
+ ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
+ ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,
+ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
+ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_ALTERNATIVE
+ }, null, null, null);
+ if (cursor != null) {
+ try {
+ if (cursor.moveToFirst()) {
+ mProfileInfo.lookupKey = cursor.getString(cursor.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY));
+ String photoUri = cursor.getString(cursor.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
+ mProfileInfo.displayPhotoUri = photoUri == null ? null
+ : Uri.parse(photoUri);
+ mProfileInfo.namePrimary = cursor.getString(cursor.getColumnIndex(
+ ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
+ mProfileInfo.nameAlternative = cursor.getString(
+ cursor.getColumnIndex(ContactsContract.CommonDataKinds
+ .Phone.DISPLAY_NAME_ALTERNATIVE));
+ }
+ } finally {
+ cursor.close();
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ // If user profile information was found, issue an async request to load the user's
+ // profile photo.
+ if (mProfileInfo != null) {
+ if (mContactPhotoManager == null) {
+ mContactPhotoManager = ContactPhotoManager.getInstance(mContext);
+ }
+ ContactPhotoManager.DefaultImageRequest imageRequest = (mProfileInfo != null)
+ ? null :
+ new ContactPhotoManager.DefaultImageRequest(mProfileInfo.namePrimary,
+ mProfileInfo.lookupKey, false /* isCircularPhoto */);
+
+ ImageView photoView = ui.getPreviewPhotoView();
+ if (photoView == null) {
+ return;
+ }
+ mContactPhotoManager.loadDirectoryPhoto(photoView,
+ mProfileInfo.displayPhotoUri,
+ false /* darkTheme */, false /* isCircular */, imageRequest);
+ }
+ }
+ };
+
+ task.execute();
+ }
+
+ /**
+ * Defines the VideoCallUI interactions.
+ */
+ public interface VideoCallUi extends Ui {
+ void showVideoViews(boolean showPreview, boolean showIncoming);
+ void hideVideoUi();
+ boolean isDisplayVideoSurfaceCreated();
+ boolean isPreviewVideoSurfaceCreated();
+ Surface getDisplayVideoSurface();
+ Surface getPreviewVideoSurface();
+ int getCurrentRotation();
+ void setPreviewSize(int width, int height);
+ void setPreviewSurfaceSize(int width, int height);
+ void setDisplayVideoSize(int width, int height);
+ Point getScreenSize();
+ Point getPreviewSize();
+ void cleanupSurfaces();
+ ImageView getPreviewPhotoView();
+ void adjustPreviewLocation(boolean shiftUp, int offset);
+ void setPreviewRotation(int orientation);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/VideoPauseController.java b/InCallUI/src/com/android/incallui/VideoPauseController.java
new file mode 100644
index 000000000..01b6b0dea
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoPauseController.java
@@ -0,0 +1,418 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.android.incallui.Call.State;
+import com.android.incallui.InCallPresenter.InCallState;
+import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
+import com.android.incallui.InCallVideoCallCallbackNotifier.SessionModificationListener;
+import com.google.common.base.Preconditions;
+
+import android.telecom.VideoProfile;
+
+/**
+ * This class is responsible for generating video pause/resume requests when the InCall UI is sent
+ * to the background and subsequently brought back to the foreground.
+ */
+class VideoPauseController implements InCallStateListener, IncomingCallListener {
+ private static final String TAG = "VideoPauseController";
+
+ /**
+ * Keeps track of the current active/foreground call.
+ */
+ private class CallContext {
+ public CallContext(Call call) {
+ Preconditions.checkNotNull(call);
+ update(call);
+ }
+
+ public void update(Call call) {
+ mCall = Preconditions.checkNotNull(call);
+ mState = call.getState();
+ mVideoState = call.getVideoState();
+ }
+
+ public int getState() {
+ return mState;
+ }
+
+ public int getVideoState() {
+ return mVideoState;
+ }
+
+ public String toString() {
+ return String.format("CallContext {CallId=%s, State=%s, VideoState=%d}",
+ mCall.getId(), mState, mVideoState);
+ }
+
+ public Call getCall() {
+ return mCall;
+ }
+
+ private int mState = State.INVALID;
+ private int mVideoState;
+ private Call mCall;
+ }
+
+ private InCallPresenter mInCallPresenter;
+ private static VideoPauseController sVideoPauseController;
+
+ /**
+ * The current call context, if applicable.
+ */
+ private CallContext mPrimaryCallContext = null;
+
+ /**
+ * Tracks whether the application is in the background. {@code True} if the application is in
+ * the background, {@code false} otherwise.
+ */
+ private boolean mIsInBackground = false;
+
+ /**
+ * Singleton accessor for the {@link VideoPauseController}.
+ * @return Singleton instance of the {@link VideoPauseController}.
+ */
+ /*package*/
+ static synchronized VideoPauseController getInstance() {
+ if (sVideoPauseController == null) {
+ sVideoPauseController = new VideoPauseController();
+ }
+ return sVideoPauseController;
+ }
+
+ /**
+ * Configures the {@link VideoPauseController} to listen to call events. Configured via the
+ * {@link com.android.incallui.InCallPresenter}.
+ *
+ * @param inCallPresenter The {@link com.android.incallui.InCallPresenter}.
+ */
+ public void setUp(InCallPresenter inCallPresenter) {
+ log("setUp");
+ mInCallPresenter = Preconditions.checkNotNull(inCallPresenter);
+ mInCallPresenter.addListener(this);
+ mInCallPresenter.addIncomingCallListener(this);
+ }
+
+ /**
+ * Cleans up the {@link VideoPauseController} by removing all listeners and clearing its
+ * internal state. Called from {@link com.android.incallui.InCallPresenter}.
+ */
+ public void tearDown() {
+ log("tearDown...");
+ mInCallPresenter.removeListener(this);
+ mInCallPresenter.removeIncomingCallListener(this);
+ clear();
+ }
+
+ /**
+ * Clears the internal state for the {@link VideoPauseController}.
+ */
+ private void clear() {
+ mInCallPresenter = null;
+ mPrimaryCallContext = null;
+ mIsInBackground = false;
+ }
+
+ /**
+ * Handles changes in the {@link InCallState}. Triggers pause and resumption of video for the
+ * current foreground call.
+ *
+ * @param oldState The previous {@link InCallState}.
+ * @param newState The current {@link InCallState}.
+ * @param callList List of current call.
+ */
+ @Override
+ public void onStateChange(InCallState oldState, InCallState newState, CallList callList) {
+ log("onStateChange, OldState=" + oldState + " NewState=" + newState);
+
+ Call call = null;
+ if (newState == InCallState.INCOMING) {
+ call = callList.getIncomingCall();
+ } else if (newState == InCallState.WAITING_FOR_ACCOUNT) {
+ call = callList.getWaitingForAccountCall();
+ } else if (newState == InCallState.PENDING_OUTGOING) {
+ call = callList.getPendingOutgoingCall();
+ } else if (newState == InCallState.OUTGOING) {
+ call = callList.getOutgoingCall();
+ } else {
+ call = callList.getActiveCall();
+ }
+
+ boolean hasPrimaryCallChanged = !areSame(call, mPrimaryCallContext);
+ boolean canVideoPause = VideoUtils.canVideoPause(call);
+ log("onStateChange, hasPrimaryCallChanged=" + hasPrimaryCallChanged);
+ log("onStateChange, canVideoPause=" + canVideoPause);
+ log("onStateChange, IsInBackground=" + mIsInBackground);
+
+ if (hasPrimaryCallChanged) {
+ onPrimaryCallChanged(call);
+ return;
+ }
+
+ if (isDialing(mPrimaryCallContext) && canVideoPause && mIsInBackground) {
+ // Bring UI to foreground if outgoing request becomes active while UI is in
+ // background.
+ bringToForeground();
+ } else if (!isVideoCall(mPrimaryCallContext) && canVideoPause && mIsInBackground) {
+ // Bring UI to foreground if VoLTE call becomes active while UI is in
+ // background.
+ bringToForeground();
+ }
+
+ updatePrimaryCallContext(call);
+ }
+
+ /**
+ * Handles a change to the primary call.
+ * <p>
+ * Reject incoming or hangup dialing call: Where the previous call was an incoming call or a
+ * call in dialing state, resume the new primary call.
+ * Call swap: Where the new primary call is incoming, pause video on the previous primary call.
+ *
+ * @param call The new primary call.
+ */
+ private void onPrimaryCallChanged(Call call) {
+ log("onPrimaryCallChanged: New call = " + call);
+ log("onPrimaryCallChanged: Old call = " + mPrimaryCallContext);
+ log("onPrimaryCallChanged, IsInBackground=" + mIsInBackground);
+
+ Preconditions.checkState(!areSame(call, mPrimaryCallContext));
+ final boolean canVideoPause = VideoUtils.canVideoPause(call);
+
+ if ((isIncomingCall(mPrimaryCallContext) || isDialing(mPrimaryCallContext) ||
+ (call != null && VideoProfile.isPaused(call.getVideoState())))
+ && canVideoPause && !mIsInBackground) {
+ // Send resume request for the active call, if user rejects incoming call, ends dialing
+ // call, or the call was previously in a paused state and UI is in the foreground.
+ sendRequest(call, true);
+ } else if (isIncomingCall(call) && canVideoPause(mPrimaryCallContext)) {
+ // Send pause request if there is an active video call, and we just received a new
+ // incoming call.
+ sendRequest(mPrimaryCallContext.getCall(), false);
+ }
+
+ updatePrimaryCallContext(call);
+ }
+
+ /**
+ * Handles new incoming calls by triggering a change in the primary call.
+ *
+ * @param oldState the old {@link InCallState}.
+ * @param newState the new {@link InCallState}.
+ * @param call the incoming call.
+ */
+ @Override
+ public void onIncomingCall(InCallState oldState, InCallState newState, Call call) {
+ log("onIncomingCall, OldState=" + oldState + " NewState=" + newState + " Call=" + call);
+
+ if (areSame(call, mPrimaryCallContext)) {
+ return;
+ }
+
+ onPrimaryCallChanged(call);
+ }
+
+ /**
+ * Caches a reference to the primary call and stores its previous state.
+ *
+ * @param call The new primary call.
+ */
+ private void updatePrimaryCallContext(Call call) {
+ if (call == null) {
+ mPrimaryCallContext = null;
+ } else if (mPrimaryCallContext != null) {
+ mPrimaryCallContext.update(call);
+ } else {
+ mPrimaryCallContext = new CallContext(call);
+ }
+ }
+
+ /**
+ * Called when UI goes in/out of the foreground.
+ * @param showing true if UI is in the foreground, false otherwise.
+ */
+ public void onUiShowing(boolean showing) {
+ // Only send pause/unpause requests if we are in the INCALL state.
+ if (mInCallPresenter == null || mInCallPresenter.getInCallState() != InCallState.INCALL) {
+ return;
+ }
+
+ if (showing) {
+ onResume();
+ } else {
+ onPause();
+ }
+ }
+
+ /**
+ * Called when UI is brought to the foreground. Sends a session modification request to resume
+ * the outgoing video.
+ */
+ private void onResume() {
+ log("onResume");
+
+ mIsInBackground = false;
+ if (canVideoPause(mPrimaryCallContext)) {
+ sendRequest(mPrimaryCallContext.getCall(), true);
+ } else {
+ log("onResume. Ignoring...");
+ }
+ }
+
+ /**
+ * Called when UI is sent to the background. Sends a session modification request to pause the
+ * outgoing video.
+ */
+ private void onPause() {
+ log("onPause");
+
+ mIsInBackground = true;
+ if (canVideoPause(mPrimaryCallContext)) {
+ sendRequest(mPrimaryCallContext.getCall(), false);
+ } else {
+ log("onPause, Ignoring...");
+ }
+ }
+
+ private void bringToForeground() {
+ if (mInCallPresenter != null) {
+ log("Bringing UI to foreground");
+ mInCallPresenter.bringToForeground(false);
+ } else {
+ loge("InCallPresenter is null. Cannot bring UI to foreground");
+ }
+ }
+
+ /**
+ * Sends Pause/Resume request.
+ *
+ * @param call Call to be paused/resumed.
+ * @param resume If true resume request will be sent, otherwise pause request.
+ */
+ private void sendRequest(Call call, boolean resume) {
+ // Check if this call supports pause/un-pause.
+ if (!call.can(android.telecom.Call.Details.CAPABILITY_CAN_PAUSE_VIDEO)) {
+ return;
+ }
+
+ if (resume) {
+ log("sending resume request, call=" + call);
+ call.getVideoCall()
+ .sendSessionModifyRequest(VideoUtils.makeVideoUnPauseProfile(call));
+ } else {
+ log("sending pause request, call=" + call);
+ call.getVideoCall().sendSessionModifyRequest(VideoUtils.makeVideoPauseProfile(call));
+ }
+ }
+
+ /**
+ * Determines if a given call is the same one stored in a {@link CallContext}.
+ *
+ * @param call The call.
+ * @param callContext The call context.
+ * @return {@code true} if the {@link Call} is the same as the one referenced in the
+ * {@link CallContext}.
+ */
+ private static boolean areSame(Call call, CallContext callContext) {
+ if (call == null && callContext == null) {
+ return true;
+ } else if (call == null || callContext == null) {
+ return false;
+ }
+ return call.equals(callContext.getCall());
+ }
+
+ /**
+ * Determines if a video call can be paused. Only a video call which is active can be paused.
+ *
+ * @param callContext The call context to check.
+ * @return {@code true} if the call is an active video call.
+ */
+ private static boolean canVideoPause(CallContext callContext) {
+ return isVideoCall(callContext) && callContext.getState() == Call.State.ACTIVE;
+ }
+
+ /**
+ * Determines if a call referenced by a {@link CallContext} is a video call.
+ *
+ * @param callContext The call context.
+ * @return {@code true} if the call is a video call, {@code false} otherwise.
+ */
+ private static boolean isVideoCall(CallContext callContext) {
+ return callContext != null && VideoUtils.isVideoCall(callContext.getVideoState());
+ }
+
+ /**
+ * Determines if call is in incoming/waiting state.
+ *
+ * @param call The call context.
+ * @return {@code true} if the call is in incoming or waiting state, {@code false} otherwise.
+ */
+ private static boolean isIncomingCall(CallContext call) {
+ return call != null && isIncomingCall(call.getCall());
+ }
+
+ /**
+ * Determines if a call is in incoming/waiting state.
+ *
+ * @param call The call.
+ * @return {@code true} if the call is in incoming or waiting state, {@code false} otherwise.
+ */
+ private static boolean isIncomingCall(Call call) {
+ return call != null && (call.getState() == Call.State.CALL_WAITING
+ || call.getState() == Call.State.INCOMING);
+ }
+
+ /**
+ * Determines if a call is dialing.
+ *
+ * @param call The call context.
+ * @return {@code true} if the call is dialing, {@code false} otherwise.
+ */
+ private static boolean isDialing(CallContext call) {
+ return call != null && Call.State.isDialing(call.getState());
+ }
+
+ /**
+ * Determines if a call is holding.
+ *
+ * @param call The call context.
+ * @return {@code true} if the call is holding, {@code false} otherwise.
+ */
+ private static boolean isHolding(CallContext call) {
+ return call != null && call.getState() == Call.State.ONHOLD;
+ }
+
+ /**
+ * Logs a debug message.
+ *
+ * @param msg The message.
+ */
+ private void log(String msg) {
+ Log.d(this, TAG + msg);
+ }
+
+ /**
+ * Logs an error message.
+ *
+ * @param msg The message.
+ */
+ private void loge(String msg) {
+ Log.e(this, TAG + msg);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/VideoUtils.java b/InCallUI/src/com/android/incallui/VideoUtils.java
new file mode 100644
index 000000000..8641d60ec
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/VideoUtils.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.telecom.VideoProfile;
+
+import com.android.contacts.common.compat.CompatUtils;
+
+import com.google.common.base.Preconditions;
+
+public class VideoUtils {
+
+ public static boolean isVideoCall(Call call) {
+ return call != null && isVideoCall(call.getVideoState());
+ }
+
+ public static boolean isVideoCall(int videoState) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ return VideoProfile.isTransmissionEnabled(videoState)
+ || VideoProfile.isReceptionEnabled(videoState);
+ }
+
+ public static boolean isBidirectionalVideoCall(Call call) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return false;
+ }
+
+ return VideoProfile.isBidirectional(call.getVideoState());
+ }
+
+ public static boolean isIncomingVideoCall(Call call) {
+ if (!VideoUtils.isVideoCall(call)) {
+ return false;
+ }
+ final int state = call.getState();
+ return (state == Call.State.INCOMING) || (state == Call.State.CALL_WAITING);
+ }
+
+ public static boolean isActiveVideoCall(Call call) {
+ return VideoUtils.isVideoCall(call) && call.getState() == Call.State.ACTIVE;
+ }
+
+ public static boolean isOutgoingVideoCall(Call call) {
+ if (!VideoUtils.isVideoCall(call)) {
+ return false;
+ }
+ final int state = call.getState();
+ return Call.State.isDialing(state) || state == Call.State.CONNECTING
+ || state == Call.State.SELECT_PHONE_ACCOUNT;
+ }
+
+ public static boolean isAudioCall(Call call) {
+ if (!CompatUtils.isVideoCompatible()) {
+ return true;
+ }
+
+ return call != null && VideoProfile.isAudioOnly(call.getVideoState());
+ }
+
+ // TODO (ims-vt) Check if special handling is needed for CONF calls.
+ public static boolean canVideoPause(Call call) {
+ return isVideoCall(call) && call.getState() == Call.State.ACTIVE;
+ }
+
+ public static VideoProfile makeVideoPauseProfile(Call call) {
+ Preconditions.checkNotNull(call);
+ Preconditions.checkState(!VideoProfile.isAudioOnly(call.getVideoState()));
+ return new VideoProfile(getPausedVideoState(call.getVideoState()));
+ }
+
+ public static VideoProfile makeVideoUnPauseProfile(Call call) {
+ Preconditions.checkNotNull(call);
+ return new VideoProfile(getUnPausedVideoState(call.getVideoState()));
+ }
+
+ public static int getUnPausedVideoState(int videoState) {
+ return videoState & (~VideoProfile.STATE_PAUSED);
+ }
+
+ public static int getPausedVideoState(int videoState) {
+ return videoState | VideoProfile.STATE_PAUSED;
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/async/PausableExecutor.java b/InCallUI/src/com/android/incallui/async/PausableExecutor.java
new file mode 100644
index 000000000..1b8201a79
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/async/PausableExecutor.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.async;
+
+import com.android.contacts.common.testing.NeededForTesting;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Executor that can be used to easily synchronize testing and production code. Production code
+ * should call {@link #milestone()} at points in the code where the state of the system is worthy of
+ * testing. In a test scenario, this method will pause execution until the test acknowledges the
+ * milestone through the use of {@link #ackMilestoneForTesting()}.
+ */
+public interface PausableExecutor extends Executor {
+
+ /**
+ * Method called from asynchronous production code to inform this executor that it has
+ * reached a point that puts the system into a state worth testing. TestableExecutors intended
+ * for use in a testing environment should cause the calling thread to block. In the production
+ * environment this should be a no-op.
+ */
+ void milestone();
+
+ /**
+ * Method called from the test code to inform this executor that the state of the production
+ * system at the current milestone has been sufficiently tested. Every milestone must be
+ * acknowledged.
+ */
+ @NeededForTesting
+ void ackMilestoneForTesting();
+
+ /**
+ * Method called from the test code to inform this executor that the tests are finished with all
+ * milestones. Future calls to {@link #milestone()} or {@link #awaitMilestoneForTesting()}
+ * should return immediately.
+ */
+ @NeededForTesting
+ void ackAllMilestonesForTesting();
+
+ /**
+ * Method called from the test code to block until a milestone has been reached in the
+ * production code.
+ */
+ @NeededForTesting
+ void awaitMilestoneForTesting() throws InterruptedException;
+}
diff --git a/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java b/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java
new file mode 100644
index 000000000..15900e57b
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/async/PausableExecutorImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.async;
+
+import java.util.concurrent.Executors;
+
+/**
+ * {@link PausableExecutor} intended for use in production environments.
+ */
+public class PausableExecutorImpl implements PausableExecutor {
+
+ @Override
+ public void milestone() {}
+
+ @Override
+ public void ackMilestoneForTesting() {}
+
+ @Override
+ public void ackAllMilestonesForTesting() {}
+
+ @Override
+ public void awaitMilestoneForTesting() {}
+
+ @Override
+ public void execute(Runnable command) {
+ Executors.newSingleThreadExecutor().execute(command);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java
new file mode 100644
index 000000000..39844e5a2
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ringtone/DialerRingtoneManager.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.ringtone;
+
+import com.google.common.base.Preconditions;
+
+import android.content.ContentResolver;
+import android.net.Uri;
+import android.provider.Settings;
+import android.support.annotation.Nullable;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.incallui.Call;
+import com.android.incallui.Call.State;
+import com.android.incallui.CallList;
+
+/**
+ * Class that determines when ringtones should be played and can play the call waiting tone when
+ * necessary.
+ */
+public class DialerRingtoneManager {
+
+ /*
+ * Flag used to determine if the Dialer is responsible for playing ringtones for incoming calls.
+ * Once we're ready to enable Dialer Ringing, these flags should be removed.
+ */
+ private static final boolean IS_DIALER_RINGING_ENABLED = false;
+ private Boolean mIsDialerRingingEnabledForTesting;
+
+ private final InCallTonePlayer mInCallTonePlayer;
+ private final CallList mCallList;
+
+ /**
+ * Creates the DialerRingtoneManager with the given {@link InCallTonePlayer}.
+ *
+ * @param inCallTonePlayer the tone player used to play in-call tones.
+ * @param callList the CallList used to check for {@link State#CALL_WAITING}
+ * @throws NullPointerException if inCallTonePlayer or callList are null
+ */
+ public DialerRingtoneManager(InCallTonePlayer inCallTonePlayer, CallList callList) {
+ mInCallTonePlayer = Preconditions.checkNotNull(inCallTonePlayer);
+ mCallList = Preconditions.checkNotNull(callList);
+ }
+
+ /**
+ * Determines if a ringtone should be played for the given call state (see {@link State}) and
+ * {@link Uri}.
+ *
+ * @param callState the call state for the call being checked.
+ * @param ringtoneUri the ringtone to potentially play.
+ * @return {@code true} if the ringtone should be played, {@code false} otherwise.
+ */
+ public boolean shouldPlayRingtone(int callState, @Nullable Uri ringtoneUri) {
+ return isDialerRingingEnabled()
+ && translateCallStateForCallWaiting(callState) == State.INCOMING
+ && ringtoneUri != null;
+ }
+
+ /**
+ * Determines if an incoming call should vibrate as well as ring.
+ *
+ * @param resolver {@link ContentResolver} used to look up the
+ * {@link Settings.System#VIBRATE_WHEN_RINGING} setting.
+ * @return {@code true} if the call should vibrate, {@code false} otherwise.
+ */
+ public boolean shouldVibrate(ContentResolver resolver) {
+ return Settings.System.getInt(resolver, Settings.System.VIBRATE_WHEN_RINGING, 0) != 0;
+ }
+
+ /**
+ * The incoming callState is never set as {@link State#CALL_WAITING} because
+ * {@link Call#translateState(int)} doesn't account for that case, check for it here
+ */
+ private int translateCallStateForCallWaiting(int callState) {
+ if (callState != State.INCOMING) {
+ return callState;
+ }
+ return mCallList.getActiveCall() == null ? State.INCOMING : State.CALL_WAITING;
+ }
+
+ private boolean isDialerRingingEnabled() {
+ if (mIsDialerRingingEnabledForTesting != null) {
+ return mIsDialerRingingEnabledForTesting;
+ }
+ return CompatUtils.isNCompatible() && IS_DIALER_RINGING_ENABLED;
+ }
+
+ /**
+ * Determines if a call waiting tone should be played for the the given call state
+ * (see {@link State}).
+ *
+ * @param callState the call state for the call being checked.
+ * @return {@code true} if the call waiting tone should be played, {@code false} otherwise.
+ */
+ public boolean shouldPlayCallWaitingTone(int callState) {
+ return isDialerRingingEnabled()
+ && translateCallStateForCallWaiting(callState) == State.CALL_WAITING
+ && !mInCallTonePlayer.isPlayingTone();
+ }
+
+ /**
+ * Plays the call waiting tone.
+ */
+ public void playCallWaitingTone() {
+ if (!isDialerRingingEnabled()) {
+ return;
+ }
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ }
+
+ /**
+ * Stops playing the call waiting tone.
+ */
+ public void stopCallWaitingTone() {
+ if (!isDialerRingingEnabled()) {
+ return;
+ }
+ mInCallTonePlayer.stop();
+ }
+
+ @NeededForTesting
+ void setDialerRingingEnabledForTesting(boolean status) {
+ mIsDialerRingingEnabledForTesting = status;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java b/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java
new file mode 100644
index 000000000..3a8b03d91
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ringtone/InCallTonePlayer.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.ringtone;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+
+import android.media.AudioManager;
+import android.media.ToneGenerator;
+import android.support.annotation.Nullable;
+
+import com.android.incallui.Log;
+import com.android.incallui.async.PausableExecutor;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Class responsible for playing in-call related tones in a background thread. This class only
+ * allows one tone to be played at a time.
+ */
+public class InCallTonePlayer {
+
+ public static final int TONE_CALL_WAITING = 4;
+
+ public static final int VOLUME_RELATIVE_HIGH_PRIORITY = 80;
+
+ private final ToneGeneratorFactory mToneGeneratorFactory;
+ private final PausableExecutor mExecutor;
+ private @Nullable CountDownLatch mNumPlayingTones;
+
+ /**
+ * Creates a new InCallTonePlayer.
+ *
+ * @param toneGeneratorFactory the {@link ToneGeneratorFactory} used to create
+ * {@link ToneGenerator}s.
+ * @param executor the {@link PausableExecutor} used to play tones in a background thread.
+ * @throws NullPointerException if audioModeProvider, toneGeneratorFactory, or executor are
+ * {@code null}.
+ */
+ public InCallTonePlayer(ToneGeneratorFactory toneGeneratorFactory, PausableExecutor executor) {
+ mToneGeneratorFactory = Preconditions.checkNotNull(toneGeneratorFactory);
+ mExecutor = Preconditions.checkNotNull(executor);
+ }
+
+ /**
+ * @return {@code true} if a tone is currently playing, {@code false} otherwise.
+ */
+ public boolean isPlayingTone() {
+ return mNumPlayingTones != null && mNumPlayingTones.getCount() > 0;
+ }
+
+ /**
+ * Plays the given tone in a background thread.
+ *
+ * @param tone the tone to play.
+ * @throws IllegalStateException if a tone is already playing.
+ * @throws IllegalArgumentException if the tone is invalid.
+ */
+ public void play(int tone) {
+ if (isPlayingTone()) {
+ throw new IllegalStateException("Tone already playing");
+ }
+ final ToneGeneratorInfo info = getToneGeneratorInfo(tone);
+ mNumPlayingTones = new CountDownLatch(1);
+ mExecutor.execute(new Runnable() {
+ @Override
+ public void run() {
+ playOnBackgroundThread(info);
+ }
+ });
+ }
+
+ private ToneGeneratorInfo getToneGeneratorInfo(int tone) {
+ switch (tone) {
+ case TONE_CALL_WAITING:
+ /*
+ * Call waiting tones play until they're stopped either by the user accepting or
+ * declining the call so the tone length is set at what's effectively forever. The
+ * tone is played at a high priority volume and through STREAM_VOICE_CALL since it's
+ * call related and using that stream will route it through bluetooth devices
+ * appropriately.
+ */
+ return new ToneGeneratorInfo(ToneGenerator.TONE_SUP_CALL_WAITING,
+ VOLUME_RELATIVE_HIGH_PRIORITY,
+ Integer.MAX_VALUE,
+ AudioManager.STREAM_VOICE_CALL);
+ default:
+ throw new IllegalArgumentException("Bad tone: " + tone);
+ }
+ }
+
+ private void playOnBackgroundThread(ToneGeneratorInfo info) {
+ ToneGenerator toneGenerator = null;
+ try {
+ Log.v(this, "Starting tone " + info);
+ toneGenerator = mToneGeneratorFactory.newInCallToneGenerator(info.stream, info.volume);
+ toneGenerator.startTone(info.tone);
+ /*
+ * During tests, this will block until the tests call mExecutor.ackMilestone. This call
+ * allows for synchronization to the point where the tone has started playing.
+ */
+ mExecutor.milestone();
+ if (mNumPlayingTones != null) {
+ mNumPlayingTones.await(info.toneLengthMillis, TimeUnit.MILLISECONDS);
+ // Allows for synchronization to the point where the tone has completed playing.
+ mExecutor.milestone();
+ }
+ } catch (InterruptedException e) {
+ Log.w(this, "Interrupted while playing in-call tone.");
+ } finally {
+ if (toneGenerator != null) {
+ toneGenerator.release();
+ }
+ if (mNumPlayingTones != null) {
+ mNumPlayingTones.countDown();
+ }
+ // Allows for synchronization to the point where this background thread has cleaned up.
+ mExecutor.milestone();
+ }
+ }
+
+ /**
+ * Stops playback of the current tone.
+ */
+ public void stop() {
+ if (mNumPlayingTones != null) {
+ mNumPlayingTones.countDown();
+ }
+ }
+
+ private static class ToneGeneratorInfo {
+ public final int tone;
+ public final int volume;
+ public final int toneLengthMillis;
+ public final int stream;
+
+ public ToneGeneratorInfo(int toneGeneratorType, int volume, int toneLengthMillis,
+ int stream) {
+ this.tone = toneGeneratorType;
+ this.volume = volume;
+ this.toneLengthMillis = toneLengthMillis;
+ this.stream = stream;
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("tone", tone)
+ .add("volume", volume)
+ .add("toneLengthMillis", toneLengthMillis).toString();
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/ringtone/ToneGeneratorFactory.java b/InCallUI/src/com/android/incallui/ringtone/ToneGeneratorFactory.java
new file mode 100644
index 000000000..ac47c8a7d
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/ringtone/ToneGeneratorFactory.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.ringtone;
+
+import android.media.ToneGenerator;
+
+/**
+ * Factory used to create {@link ToneGenerator}s.
+ */
+public class ToneGeneratorFactory {
+
+ /**
+ * Creates a new {@link ToneGenerator} to use while in a call.
+ *
+ * @param stream the stream through which to play tones.
+ * @param volume the volume at which to play tones.
+ * @return a new ToneGenerator.
+ */
+ public ToneGenerator newInCallToneGenerator(int stream, int volume) {
+ return new ToneGenerator(stream, volume);
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
new file mode 100644
index 000000000..70da4ef3a
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.service;
+
+import android.graphics.Bitmap;
+
+/**
+ * Provides phone number lookup services.
+ */
+public interface PhoneNumberService {
+
+ /**
+ * Get a phone number number asynchronously.
+ *
+ * @param phoneNumber The phone number to lookup.
+ * @param listener The listener to notify when the phone number lookup is complete.
+ * @param imageListener The listener to notify when the image lookup is complete.
+ */
+ public void getPhoneNumberInfo(String phoneNumber, NumberLookupListener listener,
+ ImageLookupListener imageListener, boolean isIncoming);
+
+ public interface NumberLookupListener {
+
+ /**
+ * Callback when a phone number has been looked up.
+ *
+ * @param info The looked up information. Or (@literal null} if there are no results.
+ */
+ public void onPhoneNumberInfoComplete(PhoneNumberInfo info);
+ }
+
+ public interface ImageLookupListener {
+
+ /**
+ * Callback when a image has been fetched.
+ *
+ * @param bitmap The fetched image.
+ */
+ public void onImageFetchComplete(Bitmap bitmap);
+ }
+
+ public interface PhoneNumberInfo {
+ public String getDisplayName();
+ public String getNumber();
+ public int getPhoneType();
+ public String getPhoneLabel();
+ public String getNormalizedNumber();
+ public String getImageUrl();
+ public String getLookupKey();
+ public boolean isBusiness();
+ public int getLookupSource();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/util/AccessibilityUtil.java b/InCallUI/src/com/android/incallui/util/AccessibilityUtil.java
new file mode 100644
index 000000000..1fdd2bac6
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/util/AccessibilityUtil.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.util;
+
+import android.content.Context;
+import android.view.accessibility.AccessibilityManager;
+
+public class AccessibilityUtil {
+ public static boolean isTalkBackEnabled(Context context) {
+ AccessibilityManager accessibilityManager = (AccessibilityManager) context
+ .getSystemService(Context.ACCESSIBILITY_SERVICE);
+ return accessibilityManager != null
+ && accessibilityManager.isEnabled()
+ && accessibilityManager.isTouchExplorationEnabled();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/util/TelecomCallUtil.java b/InCallUI/src/com/android/incallui/util/TelecomCallUtil.java
new file mode 100644
index 000000000..53ecc29e9
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/util/TelecomCallUtil.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.util;
+
+import android.net.Uri;
+import android.telecom.Call;
+import android.telephony.PhoneNumberUtils;
+
+/**
+ * Class to provide a standard interface for obtaining information from the underlying
+ * android.telecom.Call. Much of this should be obtained through the incall.Call, but
+ * on occasion we need to interact with the telecom.Call directly (eg. call blocking,
+ * before the incall.Call has been created).
+ */
+public class TelecomCallUtil {
+
+ // Whether the call handle is an emergency number.
+ public static boolean isEmergencyCall(Call call) {
+ Uri handle = call.getDetails().getHandle();
+ return PhoneNumberUtils.isEmergencyNumber(
+ handle == null ? "" : handle.getSchemeSpecificPart());
+ }
+
+ public static String getNumber(Call call) {
+ if (call == null) {
+ return null;
+ }
+ if (call.getDetails().getGatewayInfo() != null) {
+ return call.getDetails().getGatewayInfo()
+ .getOriginalAddress().getSchemeSpecificPart();
+ }
+ Uri handle = getHandle(call);
+ return handle == null ? null : handle.getSchemeSpecificPart();
+ }
+
+ public static Uri getHandle(Call call) {
+ return call == null ? null : call.getDetails().getHandle();
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java
new file mode 100644
index 000000000..5ef689771
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/Ease.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.widget.multiwaveview;
+
+import android.animation.TimeInterpolator;
+
+class Ease {
+ private static final float DOMAIN = 1.0f;
+ private static final float DURATION = 1.0f;
+ private static final float START = 0.0f;
+
+ static class Linear {
+ public static final TimeInterpolator easeNone = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return input;
+ }
+ };
+ }
+
+ static class Cubic {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*(input/=DURATION)*input*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*((input=input/DURATION-1)*input*input + 1) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1.0f) ?
+ (DOMAIN/2*input*input*input + START)
+ : (DOMAIN/2*((input-=2)*input*input + 2) + START);
+ }
+ };
+ }
+
+ static class Quad {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation (float input) {
+ return DOMAIN*(input/=DURATION)*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN *(input/=DURATION)*(input-2) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1) ?
+ (DOMAIN/2*input*input + START)
+ : (-DOMAIN/2 * ((--input)*(input-2) - 1) + START);
+ }
+ };
+ }
+
+ static class Quart {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*(input/=DURATION)*input*input*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN * ((input=input/DURATION-1)*input*input*input - 1) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1) ?
+ (DOMAIN/2*input*input*input*input + START)
+ : (-DOMAIN/2 * ((input-=2)*input*input*input - 2) + START);
+ }
+ };
+ }
+
+ static class Quint {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*(input/=DURATION)*input*input*input*input + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN*((input=input/DURATION-1)*input*input*input*input + 1) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return ((input/=DURATION/2) < 1) ?
+ (DOMAIN/2*input*input*input*input*input + START)
+ : (DOMAIN/2*((input-=2)*input*input*input*input + 2) + START);
+ }
+ };
+ }
+
+ static class Sine {
+ public static final TimeInterpolator easeIn = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN * (float) Math.cos(input/DURATION * (Math.PI/2)) + DOMAIN + START;
+ }
+ };
+ public static final TimeInterpolator easeOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return DOMAIN * (float) Math.sin(input/DURATION * (Math.PI/2)) + START;
+ }
+ };
+ public static final TimeInterpolator easeInOut = new TimeInterpolator() {
+ public float getInterpolation(float input) {
+ return -DOMAIN/2 * ((float)Math.cos(Math.PI*input/DURATION) - 1.0f) + START;
+ }
+ };
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
new file mode 100644
index 000000000..efeb4b7e3
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
@@ -0,0 +1,1473 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.widget.multiwaveview;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.support.v4.view.ViewCompat;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
+import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.support.v4.widget.ExploreByTouchHelper;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
+import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
+import android.view.accessibility.AccessibilityNodeProvider;
+
+import com.android.dialer.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This is a copy of com.android.internal.widget.multiwaveview.GlowPadView with minor changes
+ * to remove dependencies on private api's.
+ *
+ * Incoporated the scaling functionality.
+ *
+ * A re-usable widget containing a center, outer ring and wave animation.
+ */
+public class GlowPadView extends View {
+ private static final String TAG = "GlowPadView";
+ private static final boolean DEBUG = false;
+
+ // Wave state machine
+ private static final int STATE_IDLE = 0;
+ private static final int STATE_START = 1;
+ private static final int STATE_FIRST_TOUCH = 2;
+ private static final int STATE_TRACKING = 3;
+ private static final int STATE_SNAP = 4;
+ private static final int STATE_FINISH = 5;
+
+ // Animation properties.
+ private static final float SNAP_MARGIN_DEFAULT = 20.0f; // distance to ring before we snap to it
+
+ public interface OnTriggerListener {
+ int NO_HANDLE = 0;
+ int CENTER_HANDLE = 1;
+ public void onGrabbed(View v, int handle);
+ public void onReleased(View v, int handle);
+ public void onTrigger(View v, int target);
+ public void onGrabbedStateChange(View v, int handle);
+ public void onFinishFinalAnimation();
+ }
+
+ // Tuneable parameters for animation
+ private static final int WAVE_ANIMATION_DURATION = 1350;
+ private static final int RETURN_TO_HOME_DELAY = 1200;
+ private static final int RETURN_TO_HOME_DURATION = 200;
+ private static final int HIDE_ANIMATION_DELAY = 200;
+ private static final int HIDE_ANIMATION_DURATION = 200;
+ private static final int SHOW_ANIMATION_DURATION = 200;
+ private static final int SHOW_ANIMATION_DELAY = 50;
+ private static final int INITIAL_SHOW_HANDLE_DURATION = 200;
+ private static final int REVEAL_GLOW_DELAY = 0;
+ private static final int REVEAL_GLOW_DURATION = 0;
+
+ private static final float TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED = 1.3f;
+ private static final float TARGET_SCALE_EXPANDED = 1.0f;
+ private static final float TARGET_SCALE_COLLAPSED = 0.8f;
+ private static final float RING_SCALE_EXPANDED = 1.0f;
+ private static final float RING_SCALE_COLLAPSED = 0.5f;
+
+ private ArrayList<TargetDrawable> mTargetDrawables = new ArrayList<TargetDrawable>();
+ private AnimationBundle mWaveAnimations = new AnimationBundle();
+ private AnimationBundle mTargetAnimations = new AnimationBundle();
+ private AnimationBundle mGlowAnimations = new AnimationBundle();
+ private ArrayList<String> mTargetDescriptions;
+ private ArrayList<String> mDirectionDescriptions;
+ private OnTriggerListener mOnTriggerListener;
+ private TargetDrawable mHandleDrawable;
+ private TargetDrawable mOuterRing;
+ private Vibrator mVibrator;
+
+ private int mFeedbackCount = 3;
+ private int mVibrationDuration = 0;
+ private int mGrabbedState;
+ private int mActiveTarget = -1;
+ private float mGlowRadius;
+ private float mWaveCenterX;
+ private float mWaveCenterY;
+ private int mMaxTargetHeight;
+ private int mMaxTargetWidth;
+ private float mRingScaleFactor = 1f;
+ private boolean mAllowScaling;
+
+ private float mOuterRadius = 0.0f;
+ private float mSnapMargin = 0.0f;
+ private boolean mDragging;
+ private int mNewTargetResources;
+
+ private AccessibilityNodeProvider mAccessibilityNodeProvider;
+ private GlowpadExploreByTouchHelper mExploreByTouchHelper;
+
+ private class AnimationBundle extends ArrayList<Tweener> {
+ private static final long serialVersionUID = 0xA84D78726F127468L;
+ private boolean mSuspended;
+
+ public void start() {
+ if (mSuspended) return; // ignore attempts to start animations
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.start();
+ }
+ }
+
+ public void cancel() {
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.cancel();
+ }
+ clear();
+ }
+
+ public void stop() {
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.end();
+ }
+ clear();
+ }
+
+ public void setSuspended(boolean suspend) {
+ mSuspended = suspend;
+ }
+ };
+
+ private AnimatorListener mResetListener = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
+ dispatchOnFinishFinalAnimation();
+ }
+ };
+
+ private AnimatorListener mResetListenerWithPing = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ ping();
+ switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
+ dispatchOnFinishFinalAnimation();
+ }
+ };
+
+ private AnimatorUpdateListener mUpdateListener = new AnimatorUpdateListener() {
+ public void onAnimationUpdate(ValueAnimator animation) {
+ invalidate();
+ }
+ };
+
+ private boolean mAnimatingTargets;
+ private AnimatorListener mTargetUpdateListener = new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ if (mNewTargetResources != 0) {
+ internalSetTargetResources(mNewTargetResources);
+ mNewTargetResources = 0;
+ hideTargets(false, false);
+ }
+ mAnimatingTargets = false;
+ }
+ };
+ private int mTargetResourceId;
+ private int mTargetDescriptionsResourceId;
+ private int mDirectionDescriptionsResourceId;
+ private boolean mAlwaysTrackFinger;
+ private int mHorizontalInset;
+ private int mVerticalInset;
+ private int mGravity = Gravity.TOP;
+ private boolean mInitialLayout = true;
+ private Tweener mBackgroundAnimator;
+ private PointCloud mPointCloud;
+ private float mInnerRadius;
+ private int mPointerId;
+
+ public GlowPadView(Context context) {
+ this(context, null);
+ }
+
+ public GlowPadView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Resources res = context.getResources();
+
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GlowPadView);
+ mInnerRadius = a.getDimension(R.styleable.GlowPadView_innerRadius, mInnerRadius);
+ mOuterRadius = a.getDimension(R.styleable.GlowPadView_outerRadius, mOuterRadius);
+ mSnapMargin = a.getDimension(R.styleable.GlowPadView_snapMargin, mSnapMargin);
+ mVibrationDuration = a.getInt(R.styleable.GlowPadView_vibrationDuration,
+ mVibrationDuration);
+ mFeedbackCount = a.getInt(R.styleable.GlowPadView_feedbackCount,
+ mFeedbackCount);
+ mAllowScaling = a.getBoolean(R.styleable.GlowPadView_allowScaling, false);
+ TypedValue handle = a.peekValue(R.styleable.GlowPadView_handleDrawable);
+ setHandleDrawable(handle != null ? handle.resourceId : R.drawable.ic_incall_audio_handle);
+ mOuterRing = new TargetDrawable(res,
+ getResourceId(a, R.styleable.GlowPadView_outerRingDrawable), 1);
+
+ mAlwaysTrackFinger = a.getBoolean(R.styleable.GlowPadView_alwaysTrackFinger, false);
+
+ int pointId = getResourceId(a, R.styleable.GlowPadView_pointDrawable);
+ Drawable pointDrawable = pointId != 0 ? res.getDrawable(pointId) : null;
+ mGlowRadius = a.getDimension(R.styleable.GlowPadView_glowRadius, 0.0f);
+
+ TypedValue outValue = new TypedValue();
+
+ // Read array of target drawables
+ if (a.getValue(R.styleable.GlowPadView_targetDrawables, outValue)) {
+ internalSetTargetResources(outValue.resourceId);
+ }
+ if (mTargetDrawables == null || mTargetDrawables.size() == 0) {
+ throw new IllegalStateException("Must specify at least one target drawable");
+ }
+
+ // Read array of target descriptions
+ if (a.getValue(R.styleable.GlowPadView_targetDescriptions, outValue)) {
+ final int resourceId = outValue.resourceId;
+ if (resourceId == 0) {
+ throw new IllegalStateException("Must specify target descriptions");
+ }
+ setTargetDescriptionsResourceId(resourceId);
+ }
+
+ // Read array of direction descriptions
+ if (a.getValue(R.styleable.GlowPadView_directionDescriptions, outValue)) {
+ final int resourceId = outValue.resourceId;
+ if (resourceId == 0) {
+ throw new IllegalStateException("Must specify direction descriptions");
+ }
+ setDirectionDescriptionsResourceId(resourceId);
+ }
+
+ // Use gravity attribute from LinearLayout
+ //a = context.obtainStyledAttributes(attrs, R.styleable.LinearLayout);
+ mGravity = a.getInt(R.styleable.GlowPadView_android_gravity, Gravity.TOP);
+ a.recycle();
+
+
+ setVibrateEnabled(mVibrationDuration > 0);
+
+ assignDefaultsIfNeeded();
+
+ mPointCloud = new PointCloud(pointDrawable);
+ mPointCloud.makePointCloud(mInnerRadius, mOuterRadius);
+ mPointCloud.glowManager.setRadius(mGlowRadius);
+
+ mExploreByTouchHelper = new GlowpadExploreByTouchHelper(this);
+ ViewCompat.setAccessibilityDelegate(this, mExploreByTouchHelper);
+ }
+
+ private int getResourceId(TypedArray a, int id) {
+ TypedValue tv = a.peekValue(id);
+ return tv == null ? 0 : tv.resourceId;
+ }
+
+ private void dump() {
+ Log.v(TAG, "Outer Radius = " + mOuterRadius);
+ Log.v(TAG, "SnapMargin = " + mSnapMargin);
+ Log.v(TAG, "FeedbackCount = " + mFeedbackCount);
+ Log.v(TAG, "VibrationDuration = " + mVibrationDuration);
+ Log.v(TAG, "GlowRadius = " + mGlowRadius);
+ Log.v(TAG, "WaveCenterX = " + mWaveCenterX);
+ Log.v(TAG, "WaveCenterY = " + mWaveCenterY);
+ }
+
+ public void suspendAnimations() {
+ mWaveAnimations.setSuspended(true);
+ mTargetAnimations.setSuspended(true);
+ mGlowAnimations.setSuspended(true);
+ }
+
+ public void resumeAnimations() {
+ mWaveAnimations.setSuspended(false);
+ mTargetAnimations.setSuspended(false);
+ mGlowAnimations.setSuspended(false);
+ mWaveAnimations.start();
+ mTargetAnimations.start();
+ mGlowAnimations.start();
+ }
+
+ @Override
+ protected int getSuggestedMinimumWidth() {
+ // View should be large enough to contain the background + handle and
+ // target drawable on either edge.
+ return (int) (Math.max(mOuterRing.getWidth(), 2 * mOuterRadius) + mMaxTargetWidth);
+ }
+
+ @Override
+ protected int getSuggestedMinimumHeight() {
+ // View should be large enough to contain the unlock ring + target and
+ // target drawable on either edge
+ return (int) (Math.max(mOuterRing.getHeight(), 2 * mOuterRadius) + mMaxTargetHeight);
+ }
+
+ /**
+ * This gets the suggested width accounting for the ring's scale factor.
+ */
+ protected int getScaledSuggestedMinimumWidth() {
+ return (int) (mRingScaleFactor * Math.max(mOuterRing.getWidth(), 2 * mOuterRadius)
+ + mMaxTargetWidth);
+ }
+
+ /**
+ * This gets the suggested height accounting for the ring's scale factor.
+ */
+ protected int getScaledSuggestedMinimumHeight() {
+ return (int) (mRingScaleFactor * Math.max(mOuterRing.getHeight(), 2 * mOuterRadius)
+ + mMaxTargetHeight);
+ }
+
+ private int resolveMeasured(int measureSpec, int desired)
+ {
+ int result = 0;
+ int specSize = MeasureSpec.getSize(measureSpec);
+ switch (MeasureSpec.getMode(measureSpec)) {
+ case MeasureSpec.UNSPECIFIED:
+ result = desired;
+ break;
+ case MeasureSpec.AT_MOST:
+ result = Math.min(specSize, desired);
+ break;
+ case MeasureSpec.EXACTLY:
+ default:
+ result = specSize;
+ }
+ return result;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int minimumWidth = getSuggestedMinimumWidth();
+ final int minimumHeight = getSuggestedMinimumHeight();
+ int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
+ int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
+
+ mRingScaleFactor = computeScaleFactor(minimumWidth, minimumHeight,
+ computedWidth, computedHeight);
+
+ int scaledWidth = getScaledSuggestedMinimumWidth();
+ int scaledHeight = getScaledSuggestedMinimumHeight();
+
+ computeInsets(computedWidth - scaledWidth, computedHeight - scaledHeight);
+ setMeasuredDimension(computedWidth, computedHeight);
+ }
+
+ private void switchToState(int state, float x, float y) {
+ switch (state) {
+ case STATE_IDLE:
+ deactivateTargets();
+ hideGlow(0, 0, 0.0f, null);
+ startBackgroundAnimation(0, 0.0f);
+ mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE);
+ mHandleDrawable.setAlpha(1.0f);
+ break;
+
+ case STATE_START:
+ startBackgroundAnimation(0, 0.0f);
+ break;
+
+ case STATE_FIRST_TOUCH:
+ mHandleDrawable.setAlpha(0.0f);
+ deactivateTargets();
+ showTargets(true);
+ startBackgroundAnimation(INITIAL_SHOW_HANDLE_DURATION, 1.0f);
+ setGrabbedState(OnTriggerListener.CENTER_HANDLE);
+
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isEnabled()) {
+ announceTargets();
+ }
+ break;
+
+ case STATE_TRACKING:
+ mHandleDrawable.setAlpha(0.0f);
+ break;
+
+ case STATE_SNAP:
+ // TODO: Add transition states (see list_selector_background_transition.xml)
+ mHandleDrawable.setAlpha(0.0f);
+ showGlow(REVEAL_GLOW_DURATION , REVEAL_GLOW_DELAY, 0.0f, null);
+ break;
+
+ case STATE_FINISH:
+ doFinish();
+ break;
+ }
+ }
+
+ private void showGlow(int duration, int delay, float finalAlpha,
+ AnimatorListener finishListener) {
+ mGlowAnimations.cancel();
+ mGlowAnimations.add(Tweener.to(mPointCloud.glowManager, duration,
+ "ease", Ease.Cubic.easeIn,
+ "delay", delay,
+ "alpha", finalAlpha,
+ "onUpdate", mUpdateListener,
+ "onComplete", finishListener));
+ mGlowAnimations.start();
+ }
+
+ private void hideGlow(int duration, int delay, float finalAlpha,
+ AnimatorListener finishListener) {
+ mGlowAnimations.cancel();
+ mGlowAnimations.add(Tweener.to(mPointCloud.glowManager, duration,
+ "ease", Ease.Quart.easeOut,
+ "delay", delay,
+ "alpha", finalAlpha,
+ "x", 0.0f,
+ "y", 0.0f,
+ "onUpdate", mUpdateListener,
+ "onComplete", finishListener));
+ mGlowAnimations.start();
+ }
+
+ private void deactivateTargets() {
+ final int count = mTargetDrawables.size();
+ for (int i = 0; i < count; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ }
+ mActiveTarget = -1;
+ }
+
+ /**
+ * Dispatches a trigger event to listener. Ignored if a listener is not set.
+ * @param whichTarget the target that was triggered.
+ */
+ private void dispatchTriggerEvent(int whichTarget) {
+ vibrate();
+ if (mOnTriggerListener != null) {
+ mOnTriggerListener.onTrigger(this, whichTarget);
+ }
+ }
+
+ private void dispatchOnFinishFinalAnimation() {
+ if (mOnTriggerListener != null) {
+ mOnTriggerListener.onFinishFinalAnimation();
+ }
+ }
+
+ private void doFinish() {
+ final int activeTarget = mActiveTarget;
+ final boolean targetHit = activeTarget != -1;
+
+ if (targetHit) {
+ if (DEBUG) Log.v(TAG, "Finish with target hit = " + targetHit);
+
+ highlightSelected(activeTarget);
+
+ // Inform listener of any active targets. Typically only one will be active.
+ hideGlow(RETURN_TO_HOME_DURATION, RETURN_TO_HOME_DELAY, 0.0f, mResetListener);
+ dispatchTriggerEvent(activeTarget);
+ if (!mAlwaysTrackFinger) {
+ // Force ring and targets to finish animation to final expanded state
+ mTargetAnimations.stop();
+ }
+ } else {
+ // Animate handle back to the center based on current state.
+ hideGlow(HIDE_ANIMATION_DURATION, 0, 0.0f, mResetListenerWithPing);
+ hideTargets(true, false);
+ }
+
+ setGrabbedState(OnTriggerListener.NO_HANDLE);
+ }
+
+ private void highlightSelected(int activeTarget) {
+ // Highlight the given target and fade others
+ mTargetDrawables.get(activeTarget).setState(TargetDrawable.STATE_ACTIVE);
+ hideUnselected(activeTarget);
+ }
+
+ private void hideUnselected(int active) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ if (i != active) {
+ mTargetDrawables.get(i).setAlpha(0.0f);
+ }
+ }
+ }
+
+ private void hideTargets(boolean animate, boolean expanded) {
+ mTargetAnimations.cancel();
+ // Note: these animations should complete at the same time so that we can swap out
+ // the target assets asynchronously from the setTargetResources() call.
+ mAnimatingTargets = animate;
+ final int duration = animate ? HIDE_ANIMATION_DURATION : 0;
+ final int delay = animate ? HIDE_ANIMATION_DELAY : 0;
+
+ final float targetScale = expanded ?
+ TARGET_SCALE_EXPANDED : TARGET_SCALE_COLLAPSED;
+ final int length = mTargetDrawables.size();
+ final TimeInterpolator interpolator = Ease.Cubic.easeOut;
+ for (int i = 0; i < length; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, duration,
+ "ease", interpolator,
+ "alpha", 0.0f,
+ "scaleX", targetScale,
+ "scaleY", targetScale,
+ "delay", delay,
+ "onUpdate", mUpdateListener));
+ }
+
+ float ringScaleTarget = expanded ?
+ RING_SCALE_EXPANDED : RING_SCALE_COLLAPSED;
+ ringScaleTarget *= mRingScaleFactor;
+ mTargetAnimations.add(Tweener.to(mOuterRing, duration,
+ "ease", interpolator,
+ "alpha", 0.0f,
+ "scaleX", ringScaleTarget,
+ "scaleY", ringScaleTarget,
+ "delay", delay,
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
+
+ mTargetAnimations.start();
+ }
+
+ private void showTargets(boolean animate) {
+ mTargetAnimations.stop();
+ mAnimatingTargets = animate;
+ final int delay = animate ? SHOW_ANIMATION_DELAY : 0;
+ final int duration = animate ? SHOW_ANIMATION_DURATION : 0;
+ final int length = mTargetDrawables.size();
+ for (int i = 0; i < length; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, duration,
+ "ease", Ease.Cubic.easeOut,
+ "alpha", 1.0f,
+ "scaleX", 1.0f,
+ "scaleY", 1.0f,
+ "delay", delay,
+ "onUpdate", mUpdateListener));
+ }
+ float ringScale = mRingScaleFactor * RING_SCALE_EXPANDED;
+ mTargetAnimations.add(Tweener.to(mOuterRing, duration,
+ "ease", Ease.Cubic.easeOut,
+ "alpha", 1.0f,
+ "scaleX", ringScale,
+ "scaleY", ringScale,
+ "delay", delay,
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
+
+ mTargetAnimations.start();
+ }
+
+ private void vibrate() {
+ if (mVibrator != null) {
+ mVibrator.vibrate(mVibrationDuration);
+ }
+ }
+
+ private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) {
+ Resources res = getContext().getResources();
+ TypedArray array = res.obtainTypedArray(resourceId);
+ final int count = array.length();
+ ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count);
+ for (int i = 0; i < count; i++) {
+ TypedValue value = array.peekValue(i);
+ TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0, 3);
+ drawables.add(target);
+ }
+ array.recycle();
+ return drawables;
+ }
+
+ private void internalSetTargetResources(int resourceId) {
+ final ArrayList<TargetDrawable> targets = loadDrawableArray(resourceId);
+ mTargetDrawables = targets;
+ mTargetResourceId = resourceId;
+
+ int maxWidth = mHandleDrawable.getWidth();
+ int maxHeight = mHandleDrawable.getHeight();
+ final int count = targets.size();
+ for (int i = 0; i < count; i++) {
+ TargetDrawable target = targets.get(i);
+ maxWidth = Math.max(maxWidth, target.getWidth());
+ maxHeight = Math.max(maxHeight, target.getHeight());
+ }
+ if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) {
+ mMaxTargetWidth = maxWidth;
+ mMaxTargetHeight = maxHeight;
+ requestLayout(); // required to resize layout and call updateTargetPositions()
+ } else {
+ updateTargetPositions(mWaveCenterX, mWaveCenterY);
+ updatePointCloudPosition(mWaveCenterX, mWaveCenterY);
+ }
+ }
+ /**
+ * Loads an array of drawables from the given resourceId.
+ *
+ * @param resourceId
+ */
+ public void setTargetResources(int resourceId) {
+ if (mAnimatingTargets) {
+ // postpone this change until we return to the initial state
+ mNewTargetResources = resourceId;
+ } else {
+ internalSetTargetResources(resourceId);
+ }
+ }
+
+ public int getTargetResourceId() {
+ return mTargetResourceId;
+ }
+
+ /**
+ * Sets the handle drawable to the drawable specified by the resource ID.
+ * @param resourceId
+ */
+ public void setHandleDrawable(int resourceId) {
+ if (mHandleDrawable != null) {
+ mHandleDrawable.setDrawable(getResources(), resourceId);
+ } else {
+ mHandleDrawable = new TargetDrawable(getResources(), resourceId, 1);
+ }
+ mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE);
+ }
+
+ /**
+ * Sets the resource id specifying the target descriptions for accessibility.
+ *
+ * @param resourceId The resource id.
+ */
+ public void setTargetDescriptionsResourceId(int resourceId) {
+ mTargetDescriptionsResourceId = resourceId;
+ if (mTargetDescriptions != null) {
+ mTargetDescriptions.clear();
+ }
+ }
+
+ /**
+ * Gets the resource id specifying the target descriptions for accessibility.
+ *
+ * @return The resource id.
+ */
+ public int getTargetDescriptionsResourceId() {
+ return mTargetDescriptionsResourceId;
+ }
+
+ /**
+ * Sets the resource id specifying the target direction descriptions for accessibility.
+ *
+ * @param resourceId The resource id.
+ */
+ public void setDirectionDescriptionsResourceId(int resourceId) {
+ mDirectionDescriptionsResourceId = resourceId;
+ if (mDirectionDescriptions != null) {
+ mDirectionDescriptions.clear();
+ }
+ }
+
+ /**
+ * Gets the resource id specifying the target direction descriptions.
+ *
+ * @return The resource id.
+ */
+ public int getDirectionDescriptionsResourceId() {
+ return mDirectionDescriptionsResourceId;
+ }
+
+ /**
+ * Enable or disable vibrate on touch.
+ *
+ * @param enabled
+ */
+ public void setVibrateEnabled(boolean enabled) {
+ if (enabled && mVibrator == null) {
+ mVibrator = (Vibrator) getContext().getSystemService(Context.VIBRATOR_SERVICE);
+ } else {
+ mVibrator = null;
+ }
+ }
+
+ /**
+ * Starts wave animation.
+ *
+ */
+ public void ping() {
+ if (mFeedbackCount > 0) {
+ boolean doWaveAnimation = true;
+ final AnimationBundle waveAnimations = mWaveAnimations;
+
+ // Don't do a wave if there's already one in progress
+ if (waveAnimations.size() > 0 && waveAnimations.get(0).animator.isRunning()) {
+ long t = waveAnimations.get(0).animator.getCurrentPlayTime();
+ if (t < WAVE_ANIMATION_DURATION/2) {
+ doWaveAnimation = false;
+ }
+ }
+
+ if (doWaveAnimation) {
+ startWaveAnimation();
+ }
+ }
+ }
+
+ private void stopAndHideWaveAnimation() {
+ mWaveAnimations.cancel();
+ mPointCloud.waveManager.setAlpha(0.0f);
+ }
+
+ private void startWaveAnimation() {
+ mWaveAnimations.cancel();
+ mPointCloud.waveManager.setAlpha(1.0f);
+ mPointCloud.waveManager.setRadius(mHandleDrawable.getWidth()/2.0f);
+ mWaveAnimations.add(Tweener.to(mPointCloud.waveManager, WAVE_ANIMATION_DURATION,
+ "ease", Ease.Quad.easeOut,
+ "delay", 0,
+ "radius", 2.0f * mOuterRadius,
+ "onUpdate", mUpdateListener,
+ "onComplete",
+ new AnimatorListenerAdapter() {
+ public void onAnimationEnd(Animator animator) {
+ mPointCloud.waveManager.setRadius(0.0f);
+ mPointCloud.waveManager.setAlpha(0.0f);
+ }
+ }));
+ mWaveAnimations.start();
+ }
+
+ /**
+ * Resets the widget to default state and cancels all animation. If animate is 'true', will
+ * animate objects into place. Otherwise, objects will snap back to place.
+ *
+ * @param animate
+ */
+ public void reset(boolean animate) {
+ mGlowAnimations.stop();
+ mTargetAnimations.stop();
+ startBackgroundAnimation(0, 0.0f);
+ stopAndHideWaveAnimation();
+ hideTargets(animate, false);
+ hideGlow(0, 0, 0.0f, null);
+ Tweener.reset();
+ }
+
+ private void startBackgroundAnimation(int duration, float alpha) {
+ final Drawable background = getBackground();
+ if (mAlwaysTrackFinger && background != null) {
+ if (mBackgroundAnimator != null) {
+ mBackgroundAnimator.animator.cancel();
+ }
+ mBackgroundAnimator = Tweener.to(background, duration,
+ "ease", Ease.Cubic.easeIn,
+ "alpha", (int)(255.0f * alpha),
+ "delay", SHOW_ANIMATION_DELAY);
+ mBackgroundAnimator.animator.start();
+ }
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent event) {
+ final int action = event.getActionMasked();
+ boolean handled = false;
+ switch (action) {
+ case MotionEvent.ACTION_POINTER_DOWN:
+ case MotionEvent.ACTION_DOWN:
+ if (DEBUG) Log.v(TAG, "*** DOWN ***");
+ handleDown(event);
+ handleMove(event);
+ handled = true;
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+ if (DEBUG) Log.v(TAG, "*** MOVE ***");
+ handleMove(event);
+ handled = true;
+ break;
+
+ case MotionEvent.ACTION_POINTER_UP:
+ case MotionEvent.ACTION_UP:
+ if (DEBUG) Log.v(TAG, "*** UP ***");
+ handleMove(event);
+ handleUp(event);
+ handled = true;
+ break;
+
+ case MotionEvent.ACTION_CANCEL:
+ if (DEBUG) Log.v(TAG, "*** CANCEL ***");
+ handleMove(event);
+ handleCancel(event);
+ handled = true;
+ break;
+ }
+ invalidate();
+ return handled ? true : super.onTouchEvent(event);
+ }
+
+ private void updateGlowPosition(float x, float y) {
+ float dx = x - mOuterRing.getX();
+ float dy = y - mOuterRing.getY();
+ dx *= 1f / mRingScaleFactor;
+ dy *= 1f / mRingScaleFactor;
+ mPointCloud.glowManager.setX(mOuterRing.getX() + dx);
+ mPointCloud.glowManager.setY(mOuterRing.getY() + dy);
+ }
+
+ private void handleDown(MotionEvent event) {
+ int actionIndex = event.getActionIndex();
+ float eventX = event.getX(actionIndex);
+ float eventY = event.getY(actionIndex);
+ switchToState(STATE_START, eventX, eventY);
+ if (!trySwitchToFirstTouchState(eventX, eventY)) {
+ mDragging = false;
+ } else {
+ mPointerId = event.getPointerId(actionIndex);
+ updateGlowPosition(eventX, eventY);
+ }
+ }
+
+ private void handleUp(MotionEvent event) {
+ if (DEBUG && mDragging) Log.v(TAG, "** Handle RELEASE");
+ int actionIndex = event.getActionIndex();
+ if (event.getPointerId(actionIndex) == mPointerId) {
+ switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
+ }
+ }
+
+ private void handleCancel(MotionEvent event) {
+ if (DEBUG && mDragging) Log.v(TAG, "** Handle CANCEL");
+
+ // We should drop the active target here but it interferes with
+ // moving off the screen in the direction of the navigation bar. At some point we may
+ // want to revisit how we handle this. For now we'll allow a canceled event to
+ // activate the current target.
+
+ // mActiveTarget = -1; // Drop the active target if canceled.
+
+ int actionIndex = event.findPointerIndex(mPointerId);
+ actionIndex = actionIndex == -1 ? 0 : actionIndex;
+ switchToState(STATE_FINISH, event.getX(actionIndex), event.getY(actionIndex));
+ }
+
+ private void handleMove(MotionEvent event) {
+ int activeTarget = -1;
+ final int historySize = event.getHistorySize();
+ ArrayList<TargetDrawable> targets = mTargetDrawables;
+ int ntargets = targets.size();
+ float x = 0.0f;
+ float y = 0.0f;
+ int actionIndex = event.findPointerIndex(mPointerId);
+
+ if (actionIndex == -1) {
+ return; // no data for this pointer
+ }
+
+ for (int k = 0; k < historySize + 1; k++) {
+ float eventX = k < historySize ? event.getHistoricalX(actionIndex, k)
+ : event.getX(actionIndex);
+ float eventY = k < historySize ? event.getHistoricalY(actionIndex, k)
+ :event.getY(actionIndex);
+ // tx and ty are relative to wave center
+ float tx = eventX - mWaveCenterX;
+ float ty = eventY - mWaveCenterY;
+ float touchRadius = (float) Math.hypot(tx, ty);
+ final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f;
+ float limitX = tx * scale;
+ float limitY = ty * scale;
+ double angleRad = Math.atan2(-ty, tx);
+
+ if (!mDragging) {
+ trySwitchToFirstTouchState(eventX, eventY);
+ }
+
+ if (mDragging) {
+ // For multiple targets, snap to the one that matches
+ final float snapRadius = mRingScaleFactor * mOuterRadius - mSnapMargin;
+ final float snapDistance2 = snapRadius * snapRadius;
+ // Find first target in range
+ for (int i = 0; i < ntargets; i++) {
+ TargetDrawable target = targets.get(i);
+
+ double targetMinRad = (i - 0.5) * 2 * Math.PI / ntargets;
+ double targetMaxRad = (i + 0.5) * 2 * Math.PI / ntargets;
+ if (target.isEnabled()) {
+ boolean angleMatches =
+ (angleRad > targetMinRad && angleRad <= targetMaxRad) ||
+ (angleRad + 2 * Math.PI > targetMinRad &&
+ angleRad + 2 * Math.PI <= targetMaxRad);
+ if (angleMatches && (dist2(tx, ty) > snapDistance2)) {
+ activeTarget = i;
+ }
+ }
+ }
+ }
+ x = limitX;
+ y = limitY;
+ }
+
+ if (!mDragging) {
+ return;
+ }
+
+ if (activeTarget != -1) {
+ switchToState(STATE_SNAP, x,y);
+ updateGlowPosition(x, y);
+ } else {
+ switchToState(STATE_TRACKING, x, y);
+ updateGlowPosition(x, y);
+ }
+
+ if (mActiveTarget != activeTarget) {
+ // Defocus the old target
+ if (mActiveTarget != -1) {
+ TargetDrawable target = targets.get(mActiveTarget);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ }
+ // Focus the new target
+ if (activeTarget != -1) {
+ TargetDrawable target = targets.get(activeTarget);
+ target.setState(TargetDrawable.STATE_FOCUSED);
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isEnabled()) {
+ String targetContentDescription = getTargetDescription(activeTarget);
+ announceForAccessibility(targetContentDescription);
+ }
+ }
+ }
+ mActiveTarget = activeTarget;
+ }
+
+ @Override
+ public boolean onHoverEvent(MotionEvent event) {
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isTouchExplorationEnabled()) {
+ final int action = event.getAction();
+ switch (action) {
+ case MotionEvent.ACTION_HOVER_ENTER:
+ event.setAction(MotionEvent.ACTION_DOWN);
+ break;
+ case MotionEvent.ACTION_HOVER_MOVE:
+ event.setAction(MotionEvent.ACTION_MOVE);
+ break;
+ case MotionEvent.ACTION_HOVER_EXIT:
+ event.setAction(MotionEvent.ACTION_UP);
+ break;
+ }
+ onTouchEvent(event);
+ event.setAction(action);
+ }
+ super.onHoverEvent(event);
+ return true;
+ }
+
+ /**
+ * Sets the current grabbed state, and dispatches a grabbed state change
+ * event to our listener.
+ */
+ private void setGrabbedState(int newState) {
+ if (newState != mGrabbedState) {
+ if (newState != OnTriggerListener.NO_HANDLE) {
+ vibrate();
+ }
+ mGrabbedState = newState;
+ if (mOnTriggerListener != null) {
+ if (newState == OnTriggerListener.NO_HANDLE) {
+ mOnTriggerListener.onReleased(this, OnTriggerListener.CENTER_HANDLE);
+ } else {
+ mOnTriggerListener.onGrabbed(this, OnTriggerListener.CENTER_HANDLE);
+ }
+ mOnTriggerListener.onGrabbedStateChange(this, newState);
+ }
+ }
+ }
+
+ private boolean trySwitchToFirstTouchState(float x, float y) {
+ final float tx = x - mWaveCenterX;
+ final float ty = y - mWaveCenterY;
+ if (mAlwaysTrackFinger || dist2(tx,ty) <= getScaledGlowRadiusSquared()) {
+ if (DEBUG) Log.v(TAG, "** Handle HIT");
+ switchToState(STATE_FIRST_TOUCH, x, y);
+ updateGlowPosition(tx, ty);
+ mDragging = true;
+ return true;
+ }
+ return false;
+ }
+
+ private void assignDefaultsIfNeeded() {
+ if (mOuterRadius == 0.0f) {
+ mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f;
+ }
+ if (mSnapMargin == 0.0f) {
+ mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics());
+ }
+ if (mInnerRadius == 0.0f) {
+ mInnerRadius = mHandleDrawable.getWidth() / 10.0f;
+ }
+ }
+
+ private void computeInsets(int dx, int dy) {
+ final int layoutDirection = getLayoutDirection();
+ final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection);
+
+ switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+ case Gravity.LEFT:
+ mHorizontalInset = 0;
+ break;
+ case Gravity.RIGHT:
+ mHorizontalInset = dx;
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ default:
+ mHorizontalInset = dx / 2;
+ break;
+ }
+ switch (absoluteGravity & Gravity.VERTICAL_GRAVITY_MASK) {
+ case Gravity.TOP:
+ mVerticalInset = 0;
+ break;
+ case Gravity.BOTTOM:
+ mVerticalInset = dy;
+ break;
+ case Gravity.CENTER_VERTICAL:
+ default:
+ mVerticalInset = dy / 2;
+ break;
+ }
+ }
+
+ /**
+ * Given the desired width and height of the ring and the allocated width and height, compute
+ * how much we need to scale the ring.
+ */
+ private float computeScaleFactor(int desiredWidth, int desiredHeight,
+ int actualWidth, int actualHeight) {
+
+ // Return unity if scaling is not allowed.
+ if (!mAllowScaling) return 1f;
+
+ final int layoutDirection = getLayoutDirection();
+ final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection);
+
+ float scaleX = 1f;
+ float scaleY = 1f;
+
+ // We use the gravity as a cue for whether we want to scale on a particular axis.
+ // We only scale to fit horizontally if we're not pinned to the left or right. Likewise,
+ // we only scale to fit vertically if we're not pinned to the top or bottom. In these
+ // cases, we want the ring to hang off the side or top/bottom, respectively.
+ switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
+ case Gravity.LEFT:
+ case Gravity.RIGHT:
+ break;
+ case Gravity.CENTER_HORIZONTAL:
+ default:
+ if (desiredWidth > actualWidth) {
+ scaleX = (1f * actualWidth - mMaxTargetWidth) /
+ (desiredWidth - mMaxTargetWidth);
+ }
+ break;
+ }
+ switch (absoluteGravity & Gravity.VERTICAL_GRAVITY_MASK) {
+ case Gravity.TOP:
+ case Gravity.BOTTOM:
+ break;
+ case Gravity.CENTER_VERTICAL:
+ default:
+ if (desiredHeight > actualHeight) {
+ scaleY = (1f * actualHeight - mMaxTargetHeight) /
+ (desiredHeight - mMaxTargetHeight);
+ }
+ break;
+ }
+ return Math.min(scaleX, scaleY);
+ }
+
+ private float getRingWidth() {
+ return mRingScaleFactor * Math.max(mOuterRing.getWidth(), 2 * mOuterRadius);
+ }
+
+ private float getRingHeight() {
+ return mRingScaleFactor * Math.max(mOuterRing.getHeight(), 2 * mOuterRadius);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ super.onLayout(changed, left, top, right, bottom);
+ final int width = right - left;
+ final int height = bottom - top;
+
+ // Target placement width/height. This puts the targets on the greater of the ring
+ // width or the specified outer radius.
+ final float placementWidth = getRingWidth();
+ final float placementHeight = getRingHeight();
+ float newWaveCenterX = mHorizontalInset
+ + (mMaxTargetWidth + placementWidth) / 2;
+ float newWaveCenterY = mVerticalInset
+ + (mMaxTargetHeight + placementHeight) / 2;
+
+ if (mInitialLayout) {
+ stopAndHideWaveAnimation();
+ hideTargets(false, false);
+ mInitialLayout = false;
+ }
+
+ mOuterRing.setPositionX(newWaveCenterX);
+ mOuterRing.setPositionY(newWaveCenterY);
+
+ mPointCloud.setScale(mRingScaleFactor);
+
+ mHandleDrawable.setPositionX(newWaveCenterX);
+ mHandleDrawable.setPositionY(newWaveCenterY);
+
+ updateTargetPositions(newWaveCenterX, newWaveCenterY);
+ updatePointCloudPosition(newWaveCenterX, newWaveCenterY);
+ updateGlowPosition(newWaveCenterX, newWaveCenterY);
+
+ mWaveCenterX = newWaveCenterX;
+ mWaveCenterY = newWaveCenterY;
+
+ if (DEBUG) dump();
+ }
+
+ private void updateTargetPositions(float centerX, float centerY) {
+ // Reposition the target drawables if the view changed.
+ ArrayList<TargetDrawable> targets = mTargetDrawables;
+ final int size = targets.size();
+ final float alpha = (float) (-2.0f * Math.PI / size);
+ for (int i = 0; i < size; i++) {
+ final TargetDrawable targetIcon = targets.get(i);
+ final float angle = alpha * i;
+ targetIcon.setPositionX(centerX);
+ targetIcon.setPositionY(centerY);
+ targetIcon.setX(getRingWidth() / 2 * (float) Math.cos(angle));
+ targetIcon.setY(getRingHeight() / 2 * (float) Math.sin(angle));
+ }
+ }
+
+ private void updatePointCloudPosition(float centerX, float centerY) {
+ mPointCloud.setCenter(centerX, centerY);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ mPointCloud.draw(canvas);
+ mOuterRing.draw(canvas);
+ final int ntargets = mTargetDrawables.size();
+ for (int i = 0; i < ntargets; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ if (target != null) {
+ target.draw(canvas);
+ }
+ }
+ mHandleDrawable.draw(canvas);
+ }
+
+ public void setOnTriggerListener(OnTriggerListener listener) {
+ mOnTriggerListener = listener;
+ }
+
+ private float square(float d) {
+ return d * d;
+ }
+
+ private float dist2(float dx, float dy) {
+ return dx*dx + dy*dy;
+ }
+
+ private float getScaledGlowRadiusSquared() {
+ final float scaledTapRadius;
+ final AccessibilityManager accessibilityManager =
+ (AccessibilityManager) getContext().getSystemService(
+ Context.ACCESSIBILITY_SERVICE);
+ if (accessibilityManager.isEnabled()) {
+ scaledTapRadius = TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED * mGlowRadius;
+ } else {
+ scaledTapRadius = mGlowRadius;
+ }
+ return square(scaledTapRadius);
+ }
+
+ private void announceTargets() {
+ StringBuilder utterance = new StringBuilder();
+ final int targetCount = mTargetDrawables.size();
+ for (int i = 0; i < targetCount; i++) {
+ String targetDescription = getTargetDescription(i);
+ String directionDescription = getDirectionDescription(i);
+ if (!TextUtils.isEmpty(targetDescription)
+ && !TextUtils.isEmpty(directionDescription)) {
+ String text = String.format(directionDescription, targetDescription);
+ utterance.append(text);
+ }
+ }
+ if (utterance.length() > 0) {
+ announceForAccessibility(utterance.toString());
+ }
+ }
+
+ private String getTargetDescription(int index) {
+ if (mTargetDescriptions == null || mTargetDescriptions.isEmpty()) {
+ mTargetDescriptions = loadDescriptions(mTargetDescriptionsResourceId);
+ if (mTargetDrawables.size() != mTargetDescriptions.size()) {
+ Log.w(TAG, "The number of target drawables must be"
+ + " equal to the number of target descriptions.");
+ return null;
+ }
+ }
+ return mTargetDescriptions.get(index);
+ }
+
+ private String getDirectionDescription(int index) {
+ if (mDirectionDescriptions == null || mDirectionDescriptions.isEmpty()) {
+ mDirectionDescriptions = loadDescriptions(mDirectionDescriptionsResourceId);
+ if (mTargetDrawables.size() != mDirectionDescriptions.size()) {
+ Log.w(TAG, "The number of target drawables must be"
+ + " equal to the number of direction descriptions.");
+ return null;
+ }
+ }
+ return mDirectionDescriptions.get(index);
+ }
+
+ private ArrayList<String> loadDescriptions(int resourceId) {
+ TypedArray array = getContext().getResources().obtainTypedArray(resourceId);
+ final int count = array.length();
+ ArrayList<String> targetContentDescriptions = new ArrayList<String>(count);
+ for (int i = 0; i < count; i++) {
+ String contentDescription = array.getString(i);
+ targetContentDescriptions.add(contentDescription);
+ }
+ array.recycle();
+ return targetContentDescriptions;
+ }
+
+ public int getResourceIdForTarget(int index) {
+ final TargetDrawable drawable = mTargetDrawables.get(index);
+ return drawable == null ? 0 : drawable.getResourceId();
+ }
+
+ public void setEnableTarget(int resourceId, boolean enabled) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ final TargetDrawable target = mTargetDrawables.get(i);
+ if (target.getResourceId() == resourceId) {
+ target.setEnabled(enabled);
+ break; // should never be more than one match
+ }
+ }
+ }
+
+ /**
+ * Gets the position of a target in the array that matches the given resource.
+ * @param resourceId
+ * @return the index or -1 if not found
+ */
+ public int getTargetPosition(int resourceId) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ final TargetDrawable target = mTargetDrawables.get(i);
+ if (target.getResourceId() == resourceId) {
+ return i; // should never be more than one match
+ }
+ }
+ return -1;
+ }
+
+ private boolean replaceTargetDrawables(Resources res, int existingResourceId,
+ int newResourceId) {
+ if (existingResourceId == 0 || newResourceId == 0) {
+ return false;
+ }
+
+ boolean result = false;
+ final ArrayList<TargetDrawable> drawables = mTargetDrawables;
+ final int size = drawables.size();
+ for (int i = 0; i < size; i++) {
+ final TargetDrawable target = drawables.get(i);
+ if (target != null && target.getResourceId() == existingResourceId) {
+ target.setDrawable(res, newResourceId);
+ result = true;
+ }
+ }
+
+ if (result) {
+ requestLayout(); // in case any given drawable's size changes
+ }
+
+ return result;
+ }
+
+ /**
+ * Searches the given package for a resource to use to replace the Drawable on the
+ * target with the given resource id
+ * @param component of the .apk that contains the resource
+ * @param name of the metadata in the .apk
+ * @param existingResId the resource id of the target to search for
+ * @return true if found in the given package and replaced at least one target Drawables
+ */
+ public boolean replaceTargetDrawablesIfPresent(ComponentName component, String name,
+ int existingResId) {
+ if (existingResId == 0) return false;
+
+ boolean replaced = false;
+ if (component != null) {
+ try {
+ PackageManager packageManager = getContext().getPackageManager();
+ // Look for the search icon specified in the activity meta-data
+ Bundle metaData = packageManager.getActivityInfo(
+ component, PackageManager.GET_META_DATA).metaData;
+ if (metaData != null) {
+ int iconResId = metaData.getInt(name);
+ if (iconResId != 0) {
+ Resources res = packageManager.getResourcesForActivity(component);
+ replaced = replaceTargetDrawables(res, existingResId, iconResId);
+ }
+ }
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Failed to swap drawable; "
+ + component.flattenToShortString() + " not found", e);
+ } catch (Resources.NotFoundException nfe) {
+ Log.w(TAG, "Failed to swap drawable from "
+ + component.flattenToShortString(), nfe);
+ }
+ }
+ if (!replaced) {
+ // Restore the original drawable
+ replaceTargetDrawables(getContext().getResources(), existingResId, existingResId);
+ }
+ return replaced;
+ }
+
+ public class GlowpadExploreByTouchHelper extends ExploreByTouchHelper {
+
+ private Rect mBounds = new Rect();
+
+ public GlowpadExploreByTouchHelper(View forView) {
+ super(forView);
+ }
+
+ @Override
+ protected int getVirtualViewAt(float x, float y) {
+ if (mGrabbedState == OnTriggerListener.CENTER_HANDLE) {
+ for (int i = 0; i < mTargetDrawables.size(); i++) {
+ final TargetDrawable target = mTargetDrawables.get(i);
+ if (target.isEnabled() && target.getBounds().contains((int) x, (int) y)) {
+ return i;
+ }
+ }
+ return INVALID_ID;
+ } else {
+ return HOST_ID;
+ }
+ }
+
+ @Override
+ protected void getVisibleVirtualViews(List<Integer> virtualViewIds) {
+ if (mGrabbedState == OnTriggerListener.CENTER_HANDLE) {
+ // Add virtual views backwards so that accessibility services like switch
+ // access traverse them in the correct order
+ for (int i = mTargetDrawables.size() - 1; i >= 0; i--) {
+ if (mTargetDrawables.get(i).isEnabled()) {
+ virtualViewIds.add(i);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected void onPopulateEventForVirtualView(int virtualViewId, AccessibilityEvent event) {
+ if (virtualViewId >= 0 && virtualViewId < mTargetDescriptions.size()) {
+ event.setContentDescription(mTargetDescriptions.get(virtualViewId));
+ }
+ }
+
+ @Override
+ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
+ if (host == GlowPadView.this && event.getEventType()
+ == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
+ event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
+ }
+ super.onInitializeAccessibilityEvent(host, event);
+ }
+
+ @Override
+ public void onPopulateNodeForHost(AccessibilityNodeInfoCompat node) {
+ if (mGrabbedState == OnTriggerListener.NO_HANDLE) {
+ node.setClickable(true);
+ node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+ }
+ mBounds.set(0, 0, GlowPadView.this.getWidth(), GlowPadView.this.getHeight());
+ node.setBoundsInParent(mBounds);
+ }
+
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (mGrabbedState == OnTriggerListener.NO_HANDLE) {
+ // Simulate handle being grabbed to expose targets.
+ trySwitchToFirstTouchState(mWaveCenterX, mWaveCenterY);
+ invalidateRoot();
+ return true;
+ }
+ return super.performAccessibilityAction(host, action, args);
+ }
+
+ @Override
+ protected void onPopulateNodeForVirtualView(int virtualViewId,
+ AccessibilityNodeInfoCompat node) {
+ if (virtualViewId < mTargetDrawables.size()) {
+ final TargetDrawable target = mTargetDrawables.get(virtualViewId);
+ node.setBoundsInParent(target.getBounds());
+ node.setClickable(true);
+ node.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+ node.setContentDescription(getTargetDescription(virtualViewId));
+ }
+ }
+
+ @Override
+ protected boolean onPerformActionForVirtualView(int virtualViewId, int action,
+ Bundle arguments) {
+ if (action == AccessibilityNodeInfo.ACTION_CLICK) {
+ if (virtualViewId >= 0 && virtualViewId < mTargetDrawables.size()) {
+ dispatchTriggerEvent(virtualViewId);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java
new file mode 100644
index 000000000..07a2cb964
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/PointCloud.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.widget.multiwaveview;
+
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+
+import java.util.ArrayList;
+
+public class PointCloud {
+ private static final float MIN_POINT_SIZE = 2.0f;
+ private static final float MAX_POINT_SIZE = 4.0f;
+ private static final int INNER_POINTS = 8;
+ private static final String TAG = "PointCloud";
+ private ArrayList<Point> mPointCloud = new ArrayList<Point>();
+ private Drawable mDrawable;
+ private float mCenterX;
+ private float mCenterY;
+ private Paint mPaint;
+ private float mScale = 1.0f;
+ private static final float PI = (float) Math.PI;
+
+ // These allow us to have multiple concurrent animations.
+ WaveManager waveManager = new WaveManager();
+ GlowManager glowManager = new GlowManager();
+ private float mOuterRadius;
+
+ public class WaveManager {
+ private float radius = 50;
+ private float width = 200.0f; // TODO: Make configurable
+ private float alpha = 0.0f;
+ public void setRadius(float r) {
+ radius = r;
+ }
+
+ public float getRadius() {
+ return radius;
+ }
+
+ public void setAlpha(float a) {
+ alpha = a;
+ }
+
+ public float getAlpha() {
+ return alpha;
+ }
+ };
+
+ public class GlowManager {
+ private float x;
+ private float y;
+ private float radius = 0.0f;
+ private float alpha = 0.0f;
+
+ public void setX(float x1) {
+ x = x1;
+ }
+
+ public float getX() {
+ return x;
+ }
+
+ public void setY(float y1) {
+ y = y1;
+ }
+
+ public float getY() {
+ return y;
+ }
+
+ public void setAlpha(float a) {
+ alpha = a;
+ }
+
+ public float getAlpha() {
+ return alpha;
+ }
+
+ public void setRadius(float r) {
+ radius = r;
+ }
+
+ public float getRadius() {
+ return radius;
+ }
+ }
+
+ class Point {
+ float x;
+ float y;
+ float radius;
+
+ public Point(float x2, float y2, float r) {
+ x = (float) x2;
+ y = (float) y2;
+ radius = r;
+ }
+ }
+
+ public PointCloud(Drawable drawable) {
+ mPaint = new Paint();
+ mPaint.setFilterBitmap(true);
+ mPaint.setColor(Color.rgb(255, 255, 255)); // TODO: make configurable
+ mPaint.setAntiAlias(true);
+ mPaint.setDither(true);
+
+ mDrawable = drawable;
+ if (mDrawable != null) {
+ drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
+ }
+ }
+
+ public void setCenter(float x, float y) {
+ mCenterX = x;
+ mCenterY = y;
+ }
+
+ public void makePointCloud(float innerRadius, float outerRadius) {
+ if (innerRadius == 0) {
+ Log.w(TAG, "Must specify an inner radius");
+ return;
+ }
+ mOuterRadius = outerRadius;
+ mPointCloud.clear();
+ final float pointAreaRadius = (outerRadius - innerRadius);
+ final float ds = (2.0f * PI * innerRadius / INNER_POINTS);
+ final int bands = (int) Math.round(pointAreaRadius / ds);
+ final float dr = pointAreaRadius / bands;
+ float r = innerRadius;
+ for (int b = 0; b <= bands; b++, r += dr) {
+ float circumference = 2.0f * PI * r;
+ final int pointsInBand = (int) (circumference / ds);
+ float eta = PI/2.0f;
+ float dEta = 2.0f * PI / pointsInBand;
+ for (int i = 0; i < pointsInBand; i++) {
+ float x = r * (float) Math.cos(eta);
+ float y = r * (float) Math.sin(eta);
+ eta += dEta;
+ mPointCloud.add(new Point(x, y, r));
+ }
+ }
+ }
+
+ public void setScale(float scale) {
+ mScale = scale;
+ }
+
+ public float getScale() {
+ return mScale;
+ }
+
+ private static float hypot(float x, float y) {
+ return (float) Math.hypot(x, y);
+ }
+
+ private static float max(float a, float b) {
+ return a > b ? a : b;
+ }
+
+ public int getAlphaForPoint(Point point) {
+ // Contribution from positional glow
+ float glowDistance = hypot(glowManager.x - point.x, glowManager.y - point.y);
+ float glowAlpha = 0.0f;
+
+ if (glowDistance < glowManager.radius) {
+ double cos = Math.cos(Math.PI * 0.25d * glowDistance / glowManager.radius);
+ glowAlpha = glowManager.alpha * max(0.0f, (float) Math.pow(cos, 10.0d));
+ }
+
+ // Compute contribution from Wave
+ float radius = hypot(point.x, point.y);
+ float distanceToWaveRing = (radius - waveManager.radius);
+ float waveAlpha = 0.0f;
+ if (distanceToWaveRing < waveManager.width * 0.5f && distanceToWaveRing < 0.0f) {
+ double cos = Math.cos(Math.PI * 0.25d * distanceToWaveRing / waveManager.width);
+ waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cos, 20.0d));
+ }
+
+ return (int) (max(glowAlpha, waveAlpha) * 255);
+ }
+
+ private float interp(float min, float max, float f) {
+ return min + (max - min) * f;
+ }
+
+ public void draw(Canvas canvas) {
+ ArrayList<Point> points = mPointCloud;
+ canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ canvas.scale(mScale, mScale, mCenterX, mCenterY);
+ for (int i = 0; i < points.size(); i++) {
+ Point point = points.get(i);
+ final float pointSize = interp(MAX_POINT_SIZE, MIN_POINT_SIZE,
+ point.radius / mOuterRadius);
+ final float px = point.x + mCenterX;
+ final float py = point.y + mCenterY;
+ int alpha = getAlphaForPoint(point);
+
+ if (alpha == 0) continue;
+
+ if (mDrawable != null) {
+ canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ final float cx = mDrawable.getIntrinsicWidth() * 0.5f;
+ final float cy = mDrawable.getIntrinsicHeight() * 0.5f;
+ final float s = pointSize / MAX_POINT_SIZE;
+ canvas.scale(s, s, px, py);
+ canvas.translate(px - cx, py - cy);
+ mDrawable.setAlpha(alpha);
+ mDrawable.draw(canvas);
+ canvas.restore();
+ } else {
+ mPaint.setAlpha(alpha);
+ canvas.drawCircle(px, py, pointSize, mPaint);
+ }
+ }
+ canvas.restore();
+ }
+
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java
new file mode 100644
index 000000000..adc5324eb
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/TargetDrawable.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.widget.multiwaveview;
+
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.util.Log;
+
+public class TargetDrawable {
+ private static final String TAG = "TargetDrawable";
+ private static final boolean DEBUG = false;
+
+ public static final int[] STATE_ACTIVE =
+ { android.R.attr.state_enabled, android.R.attr.state_active };
+ public static final int[] STATE_INACTIVE =
+ { android.R.attr.state_enabled, -android.R.attr.state_active };
+ public static final int[] STATE_FOCUSED =
+ { android.R.attr.state_enabled, -android.R.attr.state_active,
+ android.R.attr.state_focused };
+
+ private float mTranslationX = 0.0f;
+ private float mTranslationY = 0.0f;
+ private float mPositionX = 0.0f;
+ private float mPositionY = 0.0f;
+ private float mScaleX = 1.0f;
+ private float mScaleY = 1.0f;
+ private float mAlpha = 1.0f;
+ private Drawable mDrawable;
+ private boolean mEnabled = true;
+ private final int mResourceId;
+ private int mNumDrawables = 1;
+ private Rect mBounds;
+
+ /**
+ * This is changed from the framework version to pass in the number of drawables in the
+ * container. The framework version relies on private api's to get the count from
+ * StateListDrawable.
+ *
+ * @param res
+ * @param resId
+ * @param count The number of drawables in the resource.
+ */
+ public TargetDrawable(Resources res, int resId, int count) {
+ mResourceId = resId;
+ setDrawable(res, resId);
+ mNumDrawables = count;
+ }
+
+ public void setDrawable(Resources res, int resId) {
+ // Note we explicitly don't set mResourceId to resId since we allow the drawable to be
+ // swapped at runtime and want to re-use the existing resource id for identification.
+ Drawable drawable = resId == 0 ? null : res.getDrawable(resId);
+ // Mutate the drawable so we can animate shared drawable properties.
+ mDrawable = drawable != null ? drawable.mutate() : null;
+ resizeDrawables();
+ setState(STATE_INACTIVE);
+ }
+
+ public TargetDrawable(TargetDrawable other) {
+ mResourceId = other.mResourceId;
+ // Mutate the drawable so we can animate shared drawable properties.
+ mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null;
+ resizeDrawables();
+ setState(STATE_INACTIVE);
+ }
+
+ public void setState(int [] state) {
+ if (mDrawable instanceof StateListDrawable) {
+ StateListDrawable d = (StateListDrawable) mDrawable;
+ d.setState(state);
+ }
+ }
+
+ /**
+ * Returns true if the drawable is a StateListDrawable and is in the focused state.
+ *
+ * @return
+ */
+ public boolean isActive() {
+ if (mDrawable instanceof StateListDrawable) {
+ StateListDrawable d = (StateListDrawable) mDrawable;
+ int[] states = d.getState();
+ for (int i = 0; i < states.length; i++) {
+ if (states[i] == android.R.attr.state_focused) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if this target is enabled. Typically an enabled target contains a valid
+ * drawable in a valid state. Currently all targets with valid drawables are valid.
+ *
+ * @return
+ */
+ public boolean isEnabled() {
+ return mDrawable != null && mEnabled;
+ }
+
+ /**
+ * Makes drawables in a StateListDrawable all the same dimensions.
+ * If not a StateListDrawable, then justs sets the bounds to the intrinsic size of the
+ * drawable.
+ */
+ private void resizeDrawables() {
+ if (mDrawable instanceof StateListDrawable) {
+ StateListDrawable d = (StateListDrawable) mDrawable;
+ int maxWidth = 0;
+ int maxHeight = 0;
+
+ for (int i = 0; i < mNumDrawables; i++) {
+ d.selectDrawable(i);
+ Drawable childDrawable = d.getCurrent();
+ maxWidth = Math.max(maxWidth, childDrawable.getIntrinsicWidth());
+ maxHeight = Math.max(maxHeight, childDrawable.getIntrinsicHeight());
+ }
+
+ if (DEBUG) Log.v(TAG, "union of childDrawable rects " + d + " to: "
+ + maxWidth + "x" + maxHeight);
+ d.setBounds(0, 0, maxWidth, maxHeight);
+
+ for (int i = 0; i < mNumDrawables; i++) {
+ d.selectDrawable(i);
+ Drawable childDrawable = d.getCurrent();
+ if (DEBUG) Log.v(TAG, "sizing drawable " + childDrawable + " to: "
+ + maxWidth + "x" + maxHeight);
+ childDrawable.setBounds(0, 0, maxWidth, maxHeight);
+ }
+ } else if (mDrawable != null) {
+ mDrawable.setBounds(0, 0,
+ mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight());
+ }
+ }
+
+ public void setX(float x) {
+ mTranslationX = x;
+ }
+
+ public void setY(float y) {
+ mTranslationY = y;
+ }
+
+ public void setScaleX(float x) {
+ mScaleX = x;
+ }
+
+ public void setScaleY(float y) {
+ mScaleY = y;
+ }
+
+ public void setAlpha(float alpha) {
+ mAlpha = alpha;
+ }
+
+ public float getX() {
+ return mTranslationX;
+ }
+
+ public float getY() {
+ return mTranslationY;
+ }
+
+ public float getScaleX() {
+ return mScaleX;
+ }
+
+ public float getScaleY() {
+ return mScaleY;
+ }
+
+ public float getAlpha() {
+ return mAlpha;
+ }
+
+ public void setPositionX(float x) {
+ mPositionX = x;
+ }
+
+ public void setPositionY(float y) {
+ mPositionY = y;
+ }
+
+ public float getPositionX() {
+ return mPositionX;
+ }
+
+ public float getPositionY() {
+ return mPositionY;
+ }
+
+ public int getWidth() {
+ return mDrawable != null ? mDrawable.getIntrinsicWidth() : 0;
+ }
+
+ public int getHeight() {
+ return mDrawable != null ? mDrawable.getIntrinsicHeight() : 0;
+ }
+
+ public Rect getBounds() {
+ if (mBounds == null) {
+ mBounds = new Rect();
+ }
+ mBounds.set((int) (mTranslationX + mPositionX - getWidth() * 0.5),
+ (int) (mTranslationY + mPositionY - getHeight() * 0.5),
+ (int) (mTranslationX + mPositionX + getWidth() * 0.5),
+ (int) (mTranslationY + mPositionY + getHeight() * 0.5));
+ return mBounds;
+ }
+
+ public void draw(Canvas canvas) {
+ if (mDrawable == null || !mEnabled) {
+ return;
+ }
+ canvas.save(Canvas.MATRIX_SAVE_FLAG);
+ canvas.scale(mScaleX, mScaleY, mPositionX, mPositionY);
+ canvas.translate(mTranslationX + mPositionX, mTranslationY + mPositionY);
+ canvas.translate(-0.5f * getWidth(), -0.5f * getHeight());
+ mDrawable.setAlpha((int) Math.round(mAlpha * 255f));
+ mDrawable.draw(canvas);
+ canvas.restore();
+ }
+
+ public void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
+
+ public int getResourceId() {
+ return mResourceId;
+ }
+}
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java
new file mode 100644
index 000000000..7222442fe
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/Tweener.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.widget.multiwaveview;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+class Tweener {
+ private static final String TAG = "Tweener";
+ private static final boolean DEBUG = false;
+
+ ObjectAnimator animator;
+ private static HashMap<Object, Tweener> sTweens = new HashMap<Object, Tweener>();
+
+ public Tweener(ObjectAnimator anim) {
+ animator = anim;
+ }
+
+ private static void remove(Animator animator) {
+ Iterator<Entry<Object, Tweener>> iter = sTweens.entrySet().iterator();
+ while (iter.hasNext()) {
+ Entry<Object, Tweener> entry = iter.next();
+ if (entry.getValue().animator == animator) {
+ if (DEBUG) Log.v(TAG, "Removing tweener " + sTweens.get(entry.getKey())
+ + " sTweens.size() = " + sTweens.size());
+ iter.remove();
+ break; // an animator can only be attached to one object
+ }
+ }
+ }
+
+ public static Tweener to(Object object, long duration, Object... vars) {
+ long delay = 0;
+ AnimatorUpdateListener updateListener = null;
+ AnimatorListener listener = null;
+ TimeInterpolator interpolator = null;
+
+ // Iterate through arguments and discover properties to animate
+ ArrayList<PropertyValuesHolder> props = new ArrayList<PropertyValuesHolder>(vars.length/2);
+ for (int i = 0; i < vars.length; i+=2) {
+ if (!(vars[i] instanceof String)) {
+ throw new IllegalArgumentException("Key must be a string: " + vars[i]);
+ }
+ String key = (String) vars[i];
+ Object value = vars[i+1];
+
+ if ("simultaneousTween".equals(key)) {
+ // TODO
+ } else if ("ease".equals(key)) {
+ interpolator = (TimeInterpolator) value; // TODO: multiple interpolators?
+ } else if ("onUpdate".equals(key) || "onUpdateListener".equals(key)) {
+ updateListener = (AnimatorUpdateListener) value;
+ } else if ("onComplete".equals(key) || "onCompleteListener".equals(key)) {
+ listener = (AnimatorListener) value;
+ } else if ("delay".equals(key)) {
+ delay = ((Number) value).longValue();
+ } else if ("syncWith".equals(key)) {
+ // TODO
+ } else if (value instanceof float[]) {
+ props.add(PropertyValuesHolder.ofFloat(key,
+ ((float[])value)[0], ((float[])value)[1]));
+ } else if (value instanceof int[]) {
+ props.add(PropertyValuesHolder.ofInt(key,
+ ((int[])value)[0], ((int[])value)[1]));
+ } else if (value instanceof Number) {
+ float floatValue = ((Number)value).floatValue();
+ props.add(PropertyValuesHolder.ofFloat(key, floatValue));
+ } else {
+ throw new IllegalArgumentException(
+ "Bad argument for key \"" + key + "\" with value " + value.getClass());
+ }
+ }
+
+ // Re-use existing tween, if present
+ Tweener tween = sTweens.get(object);
+ ObjectAnimator anim = null;
+ if (tween == null) {
+ anim = ObjectAnimator.ofPropertyValuesHolder(object,
+ props.toArray(new PropertyValuesHolder[props.size()]));
+ tween = new Tweener(anim);
+ sTweens.put(object, tween);
+ if (DEBUG) Log.v(TAG, "Added new Tweener " + tween);
+ } else {
+ anim = sTweens.get(object).animator;
+ replace(props, object); // Cancel all animators for given object
+ }
+
+ if (interpolator != null) {
+ anim.setInterpolator(interpolator);
+ }
+
+ // Update animation with properties discovered in loop above
+ anim.setStartDelay(delay);
+ anim.setDuration(duration);
+ if (updateListener != null) {
+ anim.removeAllUpdateListeners(); // There should be only one
+ anim.addUpdateListener(updateListener);
+ }
+ if (listener != null) {
+ anim.removeAllListeners(); // There should be only one.
+ anim.addListener(listener);
+ }
+ anim.addListener(mCleanupListener);
+
+ return tween;
+ }
+
+ Tweener from(Object object, long duration, Object... vars) {
+ // TODO: for v of vars
+ // toVars[v] = object[v]
+ // object[v] = vars[v]
+ return Tweener.to(object, duration, vars);
+ }
+
+ // Listener to watch for completed animations and remove them.
+ private static AnimatorListener mCleanupListener = new AnimatorListenerAdapter() {
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ remove(animation);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ remove(animation);
+ }
+ };
+
+ public static void reset() {
+ if (DEBUG) {
+ Log.v(TAG, "Reset()");
+ if (sTweens.size() > 0) {
+ Log.v(TAG, "Cleaning up " + sTweens.size() + " animations");
+ }
+ }
+ sTweens.clear();
+ }
+
+ private static void replace(ArrayList<PropertyValuesHolder> props, Object... args) {
+ for (final Object killobject : args) {
+ Tweener tween = sTweens.get(killobject);
+ if (tween != null) {
+ tween.animator.cancel();
+ if (props != null) {
+ tween.animator.setValues(
+ props.toArray(new PropertyValuesHolder[props.size()]));
+ } else {
+ sTweens.remove(tween);
+ }
+ }
+ }
+ }
+}
diff --git a/InCallUI/src/com/android/incalluibind/ObjectFactory.java b/InCallUI/src/com/android/incalluibind/ObjectFactory.java
new file mode 100644
index 000000000..7e9423acf
--- /dev/null
+++ b/InCallUI/src/com/android/incalluibind/ObjectFactory.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incalluibind;
+
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.incallui.CallCardPresenter.EmergencyCallListener;
+import com.android.incallui.ContactUtils;
+import com.android.incallui.DistanceHelper;
+import com.android.incallui.service.PhoneNumberService;
+
+public class ObjectFactory {
+
+ public static PhoneNumberService newPhoneNumberService(Context context) {
+ // no phone number service.
+ return null;
+ }
+
+ public static EmergencyCallListener newEmergencyCallListener() {
+ return null;
+ }
+
+ /** @return An {@link Intent} to be broadcast when the InCallUI is visible. */
+ public static Intent getUiReadyBroadcastIntent(Context context) {
+ return null;
+ }
+
+ /**
+ * @return An {@link Intent} to be broadcast when the call state button in the InCallUI is
+ * touched while in a call.
+ */
+ public static Intent getCallStateButtonBroadcastIntent(Context context) {
+ return null;
+ }
+
+ public static DistanceHelper newDistanceHelper(Context context,
+ DistanceHelper.Listener listener) {
+ return null;
+ }
+
+ public static ContactUtils getContactUtilsInstance(Context context) {
+ return null;
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java b/InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java
new file mode 100644
index 000000000..79545ce4b
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/CallCardPresenterTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class CallCardPresenterTest extends AndroidTestCase {
+
+ private static final String NAME_PRIMARY = "Full Name";
+ private static final String NAME_ALTERNATIVE = "Name, Full";
+ private static final String LOCATION = "US";
+ private static final String NUMBER = "8006459001";
+
+ @Mock private ContactsPreferences mContactsPreferences;
+ private ContactCacheEntry mUnlockedContactInfo;
+ private ContactCacheEntry mLockedContactInfo;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+
+ Mockito.when(mContactsPreferences.getDisplayOrder())
+ .thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+ // Unlocked all contact info is available
+ mUnlockedContactInfo = new ContactCacheEntry();
+ mUnlockedContactInfo.namePrimary = NAME_PRIMARY;
+ mUnlockedContactInfo.nameAlternative = NAME_ALTERNATIVE;
+ mUnlockedContactInfo.location = LOCATION;
+ mUnlockedContactInfo.number = NUMBER;
+
+ // Locked only number and location are available
+ mLockedContactInfo = new ContactCacheEntry();
+ mLockedContactInfo .location = LOCATION;
+ mLockedContactInfo .number = NUMBER;
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ ContactsPreferencesFactory.setTestInstance(null);
+ }
+
+ public void testGetNameForCall_Unlocked() {
+ ContactsPreferencesFactory.setTestInstance(mContactsPreferences);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NAME_PRIMARY, presenter.getNameForCall(mUnlockedContactInfo));
+ }
+
+ public void testGetNameForCall_Locked() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NUMBER, presenter.getNameForCall(mLockedContactInfo));
+ }
+
+ public void testGetNameForCall_EmptyPreferredName() {
+ ContactCacheEntry contactInfo = new ContactCacheEntry();
+ contactInfo.number = NUMBER;
+
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NUMBER, presenter.getNameForCall(contactInfo));
+ }
+
+ public void testGetNumberForCall_Unlocked() {
+ ContactsPreferencesFactory.setTestInstance(mContactsPreferences);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(NUMBER, presenter.getNumberForCall(mUnlockedContactInfo));
+ }
+
+ public void testGetNumberForCall_Locked() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(LOCATION, presenter.getNumberForCall(mLockedContactInfo));
+ }
+
+ public void testGetNumberForCall_EmptyPreferredName() {
+ ContactCacheEntry contactInfo = new ContactCacheEntry();
+ contactInfo.location = LOCATION;
+
+ ContactsPreferencesFactory.setTestInstance(null);
+ CallCardPresenter presenter = new CallCardPresenter();
+ presenter.init(getContext(), null);
+
+ assertEquals(LOCATION, presenter.getNumberForCall(contactInfo));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/CallTest.java b/InCallUI/tests/src/com/android/incallui/CallTest.java
new file mode 100644
index 000000000..118ec38da
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/CallTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.os.Bundle;
+import android.telecom.Connection;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+// @formatter:off
+/**
+ * Run test with
+ * adb shell am instrument -e class com.android.incallui.CallTest -w com.google.android.dialer.tests/android.test.InstrumentationTestRunner
+ */
+// @formatter:on
+
+@SmallTest
+public class CallTest extends AndroidTestCase {
+
+ private TestCall mCall;
+
+ private final static String CHILD_NUMBER = "123";
+ private final static ArrayList<String> LAST_FORWARDED_NUMBER_LIST =
+ new ArrayList(Arrays.asList("456", "789"));
+ private final static String LAST_FORWARDED_NUMBER = "789";
+ private final static String CALL_SUBJECT = "foo";
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ mCall = new TestCall();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testUpdateFromCallExtras() {
+ mCall.updateFromCallExtras(getTestBundle());
+ verifyTestBundleResult();
+ }
+
+ public void testUpdateFromCallExtras_corruptedBundle() {
+ mCall.setBundleCorrupted(true);
+ mCall.updateFromCallExtras(getTestBundle());
+
+ assertEquals(mCall.getChildNumber(), null);
+ assertEquals(mCall.getLastForwardedNumber(), null);
+ assertEquals(mCall.getCallSubject(), null);
+ }
+
+ public void testUpdateFromCallExtras_corruptedBundleOverwrite() {
+
+ mCall.updateFromCallExtras(getTestBundle());
+ mCall.setBundleCorrupted(true);
+ Bundle bundle = new Bundle();
+ bundle.putString(Connection.EXTRA_CHILD_ADDRESS, "321");
+ bundle.putStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER,
+ new ArrayList(Arrays.asList("654", "987")));
+ bundle.putString(Connection.EXTRA_CALL_SUBJECT, "bar");
+ mCall.updateFromCallExtras(bundle);
+ //corrupted bundle should not overwrite existing values.
+ verifyTestBundleResult();
+ }
+
+ private Bundle getTestBundle() {
+ Bundle bundle = new Bundle();
+ bundle.putString(Connection.EXTRA_CHILD_ADDRESS, CHILD_NUMBER);
+ bundle.putStringArrayList(Connection.EXTRA_LAST_FORWARDED_NUMBER,
+ LAST_FORWARDED_NUMBER_LIST);
+ bundle.putString(Connection.EXTRA_CALL_SUBJECT, CALL_SUBJECT);
+ return bundle;
+ }
+
+ private void verifyTestBundleResult() {
+ assertEquals(CHILD_NUMBER, mCall.getChildNumber());
+ assertEquals(LAST_FORWARDED_NUMBER, mCall.getLastForwardedNumber());
+ assertEquals(CALL_SUBJECT, mCall.getCallSubject());
+ }
+
+ private class TestCall extends Call {
+
+ private boolean mBundleCorrupted = false;
+
+ public TestCall() {
+ super(Call.State.NEW);
+ }
+
+ @Override
+ public void updateFromCallExtras(Bundle bundle) {
+ super.updateFromCallExtras(bundle);
+ }
+
+ public void setBundleCorrupted(boolean value) {
+ this.mBundleCorrupted = value;
+ }
+
+ @Override
+ protected boolean areCallExtrasCorrupted(Bundle callExtras) {
+ if (mBundleCorrupted) {
+ return true;
+ }
+ return super.areCallExtrasCorrupted(callExtras);
+ }
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java b/InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java
new file mode 100644
index 000000000..de5a0239e
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/CallerInfoUtilsTest.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+@SmallTest
+public class CallerInfoUtilsTest extends AndroidTestCase {
+ public void testToLogSafeNumber_email() {
+ assertEquals("xxx@xxx.xxx", CallerInfoUtils.toLogSafePhoneNumber("foo@foo.com"));
+ }
+
+ public void testToLogSafeNumber_phoneNumber() {
+ assertEquals("xxx-xxx-xxxx", CallerInfoUtils.toLogSafePhoneNumber("123-456-6789"));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java b/InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java
new file mode 100644
index 000000000..bf915553b
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ContactsPreferencesFactoryTest.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import com.android.dialer.compat.UserManagerCompat;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+
+import org.mockito.Mockito;
+
+@SmallTest
+public class ContactsPreferencesFactoryTest extends AndroidTestCase {
+
+ public void testNewContactsPreferences_Unlocked() {
+ if (!UserManagerCompat.isUserUnlocked(getContext())) {
+ return;
+ }
+ assertNotNull(ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ }
+
+ public void testNewContactsPreferences_Locked() {
+ if (UserManagerCompat.isUserUnlocked(getContext())) {
+ return;
+ }
+ assertNull(ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ }
+
+ public void testNewContactsPreferences_TestInstance() {
+ ContactsPreferences testInstance = Mockito.mock(ContactsPreferences.class);
+ ContactsPreferencesFactory.setTestInstance(testInstance);
+ // Assert that it returns the same object always
+ assertSame(testInstance, ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ assertSame(testInstance, ContactsPreferencesFactory.newContactsPreferences(getContext()));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java b/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
new file mode 100644
index 000000000..625cda448
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/InCallContactInteractionsTest.java
@@ -0,0 +1,325 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.location.Address;
+import android.test.AndroidTestCase;
+import android.util.Pair;
+
+import com.android.incallui.InCallContactInteractions.BusinessContextInfo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Tests for InCallContactInteractions class methods for formatting info for display.
+ *
+ * NOTE: tests assume system settings are set to 12hr time format and US locale. This means that
+ * the output of InCallContactInteractions methods are compared against strings in 12hr time format
+ * and US locale address formatting unless otherwise specified.
+ */
+public class InCallContactInteractionsTest extends AndroidTestCase {
+ private InCallContactInteractions mInCallContactInteractions;
+ private static final float TEST_DISTANCE = (float) 1234.56;
+
+ @Override
+ protected void setUp() {
+ mInCallContactInteractions = new InCallContactInteractions(mContext, true /* isBusiness */);
+ }
+
+ public void testIsOpenNow_NowMatchesOpenTime() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(8),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testIsOpenNow_ClosingAfterMidnight() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(10),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHourAndDaysFromToday(1, 1))))
+ .heading);
+ }
+
+ public void testIsOpenNow_Open24Hours() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(10),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHourAndDaysFromToday(8, 1))))
+ .heading);
+ }
+
+ public void testIsOpenNow_AfterMiddayBreak() {
+ assertEquals(mContext.getString(R.string.open_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(13),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15))))
+ .heading);
+ }
+
+ public void testIsClosedNow_DuringMiddayBreak() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(11),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15))))
+ .heading);
+ }
+
+ public void testIsClosedNow_BeforeOpen() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(6),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testIsClosedNow_NowMatchesClosedTime() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(20),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testIsClosedNow_AfterClosed() {
+ assertEquals(mContext.getString(R.string.closed_now),
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .heading);
+ }
+
+ public void testOpeningHours_SingleOpenRangeWhileOpen() {
+ assertEquals("8:00 AM - 8:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(12),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .detail);
+ }
+
+ public void testOpeningHours_TwoOpenRangesWhileOpen() {
+ assertEquals("8:00 AM - 10:00 AM, 12:00 PM - 3:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(12),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15))))
+ .detail);
+ }
+
+ public void testOpeningHours_AfterClosedNoTomorrow() {
+ assertEquals("Closed today at 8:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(20))))
+ .detail);
+ }
+
+ public void testOpeningHours_NotOpenTodayOpenTomorrow() {
+ assertEquals("Opens tomorrow at 8:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHourAndDaysFromToday(8, 1),
+ getTestCalendarWithHourAndDaysFromToday(10, 1))))
+ .detail);
+ }
+
+ public void testMultipleOpenRanges_BeforeOpen() {
+ assertEquals("Opens today at 8:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(7),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpenRanges_DuringFirstRange() {
+ assertEquals("Closes at 10:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(9),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpenRanges_BeforeMiddleRange() {
+ assertEquals("Opens today at 12:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(11),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpeningHours_DuringLastRange() {
+ assertEquals("Closes at 9:00 PM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(19),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testMultipleOpeningHours_AfterClose() {
+ assertEquals("Opens tomorrow at 8:00 AM",
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(22),
+ getMultipleOpeningHours())
+ .detail);
+ }
+
+ public void testNotOpenTodayOrTomorrow() {
+ assertEquals(null,
+ mInCallContactInteractions.constructHoursInfo(
+ getTestCalendarWithHour(21),
+ new ArrayList<Pair<Calendar, Calendar>>()));
+ }
+
+ public void testLocationInfo_ForUS() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.US,
+ getAddressForTest(),
+ TEST_DISTANCE);
+ assertEquals("0.8 mi away", info.heading);
+ assertEquals("Test address, Test locality", info.detail);
+ }
+
+ public void testLocationInfo_ForNotUS() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.CANADA,
+ getAddressForTest(),
+ TEST_DISTANCE);
+ assertEquals("1.2 km away", info.heading);
+ assertEquals("Test address, Test locality", info.detail);
+ }
+
+ public void testLocationInfo_NoLocality() {
+ Address address = getAddressForTest();
+ address.setLocality(null);
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.CANADA,
+ address,
+ TEST_DISTANCE);
+ assertEquals("1.2 km away", info.heading);
+ assertEquals("Test address", info.detail);
+ }
+
+ public void testLocationInfo_NoAddress() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.CANADA,
+ null,
+ TEST_DISTANCE);
+ assertEquals(null, info);
+ }
+
+ public void testLocationInfo_NoDistance() {
+ BusinessContextInfo info =
+ mInCallContactInteractions.constructLocationInfo(
+ Locale.US,
+ getAddressForTest(),
+ DistanceHelper.DISTANCE_NOT_FOUND);
+ assertEquals(null, info.heading);
+ }
+
+ private Address getAddressForTest() {
+ Address address = new Address(Locale.US);
+ address.setAddressLine(0, "Test address");
+ address.setLocality("Test locality");
+ return address;
+ }
+
+ private Calendar getTestCalendarWithHour(int hour) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar;
+ }
+
+ private Calendar getTestCalendarWithHourAndDaysFromToday(int hour, int daysFromToday) {
+ Calendar calendar = getTestCalendarWithHour(hour);
+ calendar.add(Calendar.DATE, daysFromToday);
+ return calendar;
+ }
+
+ private List<Pair<Calendar, Calendar>> getMultipleOpeningHours() {
+ return Arrays.asList(
+ Pair.create(
+ getTestCalendarWithHour(8),
+ getTestCalendarWithHour(10)),
+ Pair.create(
+ getTestCalendarWithHour(12),
+ getTestCalendarWithHour(15)),
+ Pair.create(
+ getTestCalendarWithHour(17),
+ getTestCalendarWithHour(21)),
+ Pair.create(
+ getTestCalendarWithHourAndDaysFromToday(8, 1),
+ getTestCalendarWithHourAndDaysFromToday(10, 1)),
+ Pair.create(
+ getTestCalendarWithHourAndDaysFromToday(12, 1),
+ getTestCalendarWithHourAndDaysFromToday(8, 1)));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java b/InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java
new file mode 100644
index 000000000..ed8d6223c
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/InCallPresenterTest.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.incallui.InCallPresenter.InCallState;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class InCallPresenterTest extends InstrumentationTestCase {
+ private MockCallListWrapper mCallList;
+ @Mock private InCallActivity mInCallActivity;
+ @Mock private AudioModeProvider mAudioModeProvider;
+ @Mock private StatusBarNotifier mStatusBarNotifier;
+ @Mock private ContactInfoCache mContactInfoCache;
+ @Mock private ProximitySensor mProximitySensor;
+
+ InCallPresenter mInCallPresenter;
+ @Mock private Context mContext;
+ @Mock private TelephonyManager mTelephonyManager;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ System.setProperty("dexmaker.dexcache",
+ getInstrumentation().getTargetContext().getCacheDir().getPath());
+ MockitoAnnotations.initMocks(this);
+ mCallList = new MockCallListWrapper();
+
+ when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+
+ mInCallPresenter = InCallPresenter.getInstance();
+ mInCallPresenter.setUp(mContext, mCallList.getCallList(), mAudioModeProvider,
+ mStatusBarNotifier, mContactInfoCache, mProximitySensor);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ // The tear down method needs to run in the main thread since there is an explicit check
+ // inside TelecomAdapter.getInstance().
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mInCallPresenter.unsetActivity(mInCallActivity);
+ mInCallPresenter.tearDown();
+ InCallPresenter.setInstance(null);
+ }
+ });
+ }
+
+ public void testOnActivitySet_finishesActivityWhenNoCalls() {
+ mInCallPresenter.setActivity(mInCallActivity);
+
+ verify(mInCallActivity).finish();
+ }
+
+ public void testOnCallListChange_sendsNotificationWhenInCall() {
+ mCallList.setHasCall(Call.State.INCOMING, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verify(mStatusBarNotifier).updateNotification(InCallState.INCOMING,
+ mCallList.getCallList());
+ verifyInCallActivityNotStarted();
+ }
+
+ /**
+ * This behavior is required to ensure that the screen is turned on again by the restarting
+ * activity.
+ */
+ public void testOnCallListChange_handlesCallWaitingWhenScreenOffShouldRestartActivity() {
+ mCallList.setHasCall(Call.State.ACTIVE, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+ mInCallPresenter.setActivity(mInCallActivity);
+
+ // Pretend that there is a call waiting and the screen is off
+ when(mInCallActivity.isDestroyed()).thenReturn(false);
+ when(mInCallActivity.isFinishing()).thenReturn(false);
+ when(mProximitySensor.isScreenReallyOff()).thenReturn(true);
+ mCallList.setHasCall(Call.State.INCOMING, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+ verify(mInCallActivity).finish();
+ }
+
+ /**
+ * Verifies that the PENDING_OUTGOING -> IN_CALL transition brings up InCallActivity so
+ * that it can display an error dialog.
+ */
+ public void testOnCallListChange_pendingOutgoingToInCallTransitionShowsUiForErrorDialog() {
+ mCallList.setHasCall(Call.State.CONNECTING, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ mCallList.setHasCall(Call.State.CONNECTING, false);
+ mCallList.setHasCall(Call.State.ACTIVE, true);
+
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verify(mContext).startActivity(InCallPresenter.getInstance().getInCallIntent(false, false));
+ verifyIncomingCallNotificationNotSent();
+ }
+
+ /**
+ * Verifies that if there is a call in the SELECT_PHONE_ACCOUNT state, InCallActivity is displayed
+ * to display the account picker.
+ */
+ public void testOnCallListChange_noAccountProvidedForCallShowsUiForAccountPicker() {
+ mCallList.setHasCall(Call.State.SELECT_PHONE_ACCOUNT, true);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verify(mContext).startActivity(InCallPresenter.getInstance().getInCallIntent(false, false));
+ verifyIncomingCallNotificationNotSent();
+ }
+
+ /**
+ * Verifies that for an expected call state change (e.g. NO_CALLS -> PENDING_OUTGOING),
+ * InCallActivity is not displayed.
+ */
+ public void testOnCallListChange_noCallsToPendingOutgoingDoesNotShowUi() {
+ mCallList.setHasCall(Call.State.CONNECTING, true);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ verifyInCallActivityNotStarted();
+ verifyIncomingCallNotificationNotSent();
+ }
+
+ public void testOnCallListChange_LastCallDisconnectedNoCallsLeftFinishesUi() {
+ mCallList.setHasCall(Call.State.DISCONNECTED, true);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+
+ mInCallPresenter.setActivity(mInCallActivity);
+
+ verify(mInCallActivity, never()).finish();
+
+ // Last remaining disconnected call is removed from CallList, activity should shut down.
+ mCallList.setHasCall(Call.State.DISCONNECTED, false);
+ mInCallPresenter.onCallListChange(mCallList.getCallList());
+ verify(mInCallActivity).finish();
+ }
+
+
+ //TODO
+ public void testCircularReveal_startsCircularRevealForOutgoingCalls() {
+
+ }
+
+ public void testCircularReveal_waitTillCircularRevealSentBeforeShowingCallCard() {
+ }
+
+ public void testHangupOngoingCall_disconnectsCallCorrectly() {
+ }
+
+ public void testAnswerIncomingCall() {
+ }
+
+ public void testDeclineIncomingCall() {
+ }
+
+ private void verifyInCallActivityNotStarted() {
+ verify(mContext, never()).startActivity(Mockito.any(Intent.class));
+ }
+
+ private void verifyIncomingCallNotificationNotSent() {
+ verify(mStatusBarNotifier, never()).updateNotification(Mockito.any(InCallState.class),
+ Mockito.any(CallList.class));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java b/InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java
new file mode 100644
index 000000000..369c4303f
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/MockCallListWrapper.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.telecom.PhoneAccountHandle;
+
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import java.util.HashSet;
+
+/**
+ * Provides an instance of a mock CallList, and provides utility methods to put the CallList into
+ * various states (e.g. incoming call, active call, call waiting).
+ */
+public class MockCallListWrapper {
+ private CallList mCallList;
+ private HashSet<Integer> mCallSet = new HashSet<>();
+
+ public MockCallListWrapper() {
+ mCallList = Mockito.mock(CallList.class);
+ mCallList = spy(new CallList());
+ when(mCallList.getFirstCallWithState(anyInt())).thenAnswer(new Answer<Call>() {
+ @Override
+ public Call answer(InvocationOnMock i) throws Throwable {
+ Object[] args = i.getArguments();
+ final int state = (int) args[0];
+ if (mCallSet.contains(state)) {
+ return getMockCall(state);
+ } else {
+ return null;
+ }
+ }
+ });
+ }
+
+ public CallList getCallList() {
+ return mCallList;
+ }
+
+ public void setHasCall(int state, boolean hasCall) {
+ if (hasCall) {
+ mCallSet.add(state);
+ } else {
+ mCallSet.remove(state);
+ }
+ }
+
+ private static Call getMockCall(int state) {
+ return getMockCall(state, state != Call.State.SELECT_PHONE_ACCOUNT);
+ }
+
+ private static Call getMockCall(int state, boolean hasAccountHandle) {
+ final Call call = Mockito.mock(Call.class);
+ when(call.getState()).thenReturn(Integer.valueOf(state));
+ if (hasAccountHandle) {
+ when(call.getAccountHandle()).thenReturn(new PhoneAccountHandle(null, null));
+ }
+ return call;
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java b/InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java
new file mode 100644
index 000000000..1c8f34721
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ProximitySensorTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.incallui.InCallPresenter.InCallState;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class ProximitySensorTest extends InstrumentationTestCase {
+ @Mock private AccelerometerListener mAccelerometerListener;
+ private MockCallListWrapper mCallList;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ System.setProperty("dexmaker.dexcache",
+ getInstrumentation().getTargetContext().getCacheDir().getPath());
+ MockitoAnnotations.initMocks(this);
+ mCallList = new MockCallListWrapper();
+ }
+
+ public void testAccelerometerBehaviorOnDisplayChange() {
+ final ProximitySensor proximitySensor =
+ new ProximitySensor(
+ getInstrumentation().getContext(),
+ new AudioModeProvider(),
+ mAccelerometerListener);
+ verify(mAccelerometerListener, never()).enable(anyBoolean());
+ proximitySensor.onStateChange(null, InCallState.OUTGOING, mCallList.getCallList());
+ verify(mAccelerometerListener).enable(true);
+ verify(mAccelerometerListener, never()).enable(false);
+
+ proximitySensor.onDisplayStateChanged(false);
+ verify(mAccelerometerListener).enable(true);
+ verify(mAccelerometerListener).enable(false);
+
+ proximitySensor.onDisplayStateChanged(true);
+ verify(mAccelerometerListener, times(2)).enable(true);
+ verify(mAccelerometerListener).enable(false);
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java b/InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java
new file mode 100644
index 000000000..4c55ddcc0
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/StatusBarNotifierTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.incallui.ContactInfoCache.ContactCacheEntry;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@MediumTest
+public class StatusBarNotifierTest extends AndroidTestCase {
+
+ private static final String NAME_PRIMARY = "Full Name";
+ private static final String NAME_ALTERNATIVE = "Name, Full";
+ private static final String LOCATION = "US";
+ private static final String NUMBER = "8006459001";
+
+ @Mock private Call mCall;
+ @Mock private ContactsPreferences mContactsPreferences;
+ private ContactCacheEntry mUnlockedContactInfo;
+ private ContactCacheEntry mLockedContactInfo;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+
+ Mockito.when(mContactsPreferences.getDisplayOrder())
+ .thenReturn(ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+ // Unlocked all contact info is available
+ mUnlockedContactInfo = new ContactCacheEntry();
+ mUnlockedContactInfo.namePrimary = NAME_PRIMARY;
+ mUnlockedContactInfo.nameAlternative = NAME_ALTERNATIVE;
+ mUnlockedContactInfo.location = LOCATION;
+ mUnlockedContactInfo.number = NUMBER;
+
+ // Locked only number and location are available
+ mLockedContactInfo = new ContactCacheEntry();
+ mLockedContactInfo .location = LOCATION;
+ mLockedContactInfo .number = NUMBER;
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ ContactsPreferencesFactory.setTestInstance(null);
+ }
+
+ public void testGetContentTitle_ConferenceCall() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+
+ Mockito.when(mCall.isConferenceCall()).thenReturn(true);
+ Mockito.when(mCall.hasProperty(Mockito.anyInt())).thenReturn(false);
+
+ assertEquals(mContext.getResources().getString(R.string.card_title_conf_call),
+ statusBarNotifier.getContentTitle(null, mCall));
+ }
+
+ public void testGetContentTitle_Unlocked() {
+ ContactsPreferencesFactory.setTestInstance(mContactsPreferences);
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+ assertEquals(NAME_PRIMARY, statusBarNotifier.getContentTitle(mUnlockedContactInfo, mCall));
+ }
+
+ public void testGetContentTitle_Locked() {
+ ContactsPreferencesFactory.setTestInstance(null);
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+ assertEquals(NUMBER, statusBarNotifier.getContentTitle(mLockedContactInfo, mCall));
+ }
+
+ public void testGetContentTitle_EmptyPreferredName() {
+ ContactCacheEntry contactCacheEntry = new ContactCacheEntry();
+ contactCacheEntry.number = NUMBER;
+ StatusBarNotifier statusBarNotifier = new StatusBarNotifier(mContext, null);
+ assertEquals(NUMBER, statusBarNotifier.getContentTitle(contactCacheEntry, mCall));
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java b/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java
new file mode 100644
index 000000000..5717c9478
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/async/SingleProdThreadExecutor.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.async;
+
+import java.util.concurrent.Executors;
+
+import javax.annotation.concurrent.ThreadSafe;
+
+/**
+ * {@link PausableExecutor} for use in tests. It is intended to be used between one test thread
+ * and one prod thread. See {@link com.android.incallui.ringtone.InCallTonePlayerTest} for example
+ * usage.
+ */
+@ThreadSafe
+public final class SingleProdThreadExecutor implements PausableExecutor {
+
+ private int mMilestonesReached;
+ private int mMilestonesAcked;
+ private boolean mHasAckedAllMilestones;
+
+ @Override
+ public synchronized void milestone() {
+ ++mMilestonesReached;
+ notify();
+ while (!mHasAckedAllMilestones && mMilestonesReached > mMilestonesAcked) {
+ try {
+ wait();
+ } catch (InterruptedException e) {}
+ }
+ }
+
+ @Override
+ public synchronized void ackMilestoneForTesting() {
+ ++mMilestonesAcked;
+ notify();
+ }
+
+ @Override
+ public synchronized void ackAllMilestonesForTesting() {
+ mHasAckedAllMilestones = true;
+ notify();
+ }
+
+ @Override
+ public synchronized void awaitMilestoneForTesting() throws InterruptedException {
+ while (!mHasAckedAllMilestones && mMilestonesReached <= mMilestonesAcked) {
+ wait();
+ }
+ }
+
+ @Override
+ public synchronized void execute(Runnable command) {
+ Executors.newSingleThreadExecutor().execute(command);
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ringtone/DialerRingtoneManagerTest.java b/InCallUI/tests/src/com/android/incallui/ringtone/DialerRingtoneManagerTest.java
new file mode 100644
index 000000000..01db20272
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ringtone/DialerRingtoneManagerTest.java
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.ringtone;
+
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.incallui.Call;
+import com.android.incallui.Call.State;
+import com.android.incallui.CallList;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+public class DialerRingtoneManagerTest extends AndroidTestCase {
+
+ private static final Uri RINGTONE_URI = RingtoneManager
+ .getDefaultUri(RingtoneManager.TYPE_RINGTONE);
+
+ @Mock private InCallTonePlayer mInCallTonePlayer;
+ @Mock private CallList mCallList;
+ @Mock private Call mCall;
+ private DialerRingtoneManager mRingtoneManagerEnabled;
+ private DialerRingtoneManager mRingtoneManagerDisabled;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ mRingtoneManagerEnabled = new DialerRingtoneManager(mInCallTonePlayer, mCallList);
+ mRingtoneManagerEnabled.setDialerRingingEnabledForTesting(true);
+ mRingtoneManagerDisabled = new DialerRingtoneManager(mInCallTonePlayer, mCallList);
+ mRingtoneManagerDisabled.setDialerRingingEnabledForTesting(false);
+ }
+
+ public void testNullInCallTonePlayer() {
+ try {
+ new DialerRingtoneManager(null, mCallList);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testNullCallList() {
+ try {
+ new DialerRingtoneManager(mInCallTonePlayer, null);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testShouldPlayRingtone_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayRingtone(0, RINGTONE_URI));
+ }
+
+ public void testShouldPlayRingtone_N_NullUri() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayRingtone(State.INCOMING, null));
+ }
+
+ public void testShouldPlayRingtone_N_Disabled() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerDisabled.shouldPlayRingtone(State.INCOMING, RINGTONE_URI));
+ }
+
+ public void testShouldPlayRingtone_N_NotIncoming() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayRingtone(State.ACTIVE, RINGTONE_URI));
+ }
+
+ // Specific case for call waiting since that needs its own sound
+ public void testShouldPlayRingtone_N_CallWaitingByState() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayRingtone(State.CALL_WAITING, RINGTONE_URI));
+ }
+
+ public void testShouldPlayRingtone_N_CallWaitingByActiveCall() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ Mockito.when(mCallList.getActiveCall()).thenReturn(mCall);
+ assertFalse(mRingtoneManagerEnabled.shouldPlayRingtone(State.INCOMING, RINGTONE_URI));
+ }
+
+ public void testShouldPlayRingtone_N() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertTrue(mRingtoneManagerEnabled.shouldPlayRingtone(State.INCOMING, RINGTONE_URI));
+ }
+
+ public void testShouldPlayCallWaitingTone_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayCallWaitingTone(0));
+ }
+
+ public void testShouldPlayCallWaitingTone_N_Disabled() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerDisabled.shouldPlayCallWaitingTone(State.CALL_WAITING));
+ }
+
+ public void testShouldPlayCallWaitingTone_N_NotCallWaiting() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayCallWaitingTone(State.ACTIVE));
+ }
+
+ // Specific case for incoming since it plays its own sound
+ public void testShouldPlayCallWaitingTone_N_Incoming() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mRingtoneManagerEnabled.shouldPlayCallWaitingTone(State.INCOMING));
+ }
+
+ public void testShouldPlayCallWaitingTone_N_AlreadyPlaying() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ Mockito.when(mInCallTonePlayer.isPlayingTone()).thenReturn(true);
+ assertFalse(mRingtoneManagerEnabled.shouldPlayCallWaitingTone(State.CALL_WAITING));
+ }
+
+ public void testShouldPlayCallWaitingTone_N_ByState() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertTrue(mRingtoneManagerEnabled.shouldPlayCallWaitingTone(State.CALL_WAITING));
+ }
+
+ public void testShouldPlayCallWaitingTone_N_ByActiveCall() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ Mockito.when(mCallList.getActiveCall()).thenReturn(mCall);
+ assertTrue(mRingtoneManagerEnabled.shouldPlayCallWaitingTone(State.INCOMING));
+ }
+
+ public void testPlayCallWaitingTone_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ mRingtoneManagerEnabled.playCallWaitingTone();
+ Mockito.verify(mInCallTonePlayer, Mockito.never()).play(Mockito.anyInt());
+ }
+
+ public void testPlayCallWaitingTone_N_NotEnabled() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ mRingtoneManagerDisabled.playCallWaitingTone();
+ Mockito.verify(mInCallTonePlayer, Mockito.never()).play(Mockito.anyInt());
+ }
+
+ public void testPlayCallWaitingTone_N() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ mRingtoneManagerEnabled.playCallWaitingTone();
+ Mockito.verify(mInCallTonePlayer).play(Mockito.anyInt());
+ }
+
+ public void testStopCallWaitingTone_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ mRingtoneManagerEnabled.stopCallWaitingTone();
+ Mockito.verify(mInCallTonePlayer, Mockito.never()).stop();
+ }
+
+ public void testStopCallWaitingTone_N_NotEnabled() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ mRingtoneManagerDisabled.stopCallWaitingTone();
+ Mockito.verify(mInCallTonePlayer, Mockito.never()).stop();
+ }
+
+ public void testStopCallWaitingTone_N() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ mRingtoneManagerEnabled.stopCallWaitingTone();
+ Mockito.verify(mInCallTonePlayer).stop();
+ }
+}
diff --git a/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java b/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
new file mode 100644
index 000000000..bde5c50e4
--- /dev/null
+++ b/InCallUI/tests/src/com/android/incallui/ringtone/InCallTonePlayerTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.incallui.ringtone;
+
+import android.media.AudioManager;
+import android.media.ToneGenerator;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.incallui.async.PausableExecutor;
+import com.android.incallui.async.SingleProdThreadExecutor;
+
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+public class InCallTonePlayerTest extends AndroidTestCase {
+
+ @Mock private ToneGeneratorFactory mToneGeneratorFactory;
+ @Mock private ToneGenerator mToneGenerator;
+ private InCallTonePlayer mInCallTonePlayer;
+
+ /*
+ * InCallTonePlayer milestones:
+ * 1) After tone starts playing
+ * 2) After tone finishes waiting (could have timed out)
+ * 3) After cleaning up state to allow new tone to play
+ */
+ private PausableExecutor mExecutor;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ Mockito.when(mToneGeneratorFactory.newInCallToneGenerator(Mockito.anyInt(),
+ Mockito.anyInt())).thenReturn(mToneGenerator);
+ mExecutor = new SingleProdThreadExecutor();
+ mInCallTonePlayer = new InCallTonePlayer(mToneGeneratorFactory, mExecutor);
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ // Stop any playing so the InCallTonePlayer isn't stuck waiting for the tone to complete
+ mInCallTonePlayer.stop();
+ // Ack all milestones to ensure that the prod thread doesn't block forever
+ mExecutor.ackAllMilestonesForTesting();
+ }
+
+ public void testIsPlayingTone_False() {
+ assertFalse(mInCallTonePlayer.isPlayingTone());
+ }
+
+ public void testIsPlayingTone_True() throws InterruptedException {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+
+ assertTrue(mInCallTonePlayer.isPlayingTone());
+ }
+
+ public void testPlay_InvalidTone() {
+ try {
+ mInCallTonePlayer.play(Integer.MIN_VALUE);
+ fail();
+ } catch (IllegalArgumentException e) {}
+ }
+
+ public void testPlay_CurrentlyPlaying() throws InterruptedException {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+ try {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ fail();
+ } catch (IllegalStateException e) {}
+ }
+
+ public void testPlay_VoiceCallStream() throws InterruptedException {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+ Mockito.verify(mToneGeneratorFactory).newInCallToneGenerator(AudioManager.STREAM_VOICE_CALL,
+ InCallTonePlayer.VOLUME_RELATIVE_HIGH_PRIORITY);
+ }
+
+ public void testPlay_Single() throws InterruptedException {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+ mExecutor.ackMilestoneForTesting();
+ mInCallTonePlayer.stop();
+ mExecutor.ackMilestoneForTesting();
+ mExecutor.awaitMilestoneForTesting();
+ mExecutor.ackMilestoneForTesting();
+
+ Mockito.verify(mToneGenerator).startTone(ToneGenerator.TONE_SUP_CALL_WAITING);
+ }
+
+ public void testPlay_Consecutive() throws InterruptedException {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+ mExecutor.ackMilestoneForTesting();
+ // Prevent waiting forever
+ mInCallTonePlayer.stop();
+ mExecutor.ackMilestoneForTesting();
+ mExecutor.awaitMilestoneForTesting();
+ mExecutor.ackMilestoneForTesting();
+
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+ mExecutor.ackMilestoneForTesting();
+ mInCallTonePlayer.stop();
+ mExecutor.ackMilestoneForTesting();
+ mExecutor.awaitMilestoneForTesting();
+ mExecutor.ackMilestoneForTesting();
+
+ Mockito.verify(mToneGenerator, Mockito.times(2))
+ .startTone(ToneGenerator.TONE_SUP_CALL_WAITING);
+ }
+
+ public void testStop_NotPlaying() {
+ // No crash
+ mInCallTonePlayer.stop();
+ }
+
+ public void testStop() throws InterruptedException {
+ mInCallTonePlayer.play(InCallTonePlayer.TONE_CALL_WAITING);
+ mExecutor.awaitMilestoneForTesting();
+
+ mInCallTonePlayer.stop();
+ mExecutor.ackMilestoneForTesting();
+ mExecutor.awaitMilestoneForTesting();
+
+ assertFalse(mInCallTonePlayer.isPlayingTone());
+ }
+}
diff --git a/build-app.gradle b/build-app.gradle
new file mode 100644
index 000000000..2ea437619
--- /dev/null
+++ b/build-app.gradle
@@ -0,0 +1,39 @@
+apply plugin: 'com.android.application'
+
+android {
+ defaultConfig {
+ minSdkVersion 23
+ targetSdkVersion 23
+ multiDexEnabled true
+ }
+
+ sourceSets.main {
+ java.srcDirs = ['src', 'src-pre-N', 'InCallUI/src']
+ manifest.srcFile 'AndroidManifest.xml'
+ res.srcDirs = ['res']
+ }
+
+ sourceSets.androidTest {
+ java.srcDirs = ['tests/src']
+ res.srcDirs = ['test/res']
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:23.1.+'
+ compile 'com.android.support:support-v13:23.1.+'
+ compile 'com.android.support:appcompat-v7:23.1.+'
+ compile 'com.android.support:cardview-v7:23.1.+'
+ compile 'com.android.support:design:23.1.+'
+ compile 'com.android.support:recyclerview-v7:23.1.+'
+
+ compile project(':android-common')
+ compile project(':guava')
+ compile project(':libphonenumber')
+ compile project(':jsr305')
+ compile project(':vcard')
+
+ compile project(':contactscommon')
+ compile project(':incallui')
+ compile project(':phonecommon')
+}
diff --git a/build-library.gradle b/build-library.gradle
new file mode 100644
index 000000000..a2394aac8
--- /dev/null
+++ b/build-library.gradle
@@ -0,0 +1,39 @@
+apply plugin: 'com.android.library'
+
+android {
+ defaultConfig {
+ minSdkVersion 23
+ targetSdkVersion 23
+ multiDexEnabled true
+ }
+
+ sourceSets.main {
+ java.srcDirs = ['src', 'src-pre-N', 'InCallUI/src']
+ manifest.srcFile 'AndroidManifest.xml'
+ res.srcDirs = ['res']
+ }
+
+ sourceSets.androidTest {
+ java.srcDirs = ['tests/src']
+ res.srcDirs = ['test/res']
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:23.1.+'
+ compile 'com.android.support:support-v13:23.1.+'
+ compile 'com.android.support:appcompat-v7:23.1.+'
+ compile 'com.android.support:cardview-v7:23.1.+'
+ compile 'com.android.support:design:23.1.+'
+ compile 'com.android.support:recyclerview-v7:23.1.+'
+
+ compile project(':android-common')
+ compile project(':guava')
+ compile project(':libphonenumber')
+ compile project(':jsr305')
+ compile project(':vcard')
+
+ compile project(':contactscommon')
+ compile project(':incallui')
+ compile project(':phonecommon')
+}
diff --git a/proguard.flags b/proguard.flags
index 38d4050de..6eed9983d 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -5,6 +5,8 @@
public void *(android.view.MenuItem);
}
+-keep class com.android.contacts.common.** { *;}
+
# Any class or method annotated with NeededForTesting or NeededForReflection.
-keep @com.android.contacts.common.testing.NeededForTesting class *
-keepclassmembers class * {
@@ -12,4 +14,9 @@
@com.android.dialer.NeededForReflection *;
}
+# For design libraries
+-keep public class * extends android.support.design.widget.CoordinatorLayout$Behavior {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+
-verbose
diff --git a/res/drawable-hdpi/ab_stacked_opaque_dark_holo.9.png b/res/drawable-hdpi/ab_stacked_opaque_dark_holo.9.png
deleted file mode 100644
index 23320ea16..000000000
--- a/res/drawable-hdpi/ab_stacked_opaque_dark_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/divider.9.png b/res/drawable-hdpi/divider.9.png
deleted file mode 100644
index 88e5d91af..000000000
--- a/res/drawable-hdpi/divider.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_ab_dialer_holo_light.png b/res/drawable-hdpi/ic_ab_dialer_holo_light.png
deleted file mode 100644
index 7e3457661..000000000
--- a/res/drawable-hdpi/ic_ab_dialer_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_archive_white_24dp.png b/res/drawable-hdpi/ic_archive_white_24dp.png
new file mode 100644
index 000000000..bb72e890f
--- /dev/null
+++ b/res/drawable-hdpi/ic_archive_white_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_block_24dp.png b/res/drawable-hdpi/ic_block_24dp.png
new file mode 100644
index 000000000..2ccc89d24
--- /dev/null
+++ b/res/drawable-hdpi/ic_block_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_call_log_blue.png b/res/drawable-hdpi/ic_call_log_blue.png
deleted file mode 100644
index 92af15f7b..000000000
--- a/res/drawable-hdpi/ic_call_log_blue.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_cancel_holo_light.png b/res/drawable-hdpi/ic_cancel_holo_light.png
deleted file mode 100644
index d8cacb44a..000000000
--- a/res/drawable-hdpi/ic_cancel_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_content_copy_24dp.png b/res/drawable-hdpi/ic_content_copy_24dp.png
new file mode 100644
index 000000000..70eb07378
--- /dev/null
+++ b/res/drawable-hdpi/ic_content_copy_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_fav_undo_dk.png b/res/drawable-hdpi/ic_fav_undo_dk.png
deleted file mode 100644
index 8c1b45125..000000000
--- a/res/drawable-hdpi/ic_fav_undo_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_all_contacts_dk.png b/res/drawable-hdpi/ic_menu_all_contacts_dk.png
deleted file mode 100644
index 88ba4f16a..000000000
--- a/res/drawable-hdpi/ic_menu_all_contacts_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_history_dk.png b/res/drawable-hdpi/ic_menu_history_dk.png
deleted file mode 100644
index b64122f14..000000000
--- a/res/drawable-hdpi/ic_menu_history_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_mic_grey600.png b/res/drawable-hdpi/ic_mic_grey600.png
new file mode 100644
index 000000000..4b67cf71a
--- /dev/null
+++ b/res/drawable-hdpi/ic_mic_grey600.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_more_horiz_24dp.png b/res/drawable-hdpi/ic_more_horiz_24dp.png
deleted file mode 100644
index ebfcb6f54..000000000
--- a/res/drawable-hdpi/ic_more_horiz_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_not_interested_googblue_24dp.png b/res/drawable-hdpi/ic_not_interested_googblue_24dp.png
new file mode 100644
index 000000000..26a26f911
--- /dev/null
+++ b/res/drawable-hdpi/ic_not_interested_googblue_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_phone_24dp.png b/res/drawable-hdpi/ic_phone_24dp.png
new file mode 100644
index 000000000..b27dfba06
--- /dev/null
+++ b/res/drawable-hdpi/ic_phone_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_report_24dp.png b/res/drawable-hdpi/ic_report_24dp.png
new file mode 100644
index 000000000..dc0c995c1
--- /dev/null
+++ b/res/drawable-hdpi/ic_report_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_report_problem_24dp.png b/res/drawable-hdpi/ic_report_problem_24dp.png
deleted file mode 100644
index cebb1c207..000000000
--- a/res/drawable-hdpi/ic_report_problem_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_share_white_24dp.png b/res/drawable-hdpi/ic_share_white_24dp.png
new file mode 100644
index 000000000..b09a6926d
--- /dev/null
+++ b/res/drawable-hdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_unblock.png b/res/drawable-hdpi/ic_unblock.png
new file mode 100644
index 000000000..03643b20d
--- /dev/null
+++ b/res/drawable-hdpi/ic_unblock.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_vm_bt_dk.png b/res/drawable-hdpi/ic_vm_bt_dk.png
deleted file mode 100644
index 2a4f4f618..000000000
--- a/res/drawable-hdpi/ic_vm_bt_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_vm_phone_broadcast_dk.png b/res/drawable-hdpi/ic_vm_phone_broadcast_dk.png
deleted file mode 100644
index 1e0b2ae6d..000000000
--- a/res/drawable-hdpi/ic_vm_phone_broadcast_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_search.png b/res/drawable-hdpi/ic_voice_search.png
deleted file mode 100644
index 9631d3e3d..000000000
--- a/res/drawable-hdpi/ic_voice_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png b/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
deleted file mode 100644
index f6fd30dcd..000000000
--- a/res/drawable-hdpi/list_selector_disabled_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/rounded_corner_bg.9.png b/res/drawable-hdpi/rounded_corner_bg.9.png
deleted file mode 100644
index b5f50de3c..000000000
--- a/res/drawable-hdpi/rounded_corner_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.png
deleted file mode 100644
index 3b3fb46ef..000000000
--- a/res/drawable-ldrtl-hdpi/ic_call_incoming_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.png
deleted file mode 100644
index 844f351ed..000000000
--- a/res/drawable-ldrtl-hdpi/ic_call_missed_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.png b/res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.png
deleted file mode 100644
index 786198661..000000000
--- a/res/drawable-ldrtl-hdpi/ic_call_outgoing_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.png
deleted file mode 100644
index b48e0d6f3..000000000
--- a/res/drawable-ldrtl-mdpi/ic_call_incoming_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.png
deleted file mode 100644
index 86bae1075..000000000
--- a/res/drawable-ldrtl-mdpi/ic_call_missed_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.png b/res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.png
deleted file mode 100644
index 1429593bf..000000000
--- a/res/drawable-ldrtl-mdpi/ic_call_outgoing_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.png
deleted file mode 100644
index dfb179237..000000000
--- a/res/drawable-ldrtl-xhdpi/ic_call_incoming_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.png
deleted file mode 100644
index a1236ed16..000000000
--- a/res/drawable-ldrtl-xhdpi/ic_call_missed_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.png b/res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.png
deleted file mode 100644
index ec0e1d0ef..000000000
--- a/res/drawable-ldrtl-xhdpi/ic_call_outgoing_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ab_stacked_opaque_dark_holo.9.png b/res/drawable-mdpi/ab_stacked_opaque_dark_holo.9.png
deleted file mode 100644
index 3e912f511..000000000
--- a/res/drawable-mdpi/ab_stacked_opaque_dark_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/divider.9.png b/res/drawable-mdpi/divider.9.png
deleted file mode 100644
index 88e5d91af..000000000
--- a/res/drawable-mdpi/divider.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_archive_white_24dp.png b/res/drawable-mdpi/ic_archive_white_24dp.png
new file mode 100644
index 000000000..f6aa3f966
--- /dev/null
+++ b/res/drawable-mdpi/ic_archive_white_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_block_24dp.png b/res/drawable-mdpi/ic_block_24dp.png
new file mode 100644
index 000000000..ec1b33f0e
--- /dev/null
+++ b/res/drawable-mdpi/ic_block_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_call_log_blue.png b/res/drawable-mdpi/ic_call_log_blue.png
deleted file mode 100644
index b9209adca..000000000
--- a/res/drawable-mdpi/ic_call_log_blue.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_cancel_holo_light.png b/res/drawable-mdpi/ic_cancel_holo_light.png
deleted file mode 100644
index 56705c333..000000000
--- a/res/drawable-mdpi/ic_cancel_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_content_copy_24dp.png b/res/drawable-mdpi/ic_content_copy_24dp.png
new file mode 100644
index 000000000..80c069557
--- /dev/null
+++ b/res/drawable-mdpi/ic_content_copy_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_fav_undo_dk.png b/res/drawable-mdpi/ic_fav_undo_dk.png
deleted file mode 100644
index 9655590a7..000000000
--- a/res/drawable-mdpi/ic_fav_undo_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_all_contacts_dk.png b/res/drawable-mdpi/ic_menu_all_contacts_dk.png
deleted file mode 100644
index 03af9c4bd..000000000
--- a/res/drawable-mdpi/ic_menu_all_contacts_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_dialpad_dk.png b/res/drawable-mdpi/ic_menu_dialpad_dk.png
deleted file mode 100644
index a7dcd24bf..000000000
--- a/res/drawable-mdpi/ic_menu_dialpad_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_dialpad_lt.png b/res/drawable-mdpi/ic_menu_dialpad_lt.png
deleted file mode 100644
index 14674ed05..000000000
--- a/res/drawable-mdpi/ic_menu_dialpad_lt.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_history_dk.png b/res/drawable-mdpi/ic_menu_history_dk.png
deleted file mode 100644
index 2203f3a62..000000000
--- a/res/drawable-mdpi/ic_menu_history_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_mic_grey600.png b/res/drawable-mdpi/ic_mic_grey600.png
new file mode 100644
index 000000000..2310c734a
--- /dev/null
+++ b/res/drawable-mdpi/ic_mic_grey600.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_more_horiz_24dp.png b/res/drawable-mdpi/ic_more_horiz_24dp.png
deleted file mode 100644
index 8c0be8ad6..000000000
--- a/res/drawable-mdpi/ic_more_horiz_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_not_interested_googblue_24dp.png b/res/drawable-mdpi/ic_not_interested_googblue_24dp.png
new file mode 100644
index 000000000..d7d5c588f
--- /dev/null
+++ b/res/drawable-mdpi/ic_not_interested_googblue_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_phone_24dp.png b/res/drawable-mdpi/ic_phone_24dp.png
new file mode 100644
index 000000000..c1766b854
--- /dev/null
+++ b/res/drawable-mdpi/ic_phone_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_report_24dp.png b/res/drawable-mdpi/ic_report_24dp.png
new file mode 100644
index 000000000..70b82d6c1
--- /dev/null
+++ b/res/drawable-mdpi/ic_report_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_report_problem_24dp.png b/res/drawable-mdpi/ic_report_problem_24dp.png
deleted file mode 100644
index 04365b98a..000000000
--- a/res/drawable-mdpi/ic_report_problem_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_share_white_24dp.png b/res/drawable-mdpi/ic_share_white_24dp.png
new file mode 100644
index 000000000..e944fd70c
--- /dev/null
+++ b/res/drawable-mdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_unblock.png b/res/drawable-mdpi/ic_unblock.png
new file mode 100644
index 000000000..d80fb2f5c
--- /dev/null
+++ b/res/drawable-mdpi/ic_unblock.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_vm_bt_dk.png b/res/drawable-mdpi/ic_vm_bt_dk.png
deleted file mode 100644
index 3ae87b95d..000000000
--- a/res/drawable-mdpi/ic_vm_bt_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_vm_phone_broadcast_dk.png b/res/drawable-mdpi/ic_vm_phone_broadcast_dk.png
deleted file mode 100644
index ed1d34d97..000000000
--- a/res/drawable-mdpi/ic_vm_phone_broadcast_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_search.png b/res/drawable-mdpi/ic_voice_search.png
deleted file mode 100644
index af58538d9..000000000
--- a/res/drawable-mdpi/ic_voice_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png b/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png
deleted file mode 100644
index 92da2f0dd..000000000
--- a/res/drawable-mdpi/list_selector_disabled_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/rounded_corner_bg.9.png b/res/drawable-mdpi/rounded_corner_bg.9.png
deleted file mode 100644
index e43b3efd4..000000000
--- a/res/drawable-mdpi/rounded_corner_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ab_stacked_opaque_dark_holo.9.png b/res/drawable-xhdpi/ab_stacked_opaque_dark_holo.9.png
deleted file mode 100644
index 71e4c239e..000000000
--- a/res/drawable-xhdpi/ab_stacked_opaque_dark_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/divider.9.png b/res/drawable-xhdpi/divider.9.png
deleted file mode 100644
index 88e5d91af..000000000
--- a/res/drawable-xhdpi/divider.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_archive_white_24dp.png b/res/drawable-xhdpi/ic_archive_white_24dp.png
new file mode 100644
index 000000000..3513bd9fe
--- /dev/null
+++ b/res/drawable-xhdpi/ic_archive_white_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_block_24dp.png b/res/drawable-xhdpi/ic_block_24dp.png
new file mode 100644
index 000000000..7aba97b65
--- /dev/null
+++ b/res/drawable-xhdpi/ic_block_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_call_log_blue.png b/res/drawable-xhdpi/ic_call_log_blue.png
deleted file mode 100644
index 9d92573b0..000000000
--- a/res/drawable-xhdpi/ic_call_log_blue.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_cancel_holo_light.png b/res/drawable-xhdpi/ic_cancel_holo_light.png
deleted file mode 100644
index 630f3fd4c..000000000
--- a/res/drawable-xhdpi/ic_cancel_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_content_copy_24dp.png b/res/drawable-xhdpi/ic_content_copy_24dp.png
new file mode 100644
index 000000000..537fd4e8b
--- /dev/null
+++ b/res/drawable-xhdpi/ic_content_copy_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fav_undo_dk.png b/res/drawable-xhdpi/ic_fav_undo_dk.png
deleted file mode 100644
index 4e1b65138..000000000
--- a/res/drawable-xhdpi/ic_fav_undo_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_all_contacts_dk.png b/res/drawable-xhdpi/ic_menu_all_contacts_dk.png
deleted file mode 100644
index 11bd615e0..000000000
--- a/res/drawable-xhdpi/ic_menu_all_contacts_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_dialpad_dk.png b/res/drawable-xhdpi/ic_menu_dialpad_dk.png
deleted file mode 100644
index bd8085978..000000000
--- a/res/drawable-xhdpi/ic_menu_dialpad_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_dialpad_lt.png b/res/drawable-xhdpi/ic_menu_dialpad_lt.png
deleted file mode 100644
index 345cf1a0b..000000000
--- a/res/drawable-xhdpi/ic_menu_dialpad_lt.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_history_dk.png b/res/drawable-xhdpi/ic_menu_history_dk.png
deleted file mode 100644
index 25b28e5cb..000000000
--- a/res/drawable-xhdpi/ic_menu_history_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_mic_grey600.png b/res/drawable-xhdpi/ic_mic_grey600.png
new file mode 100644
index 000000000..a9a83b329
--- /dev/null
+++ b/res/drawable-xhdpi/ic_mic_grey600.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_more_horiz_24dp.png b/res/drawable-xhdpi/ic_more_horiz_24dp.png
deleted file mode 100644
index dbb87ca91..000000000
--- a/res/drawable-xhdpi/ic_more_horiz_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_not_interested_googblue_24dp.png b/res/drawable-xhdpi/ic_not_interested_googblue_24dp.png
new file mode 100644
index 000000000..3e6ec071b
--- /dev/null
+++ b/res/drawable-xhdpi/ic_not_interested_googblue_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_phone_24dp.png b/res/drawable-xhdpi/ic_phone_24dp.png
new file mode 100644
index 000000000..83167f4cd
--- /dev/null
+++ b/res/drawable-xhdpi/ic_phone_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_report_24dp.png b/res/drawable-xhdpi/ic_report_24dp.png
new file mode 100644
index 000000000..18e7764ab
--- /dev/null
+++ b/res/drawable-xhdpi/ic_report_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_report_problem_24dp.png b/res/drawable-xhdpi/ic_report_problem_24dp.png
deleted file mode 100644
index a43fa3c27..000000000
--- a/res/drawable-xhdpi/ic_report_problem_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_share_white_24dp.png b/res/drawable-xhdpi/ic_share_white_24dp.png
new file mode 100644
index 000000000..22a8783e7
--- /dev/null
+++ b/res/drawable-xhdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_unblock.png b/res/drawable-xhdpi/ic_unblock.png
new file mode 100644
index 000000000..f7dfa21ac
--- /dev/null
+++ b/res/drawable-xhdpi/ic_unblock.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_vm_bt_dk.png b/res/drawable-xhdpi/ic_vm_bt_dk.png
deleted file mode 100644
index dc35a5594..000000000
--- a/res/drawable-xhdpi/ic_vm_bt_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_vm_phone_broadcast_dk.png b/res/drawable-xhdpi/ic_vm_phone_broadcast_dk.png
deleted file mode 100644
index ca52cb1ae..000000000
--- a/res/drawable-xhdpi/ic_vm_phone_broadcast_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_search.png b/res/drawable-xhdpi/ic_voice_search.png
deleted file mode 100644
index 6e5d8115b..000000000
--- a/res/drawable-xhdpi/ic_voice_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/list_selector_disabled_holo_dark.9.png b/res/drawable-xhdpi/list_selector_disabled_holo_dark.9.png
deleted file mode 100644
index 88726b691..000000000
--- a/res/drawable-xhdpi/list_selector_disabled_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/rounded_corner_bg.9.png b/res/drawable-xhdpi/rounded_corner_bg.9.png
deleted file mode 100644
index ebfe89791..000000000
--- a/res/drawable-xhdpi/rounded_corner_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ab_stacked_opaque_dark_holo.9.png b/res/drawable-xxhdpi/ab_stacked_opaque_dark_holo.9.png
deleted file mode 100644
index 59e1bae0c..000000000
--- a/res/drawable-xxhdpi/ab_stacked_opaque_dark_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/divider.9.png b/res/drawable-xxhdpi/divider.9.png
deleted file mode 100644
index 88e5d91af..000000000
--- a/res/drawable-xxhdpi/divider.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_archive_white_24dp.png b/res/drawable-xxhdpi/ic_archive_white_24dp.png
new file mode 100644
index 000000000..00e04e42b
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_archive_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_block_24dp.png b/res/drawable-xxhdpi/ic_block_24dp.png
new file mode 100644
index 000000000..fddfa54b8
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_block_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_call_log_blue.png b/res/drawable-xxhdpi/ic_call_log_blue.png
deleted file mode 100644
index 0a55a7572..000000000
--- a/res/drawable-xxhdpi/ic_call_log_blue.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_cancel_holo_light.png b/res/drawable-xxhdpi/ic_cancel_holo_light.png
deleted file mode 100644
index c2f5b5e1c..000000000
--- a/res/drawable-xxhdpi/ic_cancel_holo_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_content_copy_24dp.png b/res/drawable-xxhdpi/ic_content_copy_24dp.png
new file mode 100644
index 000000000..9dff893e7
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_content_copy_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fav_undo_dk.png b/res/drawable-xxhdpi/ic_fav_undo_dk.png
deleted file mode 100644
index 4b7dfc4cc..000000000
--- a/res/drawable-xxhdpi/ic_fav_undo_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_menu_all_contacts_dk.png b/res/drawable-xxhdpi/ic_menu_all_contacts_dk.png
deleted file mode 100644
index ae4037e90..000000000
--- a/res/drawable-xxhdpi/ic_menu_all_contacts_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_menu_dialpad_dk.png b/res/drawable-xxhdpi/ic_menu_dialpad_dk.png
deleted file mode 100644
index 09cc2f8bf..000000000
--- a/res/drawable-xxhdpi/ic_menu_dialpad_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_menu_dialpad_lt.png b/res/drawable-xxhdpi/ic_menu_dialpad_lt.png
deleted file mode 100644
index 45c1ab203..000000000
--- a/res/drawable-xxhdpi/ic_menu_dialpad_lt.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_menu_history_dk.png b/res/drawable-xxhdpi/ic_menu_history_dk.png
deleted file mode 100644
index 366470544..000000000
--- a/res/drawable-xxhdpi/ic_menu_history_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_mic_grey600.png b/res/drawable-xxhdpi/ic_mic_grey600.png
new file mode 100644
index 000000000..07128dd82
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_mic_grey600.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_more_horiz_24dp.png b/res/drawable-xxhdpi/ic_more_horiz_24dp.png
deleted file mode 100644
index 2036a9c2c..000000000
--- a/res/drawable-xxhdpi/ic_more_horiz_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_not_interested_googblue_24dp.png b/res/drawable-xxhdpi/ic_not_interested_googblue_24dp.png
new file mode 100644
index 000000000..7c256b5d7
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_not_interested_googblue_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_phone_24dp.png b/res/drawable-xxhdpi/ic_phone_24dp.png
new file mode 100644
index 000000000..8fff728bb
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_phone_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_report_24dp.png b/res/drawable-xxhdpi/ic_report_24dp.png
new file mode 100644
index 000000000..aed766804
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_report_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_report_problem_24dp.png b/res/drawable-xxhdpi/ic_report_problem_24dp.png
deleted file mode 100644
index 807b9fa18..000000000
--- a/res/drawable-xxhdpi/ic_report_problem_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_share_white_24dp.png b/res/drawable-xxhdpi/ic_share_white_24dp.png
new file mode 100644
index 000000000..a35b3cd14
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_unblock.png b/res/drawable-xxhdpi/ic_unblock.png
new file mode 100644
index 000000000..828a4879f
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_unblock.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_vm_bt_dk.png b/res/drawable-xxhdpi/ic_vm_bt_dk.png
deleted file mode 100644
index 0cb69bdb3..000000000
--- a/res/drawable-xxhdpi/ic_vm_bt_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_vm_phone_broadcast_dk.png b/res/drawable-xxhdpi/ic_vm_phone_broadcast_dk.png
deleted file mode 100644
index ee12670ac..000000000
--- a/res/drawable-xxhdpi/ic_vm_phone_broadcast_dk.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_voice_search.png b/res/drawable-xxhdpi/ic_voice_search.png
deleted file mode 100644
index 4e72f6947..000000000
--- a/res/drawable-xxhdpi/ic_voice_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.png b/res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.png
deleted file mode 100644
index 26234b1e3..000000000
--- a/res/drawable-xxhdpi/list_selector_disabled_holo_dark.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/rounded_corner_bg.9.png b/res/drawable-xxhdpi/rounded_corner_bg.9.png
deleted file mode 100644
index 0a99cdb26..000000000
--- a/res/drawable-xxhdpi/rounded_corner_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/empty_speeddial.png b/res/drawable-xxxhdpi/empty_speeddial.png
deleted file mode 100644
index dc7f8aeed..000000000
--- a/res/drawable-xxxhdpi/empty_speeddial.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_archive_white_24dp.png b/res/drawable-xxxhdpi/ic_archive_white_24dp.png
new file mode 100644
index 000000000..34cd3fd80
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_archive_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_block_24dp.png b/res/drawable-xxxhdpi/ic_block_24dp.png
new file mode 100644
index 000000000..0378d1bed
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_block_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_content_copy_24dp.png b/res/drawable-xxxhdpi/ic_content_copy_24dp.png
new file mode 100644
index 000000000..4ddee9ef0
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_content_copy_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_mic_grey600.png b/res/drawable-xxxhdpi/ic_mic_grey600.png
new file mode 100644
index 000000000..b7403ff22
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_mic_grey600.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_more_horiz_24dp.png b/res/drawable-xxxhdpi/ic_more_horiz_24dp.png
deleted file mode 100644
index 535f0874e..000000000
--- a/res/drawable-xxxhdpi/ic_more_horiz_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_not_interested_googblue_24dp.png b/res/drawable-xxxhdpi/ic_not_interested_googblue_24dp.png
new file mode 100644
index 000000000..6591ed485
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_not_interested_googblue_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_phone_24dp.png b/res/drawable-xxxhdpi/ic_phone_24dp.png
new file mode 100644
index 000000000..30d141db5
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_phone_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_report_24dp.png b/res/drawable-xxxhdpi/ic_report_24dp.png
new file mode 100644
index 000000000..855e59015
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_report_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_report_problem_24dp.png b/res/drawable-xxxhdpi/ic_report_problem_24dp.png
deleted file mode 100644
index 8683a2ea9..000000000
--- a/res/drawable-xxxhdpi/ic_report_problem_24dp.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_share_white_24dp.png b/res/drawable-xxxhdpi/ic_share_white_24dp.png
new file mode 100644
index 000000000..e351c7beb
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_share_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_unblock.png b/res/drawable-xxxhdpi/ic_unblock.png
new file mode 100644
index 000000000..99a1842a2
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_unblock.png
Binary files differ
diff --git a/res/drawable/blocked_contact.xml b/res/drawable/blocked_contact.xml
new file mode 100644
index 000000000..0957585b4
--- /dev/null
+++ b/res/drawable/blocked_contact.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item>
+ <shape android:shape="oval">
+ <solid android:color="@color/blocked_contact_background" />
+ <size android:width="24dp" android:height="24dp" />
+ </shape>
+ </item>
+
+ <item android:drawable="@drawable/ic_report_24dp"
+ android:width="18dp"
+ android:height="18dp"
+ android:gravity="center" />
+
+</layer-list>
diff --git a/res/drawable/ic_call_detail_block.xml b/res/drawable/ic_call_detail_block.xml
new file mode 100644
index 000000000..9ec8e03f5
--- /dev/null
+++ b/res/drawable/ic_call_detail_block.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_block_24dp"
+ android:tint="@color/call_detail_footer_icon_tint" />
diff --git a/res/drawable/ic_call_detail_content_copy.xml b/res/drawable/ic_call_detail_content_copy.xml
new file mode 100644
index 000000000..dd604dff7
--- /dev/null
+++ b/res/drawable/ic_call_detail_content_copy.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_content_copy_24dp"
+ android:tint="@color/call_detail_footer_icon_tint" />
diff --git a/res/drawable/ic_call_detail_edit.xml b/res/drawable/ic_call_detail_edit.xml
new file mode 100644
index 000000000..e5ad3e59e
--- /dev/null
+++ b/res/drawable/ic_call_detail_edit.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_create_24dp"
+ android:tint="@color/call_detail_footer_icon_tint" />
diff --git a/res/drawable/ic_call_detail_report.xml b/res/drawable/ic_call_detail_report.xml
new file mode 100644
index 000000000..201ac4cb6
--- /dev/null
+++ b/res/drawable/ic_call_detail_report.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_report_24dp"
+ android:tint="@color/call_detail_footer_icon_tint" />
diff --git a/res/drawable/ic_call_detail_unblock.xml b/res/drawable/ic_call_detail_unblock.xml
new file mode 100644
index 000000000..ba5378b10
--- /dev/null
+++ b/res/drawable/ic_call_detail_unblock.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_unblock"
+ android:tint="@color/call_detail_footer_icon_tint" />
diff --git a/res/drawable/ic_voicemail_seek_handle.xml b/res/drawable/ic_voicemail_seek_handle.xml
index a6f02be7e..d3fc95a65 100644
--- a/res/drawable/ic_voicemail_seek_handle.xml
+++ b/res/drawable/ic_voicemail_seek_handle.xml
@@ -16,6 +16,5 @@
-->
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_handle"
- android:autoMirrored="true"
android:tint="@color/actionbar_background_color" >
</bitmap> \ No newline at end of file
diff --git a/res/drawable/tab_voicemail.xml b/res/drawable/ic_voicemail_seek_handle_disabled.xml
index 568891b01..2be52ade6 100644
--- a/res/drawable/tab_voicemail.xml
+++ b/res/drawable/ic_voicemail_seek_handle_disabled.xml
@@ -14,17 +14,7 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-
-<ripple xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="@color/tab_ripple_color">
-
- <item>
- <bitmap android:src="@drawable/ic_voicemail_24dp"
- android:gravity="center" />
- </item>
-
- <item android:id="@android:id/mask">
- <color android:color="@android:color/white" />
- </item>
-
-</ripple>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_handle"
+ android:tint="@color/voicemail_icon_disabled_tint" >
+</bitmap> \ No newline at end of file
diff --git a/res/drawable/selectable_primary_flat_button.xml b/res/drawable/selectable_primary_flat_button.xml
new file mode 100644
index 000000000..c6eb7a26a
--- /dev/null
+++ b/res/drawable/selectable_primary_flat_button.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_enabled="false">
+ <shape><solid android:color="@color/material_grey_300" /></shape>
+ </item>
+ <item>
+ <shape><solid android:color="@color/dialer_theme_color" /></shape>
+ </item>
+</selector> \ No newline at end of file
diff --git a/res/layout-land/dialpad_fragment.xml b/res/layout-land/dialpad_fragment.xml
index 680c2d770..70a38ae20 100644
--- a/res/layout-land/dialpad_fragment.xml
+++ b/res/layout-land/dialpad_fragment.xml
@@ -28,7 +28,7 @@
android:id="@+id/spacer"
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="1"
+ android:layout_weight="4"
android:background="#00000000" />
<!-- Dialpad shadow -->
@@ -40,7 +40,7 @@
<RelativeLayout
android:layout_height="match_parent"
android:layout_width="0dp"
- android:layout_weight="1">
+ android:layout_weight="6">
<include layout="@layout/dialpad_view"
android:layout_height="match_parent"
@@ -60,7 +60,7 @@
<!-- Margin bottom and alignParentBottom don't work well together, so use a Space instead. -->
<Space android:id="@+id/dialpad_floating_action_button_margin_bottom"
android:layout_width="match_parent"
- android:layout_height="8dp"
+ android:layout_height="@dimen/floating_action_button_margin_bottom"
android:layout_alignParentBottom="true" />
<FrameLayout
diff --git a/res/layout/blocked_number_footer.xml b/res/layout/blocked_number_footer.xml
new file mode 100644
index 000000000..17425c840
--- /dev/null
+++ b/res/layout/blocked_number_footer.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:focusable="false">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="@dimen/blocked_number_container_padding"
+ android:background="@android:color/white"
+ android:focusable="true">
+
+ <TextView android:id="@+id/blocked_number_footer_textview"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/blocked_number_secondary_text_color"
+ android:textSize="@dimen/blocked_number_settings_description_text_size"
+ android:text="@string/block_number_footer_message_vvm"/>
+ </LinearLayout>
+</LinearLayout>
diff --git a/res/layout/show_call_history_list_item.xml b/res/layout/blocked_number_fragment.xml
index 1264894a9..4bc20857e 100644
--- a/res/layout/show_call_history_list_item.xml
+++ b/res/layout/blocked_number_fragment.xml
@@ -13,18 +13,17 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/blocked_number_fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@color/blocked_number_background">
-<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/CallLogCardStyle"
- android:layout_height="40dp"
- android:clickable="true"
- android:foreground="?android:attr/selectableItemBackground">
-
- <TextView
- android:layout_width="wrap_content"
+ <ListView android:id="@id/android:list"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:text="@string/show_call_history" />
-
-</android.support.v7.widget.CardView>
+ android:divider="@null"
+ android:headerDividersEnabled="false" />
+</LinearLayout>
diff --git a/res/layout/blocked_number_header.xml b/res/layout/blocked_number_header.xml
new file mode 100644
index 000000000..e4b795fd8
--- /dev/null
+++ b/res/layout/blocked_number_header.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:focusable="false"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/blocked_numbers_disabled_for_emergency"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="27dp"
+ android:paddingBottom="29dp"
+ android:paddingStart="@dimen/blocked_number_container_padding"
+ android:paddingEnd="44dp"
+ android:background="@color/blocked_number_disabled_emergency_background_color"
+ android:focusable="true"
+ android:orientation="vertical"
+ android:visibility="gone">
+
+ <TextView
+ style="@style/BlockedNumbersDescriptionTextStyle"
+ android:textStyle="bold"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/blocked_numbers_disabled_emergency_header_label"/>
+
+ <TextView
+ style="@style/BlockedNumbersDescriptionTextStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/blocked_numbers_disabled_emergency_desc"/>
+
+ </LinearLayout>
+
+ <android.support.v7.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ card_view:cardCornerRadius="0dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@android:color/white"
+ android:focusable="true"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/blocked_number_text_view"
+ style="@android:style/TextAppearance.Material.Subhead"
+ android:layout_width="wrap_content"
+ android:layout_height="48dp"
+ android:paddingStart="@dimen/blocked_number_container_padding"
+ android:gravity="center_vertical"
+ android:text="@string/block_list"
+ android:textColor="@color/blocked_number_header_color"/>
+
+ <RelativeLayout
+ android:id="@+id/import_settings"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/import_description"
+ style="@style/BlockedNumbersDescriptionTextStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="11dp"
+ android:paddingBottom="27dp"
+ android:paddingStart="@dimen/blocked_number_container_padding"
+ android:paddingEnd="@dimen/blocked_number_container_padding"
+ android:text="@string/blocked_call_settings_import_description"
+ android:textColor="@color/secondary_text_color"
+ android:textSize="@dimen/blocked_number_settings_description_text_size"/>
+
+ <Button
+ android:id="@+id/import_button"
+ style="@style/DialerFlatButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/blocked_number_container_padding"
+ android:layout_alignParentEnd="true"
+ android:layout_below="@id/import_description"
+ android:text="@string/blocked_call_settings_import_button"/>
+
+ <Button
+ android:id="@+id/view_numbers_button"
+ style="@style/DialerFlatButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="8dp"
+ android:layout_below="@id/import_description"
+ android:layout_toStartOf="@id/import_button"
+ android:text="@string/blocked_call_settings_view_numbers_button"/>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginTop="8dp"
+ android:layout_below="@id/import_button"
+ android:background="@color/divider_line_color"/>
+
+ </RelativeLayout>
+
+ <LinearLayout
+ android:id="@+id/migrate_promo"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="gone">
+
+ <TextView
+ android:id="@+id/migrate_promo_header"
+ style="@android:style/TextAppearance.Material.Subhead"
+ android:layout_width="match_parent"
+ android:layout_height="48dp"
+ android:paddingStart="@dimen/blocked_number_container_padding"
+ android:paddingEnd="@dimen/blocked_number_container_padding"
+ android:gravity="center_vertical"
+ android:textStyle="bold"
+ android:text="@string/migrate_blocked_numbers_dialog_title"
+ android:textColor="@color/blocked_number_header_color"/>
+
+ <TextView
+ android:id="@+id/migrate_promo_description"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/blocked_number_container_padding"
+ android:layout_marginEnd="@dimen/blocked_number_container_padding"
+ android:layout_marginBottom="@dimen/blocked_number_container_padding"
+ android:text="@string/migrate_blocked_numbers_dialog_message"
+ android:textColor="@color/secondary_text_color"/>
+
+ <Button
+ android:id="@+id/migrate_promo_allow_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/migrate_blocked_numbers_dialog_allow_button"
+ android:layout_marginStart="@dimen/blocked_number_container_padding"
+ android:layout_marginEnd="@dimen/blocked_number_container_padding"
+ android:layout_gravity="end"
+ style="@style/DialerPrimaryFlatButtonStyle"
+ android:layout_marginBottom="@dimen/blocked_number_container_padding"/>
+
+ <View
+ style="@style/FullWidthDivider"/>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/add_number_linear_layout"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/blocked_number_add_top_margin"
+ android:paddingBottom="@dimen/blocked_number_add_bottom_margin"
+ android:paddingStart="@dimen/blocked_number_horizontal_margin"
+ android:background="?android:attr/selectableItemBackground"
+ android:baselineAligned="false"
+ android:clickable="true"
+ android:contentDescription="@string/addBlockedNumber"
+ android:focusable="true"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/add_number_icon"
+ android:layout_width="@dimen/contact_photo_size"
+ android:layout_height="@dimen/contact_photo_size"
+ android:importantForAccessibility="no"/>
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginStart="@dimen/blocked_number_horizontal_margin"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/add_number_textview"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:includeFontPadding="false"
+ android:text="@string/addBlockedNumber"
+ android:textColor="@color/blocked_number_primary_text_color"
+ android:textSize="@dimen/blocked_number_primary_text_size"/>
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <View
+ android:id="@+id/blocked_number_list_divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginStart="72dp"
+ android:background="@color/divider_line_color"/>
+
+ </LinearLayout>
+
+ </android.support.v7.widget.CardView>
+
+</LinearLayout>
diff --git a/res/layout/blocked_number_item.xml b/res/layout/blocked_number_item.xml
new file mode 100644
index 000000000..a4997f257
--- /dev/null
+++ b/res/layout/blocked_number_item.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/caller_information"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/blocked_number_horizontal_margin"
+ android:baselineAligned="false"
+ android:orientation="horizontal"
+ android:focusable="true"
+ android:gravity="center_vertical"
+ android:background="@android:color/white">
+
+ <QuickContactBadge
+ android:id="@+id/quick_contact_photo"
+ android:layout_width="@dimen/contact_photo_size"
+ android:layout_height="@dimen/contact_photo_size"
+ android:focusable="true"
+ android:layout_marginTop="@dimen/blocked_number_top_margin"
+ android:layout_marginBottom="@dimen/blocked_number_bottom_margin"/>
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:layout_marginStart="@dimen/blocked_number_horizontal_margin">
+
+ <TextView
+ android:id="@+id/caller_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/blocked_number_primary_text_color"
+ android:textSize="@dimen/blocked_number_primary_text_size"
+ android:includeFontPadding="false"
+ android:singleLine="true"/>
+
+ <TextView
+ android:id="@+id/caller_number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="@color/blocked_number_secondary_text_color"
+ android:textSize="@dimen/blocked_number_settings_description_text_size"
+ android:singleLine="true" />
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/delete_button"
+ android:layout_width="@dimen/blocked_number_delete_icon_size"
+ android:layout_height="@dimen/blocked_number_delete_icon_size"
+ android:layout_marginEnd="24dp"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:src="@drawable/ic_remove"
+ android:scaleType="center"
+ android:tint="@color/blocked_number_icon_tint"
+ android:contentDescription="@string/description_blocked_number_list_delete" />
+
+</LinearLayout>
diff --git a/res/layout/blocked_numbers_activity.xml b/res/layout/blocked_numbers_activity.xml
new file mode 100644
index 000000000..d28eaf879
--- /dev/null
+++ b/res/layout/blocked_numbers_activity.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/blocked_numbers_activity_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginTop="@dimen/action_bar_height">
+</FrameLayout>
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index fde1de5c1..7d9124888 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -13,90 +13,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/call_detail"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:layout_alignParentStart="true"
- android:layout_alignParentTop="true"
android:background="@color/background_dialer_call_log" >
- <!-- Caller information "card" -->
- <LinearLayout
- android:id="@+id/caller_information"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="@dimen/call_detail_horizontal_margin"
- android:paddingTop="@dimen/call_detail_top_margin"
- android:paddingBottom="@dimen/call_detail_bottom_margin"
- android:baselineAligned="false"
- android:orientation="horizontal"
- android:translationZ="@dimen/call_detail_translation_z"
- android:focusable="true"
- android:background="@color/background_dialer_white" >
-
- <QuickContactBadge
- android:id="@+id/quick_contact_photo"
- android:layout_width="@dimen/contact_photo_size"
- android:layout_height="@dimen/contact_photo_size"
- android:layout_alignParentStart="true"
- android:layout_gravity="top"
- android:layout_marginTop="3dp"
- android:focusable="true" />
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:orientation="vertical"
- android:gravity="center_vertical"
- android:layout_marginStart="@dimen/call_detail_horizontal_margin">
-
- <TextView
- android:id="@+id/caller_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="?attr/call_log_primary_text_color"
- android:textSize="@dimen/call_log_primary_text_size"
- android:includeFontPadding="false"
- android:layout_marginBottom="5dp"
- android:singleLine="true" />
-
- <TextView
- android:id="@+id/caller_number"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
- android:layout_marginBottom="1dp"
- android:singleLine="true" />
-
- <TextView
- android:id="@+id/phone_account_label"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
- android:singleLine="true"
- android:visibility="gone" />
-
- </LinearLayout>
-
- <ImageView
- android:id="@+id/call_back_button"
- android:layout_width="@dimen/call_log_list_item_primary_action_dimen"
- android:layout_height="@dimen/call_log_list_item_primary_action_dimen"
- android:layout_marginEnd="16dp"
- android:background="?android:attr/selectableItemBackgroundBorderless"
- android:src="@drawable/ic_call_24dp"
- android:scaleType="center"
- android:tint="@color/call_log_list_item_primary_action_icon_tint"
- android:contentDescription="@string/description_call_log_call_action"
- android:visibility="gone" />
-
- </LinearLayout>
-
<!--
The list view is under everything.
It contains a first header element which is hidden under the controls UI.
@@ -107,4 +29,4 @@
android:layout_width="match_parent"
android:layout_height="fill_parent" />
-</LinearLayout>
+</FrameLayout>
diff --git a/res/layout/call_detail_footer.xml b/res/layout/call_detail_footer.xml
new file mode 100644
index 000000000..6ee76e62e
--- /dev/null
+++ b/res/layout/call_detail_footer.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/divider_line_thickness"
+ android:background="@color/call_log_action_divider" />
+
+ <TextView android:id="@+id/call_detail_action_block"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/action_block_number"
+ android:drawableStart="@drawable/ic_call_detail_block"
+ style="@style/CallDetailActionItemStyle" />
+
+ <TextView android:id="@+id/call_detail_action_copy"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/action_copy_number_text"
+ android:drawableStart="@drawable/ic_call_detail_content_copy"
+ style="@style/CallDetailActionItemStyle" />
+
+ <TextView android:id="@+id/call_detail_action_edit_before_call"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/action_edit_number_before_call"
+ android:drawableStart="@drawable/ic_call_detail_edit"
+ android:visibility="gone"
+ style="@style/CallDetailActionItemStyle" />
+
+ <TextView android:id="@+id/call_detail_action_report"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/action_report_number"
+ android:drawableStart="@drawable/ic_call_detail_report"
+ android:visibility="gone"
+ style="@style/CallDetailActionItemStyle" />
+
+</LinearLayout>
diff --git a/res/layout/call_detail_header.xml b/res/layout/call_detail_header.xml
new file mode 100644
index 000000000..6eceb80ee
--- /dev/null
+++ b/res/layout/call_detail_header.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/caller_information"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/call_detail_horizontal_margin"
+ android:paddingTop="@dimen/call_detail_top_margin"
+ android:paddingBottom="@dimen/call_detail_bottom_margin"
+ android:baselineAligned="false"
+ android:orientation="horizontal"
+ android:elevation="@dimen/call_detail_elevation"
+ android:focusable="true"
+ android:background="@color/background_dialer_white" >
+
+ <QuickContactBadge
+ android:id="@+id/quick_contact_photo"
+ android:layout_width="@dimen/contact_photo_size"
+ android:layout_height="@dimen/contact_photo_size"
+ android:layout_alignParentStart="true"
+ android:layout_gravity="top"
+ android:layout_marginTop="3dp"
+ android:focusable="true" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center_vertical"
+ android:layout_marginStart="@dimen/call_detail_horizontal_margin">
+
+ <TextView
+ android:id="@+id/caller_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?attr/call_log_primary_text_color"
+ android:textSize="@dimen/call_log_primary_text_size"
+ android:includeFontPadding="false"
+ android:layout_marginTop="2dp"
+ android:layout_marginBottom="3dp"
+ android:singleLine="true" />
+
+ <TextView
+ android:id="@+id/caller_number"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?attr/call_log_secondary_text_color"
+ android:textSize="@dimen/call_log_detail_text_size"
+ android:layout_marginBottom="1dp"
+ android:singleLine="true" />
+
+ <TextView
+ android:id="@+id/phone_account_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textColor="?attr/call_log_secondary_text_color"
+ android:textSize="@dimen/call_log_detail_text_size"
+ android:singleLine="true"
+ android:visibility="gone" />
+
+ </LinearLayout>
+
+ <ImageView
+ android:id="@+id/call_back_button"
+ android:layout_width="@dimen/call_log_list_item_primary_action_dimen"
+ android:layout_height="@dimen/call_log_list_item_primary_action_dimen"
+ android:layout_marginEnd="16dp"
+ android:background="?android:attr/selectableItemBackgroundBorderless"
+ android:src="@drawable/ic_call_24dp"
+ android:scaleType="center"
+ android:tint="@color/call_log_list_item_primary_action_icon_tint"
+ android:contentDescription="@string/description_call_log_call_action"
+ android:visibility="gone" />
+
+</LinearLayout>
diff --git a/res/layout/call_detail_history_item.xml b/res/layout/call_detail_history_item.xml
index cbe844234..10d9605a1 100644
--- a/res/layout/call_detail_history_item.xml
+++ b/res/layout/call_detail_history_item.xml
@@ -46,11 +46,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size" />
+ android:textSize="@dimen/call_log_detail_text_size" />
<TextView
android:id="@+id/duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size" />
+ android:textSize="@dimen/call_log_detail_text_size" />
</LinearLayout>
diff --git a/res/layout/call_log_fragment.xml b/res/layout/call_log_fragment.xml
index f69c5139f..aad7d8e77 100644
--- a/res/layout/call_log_fragment.xml
+++ b/res/layout/call_log_fragment.xml
@@ -24,8 +24,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_dialer_call_log"
+ android:clipToPadding="false"
android:paddingStart="@dimen/call_log_horizontal_margin"
- android:paddingEnd="@dimen/call_log_horizontal_margin" />
+ android:paddingEnd="@dimen/call_log_horizontal_margin"
+ android:paddingBottom="@dimen/floating_action_button_list_bottom_padding" />
<com.android.dialer.widget.EmptyContentView
android:id="@+id/empty_list_view"
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index ec512b67f..660bca36e 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -30,8 +30,8 @@
android:layout_marginStart="@dimen/call_log_start_margin"
android:layout_marginEnd="@dimen/call_log_outer_margin"
android:fontFamily="sans-serif-medium"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textColor="@color/call_log_day_group_heading_color"
+ android:textSize="@dimen/call_log_day_group_heading_size"
android:paddingTop="@dimen/call_log_day_group_padding_top"
android:paddingBottom="@dimen/call_log_day_group_padding_bottom" />
@@ -83,21 +83,10 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/call_log_name_margin_bottom"
android:layout_marginEnd="@dimen/call_log_icon_margin"
- android:textColor="?attr/call_log_primary_text_color"
+ android:textColor="@color/call_log_primary_color"
android:textSize="@dimen/call_log_primary_text_size"
android:singleLine="true" />
- <TextView
- android:id="@+id/voicemail_transcription"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginEnd="@dimen/call_log_icon_margin"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:visibility="gone" />
-
<LinearLayout
android:id="@+id/call_type"
android:layout_width="wrap_content"
@@ -112,14 +101,22 @@
android:layout_marginEnd="@dimen/call_log_icon_margin"
android:layout_gravity="center_vertical" />
+ <ImageView android:id="@+id/work_profile_icon"
+ android:src="@drawable/ic_work_profile"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginEnd="@dimen/call_log_icon_margin"
+ android:scaleType="center"
+ android:visibility="gone" />
+
<TextView
android:id="@+id/call_location_and_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/call_log_icon_margin"
android:layout_gravity="center_vertical"
- android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textColor="@color/call_log_detail_color"
+ android:textSize="@dimen/call_log_detail_text_size"
android:singleLine="true" />
</LinearLayout>
@@ -128,12 +125,25 @@
android:id="@+id/call_account_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/call_log_call_account_margin_bottom"
android:layout_marginEnd="@dimen/call_log_icon_margin"
android:textColor="?attr/call_log_secondary_text_color"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textSize="@dimen/call_log_detail_text_size"
android:visibility="gone"
android:singleLine="true" />
+ <TextView
+ android:id="@+id/voicemail_transcription"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/call_log_icon_margin"
+ android:textColor="@color/call_log_voicemail_transcript_color"
+ android:textSize="@dimen/call_log_voicemail_transcription_text_size"
+ android:ellipsize="marquee"
+ android:visibility="gone"
+ android:singleLine="false"
+ android:maxLines="10"/>
+
</LinearLayout>
<ImageView
diff --git a/res/layout/call_log_list_item_actions.xml b/res/layout/call_log_list_item_actions.xml
index 16a712bcd..78203b72d 100644
--- a/res/layout/call_log_list_item_actions.xml
+++ b/res/layout/call_log_list_item_actions.xml
@@ -35,16 +35,27 @@
<LinearLayout
android:id="@+id/call_action"
+ android:paddingTop="@dimen/call_log_actions_top_padding"
style="@style/CallLogActionStyle">
<ImageView
style="@style/CallLogActionIconStyle"
android:src="@drawable/ic_call_24dp" />
- <TextView
- android:id="@+id/call_action_text"
- style="@style/CallLogActionTextStyle"
- android:text="@string/description_call_log_call_action" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+ <TextView
+ android:id="@+id/call_action_text"
+ style="@style/CallLogActionTextStyle"
+ android:text="@string/description_call_log_call_action" />
+
+ <TextView
+ android:id="@+id/call_type_or_location_text"
+ style="@style/CallLogActionSupportTextStyle"/>
+ </LinearLayout>
</LinearLayout>
@@ -118,6 +129,11 @@
</LinearLayout>
+ <ViewStub
+ android:id="@+id/extended_blocking_actions_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
<LinearLayout
android:id="@+id/details_action"
style="@style/CallLogActionStyle">
diff --git a/res/layout/dialtacts_activity.xml b/res/layout/dialtacts_activity.xml
index 0f1f2bbdb..782d4f310 100644
--- a/res/layout/dialtacts_activity.xml
+++ b/res/layout/dialtacts_activity.xml
@@ -13,8 +13,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<FrameLayout
+<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/dialtacts_mainlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -43,7 +44,8 @@
android:layout_width="@dimen/floating_action_button_width"
android:layout_height="@dimen/floating_action_button_height"
android:layout_marginBottom="@dimen/floating_action_button_margin_bottom"
- android:layout_gravity="center_horizontal|bottom">
+ android:layout_gravity="center_horizontal|bottom"
+ app:layout_behavior="com.android.dialer.FloatingActionButtonBehavior">
<ImageButton
android:id="@+id/floating_action_button"
@@ -68,4 +70,4 @@
android:importantForAccessibility="no" />
</FrameLayout>
-</FrameLayout>
+</android.support.design.widget.CoordinatorLayout>
diff --git a/res/layout/lists_fragment.xml b/res/layout/lists_fragment.xml
index 1942a96eb..a073151e2 100644
--- a/res/layout/lists_fragment.xml
+++ b/res/layout/lists_fragment.xml
@@ -53,12 +53,17 @@
</LinearLayout>
+ <!-- Sets android:importantForAccessibility="no" to avoid being announced when navigating with
+ talkback enabled. It will still be announced when user drag or drop contact onto it.
+ This is required since drag and drop event is only sent to views are visible when drag
+ starts. -->
<com.android.dialer.list.RemoveView
android:id="@+id/remove_view"
android:layout_width="match_parent"
android:layout_height="@dimen/tab_height"
android:layout_marginTop="@dimen/action_bar_height_large"
- android:layout_alignParentTop="true" >
+ android:contentDescription="@string/remove_contact"
+ android:importantForAccessibility="no" >
<LinearLayout
android:id="@+id/remove_view_content"
@@ -67,7 +72,7 @@
android:background="@color/actionbar_background_color"
android:gravity="center"
android:orientation="horizontal"
- android:visibility="gone" >
+ android:visibility="gone">
<ImageView
android:layout_width="wrap_content"
@@ -76,7 +81,6 @@
android:layout_marginBottom="8dp"
android:id="@+id/remove_view_icon"
android:src="@drawable/ic_remove"
- android:contentDescription="@string/remove_contact"
android:tint="@color/remove_text_color" />
<TextView
diff --git a/res/layout/phone_favorite_tile_view.xml b/res/layout/phone_favorite_tile_view.xml
index 8b00fba61..aa82ca0dc 100644
--- a/res/layout/phone_favorite_tile_view.xml
+++ b/res/layout/phone_favorite_tile_view.xml
@@ -24,7 +24,8 @@
android:id="@+id/contact_favorite_card"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:focusable="true" >
+ android:focusable="true"
+ android:nextFocusRight="@+id/contact_tile_secondary_button">
<com.android.contacts.common.widget.LayoutSuppressingImageView
android:id="@+id/contact_tile_image"
@@ -102,8 +103,7 @@
android:id="@+id/contact_tile_push_state"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:focusable="true"
- android:nextFocusRight="@+id/contact_tile_secondary_button"
+ android:importantForAccessibility="no"
android:background="@drawable/item_background_material_dark" />
<ImageButton
diff --git a/res/layout/search_edittext.xml b/res/layout/search_edittext.xml
index 61406a197..8eda6960c 100644
--- a/res/layout/search_edittext.xml
+++ b/res/layout/search_edittext.xml
@@ -17,7 +17,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="@dimen/search_box_left_padding"
- android:paddingEnd="@dimen/search_box_right_padding"
android:gravity="center_vertical"
android:orientation="horizontal">
@@ -25,8 +24,8 @@
android:id="@+id/search_magnifying_glass"
android:layout_height="@dimen/search_box_icon_size"
android:layout_width="@dimen/search_box_icon_size"
- android:layout_margin="@dimen/search_box_icon_margin"
android:padding="@dimen/search_box_search_icon_padding"
+ android:scaleType="center"
android:src="@drawable/ic_ab_search"
android:importantForAccessibility="no"
android:tint="@color/searchbox_icon_tint" />
@@ -45,10 +44,10 @@
<ImageView
android:id="@+id/voice_search_button"
- android:layout_height="@dimen/search_box_icon_size"
android:layout_width="@dimen/search_box_icon_size"
- android:layout_margin="@dimen/search_box_icon_margin"
- android:src="@drawable/ic_voice_search"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_mic_grey600"
+ android:scaleType="center"
android:clickable="true"
android:contentDescription="@string/description_start_voice_search"
android:background="?android:attr/selectableItemBackgroundBorderless"
@@ -57,8 +56,9 @@
<ImageButton
android:id="@+id/dialtacts_options_menu_button"
android:layout_width="@dimen/search_box_icon_size"
- android:layout_height="@dimen/search_box_icon_size"
- android:layout_margin="@dimen/search_box_icon_margin"
+ android:layout_height="match_parent"
+ android:paddingEnd="@dimen/search_box_right_padding"
+ android:scaleType="center"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_overflow_menu"
android:contentDescription="@string/action_menu_overflow_description"
diff --git a/res/layout/view_numbers_to_import_fragment.xml b/res/layout/view_numbers_to_import_fragment.xml
new file mode 100644
index 000000000..1836f8dbd
--- /dev/null
+++ b/res/layout/view_numbers_to_import_fragment.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:card_view="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:background="@color/blocked_number_background">
+
+ <ListView android:id="@id/android:list"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:divider="@null"
+ android:headerDividersEnabled="false" />
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:background="@android:color/white">
+
+ <Button android:id="@+id/import_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_marginEnd="@dimen/blocked_number_container_padding"
+ android:text="@string/blocked_call_settings_import_button"
+ style="@style/DialerFlatButtonStyle" />
+
+ <Button android:id="@+id/cancel_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@id/import_description"
+ android:layout_toLeftOf="@id/import_button"
+ android:text="@android:string/cancel"
+ style="@style/DialerFlatButtonStyle" />
+
+ </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/voicemail_playback_layout.xml b/res/layout/voicemail_playback_layout.xml
index 56865fcd6..178e888bb 100644
--- a/res/layout/voicemail_playback_layout.xml
+++ b/res/layout/voicemail_playback_layout.xml
@@ -34,78 +34,104 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:gravity="top">
+ android:gravity="center_vertical"
+ android:paddingTop="@dimen/voicemail_playback_top_padding">
<TextView
android:id="@+id/playback_position_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textSize="14sp"
- android:paddingTop="@dimen/voicemail_playback_top_padding" />
+ android:importantForAccessibility="no" />
- <LinearLayout
+ <SeekBar
+ android:id="@+id/playback_seek"
android:layout_width="0dp"
- android:layout_height="wrap_content"
android:layout_weight="1"
- android:orientation="vertical"
- android:layout_marginTop="4dp">
-
- <SeekBar
- android:id="@+id/playback_seek"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingBottom="8dp"
- android:paddingTop="@dimen/voicemail_playback_top_padding"
- android:progressDrawable="@drawable/seekbar_drawable"
- android:thumb="@drawable/ic_voicemail_seek_handle"
- android:progress="0"
- android:max="0"
- android:contentDescription="@string/description_playback_seek" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="center"
- android:padding="8dp">
-
- <ImageButton android:id="@+id/playback_speakerphone"
- style="@style/VoicemailPlaybackLayoutButtonStyle"
- android:src="@drawable/ic_speakerphone_on"
- android:tint="@color/voicemail_icon_tint"
- android:contentDescription="@string/description_playback_speakerphone" />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <ImageButton android:id="@+id/playback_start_stop"
- style="@style/VoicemailPlaybackLayoutButtonStyle"
- android:src="@drawable/ic_play_arrow"
- android:contentDescription="@string/voicemail_play_start_pause" />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <ImageButton android:id="@+id/delete_voicemail"
- style="@style/VoicemailPlaybackLayoutButtonStyle"
- android:src="@drawable/ic_delete_24dp"
- android:tint="@color/voicemail_icon_tint"
- android:contentDescription="@string/recentCalls_trashVoicemail" />
-
- </LinearLayout>
-
- </LinearLayout>
+ android:layout_height="wrap_content"
+ android:progressDrawable="@drawable/seekbar_drawable"
+ android:thumb="@drawable/ic_voicemail_seek_handle"
+ android:progress="0"
+ android:max="0"
+ android:contentDescription="@string/description_playback_seek" />
- <TextView
- android:id="@+id/total_duration_text"
+ <TextView
+ android:id="@+id/total_duration_text"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textSize="14sp"
+ android:importantForAccessibility="no" />
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textSize="14sp"
- android:paddingTop="@dimen/voicemail_playback_top_padding" />
+ android:orientation="horizontal"
+ android:gravity="center">
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <ImageButton android:id="@+id/playback_speakerphone"
+ style="@style/VoicemailPlaybackLayoutButtonStyle"
+ android:src="@drawable/ic_volume_down_24dp"
+ android:tint="@color/voicemail_icon_tint"
+ android:contentDescription="@string/description_playback_speakerphone" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <ImageButton android:id="@+id/playback_start_stop"
+ style="@style/VoicemailPlaybackLayoutButtonStyle"
+ android:src="@drawable/ic_play_arrow"
+ android:contentDescription="@string/voicemail_play_start_pause" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
+
+ <ImageButton android:id="@+id/delete_voicemail"
+ style="@style/VoicemailPlaybackLayoutButtonStyle"
+ android:src="@drawable/ic_delete_24dp"
+ android:tint="@color/voicemail_icon_tint"
+ android:contentDescription="@string/call_log_trash_voicemail" />
+
+ <Space android:id="@+id/space_before_share_voicemail"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="gone" />
+
+ <ImageButton android:id="@+id/share_voicemail"
+ style="@style/VoicemailPlaybackLayoutButtonStyle"
+ android:src="@drawable/ic_share_white_24dp"
+ android:tint="@color/voicemail_icon_tint"
+ android:contentDescription="@string/call_log_share_voicemail"
+ android:visibility="gone" />
+
+ <Space android:id="@+id/space_before_archive_voicemail"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:visibility="gone" />
+
+ <ImageButton android:id="@+id/archive_voicemail"
+ style="@style/VoicemailPlaybackLayoutButtonStyle"
+ android:src="@drawable/ic_archive_white_24dp"
+ android:tint="@color/voicemail_icon_tint"
+ android:contentDescription="@string/call_log_archive_voicemail"
+ android:visibility="gone" />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"/>
</LinearLayout>
diff --git a/res/layout/voicemail_promo_card.xml b/res/layout/voicemail_promo_card.xml
index 103fa30b3..ba4ac59a7 100644
--- a/res/layout/voicemail_promo_card.xml
+++ b/res/layout/voicemail_promo_card.xml
@@ -57,7 +57,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/background_dialer_white"
- android:textSize="@dimen/call_log_secondary_text_size"
+ android:textSize="@dimen/call_log_detail_text_size"
android:text="@string/visual_voicemail_text"
android:lineSpacingExtra="@dimen/promo_card_line_spacing"
android:singleLine="false"/>
@@ -79,20 +79,20 @@
android:gravity="end">
<TextView
- android:id="@+id/settings_action"
+ android:id="@+id/secondary_action"
style="@style/PromoCardActionStyle"
android:background="?android:attr/selectableItemBackground"
android:text="@string/visual_voicemail_settings"
android:nextFocusLeft="@+id/promo_card"
- android:nextFocusRight="@+id/ok_action"
+ android:nextFocusRight="@+id/primary_action"
android:paddingEnd="@dimen/promo_card_action_between_padding"/>
<TextView
- android:id="@+id/ok_action"
+ android:id="@+id/primary_action"
style="@style/PromoCardActionStyle"
android:background="?android:attr/selectableItemBackground"
android:text="@android:string/ok"
- android:nextFocusLeft="@+id/settings_action"
+ android:nextFocusLeft="@+id/secondary_action"
android:nextFocusRight="@+id/promo_card"/>
</LinearLayout>
</LinearLayout>
diff --git a/res/menu/call_details_options.xml b/res/menu/call_details_options.xml
deleted file mode 100644
index f08b4facd..000000000
--- a/res/menu/call_details_options.xml
+++ /dev/null
@@ -1,34 +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.
--->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-
- <item android:id="@+id/menu_trash"
- android:icon="@drawable/ic_delete_24dp"
- android:showAsAction="ifRoom"
- android:title="@string/recentCalls_trashVoicemail" />
-
- <item android:id="@+id/menu_remove_from_call_log"
- android:icon="@drawable/ic_delete_24dp"
- android:showAsAction="ifRoom"
- android:title="@string/recentCalls_removeFromRecentList" />
-
- <item android:id="@+id/menu_edit_number_before_call"
- android:title="@string/recentCalls_editNumberBeforeCall" />
-
- <item android:id="@+id/menu_report"
- android:title="@string/call_detail_menu_report" />
-
-</menu>
diff --git a/res/menu/call_log_options.xml b/res/menu/call_log_options.xml
index 50b1cad5b..da38d864d 100644
--- a/res/menu/call_log_options.xml
+++ b/res/menu/call_log_options.xml
@@ -16,7 +16,7 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/delete_all"
- android:title="@string/recentCalls_deleteAll"
+ android:title="@string/call_log_delete_all"
android:showAsAction="never"
android:orderInCategory="1"/>
</menu>
diff --git a/res/menu/dialtacts_options.xml b/res/menu/dialtacts_options.xml
index 8a9e25f7f..0f068f505 100644
--- a/res/menu/dialtacts_options.xml
+++ b/res/menu/dialtacts_options.xml
@@ -20,6 +20,10 @@
android:icon="@drawable/ic_menu_history_lt"
android:title="@string/action_menu_call_history_description" />
<item
+ android:id="@+id/menu_archive"
+ android:title="@string/voicemail_archive_activity_title"
+ android:visible="false" />
+ <item
android:id="@+id/menu_import_export"
android:title="@string/menu_import_export" />
<item
diff --git a/res/mipmap-hdpi/ic_launcher_phone.png b/res/mipmap-hdpi/ic_launcher_phone.png
index 5a3dff1f3..15c41423b 100644
--- a/res/mipmap-hdpi/ic_launcher_phone.png
+++ b/res/mipmap-hdpi/ic_launcher_phone.png
Binary files differ
diff --git a/res/mipmap-mdpi/ic_launcher_phone.png b/res/mipmap-mdpi/ic_launcher_phone.png
index 9ea0d8c8b..3088f7502 100644
--- a/res/mipmap-mdpi/ic_launcher_phone.png
+++ b/res/mipmap-mdpi/ic_launcher_phone.png
Binary files differ
diff --git a/res/mipmap-xhdpi/ic_launcher_phone.png b/res/mipmap-xhdpi/ic_launcher_phone.png
index e97836cdf..e87de01fb 100644
--- a/res/mipmap-xhdpi/ic_launcher_phone.png
+++ b/res/mipmap-xhdpi/ic_launcher_phone.png
Binary files differ
diff --git a/res/mipmap-xxhdpi/ic_launcher_phone.png b/res/mipmap-xxhdpi/ic_launcher_phone.png
index 1594e4ec3..b866b79a7 100644
--- a/res/mipmap-xxhdpi/ic_launcher_phone.png
+++ b/res/mipmap-xxhdpi/ic_launcher_phone.png
Binary files differ
diff --git a/res/mipmap-xxxhdpi/ic_launcher_phone.png b/res/mipmap-xxxhdpi/ic_launcher_phone.png
index 8c92ac132..26f51f153 100644
--- a/res/mipmap-xxxhdpi/ic_launcher_phone.png
+++ b/res/mipmap-xxxhdpi/ic_launcher_phone.png
Binary files differ
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 9dabae892..8e2e52012 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Foon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Foon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Foonbelblad"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Foon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Oproepgeskiedenis"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Bel <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Gee onakkurate nommer aan"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Redigeer nommer voor oproep"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Voeg by \'n kontak"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Vee uit oproepgeskiedenis"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Vee oproepgeskiedenis uit"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Vee stemboodskap uit"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Deel stemboodskap"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Jou oproeprekord is leeg"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Maak \'n oproep"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Oproepgeskiedenis"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Gee foutiewe nommer aan"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopieer nommer"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopieer transkripsie"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokkeer nommer"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> is geblokkeer"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Deblokkeer nommer"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> is gedeblokkeer"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ONTDOEN"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Vee uit"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Wysig nommer voor oproep"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Vee oproepgeskiedenis uit"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Vee stemboodskap uit"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Argiveer stemboodskap"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Deel stemboodskap"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Stemboodskap is uitgevee"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Stemboodskap is geargiveer"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ONTDOEN"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"GAAN NA ARGIEF"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Vee oproepgeskiedenis uit?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Dit sal alle oproepe uit jou geskiedenis vee"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Vee tans oproepgeskiedenis uit …"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Foon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Gemiste oproep"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Gemiste werkoproep"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Gemiste oproepe"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepe"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Bel terug"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Boodskap"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Stemboodskappe </item>
<item quantity="one">Stemboodskap</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nuwe stemboodskap van <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Kon nie stemboodskap speel nie"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buffering…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Laai tans stemboodskap …"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Argiveer tans stemboodskap …"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Kon nie stemboodskap laai nie"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Slegs oproepe met stemboodskappe"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Slegs inkomende oproepe"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Oproepgeskiedenis"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Meer opsies"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"belblad"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopieer"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Wys slegs uitgaande"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Wys slegs inkomende"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Wys slegs misgeloop"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Uitgaande video-oproep"</string>
<string name="type_missed_video" msgid="954396897034220545">"Gemiste video-oproep"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Stemboodskap"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Afgekeurde oproep"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Geblokkeerde oproep"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Inkomende oproepe"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Speel stemboodskap"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Bekyk kontak <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Bel <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontakbesonderhede van <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nuwe stemboodskap."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> oproepe."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video-oproep."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Stuur SMS aan <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Betaalfoon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> om <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Kan nie hierdie nommer bel nie"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Om stemboodskapdiens op te stel, gaan na Kieslys &gt; Instellings."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Om stemboodskapdiens te bel, skakel eers vliegtuigmodus af."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Stemsoektog is nie beskikbaar nie"</string>
<string name="call_not_available" msgid="8941576511946492225">"Kan nie \'n foonoproep maak nie want die Foon-program is gedeaktiveer."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Geen program daarvoor op hierdie toestel nie"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Voer \'n naam of foonnommer in"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Jy het geen gemiste oproepe nie."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Jou stemboodskapdiens se inkassie is leeg."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Deursoek kontakte"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Gee nommer of soek in kontakte"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Jou oproepgeskiedenis is leeg"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Maak \'n oproep"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Jy het geen gemiste oproepe nie."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Jou stemboodskapdiens se inkassie is leeg."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Jou stemboodskap-argief is leeg."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Wys net gunstelinge"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Geskiedenis"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Oproepgeskiedenis"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Stemboodskap-argief"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Alles"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Gemis"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Stemboodskap"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nuwe, vereenvoudigde blokkering"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Om jou beter te beskerm, moet Phone die manier verander waarop blokkering werk. Jou geblokkeerde nommers sal nou sowel oproepe as SMS\'e keer en kan met ander programme gedeel word."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Laat toe"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blokkeer <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Oproepe van hierdie nommer af sal geblokkeer word en stemboodskappe sal outomaties uitgevee word."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Oproepe van hierdie nommer af sal geblokkeer word, maar die beller sal dalk steeds vir jou stemboodskappe kan los."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Jy sal nie meer oproepe of SMS\'e van hierdie nommer ontvang nie."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKKEER"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Deblokkeer <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DEBLOKKEER"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Spoedbel"</string>
- <string name="tab_recents" msgid="929949073851377206">"Onlangse kontakte"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Oproepgeskiedenis"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakte"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Stemboodskap"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Verwyder uit gunstelinge"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Voeg by \'n kontak"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Stuur SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Maak video-oproep"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Bekyk volledige oproepgeskiedenis"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokkeer nommer"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nuwe gemiste oproepe"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Daar is nog niemand op jou spoedbel nie"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Voeg \'n gunsteling by"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Raak prent om al die nommers te sien of raak en hou om te herorganiseer"</string>
<string name="remove_contact" msgid="1080555335283662961">"Verwyder"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video-oproep"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Stuur boodskap"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Stuur \'n boodskap"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Oproepbesonderhede"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Bel <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Oproep gemis vanaf <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Oproep geantwoord vanaf <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ongeleeste stempos vanaf <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Stempos vanaf <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Oproep na <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"op <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"op <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Bel"</string>
<string name="description_call_action" msgid="4000549004089776147">"Bel <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Maak video-oproep na <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Vinnige antwoorde"</string>
<string name="call_settings_label" msgid="313434211353070209">"Oproepe"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Oproepblokkering"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Oproepblokkering is tydelik af"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Oproepblokkering is gedeaktiveer omdat jy die afgelope 48 uur nooddienste van hierdie foon af gekontak het. Dit sal outomaties heraktiveer word sodra die 48-uurtydperk verstryk."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Voer nommers in"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Jy het sommige bellers vroeër gemerk om outomaties via ander programme na stemboodskapdiens gestuur te word."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Bekyk nommers"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Voer in"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Kon nie invoer nie"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Kon nie stemboodskap argiveer nie."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Deblokkeer nommer"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Voeg nommer by"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Oproepe van hierdie nommers af sal geblokkeer word en stemboodskappe sal outomaties uitgevee word."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Oproepe van hierdie nommers af sal geblokkeer word, maar die bellers sal dalk steeds vir jou stemboodskappe kan los."</string>
+ <string name="block_list" msgid="7760188925338078011">"Geblokkeerde nommers"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> is ongeldig."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> is reeds geblokkeer."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Oproepblokkering is vir 48 uur gedeaktiveer"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Gedeaktiveer omdat \'n noodoproep gemaak is."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Oproeprekeninge"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Skakel aan"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Stel toestemmings"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Om spoedbel te aktiveer,\n skakel die kontaktetoestemming aan."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Om jou oproeprekord te sien,\n skakel die foontoestemming aan."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Om jou kontakte te sien,\n skakel die kontaktetoestemming aan."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Om na jou stemboodskapdiens te gaan,\n skakel die foontoestemming aan."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Skakel die kontaktetoestemming aan om spoedbel te aktiveer."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Skakel die foontoestemming aan om jou oproeprekord te sien."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Skakel die kontaktetoestemming aan om jou kontakte te sien."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Skakel die foontoestemming aan om na jou stemboodskapdiens te gaan."</string>
<string name="permission_no_search" msgid="84152933267902056">"Skakel die Kontakte-toestemmings aan om jou kontakte te deursoek."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Om \'n oproep te maak,\n skakel die foontoestemming aan."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Skakel die foontoestemming aan om \'n oproep te maak."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Foonprogram het nie toestemming om stelselinstellings te stel nie."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Geblokkeer"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> is aktief"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 8e1a0ea2b..eeaa7d5ae 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ስልክ"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ስልክ"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"የስልክ መደወያ ሰሌዳ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ስልክ"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"የጥሪ ታሪክ"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"ጥሪ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"ትክክለኛ ያልሆነ ቁጥርን ሪፓርት አድርግ"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ከመደወል በፊት ቁጥር አርትዕ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"ወደ እውቂያ አክል"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ከጥሪ ታሪክ ሰርዝ"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"የጥሪ ታሪክን አጽዳ"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"የድምፅ መልዕክት ሰርዝ"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"የድምፅ መልዕክት አጋራ"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"የእርስዎ ምዝግብ ማስታወሻ ባዶ ነው"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ደውል"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"የጥሪ ታሪክ"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"ትክክለኛ ያልሆነ ቁጥርን ሪፓርት አድርግ"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"ቁጥር ቅዳ"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ወደ ጽሑፍ የተገለበጠውን ቅዳ"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"ቁጥርን አግድ"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ታግዷል"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"ቁጥርን አታግድ"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"የ<xliff:g id="NUMBER">%1$s</xliff:g> እገዳ ተነስቷል"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ቀልብስ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"ሰርዝ"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ከመደወል በፊት ቁጥር አርትዕ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"የጥሪ ታሪክን አጽዳ"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"የድምፅ መልዕክት ሰርዝ"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"የድምፅ መልዕክት በማህደር አስቀምጥ"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"የድምፅ መልዕክት አጋራ"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"የድምጽ ፖስታ ተፈልጎ ተገኝቷል"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"የድምፅ መልዕክት በማህደር ተቀምጧል"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ቀልብስ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ወደ መዝገብ ሂድ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"የጥሪ ታሪክ ይጽዳ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"ይሄ ሁሉንም ጥሪዎች ከታሪክዎ ይሰርዛቸዋል"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"የጥሪ ታሪክን በማጽዳት ላይ…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ስልክ"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"ያመለጠ ጥሪ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"ያመለጠ የሥራ ጥሪ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"ያመለጡ ጥሪዎች"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ያመለጡ ጥሪዎች"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"የኋላ ጥሪ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"መልእክት"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> የድምፅ መልዕክቶች </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> የድምፅ መልዕክቶች </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>፤<xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"ከ<xliff:g id="CALLER">%1$s</xliff:g> አዲስ የድምፅመልዕክት"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"የድምጽ መልዕክትን ማጫወት አልተቻለም"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"በማቋት ላይ…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"የድምጽ መልዕክትን በመጫን ላይ…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"የድምፅ መልዕክት ማህደር ውስጥ በማስቀመጥ ላይ…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"የድምጽ መልዕክትን መጫን አልተቻለም"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"የድምጽ መልዕክት ያላቸው ጥሪዎች ብቻ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ገቢ ጥሪዎች ብቻ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"የስልክ ጥሪ ታሪክ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ተጨማሪ አማራጮች"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"የመደወያ ሰሌዳ"</string>
- <string name="menu_copy" msgid="6108677035381940698">"ቅዳ"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"ወጪዎቹን ብቻ አሳይ"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ገቢዎቹን ብቻ አሳይ"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"ያመለጡትን ብቻ አሳይ"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ወጪ የቪዲዮ ጥሪ"</string>
<string name="type_missed_video" msgid="954396897034220545">"ያመለጠ የቪዲዮ ጥሪ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"የድምፅ መልዕክት"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ያልተነሳ ጥሪ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"የታገደ ጥሪ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ገቢ ጥሪዎች"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"የድምፅ መልዕክት አጫውት"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ዕውቂያ <xliff:g id="NAME">%1$s</xliff:g> ዕይ"</string>
<string name="description_call" msgid="3443678121983852666">"ጥሪ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"የ<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> እውቂያ ዝርዝሮች"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"አዲስ የድምጽ መልዕክት።"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ጥሪዎች።"</string>
<string name="description_video_call" msgid="2933838090743214204">"የቪዲዮ ጥሪ።"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"ኤስኤምኤስ ለ<xliff:g id="NAME">%1$s</xliff:g> ላክ"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"የሕዝብ ስልክ"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> ሰከንድ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> ደቂቃ <xliff:g id="SECONDS">%s</xliff:g> ሴከ"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> ላይ"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ይህን ቁጥር መደወል አልተቻለም"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ድምጽ መልዕክትን ለማደራጀት ወደ ምናሌ &gt; ቅንብሮች ሂድ::"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"የድምጽ መልዕክት ጥሪ ለማድረግ፣ በመጀመሪያ የአውሮፕላን ሁነታን አጥፋ።"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"የድምጽ ፍለጋ አይገኝም"</string>
<string name="call_not_available" msgid="8941576511946492225">"የስልክ መተግበሪያው ስለተሰናከለ የስልክ ጥሪ ማድረግ አይቻልም።"</string>
<string name="activity_not_available" msgid="2287665636817987623">"ለዚያ የሚሆን መተግበሪያ በዚህ መሣሪያ ላይ የለም"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"ስም ወይም ስልክ ቁጥር ያስገቡ"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"ምንም ያመለጡዎት ጥሪዎች የሉዎትም።"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"የእርስዎ የድምጽ መልዕክት ገቢ መልዕክት ባዶ ነው።"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"እውቂያዎችን ይፈልጉ"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"ቁጥር ያክሉ ወይም እውቂያዎችን ይፈልጉ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"የእርስዎ የጥሪ ታሪክ ባዶ ነው"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ደውል"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"ምንም ያመለጡዎት ጥሪዎች የሉዎትም።"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"የእርስዎ የድምጽ መልዕክት ገቢ መልዕክት ባዶ ነው።"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"የድምፅ መልዕክት መዝገብዎ ባዶ ነው።"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ተወዳጆችን ብቻ አሳይ"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ታሪክ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"የጥሪ ታሪክ"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"የድምፅ መልዕክት መዝገብ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ሁሉም"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"ያመለጡ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"የድምፅ መልዕክት"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"አዲስ፣ የተቃለለ ማገድ"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"እርስዎን በተሻለ ሁኔታ መጠበቅ እንዲችል ስልክ ማገድ እንዴት እንደሚሰራ መቀየር አለበት። የታገዱ ቁጥሮችዎ አሁን ጥሪዎችም ጽሑፎችም መላክ ያቆማሉ፣ እና ከሌሎች መተግበሪያዎች ጋር ሊጋሩ ይችላሉ።"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"ፍቀድ"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> ይታገድ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ከዚህ ቁጥር የሚመጡ ጥሪዎች ይታገዳሉ፣ እና የድምጽ መልዕክቶች በራስ-ሰር ይሰረዛሉ።"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ከዚህ ቁጥር የሚመጡ ጥሪዎች ይታገዳሉ፣ ነገር ግን ደዋዩ አሁንም የድምጽ መልዕክቶችን ሊተዉልዎ ይችላል።"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ከአሁን በኋላ ከዚህ ቁጥር የሚመጡ ጥሪዎችን ወይም ጽሑፎችን አይቀበሉም።"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"አግድ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"የ<xliff:g id="NUMBER">%1$s</xliff:g> እግድ ይነሳ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"እገዳ አንሳ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"ፈጣን ደውል"</string>
- <string name="tab_recents" msgid="929949073851377206">"የቅርብ ጊዜዎቹ"</string>
+ <string name="tab_history" msgid="2563144697322434940">"የጥሪ ታሪክ"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"ዕውቂያዎች"</string>
<string name="tab_voicemail" msgid="155024725947496746">"የድምፅ መልዕክት"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ከተወዳጆች ውስጥ ተወግዷል።"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"ወደ እውቂያ አክል"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"ኤስኤምኤስ ላክ"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"የቪዲዮ ጥሪ አድርግ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ሙሉ የጥሪ ታሪኮችን ይመልከቱ"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"ቁጥርን አግድ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> አዲስ ያልተመለሱ ጥሪዎች"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"በፈጥኖ መደወያ ላይ ገና ማንም የለዎትም"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ተወዳጅ አክል"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"ሁሉንም ቁጥሮች ለማየት ምስል ይንኩ ወይም ዳግም ለመደርደር ነክተው ይያዙት"</string>
<string name="remove_contact" msgid="1080555335283662961">"አስወግድ"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"የቪዲዮ ጥሪ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"መልዕክት ላከ"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"መልእክት ላክ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"የጥሪ ዝርዝሮች"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ይደውሉ"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"ከ<xliff:g id="NAMEORNUMBER">^1</xliff:g>፣ <xliff:g id="TYPEORLOCATION">^2</xliff:g>፣ <xliff:g id="TIMEOFCALL">^3</xliff:g>፣ <xliff:g id="PHONEACCOUNT">^4</xliff:g> ያመለጠ ጥሪ።"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"ከ<xliff:g id="NAMEORNUMBER">^1</xliff:g>፣ <xliff:g id="TYPEORLOCATION">^2</xliff:g>፣ <xliff:g id="TIMEOFCALL">^3</xliff:g>፣ <xliff:g id="PHONEACCOUNT">^4</xliff:g> መልስ የተሰጠው ጥሪ።"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"ያልተነበበ የድምጽ ፖስታ ከ<xliff:g id="NAMEORNUMBER">^1</xliff:g>፣ <xliff:g id="TYPEORLOCATION">^2</xliff:g>፣ <xliff:g id="TIMEOFCALL">^3</xliff:g>፣ <xliff:g id="PHONEACCOUNT">^4</xliff:g>።"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"የድምጽ ፖስታ ከ<xliff:g id="NAMEORNUMBER">^1</xliff:g>፣ <xliff:g id="TYPEORLOCATION">^2</xliff:g>፣ <xliff:g id="TIMEOFCALL">^3</xliff:g>፣ <xliff:g id="PHONEACCOUNT">^4</xliff:g>።"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"ወደ <xliff:g id="NAMEORNUMBER">^1</xliff:g>፣ <xliff:g id="TYPEORLOCATION">^2</xliff:g>፣ <xliff:g id="TIMEOFCALL">^3</xliff:g>፣ <xliff:g id="PHONEACCOUNT">^4</xliff:g> ደውል።"</string>
<string name="description_phone_account" msgid="1767072759541443861">"በ<xliff:g id="PHONEACCOUNT">^1</xliff:g> ላይ"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"በ <xliff:g id="NUMBER">%1$s</xliff:g> በኩል"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"በ <xliff:g id="NUMBER">%1$s</xliff:g> በኩል"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"በ <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> ላይ፣ በ <xliff:g id="NUMBER">%2$s</xliff:g> በኩል"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> በ <xliff:g id="NUMBER">%2$s</xliff:g> በኩል"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ደውል"</string>
<string name="description_call_action" msgid="4000549004089776147">"ወደ <xliff:g id="NAMEORNUMBER">^1</xliff:g> ይደውሉ"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"ቪዲዮ ጥሪ <xliff:g id="NAMEORNUMBER">^1</xliff:g>።"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ፈጣን ምላሾች"</string>
<string name="call_settings_label" msgid="313434211353070209">"ጥሪዎች"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ጥሪን ማገድ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ጥሪን ማገድ ለጊዜው ተሰናክሏል"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ባለፉት 48 ሰዓቶች ውስጥ ከዚህ ስልክ ሆነው የአስቸኳይ አደጋ አገልግሎቶችን ስላነጋገሩ ጥሪን ማገድ ተሰናክሏል። አንዴ የ48 ሰዓቱ ጊዜ ካለፈ በኋላ በራስ-ሰር ዳግም ይነቃል።"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"ቁጥሮችን አስመጣ"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"ከዚህ ቀደም አንዳንድ ደዋዮች በሌሎች መተግበሪያዎች በኩል በራስ-ሰር ወደ የድምፅ መልዕክት እንዲላኩ ምልክት አድርገባቸው ነበር።"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"ቁጥሮችን ይመልከቱ"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"አስመጣ"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"ማስመጣት አልተሳካም"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"የድምፅ መልዕክት ማህደር ውስጥ ማስቀመጥ አልተሳካም።"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"ቁጥርን አታግድ"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"ቁጥር አክል"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ከእነዚህ ቁትሮች የሚመጡ ጥሪዎች ይታገዳሉ፣ እና የድምጽ መልዕክቶች በራስ-ሰር ይሰረዛሉ።"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ከእነዚህ ቁትሮች የሚመጡ ጥሪዎች ይታገዳሉ፣ ነገር ግን አሁንም የድምጽ መልዕክቶችን ሊተዉልዎ ይችላሉ።"</string>
+ <string name="block_list" msgid="7760188925338078011">"የታገዱ ቁጥሮች"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ልክ ያልኾነ ነው።"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ቀድሞውኑ ታግዷል።"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"የጥሪ እገዳ ለ48 ሰዓቶች ተሰናክሏል።"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"የአስቸኳይ አደጋ ጥሪ ስለተደረገ ተሰናክሏል።"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"የመደወያ መለያዎች"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"አብራ"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ፍቃዶችን አዋቅር"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"ፈጥኖ መደወያን ለማንቃት\n የእውቂያዎች ፍቃዱን ያብሩ።"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"የጥሪ ምዝግብ ማስታወሻዎን ለማየት\n የስልክ ፍቃዱን ያብሩ።"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"የእርስዎን እውቂያዎች ለማየት\n የእውቂያዎች ፍቃዱን ያብሩ።"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"የእርስዎን ድምጽ መልዕክት ለመድረስ\n የስልክ ፍቃዱን ያብሩ።"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"ፈጥኖ መደወያን ለማንቃት የእውቂያዎች ፍቃዱን ያብሩ።"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"የጥሪ ምዝግብ ማስታወአሽዎን ለማየት የስልክ ፍቃዱን ያብሩ።"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"የእርስዎን እውቂያዎች ለማየት የእውቂያዎች ፍቃዱን ያብሩ።"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"የድምፅ መልዕክትዎን ለመድረስ የስልክ ፍቃዱን ያብሩ።"</string>
<string name="permission_no_search" msgid="84152933267902056">"የእርስዎን እውቂያዎች ለመከታተል የእውቂያዎች ፍቃዶችን ያብሩ።"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"አንድ ጥሪ ለማድረግ\n የስልክ ፍቃዱን ያብሩ።"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ስልክ ለመደወል የስልክ ፍቃዱን ያብሩ።"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"የስልክ መተግበሪያ ወደ የስርዓት ቅንብሮች የመጻፍ ፍቃድ የለውም።"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"የታገዱ"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ነቅቷል"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 1d0d2ef07..605428c32 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"الهاتف"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"الهاتف"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"لوحة اتصال الهاتف"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"الهاتف"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"سجل المكالمات"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"الاتصال بـ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"الإبلاغ عن رقم غير دقيق"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"تعديل الرقم قبل الاتصال"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"إضافة إلى جهة اتصال"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"حذف من سجل المكالمات"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"محو سجل المكالمات"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"حذف بريد صوتي"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"مشاركة البريد الصوتي"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"سجل مكالماتك فارغ"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"إجراء مكالمة"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"سجل المكالمات"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"الإبلاغ عن رقم غير دقيق"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"نسخ الرقم"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"نسخ الكتابة الصوتية"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"حظر الرقم"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"تم حظر <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"إلغاء حظر الرقم"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"تم إلغاء حظر <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"تراجع"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"حذف"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"تعديل الرقم قبل الاتصال"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"محو سجل المكالمات"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"حذف رسالة البريد الصوتي"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"البريد الصوتي للأرشيف"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"مشاركة بريد صوتي"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"تم حذف الرسالة الصوتية"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"البريد الصوتي المؤرشف"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"تراجع"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"انتقال إلى الأرشيف"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"هل تريد محو سجل المكالمات؟"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"سيؤدي ذلك إلى حذف جميع المكالمات من السجل"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"جارٍ محو سجل المكالمات…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"الهاتف"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"مكالمة فائتة"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"مكالمة عمل فائتة"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"المكالمات الفائتة"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> من المكالمات الفائتة"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"معاودة الاتصال"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"رسالة"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="zero">لا تتوفر رسائل بريد صوتي (<xliff:g id="COUNT">%1$d</xliff:g>) </item>
<item quantity="two">رسالتا بريد صوتي (<xliff:g id="COUNT">%1$d</xliff:g>) </item>
@@ -46,8 +62,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>، <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"بريد صوتي جديد من <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"تعذر تشغيل البريد الصوتي"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"جارٍ التخزين مؤقتًا..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"جارٍ تحميل البريد الصوتي…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"تجري أرشفة البريد الصوتي..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"تعذر تحميل البريد الصوتي"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"المكالمات التي تشتمل على بريد صوتي فقط"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"المكالمات الواردة فقط"</string>
@@ -77,7 +93,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"سجل المكالمات"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"مزيد من الخيارات"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"لوحة الطلب"</string>
- <string name="menu_copy" msgid="6108677035381940698">"نسخ"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"عرض الصادر فقط"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"عرض الوارد فقط"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"عرض الفائت فقط"</string>
@@ -100,12 +115,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"مكالمة فيديو صادرة"</string>
<string name="type_missed_video" msgid="954396897034220545">"مكالمة فيديو فائتة"</string>
<string name="type_voicemail" msgid="5153139450668549908">"البريد الصوتي"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"مكالمة مرفوضة"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"مكالمة محظورة"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"المكالمات الواردة"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"تشغيل البريد الصوتي"</string>
<string name="description_view_contact" msgid="5205669345700598415">"عرض جهة الاتصال <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"الاتصال بـ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"تفاصيل جهة الاتصال بـ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"بريد صوتي جديد"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> من المكالمات."</string>
<string name="description_video_call" msgid="2933838090743214204">"مكالمة فيديو."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"‏إرسال رسالة قصيرة SMS إلى <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -118,6 +134,11 @@
<string name="payphone" msgid="7726415831153618726">"هاتف يعمل بالعملة"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> ثانية"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> دقيقة <xliff:g id="SECONDS">%s</xliff:g> ثانية"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> في <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"لا يمكن الاتصال بهذا الرقم"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"‏لإعداد البريد الصوتي، انتقل إلى القائمة &gt; الإعدادات."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"للاتصال بالبريد الصوتي، يجب أولاً إيقاف وضع الطائرة."</string>
@@ -130,16 +151,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"البحث الصوتي غير متاح"</string>
<string name="call_not_available" msgid="8941576511946492225">"يتعذر إجراء مكالمة هاتفية نظرًا لأنه تم تعطيل تطبيق الهاتف."</string>
<string name="activity_not_available" msgid="2287665636817987623">"لا يوجد تطبيق لإجراء ذلك على هذا الجهاز"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"أدخل اسمًا أو رقم هاتف"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"ليست لديك أية مكالمات لم يتم الرد عليها."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"مجلد بريدك الوارد الصوتي فارغ."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"البحث في قائمة جهات الاتصال"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"إضافة رقم أو البحث في جهات الاتصال"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"سجل مكالماتك فارغ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"إجراء مكالمة"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"ليست لديك أية مكالمات لم يتم الرد عليها."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"مجلد بريدك الوارد الصوتي فارغ."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"أرشيف البريد الصوتي الخاص بك فارغ."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"عرض المفضلة فقط"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"السجل"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"سجل المكالمات"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"أرشيف البريد الصوتي"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"الكل"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"فائتة"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"البريد الصوتي"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"حظر جديد ومبسط"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"لحمايتك بشكل أفضل، يحتاج الهاتف إلى تغيير آلية تنفيذ الحظر. تؤدي الآن ميزة حظر الأرقام إلى إيقاف كل من المكالمات والرسائل النصية، كما أن ذلك الحظر يمكن أن يمتد إلى تطبيقات أخرى."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"سماح"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"هل تريد حظر الرقم <xliff:g id="NUMBER">%1$s</xliff:g>؟"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"سيتم حظر المكالمات الواردة من هذا الرقم كما سيتم تلقائيًا حذف الرسائل الصوتية."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"سيتم حظر المكالمات من هذا الرقم، إلا أنه سيظل بإمكان المتصل ترك رسائل صوتية."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"لن تتلقي المكالمات أو المراسلات النصية بعد الآن من هذا الرقم."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"حظر"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"هل تريد إزالة حظر <xliff:g id="NUMBER">%1$s</xliff:g>؟"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"إلغاء الحظر"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"اتصال سريع"</string>
- <string name="tab_recents" msgid="929949073851377206">"الحديثة"</string>
+ <string name="tab_history" msgid="2563144697322434940">"سجل المكالمات"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"جهات الاتصال"</string>
<string name="tab_voicemail" msgid="155024725947496746">"البريد الصوتي"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"تمت إزالة جهة الاتصال من المفضلة"</string>
@@ -149,7 +185,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"إضافة إلى جهة اتصال"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"‏إرسال رسالة قصيرة SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"إجراء مكالمة فيديو"</string>
- <string name="show_call_history" msgid="1141502332266697170">"عرض سجل المكالمات بالكامل"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"حظر الرقم"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> من المكالمات الجديدة الفائتة"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"لم تتم إضافة أية جهة اتصال إلى قائمة الاتصال السريع حتى الآن"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"إضافة مفضلة"</string>
@@ -158,13 +194,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"المس الصورة للاطلاع على جميع الأرقام أو المس مع الاستمرار لإعادة الترتيب"</string>
<string name="remove_contact" msgid="1080555335283662961">"إزالة"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"مكالمة فيديو"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"إرسال رسالة"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"إرسال رسالة"</string>
<string name="call_log_action_details" msgid="701345508704970622">"تفاصيل المكالمة"</string>
<string name="call_log_action_call" msgid="463690849042459842">"الاتصال بـ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"مكالمة لم يرد عليها من <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"تم الرد على مكالمة من <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"البريد الصوتي غير المقروء من <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"البريد الصوتي من <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"اتصال بـ <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"من <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"من خلال <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"من خلال <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"على <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> من خلال <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> من خلال <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"اتصال"</string>
<string name="description_call_action" msgid="4000549004089776147">"الاتصال بـ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"إجراء مكالمة فيديو مع <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -207,14 +249,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"الردود السريعة"</string>
<string name="call_settings_label" msgid="313434211353070209">"المكالمات"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"حظر المكالمات"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"حظر المكالمات معطّل مؤقتًا"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"تم تعطيل حظر المكالمات لأنك اتصلت بخدمات الطوارئ خلال 48 ساعة ماضية. وستتم إعادة تمكينه تلقائيًا بعد انتهاء هذه الفترة التي تبلغ 48 ساعة."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"استيراد الأرقام"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"سبق لك تعيين بعض المتصلين على الإرسال تلقائيًا للبريد الصوتي عبر التطبيقات الأخرى."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"عرض الأرقام"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"استيراد"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"أخفق الاستيراد"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"فشلت أرشفة البريد الصوتي."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"إلغاء حظر الرقم"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"إضافة رقم"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"سيتم حظر المكالمات من هذه الأرقام وسيتم حذف الرسائل الصوتية تلقائيًا."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"سيتم حظر المكالمات من هذه الأرقام، إلا أنه قد يظل بإمكانك ترك رسائلك الصوتية."</string>
+ <string name="block_list" msgid="7760188925338078011">"الأرقام المحظورة"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> غير صالح."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"تم حظر <xliff:g id="NUMBER">%1$s</xliff:g>."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"تم تعطيل حظر المكالمات لمدة 48 ساعة."</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"تم التعطيل نظرًا لإجراء مكالمة طوارئ."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"حسابات الاتصال"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"تشغيل"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"تعيين الأذونات"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"لتمكين الاتصال السريع،\n يمكنك تشغيل إذن جهات الاتصال."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"للاطلاع على سجل المكالمات،\n شغّل أذونات الهاتف."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"للاطلاع على جهات الاتصال التابعة لك،\n شغّل إذن جهات الاتصال."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"للوصول إلى بريدك الصوتي،\n عليك تشغيل إذن الهاتف."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"لتمكين الاتصال السريع، شغِّل إذن جهات الاتصال."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"للاطلاع على سجل المكالمات، شغِّل إذن الهاتف."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"للاطلاع على جهات الاتصال، شغِّل إذن جهات الاتصال."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"للوصول إلى البريد الصوتي، شغِّل إذن الهاتف."</string>
<string name="permission_no_search" msgid="84152933267902056">"للبحث عن جهات الاتصال، عليك تشغيل أذونات جهات الاتصال."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"لإجراء مكالمة،\n عليك تشغيل إذن الهاتف."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"لإجراء مكالمة، شغِّل إذن الهاتف."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ليس لدى تطبيق الهاتف إذن لتعديل إعدادات النظام."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"تم الحظر"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> في الوضع النشط"</string>
</resources>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 68611226c..9f135058e 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefon Yığım Pedi"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Zəng tarixçəsi"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Zəng <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Qeyri-dəqiq sayı bildirin"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Zəng etmədən öncə nömrəyə düzəliş edin"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Kontakta əlavə edin"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Zəng tarixçəsindən sil"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Zəng tarixçəsini təmizlə"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Səsli məktubu silin"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Səsli məktubu paylaşın"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Çağrı jurnalınız boşdur"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Zəng edin"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Zəng tarixçəsi"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Qeyri-dəqiq sayı bildirin"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Nömrəni kopyalayın"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Transkripsiyanı kopyalayın"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Nömrəni blok edin"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blok edilib"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Nömrəni blokdan çıxarın"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> blokdan çıxarılıb"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"LƏĞV EDİN"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Silin"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Zəng etmədən öncə nömrəyə düzəliş edin"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Zəng tarixçəsini təmizləyin"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Səsli məktubu silin"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Səsli poçtu arxivləşdirin"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Səsli məktubu paylaşın"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Səsli məktub silindi"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Səsli poçt arxivləşdirildi"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"GERİ ALIN"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARXİVƏ GEDİN"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Zəng tarixçəsi təmizlənsin?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Bu, tarixçənizdən bütün zəngləri siləcəkdir"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Zəng tarixçəsi silinir…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Buraxılmış zəng"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Buraxılmış iş çağrısı"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Buraxılmış zənglər"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> buraxılmış zənglər"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Geriyə zəng"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mesaj"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Səsli poçt </item>
<item quantity="one">Səsli poçt</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> adlı şəxsdən yeni səsli məktub"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Səsli poçtu səsləndirmək mümkün deyil"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buferlənir..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Səsli poçt yüklənir…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Səsli poçt arxivləşdirilir…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Səsli poçtu yükləmək mümkün olmadı"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Yalnız səsli məktublu zənglər"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Yalnız daxil olan zənglər"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Çağrı Tarixçəsi"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Daha çox seçim"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"nömrə yığımı paneli"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopyalayın"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Yalnız gedəni göstərin"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Yalnız gələni göstərin"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Yalnız buraxılmışı göstərin"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Gedən video zəng"</string>
<string name="type_missed_video" msgid="954396897034220545">"Buraxılmış video zəng"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Səsli poçt"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Rədd edilmiş çağrı"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blok edilmiş çağrı"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Gələn zənglər"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Səsli məktubu oxudun"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> adlı kontakta baxın"</string>
<string name="description_call" msgid="3443678121983852666">"Zəng edin: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> üçün kontakt detalları"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Yeni səsli poçt."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> zəng."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video çağrı."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> adlı şəxsə SMS göndər"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Taksofon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> san"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> dəq <xliff:g id="SECONDS">%s</xliff:g> san"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> tarixində <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Bu nömrəyə zəng etmək mümkün deyil"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Səsli poçtu ayarlamaq üçün Menyu, sonra isə &gt; Ayarlara daxil olun."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Səsli poçta zəng etmək üçün Təyyarə rejimini söndürün."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Səsli axtarış mövcud deyil"</string>
<string name="call_not_available" msgid="8941576511946492225">"Telefon tətbiqi deaktiv edildiyinə görə telefon zəngi etmək mümkün deyil."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Bu cihazda onun üçün heç bir proqram yoxdur"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Ad və ya tel. nömrəsi daxil et"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Buraxılmış heç bir zənginiz yoxdur."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Səsli poçt qutunuz boşdur."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Kontakt axtarın"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Nömrə əlavə edin və ya kontaktlarda axtarın"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Zəng tarixçəniz boşdur"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Zəng edin"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Buraxılmış heç bir zənginiz yoxdur."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Səsli poçt qutunuz boşdur."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Səsli poçt arxiviliniz boşdur."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Yalnız seçilmişləri göstər"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Tarixçə"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Zəng Tarixçəsi"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Səsli Poçt Arxivi"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Bütün"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Buraxılmış"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Səsli poçt"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Yeni, sadələşdirilmiş bloklama"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Sizi daha yaxşı qorumaq üçün, Phone blok etmənin işləmə formasını dəyişməlidir. Bloklanmış nömrələriniz indi zəng və mətnləri dayandıracaq və digər tətbiqlər ilə paylaşıla bilər."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"İcazə verin"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> nömrəsi blok edilsin?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Bu nömrədən zənglər blok ediləcək və səsli məktublar avtomatik silinəcək."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Bu nömrədən zənglər bağlanacaq, amma zəng edən səsli zəng qoya bilər."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Bu nömrədən daha zəng və ya mesaj almayacaqsınız."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOK"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> nömrəsi blokdan çıxarılsın?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"BLOKDAN ÇIXARIN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Sürətli nömrə yığımı"</string>
- <string name="tab_recents" msgid="929949073851377206">"Sonuncular"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Zəng Tarixçəsi"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktlar"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Səsli poçt"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Seçilmişlərdən silindi"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Kontakta əlavə edin"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS göndərin"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Video zəng edin"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Tam çağrı tarixçəsinə baxın"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Nömrəni blok edin"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> yeni buraxılmış zəng"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Hələ sürətli zəng siyahınızda hec kim yoxdur"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Sevimlilərə əlavə edin"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Bütün nömrələri görmək üçün təsvirə toxunun və ya yenidən qaydaya salmaq üçün toxunun və saxlayın"</string>
<string name="remove_contact" msgid="1080555335283662961">"Yığışdır"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video zəng"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Mesaj Göndərin"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Mesaj göndərin"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Zəng detalları"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> nömrəsinə zəng edin"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Buraxılmış zənglər: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Zəngləri cavablandırıb: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> hesabına gələn oxunmamış səsli mesaj."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> hesabına gələn səsli mesaj."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Zəng et: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"Zəngdədir: <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> vasitəsilə"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> vasitəsilə"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> üzərində, <xliff:g id="NUMBER">%2$s</xliff:g> vasitəsilə"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> <xliff:g id="NUMBER">%2$s</xliff:g> vasitəsilə"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Çağrı"</string>
<string name="description_call_action" msgid="4000549004089776147">"Çağrı <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> video zəng edin."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Qısa cavablar"</string>
<string name="call_settings_label" msgid="313434211353070209">"Zənglər"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Zəng blok edilir"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Çağrının blok edilməsi müvəqqəti olaraq deaktiv edilib"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Son 48 saat ərzində bu telefondan təcili yardım xidmətləri ilə əlaqə saxladığınız üçün Çağrı Bloklanması deaktiv edildi. 48 saatlıq müddət başa çatdıqda avtomatik olaraq yenidən aktiv ediləcək."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Nömrələri import edin"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Əvvəlcədən qeyd etdiyiniz bəzi zəng edənlər digər tətbiqlərin vasiyəsilə avtomatik olaraq səsli mesaja yönləndiriləcək."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Rəqəmlərə baxın"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"İmport"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import alınmadı"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Səsli poçtu arxivləşdirmək uğursuz oldu."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Nömrəni blokdan çıxarın"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Nömrə əlavə edin"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Bu nömrələrdən zənglər blok ediləcək və səsli məktublar avtomatik silinəcək."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Bu nömrələrdən zənglər blok ediləcək, amma yenə də səsli məktub qoya bilərsiniz."</string>
+ <string name="block_list" msgid="7760188925338078011">"Bloklanmış nömrələr"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> yanlışdır."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> artıq bloklanıb."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Çağrının bloklanması 48 saatlıq deaktiv edildi"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Təcili zəng olduğu üçün deaktiv edildi."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Hesabların çağrılması"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktiv edin"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"İcazələri quraşdırın"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Sürətli yığımı aktivləşdirmək üçün,\n Kontakt icazələrini aktiv edin."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Zəng jurnalınızı görmək üçün,\n Telefon icazəsini aktiv edin."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Kontaktlarınızı görmək üçün,\n Kontakt icazəsini aktiv edin."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Səsli poçtlarınıza daxil olmaq üçün,\n Telefon icazəsini aktiv edin."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Sürətli yığımı aktivləşdirmək üçün, Kontakt icazələrini aktivləşdirin."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Çağrı jurnalınızı görmək üçün Telefon icazəsini aktivləşdirin."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Kontaktlarınızı görmək üçün Kontakt icazəsini aktivləşdirin."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Səsli poçta daxil olmaq üçün, Telefon icazəsini aktivləşdirin."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kontaktlarınızı axtarmaq üçün, Kontakt icazələrini aktiv edin."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Zəng etmək üçün,\n Telefon icazəsini aktiv edin."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Zəng etmək üçün, Telefon icazəsini aktivləşdirin."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefon tətbiqinin sistem ayarlarına yazmaq icazəsi yoxdur."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloklanıb"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> aktivdir"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
new file mode 100644
index 000000000..d0c1c47ea
--- /dev/null
+++ b/res/values-b+sr+Latn/strings.xml
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2012 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
+ <string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Numerička tastatura telefona"</string>
+ <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Istorija poziva"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Prijavi netačan broj"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiraj broj"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiraj transkripciju"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokiraj broj"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> je blokiran"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Deblokiraj broj"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> je deblokiran"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"OPOZOVI"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Izbriši"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Izmeni broj pre poziva"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Obriši istoriju poziva"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Izbriši govornu poruku"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arhiviraj govornu poštu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Deli govornu poruku"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Gov. pošta je izbrisana"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Govorna pošta je arhivirana"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"OPOZOVI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARHIVA"</string>
+ <string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Želite da obrišete istoriju poziva?"</string>
+ <string name="clearCallLogConfirmation" msgid="7899552396101432827">"Ovo će izbrisati sve pozive iz istorije"</string>
+ <string name="clearCallLogProgress_title" msgid="3372471156216306132">"Briše se istorija poziva…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Propušten poziv"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Propušten poziv za Work"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Broj propuštenih poziva: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Uzvrati poziv"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Pošalji SMS"</string>
+ <plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
+ <item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> govorna poruka </item>
+ <item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> govorne poruke </item>
+ <item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> govornih poruka </item>
+ </plurals>
+ <string name="notification_action_voicemail_play" msgid="6113133136977996863">"Pusti"</string>
+ <string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
+ <string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova govorna poruka od <xliff:g id="CALLER">%1$s</xliff:g>"</string>
+ <string name="voicemail_playback_error" msgid="3356071912353297599">"Puštanje govorne pošte nije uspelo"</string>
+ <string name="voicemail_fetching_content" msgid="1287895365599580842">"Govorna pošta se učitava…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Govorna pošta se arhivira…"</string>
+ <string name="voicemail_fetching_timout" msgid="3959428065511972176">"Učitavanje govorne pošte nije uspelo"</string>
+ <string name="call_log_voicemail_header" msgid="3945407886667089173">"Samo pozivi sa govornom poštom"</string>
+ <string name="call_log_incoming_header" msgid="2787722299753674684">"Samo dolazni pozivi"</string>
+ <string name="call_log_outgoing_header" msgid="761009180766735769">"Samo odlazni pozivi"</string>
+ <string name="call_log_missed_header" msgid="8017148056610855956">"Samo propušteni pozivi"</string>
+ <string name="visual_voicemail_title" msgid="4574199312906348905">"Vizuelna govorna pošta"</string>
+ <string name="visual_voicemail_text" msgid="164967285234132509">"Pregledajte i slušajte govornu poštu bez pozivanja broja. Možda će biti naplaćeni troškovi za prenos podataka."</string>
+ <string name="visual_voicemail_settings" msgid="8090338793118794741">"Podešavanja"</string>
+ <string name="voicemail_status_voicemail_not_available" msgid="5222480147701456390">"Ažuriranja govorne pošte nisu dostupna"</string>
+ <string name="voicemail_status_messages_waiting" msgid="6329544650250068650">"Imate novu govornu poštu. Trenutno ne može da se učita."</string>
+ <string name="voicemail_status_configure_voicemail" msgid="8300808991932816153">"Podesite govornu poštu"</string>
+ <string name="voicemail_status_audio_not_available" msgid="2449801102560158082">"Audio nije dostupan"</string>
+ <string name="voicemail_status_action_configure" msgid="8671796489912239589">"Podesi"</string>
+ <string name="voicemail_status_action_call_server" msgid="1824816252288551794">"Zovi govornu poštu"</string>
+ <string name="call_log_item_count_and_date" msgid="7641933305703520787">"(<xliff:g id="COUNT">%1$d</xliff:g>) <xliff:g id="DATE">%2$s</xliff:g>"</string>
+ <string name="sms_disambig_title" msgid="5846266399240630846">"Izbor broja"</string>
+ <string name="call_disambig_title" msgid="4392886850104795739">"Izbor broja"</string>
+ <string name="make_primary" msgid="5829291915305113983">"Zapamti ovaj izbor"</string>
+ <string name="description_search_button" msgid="3660807558587384889">"pretraži"</string>
+ <string name="description_dial_button" msgid="1274091017188142646">"biranje"</string>
+ <string name="description_digits_edittext" msgid="8760207516497016437">"broj za biranje"</string>
+ <string name="description_playback_start_stop" msgid="5060732345522492292">"Pokretanje ili zaustavljanje reprodukcije"</string>
+ <string name="description_playback_speakerphone" msgid="6008323900245707504">"Uključivanje ili isključivanje spikerfona"</string>
+ <string name="description_playback_seek" msgid="4509404274968530055">"Traženje pozicije u reprodukciji"</string>
+ <string name="description_rate_decrease" msgid="3161652589401708284">"Smanjivanje brzine reprodukcije"</string>
+ <string name="description_rate_increase" msgid="6324606574127052385">"Povećavanje brzine reprodukcije"</string>
+ <string name="action_menu_call_history_description" msgid="9018442816219748968">"Istorija poziva"</string>
+ <string name="action_menu_overflow_description" msgid="2303272250613084574">"Još opcija"</string>
+ <string name="action_menu_dialpad_button" msgid="1425910318049008136">"numerička tastatura"</string>
+ <string name="menu_show_outgoing_only" msgid="1965570298133301970">"Prikaži samo odlazne"</string>
+ <string name="menu_show_incoming_only" msgid="7534206815238877417">"Prikaži samo dolazne"</string>
+ <string name="menu_show_missed_only" msgid="154473166059743996">"Prikaži samo propuštene"</string>
+ <string name="menu_show_voicemails_only" msgid="1898421289561435703">"Prikaži samo govorne poruke"</string>
+ <string name="menu_show_all_calls" msgid="7560347482073345885">"Prikaži sve pozive"</string>
+ <string name="add_2sec_pause" msgid="9214012315201040129">"Dodaj pauzu od 2 sekunde"</string>
+ <string name="add_wait" msgid="3360818652790319634">"Dodaj čekanje"</string>
+ <string name="dialer_settings_label" msgid="4305043242594150479">"Podešavanja"</string>
+ <string name="menu_newContact" msgid="1209922412763274638">"Novi kontakt"</string>
+ <string name="menu_allContacts" msgid="6948308384034051670">"Svi kontakti"</string>
+ <string name="callDetailTitle" msgid="5340227785196217938">"Detalji poziva"</string>
+ <string name="toast_call_detail_error" msgid="6947041258280380832">"Detalji nisu dostupni"</string>
+ <string name="dialer_useDtmfDialpad" msgid="1707548397435075040">"Upotrebite brojčanik za tonsko biranje"</string>
+ <string name="dialer_returnToInCallScreen" msgid="3719386377550913067">"Vrati se na poziv koji je u toku"</string>
+ <string name="dialer_addAnotherCall" msgid="4205688819890074468">"Dodaj poziv"</string>
+ <string name="type_incoming" msgid="6502076603836088532">"Dolazni poziv"</string>
+ <string name="type_outgoing" msgid="343108709599392641">"Odlazni poziv"</string>
+ <string name="type_missed" msgid="2720502601640509542">"Propušten poziv"</string>
+ <string name="type_incoming_video" msgid="82323391702796181">"Dolazni video poziv"</string>
+ <string name="type_outgoing_video" msgid="2858140021680755266">"Odlazni video poziv"</string>
+ <string name="type_missed_video" msgid="954396897034220545">"Propušten video poziv"</string>
+ <string name="type_voicemail" msgid="5153139450668549908">"Govorna pošta"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Odbijen poziv"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokiran poziv"</string>
+ <string name="actionIncomingCall" msgid="6028930669817038600">"Dolazni pozivi"</string>
+ <string name="description_call_log_play_button" msgid="651182125650429846">"Puštanje govorne pošte"</string>
+ <string name="description_view_contact" msgid="5205669345700598415">"Prikaži kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_call" msgid="3443678121983852666">"Pozovi korisnika <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_contact_details" msgid="51229793651342809">"Detalji o kontaktu za <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
+ <string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> poziva."</string>
+ <string name="description_video_call" msgid="2933838090743214204">"Video poziv."</string>
+ <string name="description_send_text_message" msgid="3118485319691414221">"Slanje SMS-a za <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_call_log_unheard_voicemail" msgid="118101684236996786">"Nepreslušana govorna pošta"</string>
+ <string name="description_start_voice_search" msgid="520539488194946012">"Pokretanje glasovne pretrage"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Pozovi <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="unknown" msgid="740067747858270469">"Nepoznato"</string>
+ <string name="voicemail" msgid="3851469869202611441">"Govorna pošta"</string>
+ <string name="private_num" msgid="6374339738119166953">"Privatan broj"</string>
+ <string name="payphone" msgid="7726415831153618726">"Telefonska govornica"</string>
+ <string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> u <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Nije moguće pozvati ovaj broj"</string>
+ <string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Da biste podesili govornu poštu, idite u Meni &gt; Podešavanja."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Da biste pozvali govornu poštu, prvo isključite režim aviona."</string>
+ <string name="contact_list_loading" msgid="5488620820563977329">"Učitava se…"</string>
+ <string name="imei" msgid="3045126336951684285">"IMEI"</string>
+ <string name="meid" msgid="6210568493746275750">"MEID"</string>
+ <string name="simContacts_emptyLoading" msgid="6700035985448642408">"Učitava se sa SIM kartice…"</string>
+ <string name="simContacts_title" msgid="27341688347689769">"Kontakti na SIM kartici"</string>
+ <string name="add_contact_not_available" msgid="5547311613368004859">"Nema dostupne aplikacije za kontakte"</string>
+ <string name="voice_search_not_available" msgid="2977719040254285301">"Glasovna pretraga nije dostupna"</string>
+ <string name="call_not_available" msgid="8941576511946492225">"Nije moguće uputiti telefonski poziv jer je aplikacija Telefon onemogućena."</string>
+ <string name="activity_not_available" msgid="2287665636817987623">"Na ovom uređaju nema aplikacija za to"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Pretražite kontakte"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Dodajte broj ili pretražite kontakte"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Istorija poziva je prazna"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Pozovi"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nemate nijedan propušten poziv."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Prijemno sanduče govorne pošte je prazno."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arhiva govorne pošte je prazna."</string>
+ <string name="show_favorites_only" msgid="5520072531022614595">"Prikaži samo omiljene"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Istorija poziva"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arhiva govorne pošte"</string>
+ <string name="call_log_all_title" msgid="3566738938889333307">"Svi"</string>
+ <string name="call_log_missed_title" msgid="4541142293870638971">"Propušteni"</string>
+ <string name="call_log_voicemail_title" msgid="940422274047025948">"Govorna pošta"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo, jednostavnije blokiranje"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Telefon treba da promeni način na koji blokiranje funkcioniše da bi vam pružio bolju zaštitu. Sa blokiranih brojeva više nećete primati ni pozive ni SMS-ove, ali možete da ih delite sa drugim aplikacijama."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Dozvoli"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Želite li da blokirate <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Pozivi sa ovog broja će biti blokirani i poruke govorne pošte će se automatski brisati."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Pozivi sa ovog broja će biti blokirani, ali pozivalac i dalje može da vam ostavlja poruke govorne pošte."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Više nećete primati pozive ni SMS-ove sa ovog broja."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKIRAJ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Želite li da deblokirate <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DEBLOKIRAJ"</string>
+ <string name="tab_speed_dial" msgid="7552166276545648893">"Brzo biranje"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Istorija poziva"</string>
+ <string name="tab_all_contacts" msgid="1410922767166533690">"Kontakti"</string>
+ <string name="tab_voicemail" msgid="155024725947496746">"Govorna pošta"</string>
+ <string name="favorite_hidden" msgid="5011234945140912047">"Uklonjeno je iz omiljenih"</string>
+ <string name="favorite_hidden_undo" msgid="2508998611039406474">"Opozovi"</string>
+ <string name="search_shortcut_call_number" msgid="7277194656832895870">"Pozovi <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="search_shortcut_create_new_contact" msgid="1679917465521554093">"Napravi novi kontakt"</string>
+ <string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Dodaj u kontakt"</string>
+ <string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Pošalji SMS"</string>
+ <string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Uputi video poziv"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokiraj broj"</string>
+ <string name="num_missed_calls" msgid="8081736535604293886">"Novih propuštenih poziva: <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="speed_dial_empty" msgid="8838921693673366129">"Nemate nijedan kontakt na brzom biranju"</string>
+ <string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Dodaj omiljen kontakt"</string>
+ <string name="all_contacts_empty" msgid="471370638298229686">"Još uvek nemate nijedan kontakt"</string>
+ <string name="all_contacts_empty_add_contact_action" msgid="1515782853819374618">"Dodaj kontakt"</string>
+ <string name="contact_tooltip" msgid="2019777545923635266">"Dodirnite sliku da biste videli sve brojeve ili dodirnite i zadržite da biste promenili raspored"</string>
+ <string name="remove_contact" msgid="1080555335283662961">"Ukloni"</string>
+ <string name="call_log_action_video_call" msgid="7724301709041128296">"Video poziv"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Pošalji poruku"</string>
+ <string name="call_log_action_details" msgid="701345508704970622">"Detalji poziva"</string>
+ <string name="call_log_action_call" msgid="463690849042459842">"Pozovi <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_incoming_missed_call" msgid="2381085098795943627">"Propušteni poziv: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_incoming_answered_call" msgid="7117665748428816544">"Primljeni poziv: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nepročitana govorna poruka od <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Govorna poruka od <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_outgoing_call" msgid="6386364390619734734">"Pozvali ste: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_phone_account" msgid="1767072759541443861">"na nalogu <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"preko <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"preko <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"na <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, preko <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> preko <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="description_call_log_call_action" msgid="3682561657090693134">"Pozovi"</string>
+ <string name="description_call_action" msgid="4000549004089776147">"Pozovi <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_video_call_action" msgid="7386922428155062213">"Uputite video poziv kontaktu <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
+ <string name="description_voicemail_action" msgid="8054891873788903063">"Pusti govornu poštu od <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_play" msgid="2689369874037785439">"Reprodukuj govornu poštu kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_pause" msgid="3905259748756919693">"Pauziraj govornu poštu kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_delete" msgid="2025472770630153436">"Izbriši govornu poštu kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <plurals name="description_voicemail_unread" formatted="false" msgid="8708346053055570332">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> nova poruka govorne pošte</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nove poruke govorne pošte</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> novih poruka govorne pošte</item>
+ </plurals>
+ <string name="description_create_new_contact_action" msgid="818755978791008167">"Napravite kontakt za <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_add_to_existing_contact_action" msgid="6081200053494414351">"Dodajte <xliff:g id="NAMEORNUMBER">^1</xliff:g> postojećem kontaktu"</string>
+ <string name="description_details_action" msgid="2433827152749491785">"Detalji poziva za <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="toast_entry_removed" msgid="8010830299576311534">"Izbrisano iz istorije poziva"</string>
+ <string name="call_log_header_today" msgid="3225248682434212981">"Danas"</string>
+ <string name="call_log_header_yesterday" msgid="9139172458834033092">"Juče"</string>
+ <string name="call_log_header_other" msgid="5769921959940709084">"Stariji"</string>
+ <string name="call_detail_list_header" msgid="3752717059699600861">"Lista poziva"</string>
+ <string name="voicemail_speaker_on" msgid="209154030283487068">"Uključite zvučnik."</string>
+ <string name="voicemail_speaker_off" msgid="7390530056413093958">"Isključite zvučnik."</string>
+ <string name="voicemail_play_faster" msgid="3444751008615323006">"Brža reprodukcija."</string>
+ <string name="voicemail_play_slower" msgid="4544796503902818832">"Sporija reprodukcija."</string>
+ <string name="voicemail_play_start_pause" msgid="3687447935787768983">"Započnite ili pauzirajte reprodukciju."</string>
+ <string name="list_delimeter" msgid="4571593167738725100">", "</string>
+ <string name="display_options_title" msgid="7812852361055667468">"Opcije prikaza"</string>
+ <string name="sounds_and_vibration_title" msgid="1692290115642160845">"Zvuci i vibracija"</string>
+ <string name="accessibility_settings_title" msgid="6068141142874046249">"Pristupačnost"</string>
+ <string name="ringtone_title" msgid="760362035635084653">"Zvuk zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="3362916460327555241">"Vibriraj i za pozive"</string>
+ <string name="dtmf_tone_enable_title" msgid="6571449695997521615">"Zvuci numeričke tastature"</string>
+ <string name="dtmf_tone_length_title" msgid="8581125689808919460">"Trajanje tonova numeričke tastature"</string>
+ <string-array name="dtmf_tone_length_entries">
+ <item msgid="1036113889050195575">"Normalno"</item>
+ <item msgid="6177579030803486015">"Dugačko"</item>
+ </string-array>
+ <string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Brzi odgovori"</string>
+ <string name="call_settings_label" msgid="313434211353070209">"Pozivi"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokiranje poziva"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokiranje poziva je privremeno isključeno"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blokiranje poziva je onemogućeno zato što ste kontaktirali službe za pomoć u hitnim slučajevima sa ovog telefona u poslednjih 48 sati. Automatski će biti ponovo omogućeno kada istekne period od 48 sati."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Uvezi brojeve"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ranije ste označili neke pozivaoce koje automatski treba preusmeriti na govornu poštu preko drugih aplikacija."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Prikaži brojeve"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Uvezi"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Uvoz nije uspeo"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Arhiviranje govorne pošte nije uspelo."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Deblokiraj broj"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Dodaj broj"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Pozivi sa ovih brojeva će biti blokirani i poruke govorne pošte će se automatski brisati."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Pozivi sa ovih brojeva će biti blokirani, ali pozivaoci sa ovih brojeva će i dalje moći da vam ostavljaju poruke govorne pošte."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokirani brojevi"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> je nevažeći."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> je već blokiran."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokiranje poziva je onemogućeno na 48 sati"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Onemogućeno je zato što je upućen hitan poziv."</string>
+ <string name="phone_account_settings_label" msgid="5864322009841175294">"Nalozi za pozivanje"</string>
+ <string name="permission_single_turn_on" msgid="1543391076065465464">"Uključi"</string>
+ <string name="permission_multiple_turn_on" msgid="2426278457455950554">"Podesi dozvole"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Da biste omogućili brzo biranje, uključite dozvolu za Kontakte."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Da biste videli evidenciju poziva, uključite dozvolu za Telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Da biste videli kontakte, uključite dozvolu za Kontakte."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Da biste pristupili govornoj pošti, uključite dozvolu za Telefon."</string>
+ <string name="permission_no_search" msgid="84152933267902056">"Da biste pretražili kontakte, uključite dozvole za Kontakte."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Da biste uputili poziv, uključite dozvolu za Telefon."</string>
+ <string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikacija Telefon nema dozvolu za upisivanje u sistemska podešavanja."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokiran"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> je aktivan"</string>
+</resources>
diff --git a/res/values-be-rBY/strings.xml b/res/values-be-rBY/strings.xml
new file mode 100644
index 000000000..62afe22ac
--- /dev/null
+++ b/res/values-be-rBY/strings.xml
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2012 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applicationLabel" msgid="7762561155467201526">"Тэлефон"</string>
+ <string name="launcherActivityLabel" msgid="1129729740601172692">"Тэлефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Панэль набору тэлефона"</string>
+ <string name="dialerIconLabel" msgid="6500826552823403796">"Тэлефон"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Гісторыя выклікаў"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Паведаміць аб недакладным нумары"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Скапіраваць нумар"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Капіраваць транскрыпцыю"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Заблакіраваць нумар"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> заблакіраваны"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Разблакіраваць нумар"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> разблакіраваны"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"АДРАБІЦЬ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Выдаліць"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Змяніць нумар перад тым, як тэлефанаваць"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Ачысціць гісторыю выклікаў"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Выдаліць галас. паведамленне"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Архіваванне галас.паведамлення"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Абагуліць галасавую пошту"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Павед.галасавой пошты выдалена"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Галас. паведамленне архівавана"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"АДРАБІЦЬ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ПЕРАЙСЦІ Ў АРХІЎ"</string>
+ <string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Ачысціць гісторыю выклікаў?"</string>
+ <string name="clearCallLogConfirmation" msgid="7899552396101432827">"Гэта выдаліць усе выклікі з вашай гісторыі"</string>
+ <string name="clearCallLogProgress_title" msgid="3372471156216306132">"Ачыстка гісторыі выклікаў…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Патэлефанаваць"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Прапушчаны выклік"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Прапушчаны выклік па працы"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Прапушчаныя выклікі"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Прапушчаных выклікаў: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Перазваніць"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Паведамленне"</string>
+ <plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
+ <item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> Паведамленне галасавой пошты </item>
+ <item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> Паведамленні галасавой пошты </item>
+ <item quantity="many"> <xliff:g id="COUNT">%1$d</xliff:g> Паведамленняў галасавой пошты </item>
+ <item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Паведамлення галасавой пошты </item>
+ </plurals>
+ <string name="notification_action_voicemail_play" msgid="6113133136977996863">"Прайграць"</string>
+ <string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
+ <string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Новае паведамл. ад <xliff:g id="CALLER">%1$s</xliff:g>"</string>
+ <string name="voicemail_playback_error" msgid="3356071912353297599">"Не ўдалося прайграць галасавую пошту"</string>
+ <string name="voicemail_fetching_content" msgid="1287895365599580842">"Загрузка галасавой пошты…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Архіваванне галасавой пошты..."</string>
+ <string name="voicemail_fetching_timout" msgid="3959428065511972176">"Не ўдалося загрузіць галасавую пошту"</string>
+ <string name="call_log_voicemail_header" msgid="3945407886667089173">"Толькi выклiкі з галасавой поштай"</string>
+ <string name="call_log_incoming_header" msgid="2787722299753674684">"Толькi ўваходныя выклiкi"</string>
+ <string name="call_log_outgoing_header" msgid="761009180766735769">"Толькi выходныя выклiкi"</string>
+ <string name="call_log_missed_header" msgid="8017148056610855956">"Толькі прапушчаныя выклiкi"</string>
+ <string name="visual_voicemail_title" msgid="4574199312906348905">"Візуальная галасавая пошта"</string>
+ <string name="visual_voicemail_text" msgid="164967285234132509">"Праглядайце і праслухоўвайце свае паведамленні галасавой пошты без неабходнасці набіраць нумар. Могуць спаганяцца плацяжы за перадачу даных."</string>
+ <string name="visual_voicemail_settings" msgid="8090338793118794741">"Налады"</string>
+ <string name="voicemail_status_voicemail_not_available" msgid="5222480147701456390">"Абнаўленні галасавой пошты недаступныя"</string>
+ <string name="voicemail_status_messages_waiting" msgid="6329544650250068650">"Чакаецца новае галас.паведамленне. Немагчыма загрузіць яго зараз"</string>
+ <string name="voicemail_status_configure_voicemail" msgid="8300808991932816153">"Наладзьце сваю галасавую пошту"</string>
+ <string name="voicemail_status_audio_not_available" msgid="2449801102560158082">"Аўдыя недаступнае"</string>
+ <string name="voicemail_status_action_configure" msgid="8671796489912239589">"Стварыць"</string>
+ <string name="voicemail_status_action_call_server" msgid="1824816252288551794">"Выкл. гал. пошту"</string>
+ <string name="call_log_item_count_and_date" msgid="7641933305703520787">"( <xliff:g id="COUNT">%1$d</xliff:g> ) <xliff:g id="DATE">%2$s</xliff:g>"</string>
+ <string name="sms_disambig_title" msgid="5846266399240630846">"Выбар нумару"</string>
+ <string name="call_disambig_title" msgid="4392886850104795739">"Выбар нумару"</string>
+ <string name="make_primary" msgid="5829291915305113983">"Запомніць гэты выбар"</string>
+ <string name="description_search_button" msgid="3660807558587384889">"пошук"</string>
+ <string name="description_dial_button" msgid="1274091017188142646">"набор"</string>
+ <string name="description_digits_edittext" msgid="8760207516497016437">"нумар для набору"</string>
+ <string name="description_playback_start_stop" msgid="5060732345522492292">"Пачаць ці спыніць прайграванне"</string>
+ <string name="description_playback_speakerphone" msgid="6008323900245707504">"Уключыць ці адключыць гучную сувязь"</string>
+ <string name="description_playback_seek" msgid="4509404274968530055">"Шукаць становішча прайгравання"</string>
+ <string name="description_rate_decrease" msgid="3161652589401708284">"Панізіць хуткасць прайгравання"</string>
+ <string name="description_rate_increase" msgid="6324606574127052385">"Павялічыць хуткасць прайгравання"</string>
+ <string name="action_menu_call_history_description" msgid="9018442816219748968">"Гісторыя выклікаў"</string>
+ <string name="action_menu_overflow_description" msgid="2303272250613084574">"Дадатковыя параметры"</string>
+ <string name="action_menu_dialpad_button" msgid="1425910318049008136">"панэль набору"</string>
+ <string name="menu_show_outgoing_only" msgid="1965570298133301970">"Паказаць толькі выходныя"</string>
+ <string name="menu_show_incoming_only" msgid="7534206815238877417">"Паказаць толькі ўваходныя"</string>
+ <string name="menu_show_missed_only" msgid="154473166059743996">"Паказаць толькі прапушчаныя"</string>
+ <string name="menu_show_voicemails_only" msgid="1898421289561435703">"Паказаць толькі галас. пошту"</string>
+ <string name="menu_show_all_calls" msgid="7560347482073345885">"Паказаць усе выклікі"</string>
+ <string name="add_2sec_pause" msgid="9214012315201040129">"Дадаць 2-секундную паўзу"</string>
+ <string name="add_wait" msgid="3360818652790319634">"Дадаць чаканне"</string>
+ <string name="dialer_settings_label" msgid="4305043242594150479">"Налады"</string>
+ <string name="menu_newContact" msgid="1209922412763274638">"Новы кантакт"</string>
+ <string name="menu_allContacts" msgid="6948308384034051670">"Усе кантакты"</string>
+ <string name="callDetailTitle" msgid="5340227785196217938">"Падрабязнасці выкліку"</string>
+ <string name="toast_call_detail_error" msgid="6947041258280380832">"Падрабязнасцей няма"</string>
+ <string name="dialer_useDtmfDialpad" msgid="1707548397435075040">"Выкарыстанне тонавай клавіятуры"</string>
+ <string name="dialer_returnToInCallScreen" msgid="3719386377550913067">"Звярнуцца да бягучага выкліку"</string>
+ <string name="dialer_addAnotherCall" msgid="4205688819890074468">"Дадаць выклік"</string>
+ <string name="type_incoming" msgid="6502076603836088532">"Уваходны выклік"</string>
+ <string name="type_outgoing" msgid="343108709599392641">"Выходны выклік"</string>
+ <string name="type_missed" msgid="2720502601640509542">"Прапушчаны выклік"</string>
+ <string name="type_incoming_video" msgid="82323391702796181">"Уваходны відэавыклік"</string>
+ <string name="type_outgoing_video" msgid="2858140021680755266">"Выходны відэавыклік"</string>
+ <string name="type_missed_video" msgid="954396897034220545">"Прапушчаны відэавыклік"</string>
+ <string name="type_voicemail" msgid="5153139450668549908">"Галасавая пошта"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Адхілены выклік"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Заблакіраваны выклік"</string>
+ <string name="actionIncomingCall" msgid="6028930669817038600">"Уваходныя выклікі"</string>
+ <string name="description_call_log_play_button" msgid="651182125650429846">"Прайграць паведамленне галасавой пошты"</string>
+ <string name="description_view_contact" msgid="5205669345700598415">"Прагледзець кантакт <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_call" msgid="3443678121983852666">"Выклік карыстальнiка <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_contact_details" msgid="51229793651342809">"Падрабязнасці кантакту для <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
+ <string name="description_num_calls" msgid="1601505153694540074">"Выклікаў: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
+ <string name="description_video_call" msgid="2933838090743214204">"Відэавыклік."</string>
+ <string name="description_send_text_message" msgid="3118485319691414221">"Адправіць SMS абаненту <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_call_log_unheard_voicemail" msgid="118101684236996786">"Непраслуханая галасавая пошта"</string>
+ <string name="description_start_voice_search" msgid="520539488194946012">"Пачаць галасавы пошук"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Выклікаць <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="unknown" msgid="740067747858270469">"Невядомы"</string>
+ <string name="voicemail" msgid="3851469869202611441">"Галасавая пошта"</string>
+ <string name="private_num" msgid="6374339738119166953">"Прыватны нумар"</string>
+ <string name="payphone" msgid="7726415831153618726">"Таксафон"</string>
+ <string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> с"</string>
+ <string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> хв <xliff:g id="SECONDS">%s</xliff:g> с"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> у <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Немагчыма выклікаць гэты нумар"</string>
+ <string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Каб наладзіць галасавую пошту, націсніце \"Меню\" i перайдзiце ў налады."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Каб зрабiць выклік галасавой пошты, спачатку адключыце рэжым палёту."</string>
+ <string name="contact_list_loading" msgid="5488620820563977329">"Загрузка..."</string>
+ <string name="imei" msgid="3045126336951684285">"IMEI"</string>
+ <string name="meid" msgid="6210568493746275750">"MEID"</string>
+ <string name="simContacts_emptyLoading" msgid="6700035985448642408">"Загрузка з SIM-карты..."</string>
+ <string name="simContacts_title" msgid="27341688347689769">"Кантакты SIM-карты"</string>
+ <string name="add_contact_not_available" msgid="5547311613368004859">"Праграмы для аперацый з кантактамі няма"</string>
+ <string name="voice_search_not_available" msgid="2977719040254285301">"Галасавы пошук недаступны"</string>
+ <string name="call_not_available" msgid="8941576511946492225">"Немагчыма зрабіць выклік па тэлефоне, таму што праграма Тэлефон была адключана."</string>
+ <string name="activity_not_available" msgid="2287665636817987623">"На прыладзе няма праграмы для гэтага"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Пошук у кантактах"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Дадайце нумар ці шукайце ў кантактах"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Ваша гісторыя выклікаў пустая"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Зрабіць выклік"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"У вас няма прапушчаных выклікаў."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Ваша галасавая пошта пустая."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Ваш архіў галасавой пошты пусты."</string>
+ <string name="show_favorites_only" msgid="5520072531022614595">"Паказаць толькі ўпадабаныя"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Гісторыя выклікаў"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Архіў галасавой пошты"</string>
+ <string name="call_log_all_title" msgid="3566738938889333307">"Усе"</string>
+ <string name="call_log_missed_title" msgid="4541142293870638971">"Прапушчаныя"</string>
+ <string name="call_log_voicemail_title" msgid="940422274047025948">"Галасавая пошта"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Новае спрошчанае блакіраванне"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Каб лепш вас абараняць, Тэлефон павінен змяніць спосаб блакіроўкі. Зараз вашы заблакіраваныя нумары не могуць выкарыстоўвацца для выклікаў і перадачы тэкставых паведамленняў і могуць выкарыстоўвацца сумесна з іншымі праграмамі."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Дазволіць"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Заблакіраваць <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Выклікі з гэтага нумара будуць блакіравацца, а паведамленні галасавой пошты - аўтаматычна выдаляцца."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Выклікі з гэтага нумара будуць блакіравацца, але абанент усё яшчэ зможа пакінуць вам паведамленне галасавой пошты."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Вы больш не будзеце атрымліваць выклікі або SMS з гэтага нумара."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛАКІРАВАЦЬ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Разблакіраваць <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"РАЗБЛАКІРАВАЦЬ"</string>
+ <string name="tab_speed_dial" msgid="7552166276545648893">"Хуткі набор"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Гісторыя выклікаў"</string>
+ <string name="tab_all_contacts" msgid="1410922767166533690">"Кантакты"</string>
+ <string name="tab_voicemail" msgid="155024725947496746">"Галасавая пошта"</string>
+ <string name="favorite_hidden" msgid="5011234945140912047">"Выдалена з выбранага"</string>
+ <string name="favorite_hidden_undo" msgid="2508998611039406474">"Адрабіць"</string>
+ <string name="search_shortcut_call_number" msgid="7277194656832895870">"Выклікаць <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="search_shortcut_create_new_contact" msgid="1679917465521554093">"Стварыць новы кантакт"</string>
+ <string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Дадаць у кантакт"</string>
+ <string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Адправiць SMS"</string>
+ <string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Зрабіць відэавыклік"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Заблакіраваць нумар"</string>
+ <string name="num_missed_calls" msgid="8081736535604293886">"Новых прапушчаных выклікаў: <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="speed_dial_empty" msgid="8838921693673366129">"У вас пакуль нікога няма на хуткім наборы"</string>
+ <string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Дадаць улюбёны"</string>
+ <string name="all_contacts_empty" msgid="471370638298229686">"У вас пакуль няма ніякіх кантактаў"</string>
+ <string name="all_contacts_empty_add_contact_action" msgid="1515782853819374618">"Дадаць кантакт"</string>
+ <string name="contact_tooltip" msgid="2019777545923635266">"Дакраніцеся да відарыса, каб пабачыць усе нумары, ці націсніце і ўтрымлівайце, каб змяніць іх парадак"</string>
+ <string name="remove_contact" msgid="1080555335283662961">"Выдаліць"</string>
+ <string name="call_log_action_video_call" msgid="7724301709041128296">"Відэавыклік"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Адправiць паведамленне"</string>
+ <string name="call_log_action_details" msgid="701345508704970622">"Падрабязнасці выкліку"</string>
+ <string name="call_log_action_call" msgid="463690849042459842">"Выклікаць <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_incoming_missed_call" msgid="2381085098795943627">"Прапушчаны выклік ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_incoming_answered_call" msgid="7117665748428816544">"Адказаны выклік ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Непрачытанае паведамленне галасавой пошты ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Паведамленне галасавой пошты ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_outgoing_call" msgid="6386364390619734734">"Выклік абаненту <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_phone_account" msgid="1767072759541443861">"на <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"праз <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"праз <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"на <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, праз <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> праз <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="description_call_log_call_action" msgid="3682561657090693134">"Выклікаць"</string>
+ <string name="description_call_action" msgid="4000549004089776147">"Выклікаць <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_video_call_action" msgid="7386922428155062213">"Відэавыклік ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
+ <string name="description_voicemail_action" msgid="8054891873788903063">"Праслухаць галасавое паведамленне ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_play" msgid="2689369874037785439">"Прайграць галасавое паведамленне ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_pause" msgid="3905259748756919693">"Прыпыніць галасавое паведамленне ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_delete" msgid="2025472770630153436">"Выдаліць галасавое паведамленне ад <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <plurals name="description_voicemail_unread" formatted="false" msgid="8708346053055570332">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> новае паведамленне галасавой пошты</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> новыя паведамленні галасавой пошты</item>
+ <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> новых паведамленняў галасавой пошты</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> новага паведамлення галасавой пошты</item>
+ </plurals>
+ <string name="description_create_new_contact_action" msgid="818755978791008167">"Стварыць кантакт для <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_add_to_existing_contact_action" msgid="6081200053494414351">"Дадаць <xliff:g id="NAMEORNUMBER">^1</xliff:g> да існуючага кантакту"</string>
+ <string name="description_details_action" msgid="2433827152749491785">"Падрабязнасці кантакту для <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="toast_entry_removed" msgid="8010830299576311534">"Выдалена з гісторыі выклікаў."</string>
+ <string name="call_log_header_today" msgid="3225248682434212981">"Сёння"</string>
+ <string name="call_log_header_yesterday" msgid="9139172458834033092">"Учора"</string>
+ <string name="call_log_header_other" msgid="5769921959940709084">"Больш старыя"</string>
+ <string name="call_detail_list_header" msgid="3752717059699600861">"Спіс выклікаў"</string>
+ <string name="voicemail_speaker_on" msgid="209154030283487068">"Уключыць дынамік."</string>
+ <string name="voicemail_speaker_off" msgid="7390530056413093958">"Адключыць дынамік."</string>
+ <string name="voicemail_play_faster" msgid="3444751008615323006">"Прайграваць хутчэй."</string>
+ <string name="voicemail_play_slower" msgid="4544796503902818832">"Прайграваць павольней."</string>
+ <string name="voicemail_play_start_pause" msgid="3687447935787768983">"Пачаць ці прыпыніць прайграванне."</string>
+ <string name="list_delimeter" msgid="4571593167738725100">", "</string>
+ <string name="display_options_title" msgid="7812852361055667468">"Параметры адлюстравання"</string>
+ <string name="sounds_and_vibration_title" msgid="1692290115642160845">"Гукі і вібрацыя"</string>
+ <string name="accessibility_settings_title" msgid="6068141142874046249">"Спецыяльныя магчымасці"</string>
+ <string name="ringtone_title" msgid="760362035635084653">"Рынгтон тэлефона"</string>
+ <string name="vibrate_on_ring_title" msgid="3362916460327555241">"Уключыць вібрацыю для выклікаў"</string>
+ <string name="dtmf_tone_enable_title" msgid="6571449695997521615">"Гукі панэлі набору"</string>
+ <string name="dtmf_tone_length_title" msgid="8581125689808919460">"Даўжыня гукаў панэлі набору"</string>
+ <string-array name="dtmf_tone_length_entries">
+ <item msgid="1036113889050195575">"Звычайны"</item>
+ <item msgid="6177579030803486015">"Доўгі"</item>
+ </string-array>
+ <string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Хуткія адказы"</string>
+ <string name="call_settings_label" msgid="313434211353070209">"Выклікі"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Блакіраванне выклікаў"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Блакіроўка выклікаў часова адключана"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Блакіроўка выклікаў будзе адключана, таму што вы выклікалі экстранныя службы з гэтага тэлефона на працягу апошніх 48 гадзін. Яна будзе аўтаматычна адноўлена пасля заканчэння перыяду ў 48 гадзін."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Імпартаваць нумары"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Вы пазначалі праз іншыя праграмы некаторых абанентаў, якіх трэба аўтаматычна адпраўляць у галасавую пошту ."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Прагледзець нумары"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Імпартаваць"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Імпарт не ўдаўся"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Не ўдалося архіваваць галасавую пошту."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Разблакіраваць нумар"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Дадаць нумар"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Выклікі з гэтых нумароў будуць блакіравацца, а паведамленні галасавой пошты - аўтаматычна выдаляцца."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Выклікі з гэтых нумароў будуць блакіравацца, але з іх яшчэ можна пакінуць вам паведамленні галасавой пошты."</string>
+ <string name="block_list" msgid="7760188925338078011">"Заблакіраваныя нумары"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> несапраўдны."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ужо заблакіраваны."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Блакіроўка выклікаў адключана на 48 гадзін"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Адключана, таму што быў зроблены экстранны выклік."</string>
+ <string name="phone_account_settings_label" msgid="5864322009841175294">"Уліковыя запісы для выклікаў"</string>
+ <string name="permission_single_turn_on" msgid="1543391076065465464">"Уключыць"</string>
+ <string name="permission_multiple_turn_on" msgid="2426278457455950554">"Задаць дазволы"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Каб уключыць хуткі набор, уключыце дазвол для Кантактаў."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Каб прагледзець свой журнал выклікаў, уключыце дазволы Тэлефона."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Каб бачыць свае кантакты, уключыце дазвол для Кантактаў."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Каб атрымаць доступ да галасавой пошты, уключыце дазвол для Тэлефона."</string>
+ <string name="permission_no_search" msgid="84152933267902056">"Каб шукаць свае кантакты, уключыце дазвол для Кантактаў."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Каб зрабіць выклік, уключыце дазвол для Тэлефона."</string>
+ <string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Праграма Тэлефон не мае дазволу на запіс у налады сістэмы."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Заблакiраваны"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Актыўная размова з <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 5769667cb..637f16866 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Клавиатура за набиране"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"История на обажданията"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Обаждане на <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Сигнал за неправилен номер"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Редактиране на номер преди обаждане"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Добавяне към контакт"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Изтриване от историята на обажданията"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Изчистване на историята на обажд."</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Изтриване на гласова поща"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Споделяне на гласова поща"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Списъкът с обажданията е празен"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Обаждане"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"История на обажданията"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Сигнал за неправилен номер"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Копиране на номера"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Копиране на преписа"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Блокиране на номера"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Блокирахте <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Отблокиране на номера"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Отблокирахте <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ОТМЯНА"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Изтриване"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Редактиране на номера преди обаждане"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Изчистване на историята"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Изтриване на гласова поща"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Архивиране на гласовата поща"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Споделяне на гласова поща"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Гл. поща е изтрита"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Гласовата поща бе архивирана"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ОТМЯНА"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"КЪМ АРХИВА"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Да се изчисти ли историята на обажд.?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Така ще се изтрият всички обаждания от историята ви"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Историята на обажд. се изчиства…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Телефон"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Пропуснато обаждане"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Пропуснато служебно обаждане"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Пропуснати обаждания"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> пропуснати обаждания"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Обратно обаждане"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Съобщение"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> гласови съобщения </item>
<item quantity="one">Гласово съобщение</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Нова гласова поща от <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Гл. поща не можа да се възпроизведе"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Буферира се..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Гласовата поща се зарежда…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Гласовата поща се архивира…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Гласовата поща не можа да се зареди"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Само обаждания с гласова поща"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Само входящи обаждания"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"История на обажданията"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Още опции"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"клавиатура за набиране"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Копиране"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Показване само на изходящите"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Показване само на входящите"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Показване само на пропуснатите"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Изходящо видеообаждане"</string>
<string name="type_missed_video" msgid="954396897034220545">"Пропуснато видеообаждане"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Гласова поща"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Отхвърлено обаждане"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Блокирано обаждане"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Вх. обаждания"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Пускане на гласовата поща"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Преглед на контактa <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Обаждане до <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Подробности за контакта за <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Нова гласова поща."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> обаждания."</string>
<string name="description_video_call" msgid="2933838090743214204">"Видеообаждане."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Изпращане на SMS до <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Обществен телефон"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> мин <xliff:g id="SECONDS">%s</xliff:g> сек"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> в <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Не можете да се обадите на този номер"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"За да настроите гласовата поща, отворете „Меню“ &gt; „Настройки“."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"За да чуете гласовата си поща, първо изключете самолетния режим."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Гласовото търсене не е налице"</string>
<string name="call_not_available" msgid="8941576511946492225">"Не може да се осъществи телефонно обаждане, защото приложението Телефон е деактивирано."</string>
<string name="activity_not_available" msgid="2287665636817987623">"На устройството няма приложение за това действие"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Въведете име или тел. номер"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Нямате пропуснати обаждания."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Входящата ви гласова поща е празна."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Търсене в контактите"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Доб. номер или потърс. контакт"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Историята на обажданията ви е празна"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Извършване на обаждане"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Нямате пропуснати обаждания."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Входящата ви гласова поща е празна."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Архивът на гласовата ви поща е празен."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Показване само на любимите"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"История"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"История на обажданията"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Архив на гласовата поща"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Всички"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Пропуснати"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Гл. поща"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Ново и лесно блокиране"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"За да ви защитава по-добре, Phone трябва да промени начина на работа на функцията за блокиране. Вече няма да получавате обаждания и текстови съобщения от блокираните номера. Възможно е тези номера да бъдат споделени с други приложения."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Разрешаване"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Да се блокира ли <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Обажданията от този номер ще бъдат блокирани, а гласовите съобщения – автоматично изтривани."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Обажданията от този номер ще бъдат блокирани, но обаждащият се пак може да е в състояние да ви оставя гласови съобщения."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Повече няма да получавате обаждания или SMS от този номер."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛОКИРАНЕ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Да се отблокира ли <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ОТБЛОКИРАНЕ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Бързо набиране"</string>
- <string name="tab_recents" msgid="929949073851377206">"Скорошни"</string>
+ <string name="tab_history" msgid="2563144697322434940">"История на обажданията"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Контакти"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Гласова поща"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Премахнато от любимите"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Добавяне към контакт"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Изпращане на SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Провеждане на видеообаждане"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Преглед на цялата история на обажданията"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Блокиране на номера"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> нови пропуснати обаждания"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Още нямате контакти за бързо набиране"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Добавяне на любим контакт"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Докоснете изображението, за да видите всички номера, или го натиснете и задръжте за пренареждане"</string>
<string name="remove_contact" msgid="1080555335283662961">"Премахване"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Видеообаждане"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Изпращане на съобщение"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Изпращане на съобщение"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Подробности за обаждането"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Обаждане до <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Пропуснато обаждане от <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Прието обаждане от <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Непрочетено гласово съобщение от <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Гласово съобщение от <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Обаждане до <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"на <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"през <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"през <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"в/ъв <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, през <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> през <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Обаждане"</string>
<string name="description_call_action" msgid="4000549004089776147">"Обаждане на <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Видеообаждане до <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Бързи отговори"</string>
<string name="call_settings_label" msgid="313434211353070209">"Обаждания"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Блокиране на обажданията"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Блокир. на обажданията е временно изкл."</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Блокирането на обажданията е деактивирано, защото в рамките на последните 48 часа сте се свързали със спешните служби от този телефон. То автоматично ще бъде активирано отново, когато периодът от 48 часа изтече."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Импортиране на номерата"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"По-рано означихте обажданията от някои контакти автоматично да се прехвърлят към гласова поща чрез други приложения."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Преглед на номерата"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Импортиране"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Импортирането не бе успешно"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Неуспешно архивиране на гласовата поща."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Отблокиране на номера"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Добавяне на номер"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Обажданията от тези номера ще бъдат блокирани, а гласовите съобщения – автоматично изтривани."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Обажданията от тези номера ще бъдат блокирани, но обаждащите се от тях пак може да са в състояние да ви оставят гласови съобщения."</string>
+ <string name="block_list" msgid="7760188925338078011">"Блокирани номера"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> е невалиден."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> вече е блокиран."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Блокирането на обажданията е деактивирано за 48 часа"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Деактивирано, тъй като бе извършено спешно обаждане."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Профили за обаждане"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Включване"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Задаване на разрешенията"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"За да активирате бързото набиране,\nвключете разрешението за контакти."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"За да видите списъка с обажданията си,\nвключете разрешението за телефон."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"За да видите контактите си,\nвключете разрешението за контакти."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"За да осъществите достъп до гласовата си поща,\nвключете разрешението за телефон."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"За да активирате бързото набиране, включете разрешението за Контакти."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"За да видите списъка с обажданията си, включете разрешението за Телефон."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"За да видите контактите си, включете разрешението за Контакти."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"За да осъществите достъп до гласовата си поща, включете разрешението за Телефон."</string>
<string name="permission_no_search" msgid="84152933267902056">"За да търсите в контактите си, включете разрешенията за тях."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"За да извършите обаждане,\nвключете разрешението за телефон."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"За да извършите обаждане, включете разрешението за Телефон."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Приложението Телефон няма разрешение да записва в системните настройки."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Блокирано"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> е активно"</string>
</resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 8816cb38d..a5d732cb6 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ফোন"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ফোন"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ফোন ডায়ালপ্যাড"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ফোন"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"পুরোনো কলের তালিকা"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> কে কল করুন"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"ভুল নম্বর প্রতিবেদন করুন"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"কল করার আগে নম্বর সম্পাদনা করুন"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"একটি পরিচিতিতে যোগ করুন"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"পুরোনো কলের তালিকা থেকে মুছুন"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"পুরোনো কলের তালিকা সাফ করুন"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ভয়েসমেল মুছুন"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ভয়েসমেল শেয়ার করুন"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"আপনার কল লগ খালি রয়েছে"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"একটি কল করুন"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"পুরোনো কলের তালিকা"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"ভুল নম্বর প্রতিবেদন করুন"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"নম্বর প্রতিলিপি করুন"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ট্রান্সক্রিপশান প্রতিলিপি করুন"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"নম্বর অবরোধ করুন"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> অবরোধ করা হয়েছে"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"নম্বর অবরোধ মুক্ত করুন"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> অবরোধ মুক্ত করা হয়েছে"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"পূর্বাবস্থায় ফিরুন"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"মুছুন"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"কল করার আগে নম্বর সম্পাদনা করুন"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"পুরোনো কলের তালিকা সাফ করুন"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ভয়েসমেল মুছুন"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"ভয়েসমেল সংরক্ষণাগারভুক্ত করুন"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ভয়েসমেল শেয়ার করুন"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ভয়েসমেল মোছা হয়েছে"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ভয়েসমেল সংরক্ষণাগারভুক্ত"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"পূর্বাবস্থায় ফিরুন"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"সংরক্ষণাগারে যান"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"পুরোনো কলের তালিকা সাফ করবেন?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"এটি আপনার ইতিহাস থেকে সমস্ত কল মুছে দেবে"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"পুরোনো কলের তালিকা সাফ করা হচ্ছে…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ফোন"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"মিস করা কল"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"কাজের কল মিস করেছেন"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"মিস করা কলগুলি"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>টি মিস করা কল"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ঘুরিয়ে কল করুন"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"বার্তা"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g>টি ভয়েসমেল </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g>টি ভয়েসমেল </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> এর থেকে নতুন ভয়েসমেল"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ভয়েসমেল প্লে করা যায়নি"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"বাফারিং..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"ভয়েসমেল লোড করা হচ্ছে..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"ভয়েসমেল সংরক্ষণাগারভুক্ত করা হচ্ছে…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ভয়েসমেল লোড করা যায়নি"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"কেবলমাত্র ভয়েসমেলের সাথে কলগুলি"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"কেবলমাত্র ইনকামিং কলগুলি"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"পুরোনো কলের তালিকা"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"আরো বিকল্প"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ডায়াল প্যাড"</string>
- <string name="menu_copy" msgid="6108677035381940698">"কপি করুন"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"কেবলমাত্র আউটগোয়িং দেখান"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"কেবলমাত্র ইনকামিং দেখান"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"কেবলমাত্র মিসড দেখান"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"আউটগোয়িং ভিডিও কল"</string>
<string name="type_missed_video" msgid="954396897034220545">"মিস করা ভিডিও কল"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ভয়েসমেল"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"অস্বীকৃত কল"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"অবরুদ্ধ কল"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ইনকামিং কলগুলি"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ভয়েসমেল প্লে করুন"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> পরিচিতি দেখুন"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> কে কল করুন"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> পরিচিতির বিশদ বিবরণ"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"নতুন ভয়েসমেল৷"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>টি কল৷"</string>
<string name="description_video_call" msgid="2933838090743214204">"ভিডিও কল।"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> কে SMS পাঠান"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"পে ফোন"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> সেকেন্ড"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> মিনিট <xliff:g id="SECONDS">%s</xliff:g> সেকেন্ড"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> তারিখে <xliff:g id="TIME">%2$s</xliff:g>\'টায়"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"এই নম্বরে কল করতে পারবেন না"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ভয়েসমেল সেট আপ করতে, মেনু &gt; সেটিংস এ যান৷"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ভয়েসমেলে কল করতে, সবার আগে বিমানমোড বন্ধ করুন৷"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"ভয়েস অনুসন্ধান অনুপলব্ধ"</string>
<string name="call_not_available" msgid="8941576511946492225">"কোনো ফোন কল করা যাবে না কারণ ফোন অ্যাপ্লিকেশানটি অক্ষম করা হয়েছে৷"</string>
<string name="activity_not_available" msgid="2287665636817987623">"এর জন্য এই ডিভাইসে কোনো অ্যাপ্লিকেশান নেই"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"কোনো নাম বা ফোন নম্বর লিখুন"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"আপনার কোনো মিসড কল নেই।"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"আপনার ভয়েসমেলের ইনবক্স খালি রয়েছে।"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"পরিচিতিগুলি অনুসন্ধান করুন"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"সংখ্যা যোগ করুন বা পরিচিতিগুলি অনুসন্ধান করুন"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"আপনার পুরোনো কলের তালিকা খালি আছে"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"একটি কল করুন"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"আপনার কোনো মিসড কল নেই।"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"আপনার ভয়েসমেলের ইনবক্স খালি রয়েছে।"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"আপনার ভয়েসমেলের সংরক্ষণাগারটি খালি।"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"কেবলমাত্র পছন্দসইগুলি দেখান"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ইতিহাস"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"পুরোনো কলের তালিকা"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ভয়েসমেলের সংরক্ষাণাগার"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"সমস্ত"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"মিসড"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ভয়েসমেল"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"নতুন, সরলীকৃত অবরুদ্ধ করার ব্যবস্থা"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"আপনাকে আরো ভালো সুরক্ষা দিতে, \'ফোন\' এর অবরুদ্ধ করার আচরণ পরিবর্তন করতে হবে৷ আপনার অবরুদ্ধ করা নম্বরগুলি থেকে আসা কলগুলি এবং পাঠ্যবার্তা উভয়ই থামানো হবে এবং অন্যান্য অ্যাপ্লিকেশানের সাথে শেয়ার করা হতে পারে৷"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"অনুমতি দিন"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> অবরোধ করবেন?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"এই নম্বর থেকে আসা কলগুলি অবরোধ করা হবে এবং ভয়েসমেলগুলি স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে৷"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"এই নম্বর থেকে আসা কলগুলি অবরোধ করা হবে, কিন্তু কলার হয়ত এখনও আপনাকে ভয়েসমেলগুলি পাঠাতে পারবে৷"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"আপনি এই নম্বর থেকে আর কল বা পাঠ্যবার্তাগুলি পাবেন না৷"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"অবরোধ করুন"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> অবরোধ মুক্ত করবেন?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"অবরোধ মুক্ত করুন"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"দ্রুত ডায়াল"</string>
- <string name="tab_recents" msgid="929949073851377206">"সাম্প্রতিকগুলি"</string>
+ <string name="tab_history" msgid="2563144697322434940">"পুরোনো কলের তালিকা"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"পরিচিতিগুলি"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ভয়েস মেল"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"পছন্দসই থেকে সরানো হয়েছে"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"একটি পরিচিতিতে যোগ করুন"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS পাঠান"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ভিডিও কল করুন"</string>
- <string name="show_call_history" msgid="1141502332266697170">"সম্পূর্ণ পুরোনো কলের তালিকা দেখুন"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"নম্বর অবরোধ করুন"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g>টি নতুন মিসড কল"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"আপনার স্পীড ডায়ালে এখনও পর্যন্ত কেউ নেই"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"আপনার পছন্দের একটি পরিচিতি যোগ করুন"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"সমস্ত নম্বর দেখতে চিত্রে স্পর্শ করুন বা রেকর্ড করতে ধরে রাখুন"</string>
<string name="remove_contact" msgid="1080555335283662961">"সরান"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ভিডিও কল"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"বার্তা পাঠান"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"একটি বার্তা পাঠান"</string>
<string name="call_log_action_details" msgid="701345508704970622">"কলের বিশদ বিবরণ"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> এর কল"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> থেকে মিস হওয়া কল৷"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> এর থেকে উত্তর দেওয়া কল৷"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> , <xliff:g id="TYPEORLOCATION">^2</xliff:g> , <xliff:g id="TIMEOFCALL">^3</xliff:g> , <xliff:g id="PHONEACCOUNT">^4</xliff:g> এর থেকে অপঠিত ভয়েসমেল৷"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> , <xliff:g id="TYPEORLOCATION">^2</xliff:g> , <xliff:g id="TIMEOFCALL">^3</xliff:g> , <xliff:g id="PHONEACCOUNT">^4</xliff:g> এর থেকে ভয়েসমেল৷"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> এ কল করুন৷"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> এ"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> এর মাধ্যমে"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> এর মাধ্যমে"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> এ, <xliff:g id="NUMBER">%2$s</xliff:g> এর মাধ্যমে"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> এর মাধ্যমে <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"কল করুন"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> এর কল"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>-এ ভিডিও কল করুন।"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"দ্রুত প্রতিক্রিয়াগুলি"</string>
<string name="call_settings_label" msgid="313434211353070209">"কল"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"কল অবরোধ করা"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"কল অবরোধ সাময়িকভাবে বন্ধ রয়েছে"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"কল অবরোধ অক্ষম করা হয়েছে কারণ আপনি গত ২৮ ঘন্টার মধ্যে এই ফোন থেকে জরুরি পরিষেবায় যোগাযোগ করেছেন। ২৮ ঘন্টার সময়সীমা পেরিয়ে গেলেই এটি স্বয়ংক্রিয়ভাবে পুনরায় সক্ষম হবে।"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"নম্বরগুলি আমদানি করুন"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"আপনি আগে থেকেই অন্য অ্যাপ্লিকেশানগুলির মাধ্যমে স্বয়ংক্রিয়ভাবে ভয়েস মেল পাঠানোর জন্য কিছু কলারকে চিহ্নিত করেছেন৷"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"নম্বরগুলি দেখুন"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"আমদানি করুন"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"আমদানি ব্যর্থ হয়েছে"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"ভয়েসমেল সংরক্ষণাগারভুক্ত করতে ব্যর্থ হয়েছে।"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"নম্বর অবরোধ মুক্ত করুন"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"একটি নম্বর যোগ করুন"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"এই নম্বরগুলি থেকে আসা কলগুলি অবরোধ করা হবে এবং ভয়েসমেলগুলি স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে৷"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"এই নম্বরগুলি থেকে আসা কলগুলি অবরোধ করা হবে, কিন্তু তারা হয়ত এখনও আপনাকে ভয়েসমেলগুলি পাঠাতে পারবে৷"</string>
+ <string name="block_list" msgid="7760188925338078011">"অবরুদ্ধ নম্বরগুলি"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> অবৈধ৷"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ইতিমধ্যেই অববোধ করা রয়েছে৷"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"৪৮ ঘন্টার জন্য কল অবরোধ করা অক্ষম করা হয়েছে"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"কোনো জরুরি কল করার কারণে অক্ষম করা হয়েছে৷"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"কলিং অ্যাকাউন্টগুলি"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"চালু করুন"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"অনুমতিগুলি সেট করুন"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"স্পীড ডায়াল সক্ষম করতে,\n পরিচিতিগুলির অনুমতি চালু করুন।"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"আপনার কল লগ দেখতে,\n ফোনের অনুমতি চালু করুন।"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"আপনার পরিচিতিগুলি দেখতে,\n পরিচিতিগুলির অনুমতি চালু করুন।"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"আপনার ভয়েসমেল অ্যাক্সেস করতে,\n ফোনের অনুমতি চালু করুন।"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"স্পীড ডায়াল সক্ষম করতে, পরিচিতিগুলির অনুমতি চালু করুন।"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"আপনার কল লগ দেখতে, ফোনের অনুমতি চালু করুন।"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"আপনার পরিচিতিগুলি দেখতে, পরিচিতিগুলির অনুমতি চালু করুন।"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"আপনার ভয়েসমেল অ্যাক্সেস করতে, ফোনের অনুমতি চালু করুন।"</string>
<string name="permission_no_search" msgid="84152933267902056">"আপনার পরিচিতিগুলি অনুসন্ধান করতে, পরিচিতির অনুমতিগুলি চালু করুন।"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"একটি কল করার জন্য,\n ফোনের অনুমতি চালু করুন।"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"একটি কল করতে, ফোনের অনুমতি চালু করুন।"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ফোনের অ্যাপ্লিকেশানকে সিস্টেম সেটিংসে লেখার অনুমতি দেওয়া হয়নি।"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"অবরুদ্ধ"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> সক্রিয় আছে"</string>
</resources>
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
new file mode 100644
index 000000000..d20bf3a68
--- /dev/null
+++ b/res/values-bs-rBA/strings.xml
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2012 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
+ <string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefonska tipkovnica telefona"</string>
+ <string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historija poziva"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Prijavi netačan broj"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiraj broj"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiraj transkripciju"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokiraj broj"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> je blokiran"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Odblokiraj broj"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> je odblokiran"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"PONIŠTI"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Izbriši"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Uredi broj prije poziva"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Obriši historiju poziva"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Izbriši govornu poštu"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arhiviraj govornu poštu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Podijeli govornu poštu"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Govorna pošta je izbrisana"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Govorna pošta arhivirana"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"PONIŠTI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"IDI U ARH."</string>
+ <string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Obrisati historiju poziva?"</string>
+ <string name="clearCallLogConfirmation" msgid="7899552396101432827">"Ovo će izbrisati sve pozive iz historije"</string>
+ <string name="clearCallLogProgress_title" msgid="3372471156216306132">"Brisanje historije poziva u toku…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Propušteni poziv"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Propušteni poslovni poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Propuštenih poziva: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Pozovi ovaj broj"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Poruka"</string>
+ <plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
+ <item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> Poruka govorne pošte </item>
+ <item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> Poruke govorne pošte </item>
+ <item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Poruka govorne pošte </item>
+ </plurals>
+ <string name="notification_action_voicemail_play" msgid="6113133136977996863">"Pokreni"</string>
+ <string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
+ <string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova govorna pošta od <xliff:g id="CALLER">%1$s</xliff:g>"</string>
+ <string name="voicemail_playback_error" msgid="3356071912353297599">"Nije moguće pokrenuti govornu poštu"</string>
+ <string name="voicemail_fetching_content" msgid="1287895365599580842">"Učitavanje govorne pošte…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arhiviranje govorne pošte..."</string>
+ <string name="voicemail_fetching_timout" msgid="3959428065511972176">"Nije moguće učitati govornu poštu"</string>
+ <string name="call_log_voicemail_header" msgid="3945407886667089173">"Samo pozivi s govornom poštom"</string>
+ <string name="call_log_incoming_header" msgid="2787722299753674684">"Samo dolazni pozivi"</string>
+ <string name="call_log_outgoing_header" msgid="761009180766735769">"Samo odlazni pozivi"</string>
+ <string name="call_log_missed_header" msgid="8017148056610855956">"Samo propušteni pozivi"</string>
+ <string name="visual_voicemail_title" msgid="4574199312906348905">"Vizuelna govorna pošta"</string>
+ <string name="visual_voicemail_text" msgid="164967285234132509">"Pogledajte i preslušajte govornu poštu bez pozivanja broja. Mogući su troškovi prijenosa podataka."</string>
+ <string name="visual_voicemail_settings" msgid="8090338793118794741">"Postavke"</string>
+ <string name="voicemail_status_voicemail_not_available" msgid="5222480147701456390">"Ažuriranja govorne pošte nisu dostupna"</string>
+ <string name="voicemail_status_messages_waiting" msgid="6329544650250068650">"Nova govorna pošta čeka. Trenutno nije moguće učitati."</string>
+ <string name="voicemail_status_configure_voicemail" msgid="8300808991932816153">"Postavite govornu poštu"</string>
+ <string name="voicemail_status_audio_not_available" msgid="2449801102560158082">"Zvuk nije dostupan"</string>
+ <string name="voicemail_status_action_configure" msgid="8671796489912239589">"Postavljanje"</string>
+ <string name="voicemail_status_action_call_server" msgid="1824816252288551794">"Pozovi govornu poštu"</string>
+ <string name="call_log_item_count_and_date" msgid="7641933305703520787">"(<xliff:g id="COUNT">%1$d</xliff:g>) <xliff:g id="DATE">%2$s</xliff:g>"</string>
+ <string name="sms_disambig_title" msgid="5846266399240630846">"Izaberite broj"</string>
+ <string name="call_disambig_title" msgid="4392886850104795739">"Izaberite broj"</string>
+ <string name="make_primary" msgid="5829291915305113983">"Zapamti ovaj izbor"</string>
+ <string name="description_search_button" msgid="3660807558587384889">"pretraga"</string>
+ <string name="description_dial_button" msgid="1274091017188142646">"biraj"</string>
+ <string name="description_digits_edittext" msgid="8760207516497016437">"broj za biranje"</string>
+ <string name="description_playback_start_stop" msgid="5060732345522492292">"Pokreni ili zaustavi pokretanje"</string>
+ <string name="description_playback_speakerphone" msgid="6008323900245707504">"Uključi ili isključi zvučnik"</string>
+ <string name="description_playback_seek" msgid="4509404274968530055">"Traženje položaja reprodukcije"</string>
+ <string name="description_rate_decrease" msgid="3161652589401708284">"Smanjenje brzine reprodukcije"</string>
+ <string name="description_rate_increase" msgid="6324606574127052385">"Povećavanje brzine reprodukcije"</string>
+ <string name="action_menu_call_history_description" msgid="9018442816219748968">"Historija poziva"</string>
+ <string name="action_menu_overflow_description" msgid="2303272250613084574">"Više opcija"</string>
+ <string name="action_menu_dialpad_button" msgid="1425910318049008136">"telefonska tipkovnica"</string>
+ <string name="menu_show_outgoing_only" msgid="1965570298133301970">"Prikaži samo odlazne"</string>
+ <string name="menu_show_incoming_only" msgid="7534206815238877417">"Prikaži samo dolazne"</string>
+ <string name="menu_show_missed_only" msgid="154473166059743996">"Prikaži samo propuštene"</string>
+ <string name="menu_show_voicemails_only" msgid="1898421289561435703">"Prikaži samo govornu poštu"</string>
+ <string name="menu_show_all_calls" msgid="7560347482073345885">"Prikaži sve pozive"</string>
+ <string name="add_2sec_pause" msgid="9214012315201040129">"Dodaj pauzu od 2 sekunde"</string>
+ <string name="add_wait" msgid="3360818652790319634">"Dodaj čekanje"</string>
+ <string name="dialer_settings_label" msgid="4305043242594150479">"Postavke"</string>
+ <string name="menu_newContact" msgid="1209922412763274638">"Novi kontakt"</string>
+ <string name="menu_allContacts" msgid="6948308384034051670">"Svi kontakti"</string>
+ <string name="callDetailTitle" msgid="5340227785196217938">"Detalji o pozivu"</string>
+ <string name="toast_call_detail_error" msgid="6947041258280380832">"Detalji nisu dostupni"</string>
+ <string name="dialer_useDtmfDialpad" msgid="1707548397435075040">"Koristi tastaturu za tonsko biranje"</string>
+ <string name="dialer_returnToInCallScreen" msgid="3719386377550913067">"Povratak na poziv u toku"</string>
+ <string name="dialer_addAnotherCall" msgid="4205688819890074468">"Dodaj poziv"</string>
+ <string name="type_incoming" msgid="6502076603836088532">"Dolazni poziv"</string>
+ <string name="type_outgoing" msgid="343108709599392641">"Odlazni poziv"</string>
+ <string name="type_missed" msgid="2720502601640509542">"Propušteni poziv"</string>
+ <string name="type_incoming_video" msgid="82323391702796181">"Dolazni videopoziv"</string>
+ <string name="type_outgoing_video" msgid="2858140021680755266">"Odlazni videopoziv"</string>
+ <string name="type_missed_video" msgid="954396897034220545">"Propušteni videopoziv"</string>
+ <string name="type_voicemail" msgid="5153139450668549908">"Govorna pošta"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Odbijeni poziv"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokiran poziv"</string>
+ <string name="actionIncomingCall" msgid="6028930669817038600">"Dolazni pozivi"</string>
+ <string name="description_call_log_play_button" msgid="651182125650429846">"Pokretanje govorne pošte"</string>
+ <string name="description_view_contact" msgid="5205669345700598415">"Prikaži kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_call" msgid="3443678121983852666">"Pozovi kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_contact_details" msgid="51229793651342809">"Detalji o kontaktu <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
+ <string name="description_num_calls" msgid="1601505153694540074">"Broj poziva: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
+ <string name="description_video_call" msgid="2933838090743214204">"Videopoziv."</string>
+ <string name="description_send_text_message" msgid="3118485319691414221">"Pošalji SMS kontaktu <xliff:g id="NAME">%1$s</xliff:g>"</string>
+ <string name="description_call_log_unheard_voicemail" msgid="118101684236996786">"Nepreslušana govorna pošta"</string>
+ <string name="description_start_voice_search" msgid="520539488194946012">"Pokreni glasovnu pretragu"</string>
+ <string name="menu_callNumber" msgid="997146291983360266">"Pozovi <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="unknown" msgid="740067747858270469">"Nepoznato"</string>
+ <string name="voicemail" msgid="3851469869202611441">"Govorna pošta"</string>
+ <string name="private_num" msgid="6374339738119166953">"Privatni broj"</string>
+ <string name="payphone" msgid="7726415831153618726">"Telefonska govornica"</string>
+ <string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> u <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
+ <string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Nije moguće pozvati ovaj broj"</string>
+ <string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Da postavite govornu poštu, idite na Meni &gt; Postavke."</string>
+ <string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Da pozovete govornu poštu, isključite Način rada u avionu."</string>
+ <string name="contact_list_loading" msgid="5488620820563977329">"Učitavanje..."</string>
+ <string name="imei" msgid="3045126336951684285">"IMEI"</string>
+ <string name="meid" msgid="6210568493746275750">"MEID"</string>
+ <string name="simContacts_emptyLoading" msgid="6700035985448642408">"Učitavanje sa SIM kartice…"</string>
+ <string name="simContacts_title" msgid="27341688347689769">"Kontakti sa SIM kartice"</string>
+ <string name="add_contact_not_available" msgid="5547311613368004859">"Nije dostupna nijedna aplikacija za kontakte"</string>
+ <string name="voice_search_not_available" msgid="2977719040254285301">"Glasovna pretraga nije dostupna"</string>
+ <string name="call_not_available" msgid="8941576511946492225">"Nije moguće uputiti poziv jer je aplikacija Telefon onemogućena."</string>
+ <string name="activity_not_available" msgid="2287665636817987623">"Na ovom uređaju nema aplikacije za to"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Traži kontakte"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Dodajte broj ili tražite kontakte"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Vaša historija poziva je prazna."</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Pozovi"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nemate propuštenih poziva."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Vaše sanduče govorne pošte je prazno."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Vaša arhiva govorne pošte je prazna."</string>
+ <string name="show_favorites_only" msgid="5520072531022614595">"Prikaži samo favorite"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historija poziva"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arhiva govorne pošte"</string>
+ <string name="call_log_all_title" msgid="3566738938889333307">"Sve"</string>
+ <string name="call_log_missed_title" msgid="4541142293870638971">"Propušteni"</string>
+ <string name="call_log_voicemail_title" msgid="940422274047025948">"Govorna pošta"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo, jednostavnije blokiranje"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Radi bolje zaštite, Telefon treba promijeniti način rada blokiranja. S blokiranih brojeva od sada nećete primati ni pozive ni tekstualne poruke i blokirani brojevi će se moći dijeliti s drugim aplikacijama."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Dozvoli"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blokirati broj <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Pozivi s ovog broja će biti blokirani, a govorna pošta će se automatski brisati."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Pozivi s ovog broja će biti blokirani, ali pozivalac će vam moći ostavljati govornu poštu."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Više nećete primati pozive ili tekstualne poruke s ovog broja."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKIRAJ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Odblokirati broj <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ODBLOKIRAJ"</string>
+ <string name="tab_speed_dial" msgid="7552166276545648893">"Brzo biranje"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historija poziva"</string>
+ <string name="tab_all_contacts" msgid="1410922767166533690">"Kontakti"</string>
+ <string name="tab_voicemail" msgid="155024725947496746">"Govorna pošta"</string>
+ <string name="favorite_hidden" msgid="5011234945140912047">"Uklonjeno iz favorita"</string>
+ <string name="favorite_hidden_undo" msgid="2508998611039406474">"Poništi"</string>
+ <string name="search_shortcut_call_number" msgid="7277194656832895870">"Pozovi <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="search_shortcut_create_new_contact" msgid="1679917465521554093">"Napravi novi kontakt"</string>
+ <string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Dodaj u kontakt"</string>
+ <string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Pošalji SMS"</string>
+ <string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Uputi videopoziv"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokiraj broj"</string>
+ <string name="num_missed_calls" msgid="8081736535604293886">"Broj novih propuštenih poziva: <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="speed_dial_empty" msgid="8838921693673366129">"Još nemate nikog na brzom biranju"</string>
+ <string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Dodaj u favorite"</string>
+ <string name="all_contacts_empty" msgid="471370638298229686">"Još nemate nijedan kontakt"</string>
+ <string name="all_contacts_empty_add_contact_action" msgid="1515782853819374618">"Dodaj kontakt"</string>
+ <string name="contact_tooltip" msgid="2019777545923635266">"Dodirnite sliku da vidite sve brojeve ili dodirnite i držite da promijenite raspored."</string>
+ <string name="remove_contact" msgid="1080555335283662961">"Ukloni"</string>
+ <string name="call_log_action_video_call" msgid="7724301709041128296">"Videopoziv"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Pošalji poruku"</string>
+ <string name="call_log_action_details" msgid="701345508704970622">"Detalji o pozivu"</string>
+ <string name="call_log_action_call" msgid="463690849042459842">"Pozovi kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_incoming_missed_call" msgid="2381085098795943627">"Propušteni poziv od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_incoming_answered_call" msgid="7117665748428816544">"Odgovoreno na poziv od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nepročitana govorna pošta od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Govorna pošta od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_outgoing_call" msgid="6386364390619734734">"Pozovi kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_phone_account" msgid="1767072759541443861">"na <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"preko <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"preko <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"na <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, preko <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> preko <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="description_call_log_call_action" msgid="3682561657090693134">"Pozovi"</string>
+ <string name="description_call_action" msgid="4000549004089776147">"Pozovi kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_video_call_action" msgid="7386922428155062213">"Uputi videopoziv kontaktu <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
+ <string name="description_voicemail_action" msgid="8054891873788903063">"Preslušaj govornu poštu od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_play" msgid="2689369874037785439">"Pokreni govornu poštu od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_pause" msgid="3905259748756919693">"Pauziraj govornu poštu od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_voicemail_delete" msgid="2025472770630153436">"Izbriši govornu poštu od kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <plurals name="description_voicemail_unread" formatted="false" msgid="8708346053055570332">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> nova poruka govorne pošte</item>
+ <item quantity="few"><xliff:g id="COUNT_1">%d</xliff:g> nove poruke govorne pošte</item>
+ <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> novih poruka govorne pošte</item>
+ </plurals>
+ <string name="description_create_new_contact_action" msgid="818755978791008167">"Napravi kontakt za <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="description_add_to_existing_contact_action" msgid="6081200053494414351">"Dodaj <xliff:g id="NAMEORNUMBER">^1</xliff:g> postojećem kontaktu"</string>
+ <string name="description_details_action" msgid="2433827152749491785">"Detalji poziva za <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
+ <string name="toast_entry_removed" msgid="8010830299576311534">"Izbrisano iz historije poziva"</string>
+ <string name="call_log_header_today" msgid="3225248682434212981">"Danas"</string>
+ <string name="call_log_header_yesterday" msgid="9139172458834033092">"Jučer"</string>
+ <string name="call_log_header_other" msgid="5769921959940709084">"Starije"</string>
+ <string name="call_detail_list_header" msgid="3752717059699600861">"Lista poziva"</string>
+ <string name="voicemail_speaker_on" msgid="209154030283487068">"Uključite zvučnik."</string>
+ <string name="voicemail_speaker_off" msgid="7390530056413093958">"Isključivanje zvučnika."</string>
+ <string name="voicemail_play_faster" msgid="3444751008615323006">"Brže pokretanje."</string>
+ <string name="voicemail_play_slower" msgid="4544796503902818832">"Sporije pokretanje.."</string>
+ <string name="voicemail_play_start_pause" msgid="3687447935787768983">"Pokreni ili pauziraj pokretanje"</string>
+ <string name="list_delimeter" msgid="4571593167738725100">", "</string>
+ <string name="display_options_title" msgid="7812852361055667468">"Opcije prikaza"</string>
+ <string name="sounds_and_vibration_title" msgid="1692290115642160845">"Zvukovi i vibracija"</string>
+ <string name="accessibility_settings_title" msgid="6068141142874046249">"Pristupačnost"</string>
+ <string name="ringtone_title" msgid="760362035635084653">"Melodija zvona telefona"</string>
+ <string name="vibrate_on_ring_title" msgid="3362916460327555241">"Također vibriraj za pozive"</string>
+ <string name="dtmf_tone_enable_title" msgid="6571449695997521615">"Tonovi telefonske tipkovnice"</string>
+ <string name="dtmf_tone_length_title" msgid="8581125689808919460">"Dužina tonova telefonske tipkovnice"</string>
+ <string-array name="dtmf_tone_length_entries">
+ <item msgid="1036113889050195575">"Normalno"</item>
+ <item msgid="6177579030803486015">"Dugo"</item>
+ </string-array>
+ <string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Brzi odgovori"</string>
+ <string name="call_settings_label" msgid="313434211353070209">"Pozivi"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokiranje poziva"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokiranje poziva je privremeno isključeno"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blokiranje poziva je onemogućeno jer ste kontaktirali hitnu službu s ovog telefona u proteklih 48 sati. Automatski će se ponovo omogućiti kada istekne 48 sati."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Uvezi brojeve"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ranije ste označili da se neki pozivaoci automatski šalju na govornu poštu preko drugih aplikacija."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Prikaži brojeve"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Uvezi"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Uvoz nije uspio"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Arhiviranje govorne pošte nije uspjelo."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Odblokiraj broj"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Dodaj broj"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Pozivi s ovih brojeva će biti blokirani, a govorna pošta će se automatski brisati."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Pozivi s ovih brojeva će biti blokirani, ali pozivaoci će vam moći ostavljati govornu poštu."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokirani brojevi"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> je nevažeći."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> je već blokiran."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokiranje poziva je onemogućeno na 48 sati"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Onemogućeno jer je upućen hitni poziv."</string>
+ <string name="phone_account_settings_label" msgid="5864322009841175294">"Računi za pozivanje"</string>
+ <string name="permission_single_turn_on" msgid="1543391076065465464">"Uključi"</string>
+ <string name="permission_multiple_turn_on" msgid="2426278457455950554">"Postavi dozvole"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Da omogućite brzo biranje, uključite dozvolu za Kontakte."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Da vidite popis poziva, uključite dozvolu za Telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Da vidite kontakte, uključite dozvolu za Kontakte."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Da pristupite govornoj pošti,uključite dozvolu za telefon."</string>
+ <string name="permission_no_search" msgid="84152933267902056">"Da pretražujete kontakte, uključite dozvole za Kontakte."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Da uputite poziv, uključite dozvolu za Telefon."</string>
+ <string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikacija za telefon nema dozvolu za pisanje u postavkama sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokirano"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Osoba <xliff:g id="NAMEORNUMBER">^1</xliff:g> je aktivna"</string>
+</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6bb8f0bf1..84e17a414 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telèfon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telèfon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclat del telèfon"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telèfon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historial de trucades"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Truca a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Informa d\'un número incorrecte"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edita el número abans de trucar"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Afegeix a un contacte"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Suprimeix de l\'historial de trucades"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Esborra l\'historial de trucades"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Suprimeix missatge de veu"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Comparteix la bústia de veu"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"El registre de trucades està buit"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Fes una trucada"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historial de trucades"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Informa d\'un número incorrecte"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copia el número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copia la transcripció"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloqueja el número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"S\'ha bloquejat el número <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloqueja el número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"S\'ha desbloquejat el número <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESFÉS"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Suprimeix"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edita el número abans de trucar"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Esborra l\'historial de trucades"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Suprimeix la bústia de veu"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arxiva el missatge de veu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Comparteix el missatge de veu"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Correu de veu suprimit"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Missatge de veu arxivat"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESFÉS"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"OBRE ARXIU"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Esborrar l\'historial de trucades?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Se suprimiran totes les trucades de l\'historial."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Esborrant historial de trucades..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telèfon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Trucada perduda"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Trucada perduda de feina"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Trucades perdudes"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> trucades perdudes"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Torna la trucada"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Missatge"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> bústies de veu </item>
<item quantity="one">Bústia de veu</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nou missatge de veu de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Error en reproduir el missatge de veu."</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"S\'està emmagatzemant a mem. intermèd.…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"S\'està carregant la bústia de veu..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"S\'estan arxivant els missatges de veu…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"No s\'ha pogut carregar la bústia de veu."</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Només trucades amb bústia de veu"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Només trucades entrants"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historial de trucades"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Més opcions"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclat"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copia"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostra només trucades sortints"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostra només trucades entrants"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostra només trucades perdudes"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videotrucada sortint"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videotrucada perduda"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Bústia de veu"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Trucada rebutjada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Trucada bloquejada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Trucades entrants"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reprodueix el missatge de veu"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualitza el contacte <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Truca a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Dades de contacte de: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Missatge de veu nou"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> trucades"</string>
<string name="description_video_call" msgid="2933838090743214204">"Videotrucada"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Envia un SMS a <xliff:g id="NAME">%1$s</xliff:g>."</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telèfon públic"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> a les <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"No es pot trucar a aquest número."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Per configurar la bústia de veu, vés a Menú &gt; Configuració."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Per trucar a la bústia de veu, primer has de desactivar el mode d\'avió."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"La cerca per veu no està disponible."</string>
<string name="call_not_available" msgid="8941576511946492225">"No es pot fer una trucada telefònica perquè s\'ha desactivat l\'aplicació de telèfon."</string>
<string name="activity_not_available" msgid="2287665636817987623">"No hi ha cap aplicació per a això en aquest dispositiu."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Escriu un nom o un telèfon"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"No tens cap trucada perduda."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"La safata d\'entrada de la bústia de veu està buida."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Cerca contactes"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Afegeix núm. o cerca contactes"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"El teu historial de trucades és buit"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Fes una trucada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"No tens cap trucada perduda."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"La safata d\'entrada de la bústia de veu està buida."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"L\'arxiu de missatges de veu està buit."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostra només els preferits"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historial"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historial de trucades"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arxiu de missatges de veu"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Totes"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perdudes"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Missatge de veu"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Bloqueig nou i simplificat"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Per protegir-te millor, l\'aplicació Telèfon ha de canviar la manera com funciona el bloqueig. No rebràs trucades ni missatges de text dels números bloquejats, i pot ser que compartim aquests números amb altres aplicacions."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permet"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Vols bloquejar el número <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Es bloquejaran les trucades d\'aquest número i els missatges de veu se suprimiran automàticament."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Es bloquejaran les trucades d\'aquest número, però és possible que continuïn deixant-te missatges de veu."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Deixaràs de rebre trucades i missatges de text d\'aquest número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEJA"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Vols desbloquejar el número <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEJA"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Marcatge ràpid"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recents"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historial de trucades"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contactes"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Bústia de veu"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Eliminat dels preferits"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Afegeix a un contacte"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Envia SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Fes una videotrucada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Consulta tot l\'historial de trucades"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloqueja el número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> trucades perdudes noves"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Encara no tens cap contacte al marcatge ràpid"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Afegeix un preferit"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toca la imatge per veure tots els números i toca-la i mantén-la premuda per reordenar-los."</string>
<string name="remove_contact" msgid="1080555335283662961">"Suprimeix"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videotrucada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Envia un missatge"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Envia un missatge"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalls de la trucada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Truca a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Trucada perduda de: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Trucada resposta de: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Missatge de veu no escoltat del contacte <xliff:g id="NAMEORNUMBER">^1</xliff:g>: <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Missatge de veu del contacte <xliff:g id="NAMEORNUMBER">^1</xliff:g>: <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Trucada a <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"a <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"al número <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"al número <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"a <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, al número <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> al número <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Truca"</string>
<string name="description_call_action" msgid="4000549004089776147">"Truca a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videotrucada amb <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respostes ràpides"</string>
<string name="call_settings_label" msgid="313434211353070209">"Trucades"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueig de trucades"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bloqueig de trucades desactivat tempor."</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"El bloqueig de trucades s\'ha desactivat perquè has contactat amb els serveis d\'emergència des d\'aquest telèfon durant les últimes 48 hores. Es tornarà a activar automàticament una vegada transcorregut el període de 48 hores."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importa els números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Has indicat que les trucades d\'alguns contactes s\'enviïn automàticament a la bústia de veu mitjançant altres aplicacions."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Mostra els números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importa"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Error en la importació"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Error en arxivar el missatge de veu."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloqueja el número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Afegeix un número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Es bloquejaran les trucades d\'aquests números i els missatges de veu se suprimiran automàticament."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Es bloquejaran les trucades d\'aquests números, però és possible que continuïn deixant-te missatges de veu."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloquejats"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> no és vàlid."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ja està bloquejat."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"El bloqueig de trucades s\'ha desactivat durant 48 hores"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"S\'ha desactivat perquè s\'ha fet una trucada d\'emergència."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Comptes de trucades"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activa"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Defineix els permisos"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Per activar el marcatge ràpid,\n activa el permís de Contactes."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Per veure el registre de trucades,\nactiva el permís Telèfon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Per veure els contactes,\nactiva el permís Contactes."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Per accedir a la bústia de veu,\nactiva el permís Telèfon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Activa el permís Contactes per activar el marcatge ràpid."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Activa el permís Telèfon per veure el teu registre de trucades."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Activa el permís Contactes per veure els teus contactes."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Activa el permís Telèfon per accedir a la bústia de veu."</string>
<string name="permission_no_search" msgid="84152933267902056">"Per cercar els teus contactes, activa els permisos de Contactes."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Per fer una trucada,\nactiva el permís Telèfon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Activa el permís Telèfon per fer una trucada."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"L\'aplicació Telèfon no té permís per escriure a la configuració del sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloquejat"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> és la trucada activa"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 9493c54ae..268faaa04 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Číselník telefonu"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historie volání"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Volat kontakt <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Nahlásit nesprávné číslo"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Před voláním upravit číslo"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Přidat ke kontaktu"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Smazat z historie volání"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Vymazat historii volání"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Smazat hlasovou zprávu"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Sdílet hlasovou schránku"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Seznam hovorů je prázdný"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Uskutečnit hovor"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historie volání"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Nahlásit nesprávné číslo"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopírovat číslo"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopírovat přepis"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokovat číslo"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Číslo <xliff:g id="NUMBER">%1$s</xliff:g> zablokováno"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Zrušit blokování čísla"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Číslo <xliff:g id="NUMBER">%1$s</xliff:g> odblokováno"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"VRÁTIT"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Smazat"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Před voláním upravit číslo"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Vymazat historii volání"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Smazat hlasovou zprávu"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archivovat hlasovou zprávu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Sdílet hlasovou zprávu"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Hlas. zpráva smazána"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Hlasová zpráva archivována"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"VRÁTIT"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"DO ARCHIVU"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Vymazat historii hovorů?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Tímto z historie smažete všechny hovory."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Mazání historie volání…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Zmeškaný hovor"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Zmeškaný pracovní hovor"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Zmeškané hovory"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Zavolat zpět"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Zpráva"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> hlasové zprávy </item>
<item quantity="many"> <xliff:g id="COUNT">%1$d</xliff:g> hlasové zprávy </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nová hlasová zpráva – <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Hlasovou schránku nelze přehrát."</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Ukládání do vyrovnávací paměti…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Načítání hlasové schránky…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archivace hlasové zprávy…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Hlasovou schránku nelze načíst."</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Jen hovory s hlasovou schránkou"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Jen příchozí hovory"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historie volání"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Více možností"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"číselník"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopírovat"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Zobrazit pouze odchozí"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Zobrazit pouze příchozí"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Zobrazit pouze zmeškané"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Odchozí videohovor"</string>
<string name="type_missed_video" msgid="954396897034220545">"Zmeškaný videohovor"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Hlasová schránka"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Zamítnutý hovor"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokovaný hovor"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Příchozí volání"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Přehrát hlasovou schránku"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Zobrazit kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Volat kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Podrobnosti kontaktu pro <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nová hlasová zpráva"</string>
<string name="description_num_calls" msgid="1601505153694540074">"Počet hovorů: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>"</string>
<string name="description_video_call" msgid="2933838090743214204">"Videohovor"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Odeslat zprávu SMS kontaktu <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefonní automat"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> v <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Na toto číslo nelze volat."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Chcete-li nastavit hlasovou schránku, přejděte do části Menu &gt; Nastavení."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Chcete-li volat hlasovou schránku, nejdříve vypněte režim Letadlo."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Hlasové vyhledávání není k dispozici."</string>
<string name="call_not_available" msgid="8941576511946492225">"Telefonický hovor nelze uskutečnit, protože aplikace Telefon byla zakázána."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Pro tuto akci v zařízení nemáte žádnou aplikaci."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Zadejte jméno nebo tel. číslo."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nemáte žádné zmeškané hovory."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Hlasová schránka je prázdná."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Prohledat kontakty"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Přidejte číslo nebo vyhledejte kontakty"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Historie volání je prázdná"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Zavolat"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nemáte žádné zmeškané hovory."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Hlasová schránka je prázdná."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Archiv vašich hlasových zpráv je prázdný."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Zobrazit pouze oblíbené"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historie"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historie volání"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archiv hlasových zpráv"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Všechny"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Zmeškané"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Schránka"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nové zjednodušené blokování"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Z důvodu zvýšení zabezpečení potřebuje aplikace Telefon změnit nastavení blokování. Blokovaná čísla vám nyní nebudou moci volat ani psát SMS a mohou být sdílena s dalšími aplikacemi."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Povolit"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blokovat číslo <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Volání z tohoto čísla budou zablokována. Hlasové zprávy budou automaticky smazány."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Volání z tohoto čísla budou zablokována, avšak volající vám bude moci zanechat hlasovou zprávu."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Z tohoto čísla už nebudete přijímat hovory ani zprávy SMS."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKOVAT"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Odblokovat číslo <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ODBLOKOVAT"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Rychlá volba"</string>
- <string name="tab_recents" msgid="929949073851377206">"Poslední"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historie volání"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakty"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Hlasová schránka"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Odebráno z oblíbených"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Přidat ke kontaktu"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Odeslat SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Uskutečnit videohovor"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Zobrazit celou historii volání"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokovat číslo"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Nové zmeškané hovory: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"V rychlém vytáčení zatím nemáte žádný kontakt."</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Přidat oblíbený kontakt"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Klepnutím na obrázek zobrazíte všechna čísla. Klepnutím a podržením upravíte uspořádání."</string>
<string name="remove_contact" msgid="1080555335283662961">"Odstranit"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videohovor"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Odeslat zprávu"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Odeslat zprávu"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Podrobnosti hovoru"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Volat kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Nepřijatý hovor: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Přijatý hovor: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nepřečtená hlasová zpráva od <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Hlasová zpráva od <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Odchozí hovor: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"v účtu <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"z čísla <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"z čísla <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"na účet <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, z čísla <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"na účet <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, z čísla <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Volat"</string>
<string name="description_call_action" msgid="4000549004089776147">"Volat kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videohovor s kontaktem <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Rychlé odpovědi"</string>
<string name="call_settings_label" msgid="313434211353070209">"Volání"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokování hovorů"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokování hovorů je dočasně vypnuto"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Protože jste z tohoto telefonu během posledních 48 hodin volali na tísňovou linku, bylo blokování hovorů vypnuto. Po uplynutí 48 hodin se automaticky znovu zapne."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importovat čísla"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Pomocí dalších aplikací jste dříve některé volající označili k automatickému přesměrování do hlasové schránky."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Zobrazit čísla"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importovat"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import se nezdařil."</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Hlasovou zprávu se nepodařilo archivovat"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Zrušit blokování čísla"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Přidat číslo"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Volání z těchto čísel budou zablokována. Hlasové zprávy budou automaticky smazány."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Volání z těchto čísel budou zablokována, avšak volající vám budou moci zanechat hlasovou zprávu."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokovaná čísla"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Číslo <xliff:g id="NUMBER">%1$s</xliff:g> je neplatné."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Číslo <xliff:g id="NUMBER">%1$s</xliff:g> je již blokováno."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokování hovorů je vypnuto na 48 hodin"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Vypnuto z důvodu provedeného tísňového volání"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Účty pro volání"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Zapnout"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Nastavit oprávnění"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Chcete-li povolit rychlé vytáčení,\n zapněte oprávnění Kontakty."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Chcete-li zobrazit seznam hovorů,\n zapněte oprávnění Telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Chcete-li zobrazit kontakty,\n zapněte oprávnění Kontakty."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Chcete-li používat hlasovou schránku,\n zapněte oprávnění Telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Chcete-li povolit rychlé vytáčení, aktivujte oprávnění Kontakty."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Chcete-li zobrazit seznam hovorů, aktivujte oprávnění Telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Chcete-li zobrazit kontakty, aktivujte oprávnění Kontakty."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Chcete-li přejít do hlasové schránky, aktivujte oprávnění Telefon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Chcete-li vyhledat kontakty, zapněte oprávnění Kontakty."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Chcete-li uskutečnit hovor,\n zapněte oprávnění Telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Chcete-li uskutečnit hovor, aktivujte oprávnění Telefon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikace Telefon nemá oprávnění provádět zápis do nastavení systému."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokováno"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> je aktivní"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index e867e018c..e90e919d8 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Opkald"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Opkald"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefontastatur"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Opkald"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Opkaldshistorik"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ring til <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Rapportér et forkert nummer"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Rediger nummer inden opkald"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Føj til en kontaktperson"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Slet fra opkaldshistorik"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Ryd opkaldshistorik"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Slet telefonsvarerbesked"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Del telefonsvarerbesked"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Din opkaldsliste er tom"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Foretag et opkald"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Opkaldshistorik"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Rapportér et forkert nummer"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiér nummeret"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiér transskriptionen"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloker nummeret"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> er blokeret"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Ophæv blokering af nummeret"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> er ikke blokeret"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"FORTRYD"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Slet"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Rediger nummeret før opkald"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Ryd opkaldshistorik"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Slet talemeddelelsen"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arkivér talebesked"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Del talebeskeden"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Talebeskeden blev slettet"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Talebeskeden blev arkiveret"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"FORTRYD"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"GÅ TIL ARKIV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Vil du rydde opkaldshistorikken?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Dette vil slette alle opkald fra din historik"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Opkaldshistorik ryddes..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Ubesvaret opkald"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Ubesvaret arbejdsopkald"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Ubesvarede opkald"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ubesvarede opkald"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Ring tilbage"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Besked"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> talebeskeder </item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> talebeskeder </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Ny besked fra <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Telefonsvarerbesked kan ikke afspilles"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Gemmer i buffer..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Telefonsvarerbesked indlæses..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arkiverer talebeskeden…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Telefonsvarerbesked kan ikke indlæses"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Kun opkald med telefonsvarer"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Kun indgående opkald"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Opkaldshistorik"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Flere valgmuligheder"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tastatur"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiér"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Vis kun udgående"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Vis kun indgående"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Vis kun ubesvarede"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Udgående videoopkald"</string>
<string name="type_missed_video" msgid="954396897034220545">"Ubesvaret videoopkald"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Telefonsvarer"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Afvist opkald"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokeret opkald"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Indgående opkald"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Afspil telefonsvarerbesked"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Vis kontaktpersonen <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ring til <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktoplysninger for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Ny talebesked."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> opkald."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videoopkald."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Send sms-besked til <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Mønttelefon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Det er ikke muligt at ringe til dette nummer"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Hvis du vil konfigurere telefonsvareren, skal du gå til Menu &gt; Indstillinger."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Hvis du vil ringe til telefonsvareren, skal du først slå Flytilstand fra."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Talesøgning er ikke tilgængelig"</string>
<string name="call_not_available" msgid="8941576511946492225">"Det er ikke muligt at foretage et telefonopkald, fordi applikationen Telefon er deaktiveret."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Der findes Ingen app til det på denne enhed"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Indtast et navn eller telefonnummer"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Du har ingen ubesvarede opkald."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Indbakken for din telefonsvarer er tom."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Søg efter kontaktpersoner"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Tilføj nummer, eller søg i kontaktpersoner"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Din opkaldshistorik er tom"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Foretag et opkald"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Du har ingen ubesvarede opkald."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Indbakken for din telefonsvarer er tom."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Dit arkiv med talebeskeder er tomt."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Vis kun foretrukne"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historik"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Opkaldshistorik"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arkiv med talebeskeder"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Alle"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Ubesvarede"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Talebesked"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Ny, forenklet blokering"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Phone er nødt til at ændre, hvordan blokering fungerer, for bedre at kunne beskytte dig. Dine blokerede numre forhindrer både opkald og sms-beskeder, og de kan muligvis deles med andre apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Tillad"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Vil du blokere <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Opkald fra dette nummer blokeres, og beskeder i telefonsvareren slettes automatisk."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Opkald fra dette nummer bliver blokeret, men der kan muligvis stadig lægges beskeder i din telefonsvarer."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Du modtager ikke længere opkald eller sms-beskeder fra dette nummer."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKER"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Vil du fjerne blokeringen af <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"FJERN BLOKERING"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Hurtigopkald"</string>
- <string name="tab_recents" msgid="929949073851377206">"Seneste"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Opkaldshistorik"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktpersoner"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Telefonsvarer"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Fjernet fra foretrukne"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Føj til en kontaktperson"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Send sms"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Foretag videoopkald"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Se komplet opkaldshistorik"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloker nummer"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nye ubesvarede opkald"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Der er endnu ingen kontaktpersoner i Hurtigopkald"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Angiv en kontaktperson som foretrukken"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Tryk på billedet for at se alle numre, eller tryk på billedet, og hold det nede for at omarrangere"</string>
<string name="remove_contact" msgid="1080555335283662961">"Fjern"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videoopkald"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Send besked"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Send en sms-besked"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Opkaldsinfo"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Ring til <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Mistet opkald fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Besvaret opkald fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ulæst talebesked fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Talebesked fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Ring til <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"på <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"til <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Ring op"</string>
<string name="description_call_action" msgid="4000549004089776147">"Ring til <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videoopkald <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Hurtige svar"</string>
<string name="call_settings_label" msgid="313434211353070209">"Opkald"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Opkaldsblokering"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Opkaldsblokering er midlertidigt slået fra"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Opkaldsblokering er blevet deaktiveret, da du inden for de sidste 48 timer har kontaktet en alarmcentral. Blokeringen aktiveres automatisk igen, når perioden på 48 timer er udløbet."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importér numre"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Du har tidligere angivet, at nogle opkaldere automatisk skal sendes til telefonsvareren via andre apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Se numre"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importér"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importen mislykkedes"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Talebeskeden kunne ikke arkiveres."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Ophæv blokering af nummer"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Tilføj nummer"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Opkald fra disse numre blokeres, og beskeder i telefonsvareren slettes automatisk."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Opkald fra disse numre bliver blokeret, men der kan muligvis stadig lægges beskeder i din telefonsvarer."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokerede telefonnumre"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> er ugyldigt."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> er allerede blokeret."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Opkaldsblokering er blevet deaktiveret i 48 timer"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Deaktiveret, da du har foretaget et nødopkald."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Opkaldskonti"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktivér"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Angiv tilladelser"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"For at aktivere hurtigopkald\n skal du slå tilladelsen Kontaktpersoner til."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"For at se din opkaldsliste skal du\n slå tilladelsen Telefon til."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"For at se dine kontaktpersoner skal du\n slå tilladelsen Kontaktpersoner til."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"For at få adgang til din telefonsvarer skal du\n slå tilladelsen Telefon til."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Slå tilladelsen Kontaktpersoner til for at aktivere hurtigopkald."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Slå tilladelsen Telefon til for at se din opkaldsliste."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Slå tilladelsen Kontaktpersoner til for at se dine kontaktpersoner."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Slå tilladelsen Telefon til for at få adgang til din telefonsvarer,"</string>
<string name="permission_no_search" msgid="84152933267902056">"Hvis du vil søge i dine kontaktpersoner, skal du slå tilladelserne Kontaktpersoner til."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"For at foretage et opkald skal du \n slå tilladelsen Telefon til."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Slå tilladelsen Telefon til for at foretage et opkald."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Opkaldsappen har ikke tilladelse til at ændre systemindstillinger."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokeret"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> er aktivt"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 9a03d4e18..98d9318c0 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Wähltasten verwenden"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Anrufliste"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> anrufen"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Falsche Nummer melden"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Nr. vor Anruf bearbeiten"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Zu einem Kontakt hinzufügen"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Von Anrufliste löschen"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Anrufliste löschen"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Mailbox-Nachricht löschen"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Mailbox-Nachricht teilen"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Deine Anrufliste ist leer."</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Anrufen"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Anrufliste"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Falsche Nummer melden"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Nummer kopieren"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Transkription kopieren"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Nummer blockieren"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blockiert"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Blockierung der Nummer aufheben"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Blockierung von <xliff:g id="NUMBER">%1$s</xliff:g> aufgehoben"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"Rückgängig"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Löschen"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Nummer vor Anruf bearbeiten"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Anrufliste löschen"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Mailbox-Nachricht löschen"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Mailbox-Nachricht archivieren"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Mailbox-Nachricht teilen"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Mailbox gelöscht"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Mailbox-Nachricht archiviert"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"Rückgängig"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ZUM ARCHIV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Anrufliste löschen?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Alle Anrufe werden aus deinem Verlauf gelöscht."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Anrufliste wird gelöscht…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Verpasster Anruf"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Verpasster geschäftlicher Anruf"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Verpasste Anrufe"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> verpasste Anrufe"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Zurückrufen"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Nachricht"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Mailbox-Nachrichten </item>
<item quantity="one">Mailbox-Nachricht</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Neue Mailbox-Nachricht von <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Mailbox-Nachricht-Wiedergabe nicht möglich"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Pufferung ..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Mailbox-Nachricht wird geladen…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Mailbox-Nachricht wird archiviert…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Laden der Mailbox-Nachricht nicht möglich"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Nur Mailbox-Anrufe"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Nur eingehende Anrufe"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Anrufliste"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Mehr Optionen"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"Wähltasten"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopieren"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Nur ausgehende Anrufe anzeigen"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Nur eingehende Anrufe anzeigen"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Nur entgangene Anrufe anzeigen"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Ausgehender Videoanruf"</string>
<string name="type_missed_video" msgid="954396897034220545">"Entgangener Videoanruf"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Mailbox"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Abgelehnter Anruf"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blockierter Anruf"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Eingehende Anrufe"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Mailbox abhören"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Kontakt <xliff:g id="NAME">%1$s</xliff:g> anzeigen"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> anrufen"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktdetails für <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Neue Mailbox-Nachricht"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> Anrufe"</string>
<string name="description_video_call" msgid="2933838090743214204">"Videoanruf"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"SMS an <xliff:g id="NAME">%1$s</xliff:g> senden"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Münztelefon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> um <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Diese Nummer kann nicht angerufen werden."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Konfiguriere deine Mailbox unter \"Menü\" &gt; \"Einstellungen\"."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Deaktiviere zunächst den Flugmodus, um die Mailbox anzurufen."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Sprachsuche nicht verfügbar"</string>
<string name="call_not_available" msgid="8941576511946492225">"Es kann kein Anruf getätigt werden, da die App \"Telefon\" deaktiviert wurde."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Keine entsprechende App auf diesem Gerät"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Namen/Telefonnummer eingeben"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Keine verpassten Anrufe"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Dein Mailbox-Posteingang ist leer."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"In Kontakten suchen"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Nummer hinzufügen oder in Kontakten suchen"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Deine Anrufliste ist leer."</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Anrufen"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Keine verpassten Anrufe"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Dein Mailbox-Posteingang ist leer."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Das Archiv für Mailbox-Nachrichten ist leer."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Nur Favoriten anzeigen"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Verlauf"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Anrufliste"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archiv für Mailbox-Nachrichten"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Alle"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Entgangen"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Mailbox-Nachrichten"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Neue einfache Blockierfunktion"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Um dich besser schützen zu können, müssen die Einstellungen der Blockierung beim Telefon geändert werden. Von blockierten Nummern erhältst du jetzt keine Anrufe und Nachrichten mehr und diese Nummern können auch an andere Apps weitergegeben werden."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Zulassen"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> blockieren?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Anrufe von dieser Nummer werden blockiert und Mailbox-Nachrichten automatisch gelöscht."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Anrufe von dieser Nummer werden blockiert. Der Anrufer hat aber unter Umständen weiterhin die Möglichkeit, dir Mailbox-Nachrichten zu hinterlassen."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Du erhältst von dieser Nummer keine Anrufe oder Nachrichten mehr."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCKIEREN"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Blockierung von <xliff:g id="NUMBER">%1$s</xliff:g> aufheben?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"BLOCKIERUNG AUFHEBEN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Schnellauswahl"</string>
- <string name="tab_recents" msgid="929949073851377206">"Neueste"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Anrufliste"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakte"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Mailbox"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Aus Favoriten entfernt"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Zu Kontakt hinzufügen"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS senden"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Videoanruf starten"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Gesamte Anrufliste ansehen"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Nummer blockieren"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> neue verpasste Anrufe"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Du hast noch für niemanden eine Kurzwahl festgelegt."</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Favoriten hinzufügen"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Bild berühren, um alle Nummern zu sehen, oder Bild berühren und halten, um sie neu anzuordnen"</string>
<string name="remove_contact" msgid="1080555335283662961">"Entfernen"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videoanruf"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Nachricht senden"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"SMS senden"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Anrufdetails"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> anrufen"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Anruf von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> verpasst"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Anruf von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> angenommen"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ungelesene Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Mailbox-Nachricht von <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Ausgehender Anruf an <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_phone_account" msgid="1767072759541443861">"mit <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"über <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"über <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"mit <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, über <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> über <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Anrufen"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> anrufen"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> über Videoanruf anrufen"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Kurzantworten"</string>
<string name="call_settings_label" msgid="313434211353070209">"Anrufe"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Anrufblockierung"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Anrufblockierung vorübergehend aus"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Die Anrufblockierung wurde deaktiviert, weil du innerhalb der letzten 48 Stunden mit diesem Telefon den Notruf gewählt hast. Nach Ablauf dieser 48-Stunden-Frist wird die Blockierung automatisch wieder aktiviert."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Nummern importieren"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Du hast zuvor einige Anrufer markiert, die automatisch über andere Apps an die Mailbox gesendet werden."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Nummern anzeigen"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importieren"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import fehlgeschlagen"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Mailbox-Nachricht nicht archiviert."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Blockierung der Nummer aufheben"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Nummer hinzufügen"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Anrufe von diesen Nummern werden blockiert und Mailbox-Nachrichten automatisch gelöscht."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Anrufe von diesen Nummern werden blockiert. Die Anrufer haben aber unter Umständen weiterhin die Möglichkeit, dir Mailbox-Nachrichten zu hinterlassen."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blockierte Nummern"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ist ungültig."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ist bereits blockiert."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Anrufblockierung für 48 Stunden deaktiviert"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Deaktiviert, da ein Notruf getätigt wurde."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Anrufkonten"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktivieren"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Berechtigungen festlegen"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Aktiviere die Berechtigung \"Kontakte\",\num die Kurzwahlfunktion zu verwenden."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Aktiviere die Berechtigung\n\"Telefon\", um dein Anrufprotokoll abzurufen."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Aktiviere die Berechtigung\n\"Kontakte\", um deine Kontakte abzurufen."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Aktiviere die Berechtigung\n\"Telefon\", um auf deine Mailbox zuzugreifen."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Aktiviere die Berechtigung \"Kontakte\", um die Kurzwahlfunktion zu verwenden."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Aktiviere die Berechtigung \"Telefon\", um dein Anrufprotokoll abzurufen."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Aktiviere die Berechtigung \"Kontakte\", um deine Kontakte abzurufen."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Aktiviere die Berechtigung \"Telefon\", um auf deine Mailbox zuzugreifen."</string>
<string name="permission_no_search" msgid="84152933267902056">"Aktiviere die Berechtigungen \"Kontakte\", um deine Kontakte zu suchen."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Aktiviere die Berechtigung\n\"Telefon\", um anzurufen."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Aktiviere die Berechtigung \"Telefon\", um einen Anruf zu tätigen."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Die App \"Telefon\" ist nicht berechtigt, die Systemeinstellungen zu überschreiben."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blockiert"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ist aktiv"</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index bc73ee0c6..efb0498b4 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Τηλέφωνο"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Τηλέφωνο"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Πληκτρολόγιο κλήσης τηλεφώνου"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Τηλέφωνο"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Ιστορικό κλήσεων"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Κλήση <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Αναφορά ανακριβούς αριθμού"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Επεξεργασία αριθμού πριν την κλήση"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Προσθήκη σε μια επαφή"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Διαγραφή από το ιστορικό κλήσεων"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Διαγραφή ιστορικού κλήσεων"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Διαγραφή αυτόματου τηλεφωνητή"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Κοινή χρήση αυτόμ. τηλεφωνητή"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Το αρχείο καταγραφής κλήσεων είναι κενό"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Πραγματοποίηση κλήσης"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Ιστορικό κλήσεων"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Αναφορά ανακριβούς αριθμού"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Αντιγραφή αριθμού"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Αντιγραφή μεταγραφής"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Αποκλεισμός αριθμού"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Ο αριθμός <xliff:g id="NUMBER">%1$s</xliff:g> αποκλείστηκε"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Κατάργηση αποκλεισμού αριθμού"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Ο αποκλεισμός του αριθμού <xliff:g id="NUMBER">%1$s</xliff:g> καταργήθηκε"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ΑΝΑΙΡΕΣΗ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Διαγραφή"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Επεξεργασία αριθμού πριν την κλήση"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Διαγραφή ιστορικού κλήσεων"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Διαγραφή αυτόματου τηλεφωνητή"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Αρχειοθ. μην. αυτόμ. τηλεφων."</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Κοινή χρήση αυτόμ. τηλεφωνητή"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Μήν.αυτ. τηλ. διαγρ."</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Μήν. αυτ. τηλεφ. αρχειοθετήθ."</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ΑΝΑΙΡΕΣΗ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ΜΤΒ ΣΕ ΑΡΧ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Διαγραφή ιστορικού κλήσεων;"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Αυτό θα διαγράψει όλες τις κλήσεις από το ιστορικό σας"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Διαγραφή ιστορικού κλήσεων…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Τηλέφωνο"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Αναπάντητη κλήση"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Αναπάντητη κλήση εργασίας"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Αναπάντητες κλήσεις"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> αναπάντητες κλήσεις"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Επανάκληση"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Μήνυμα"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Μηνύματα αυτόμ. τηλεφωνητή </item>
<item quantity="one">Μήνυμα αυτόματου τηλεφωνητή</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Νέα μην. αυτ. τηλεφ. από <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Αδύνατη αναπαραγωγή φωνητικού μηνύματος"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Αποθ. στη πρ. μνήμη"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Φόρτωση φωνητικών μηνυμάτων…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Αρχειοθέτηση μηνυμ. αυτόμ. τηλεφωνητή…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Αδύνατη φόρτωση φωνητικών μηνυμάτων"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Μόνο κλήσεις με ηχητικά μηνύματα"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Μόνο εισερχόμενες κλήσεις"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Ιστορικό κλήσεων"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Περισσότερες επιλογές"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"πληκτρολόγιο κλήσης"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Αντιγραφή"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Εμφάνιση μόνο εξερχόμενων"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Εμφάνιση μόνο εισερχόμενων"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Εμφάνιση μόνο αναπάντητων"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Εξερχόμενη βιντεοκλήση"</string>
<string name="type_missed_video" msgid="954396897034220545">"Αναπάντητη βιντεοκλήση"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Αυτόματος τηλεφωνητής"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Απορριφθείσα κλήση"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Αποκλεισμένη κλήση"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Εισερχόμενες κλήσεις"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Αναπαραγωγή μηνύματος αυτόματου τηλεφωνητή"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Προβολή επαφής <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Κλήση του χρήστη <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Στοιχεία επικοινωνίας του <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Νέο μήνυμα στον αυτόματο τηλεφωνητή."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> κλήσεις."</string>
<string name="description_video_call" msgid="2933838090743214204">"Βιντεοκλήση."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Αποστολή SMS στο χρήστη <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Τηλέφωνο με χρέωση"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> δευτερόλεπτα"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> λεπτά <xliff:g id="SECONDS">%s</xliff:g> δευτερόλεπτα"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> στις <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Δεν μπορείτε να καλέσετε αυτόν τον αριθμό"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Για τη r;yumish του αυτόματου τηλεφωνητή, μεταβείτε στο στοιχείο Μενού &gt; Ρυθμίσεις."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Για κλήση αυτόματου τηλεφωνητή, πρώτα απενεργοποιήστε τη λειτουργία πτήσης."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Η φωνητική αναζήτηση δεν είναι διαθέσιμη"</string>
<string name="call_not_available" msgid="8941576511946492225">"Δεν είναι δυνατή η πραγματοποίηση τηλεφωνικής κλήσης επειδή η εφαρμογή \"Τηλέφωνο\" έχει απενεργοποιηθεί."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Δεν υπάρχει εφαρμογή γι\' αυτήν την ενέργεια σε αυτήν τη συσκευή"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Εισαγάγετε όνομα ή τηλέφωνο"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Δεν υπάρχουν αναπάντητες κλήσεις."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Ο φάκελος εισερχομένων του αυτόματου τηλεφωνητή σας είναι κενός."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Αναζήτηση στις επαφές"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Προσθήκη αριθμού ή αναζήτηση επαφών"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Το ιστορικό κλήσεων είναι κενό"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Πραγματοποίηση κλήσης"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Δεν υπάρχουν αναπάντητες κλήσεις."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Ο φάκελος εισερχομένων του αυτόματου τηλεφωνητή σας είναι κενός."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Δεν υπάρχουν αρχειοθετημένα μηνύματα αυτόματου τηλεφωνητή."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Εμφάνιση μόνο των αγαπημένων"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Ιστορικό"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Ιστορικό κλήσεων"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Αρχειοθετημένα μηνύματα αυτόματου τηλεφωνητή"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Όλα"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Αναπάντητες"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Φωνητικό μήνυμα"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Νέος, απλούστερος αποκλεισμός"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Για την καλύτερη δυνατή προστασία σας, το Phone πρέπει να αλλάξει τον τρόπο με τον οποίο λειτουργεί ο αποκλεισμός. Οι αποκλεισμένοι αριθμοί σας δεν θα επιτρέπουν πλέον τη λήψη τόσο κλήσεων όσο και μηνυμάτων κειμένου και μπορεί να κοινοποιηθούν σε άλλες εφαρμογές."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Αποδοχή"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Να αποκλειστεί ο αριθμός <xliff:g id="NUMBER">%1$s</xliff:g>;"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Οι μελλοντικές κλήσεις από αυτόν τον αριθμό θα αποκλείονται και τα μηνύματα στον αυτόματο τηλεφωνητή θα διαγράφονται αυτόματα."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Οι κλήσεις από αυτόν τον αριθμό θα αποκλείονται, αλλά ο καλών ενδέχεται να μπορεί να αφήνει μηνύματα στον αυτόματο τηλεφωνητή."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Δεν θα λαμβάνετε πλέον κλήσεις ή μηνύματα κειμένου από αυτόν τον αριθμό."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ΑΠΟΚΛΕΙΣΜΟΣ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Να καταργηθεί ο αποκλεισμός του αριθμού <xliff:g id="NUMBER">%1$s</xliff:g>;"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ΚΑΤΑΡΓΗΣΗ ΑΠΟΚΛΕΙΣΜΟΥ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Γρήγορη κλήση"</string>
- <string name="tab_recents" msgid="929949073851377206">"Πρόσφατα"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Ιστορικό κλήσεων"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Επαφές"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Αυτόματος τηλεφωνητής"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Καταργήθηκε από τα αγαπημένα"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Προσθήκη σε μια επαφή"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Αποστολή SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Πραγματοποίηση βιντεοκλήσης"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Προβολή πλήρους ιστορικού κλήσεων"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Αποκλεισμός αριθμού"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> νέες αναπάντητες κλήσεις"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Δεν έχετε ορίσει ακόμη κάποια επαφή στις ταχείες κλήσεις"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Προσθέστε ένα αγαπημένο"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Πατήστε την εικόνα για να δείτε όλους τους αριθμούς ή αγγίξτε παρατεταμένα για αναδιάταξη"</string>
<string name="remove_contact" msgid="1080555335283662961">"Κατάργηση"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Βιντεοκλήση"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Αποστολή μηνύματος"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Αποστολή μηνύματος"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Λεπτομέρειες κλήσης"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Κλήση <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Αναπάντητη κλήση από <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Ληφθείσα κλήση από <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Μη αναγνωσμένο μήνυμα αυτόματου τηλεφωνητή από <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Μήνυμα αυτόματου τηλεφωνητή από <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Κλήση προς <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"σε <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"μέσω <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"μέσω <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"στον λογαριασμό <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, μέσω <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> μέσω <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Κλήση"</string>
<string name="description_call_action" msgid="4000549004089776147">"Κλήση <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Βιντεοκλήση <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Γρήγορες απαντήσεις"</string>
<string name="call_settings_label" msgid="313434211353070209">"Κλήσεις"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Φραγή κλήσεων"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Προσωρινά απενεργοποιημένη φραγή κλήσεων"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Η φραγή κλήσεων έχει απενεργοποιηθεί προσωρινά επειδή επικοινωνήσατε με τις υπηρεσίες έκτακτης ανάγκης από αυτό το τηλέφωνο μέσα στις τελευταίες 48 ώρες. Θα ενεργοποιηθεί ξανά αυτόματα μόλις λήξει η περίοδος των 48 ωρών."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Εισαγωγή αριθμών"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Στο παρελθόν ρυθμίσατε ορισμένους καλούντες ώστε να αποστέλλονται αυτόματα στον τηλεφωνητή μέσω άλλων εφαρμογών."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Προβολή αριθμών"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Εισαγωγή"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Αποτυχία εισαγωγής"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Απέτυχε η αρχειοθέτ. μην. αυτόμ. τηλεφ."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Κατάργηση αποκλεισμού αριθμού"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Προσθήκη αριθμού"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Οι κλήσεις από αυτούς τους αριθμούς θα αποκλείονται και τα μηνύματα στον αυτόματο τηλεφωνητή θα διαγράφονται αυτόματα."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Οι κλήσεις από αυτούς τους αριθμούς θα αποκλείονται, αλλά ενδέχεται να λαμβάνετε από αυτούς μηνύματα στον αυτόματο τηλεφωνητή."</string>
+ <string name="block_list" msgid="7760188925338078011">"Αποκλεισμένοι αριθμοί"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Ο αριθμός <xliff:g id="NUMBER">%1$s</xliff:g> δεν είναι έγκυρος."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Ο αριθμός <xliff:g id="NUMBER">%1$s</xliff:g> αποκλείστηκε ήδη."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Η φραγή κλήσεων απενεργοποιήθηκε για 48 ώρες"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Απενεργοποιημένο επειδή πραγματοποιήθηκε κλήση έκτακτης ανάγκης."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Λογαριασμοί κλήσης"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Ενεργοποίηση"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Ορισμός αδειών"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Για να ενεργοποιήσετε την ταχεία κλήση,\n ενεργοποιήστε την άδεια Επαφών."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Για να δείτε το αρχείο καταγραφής κλήσεών σας,\n ενεργοποιήστε την άδεια Τηλεφώνου."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Για να δείτε τις επαφές σας,\n ενεργοποιήστε την άδεια Επαφών."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Για να μεταβείτε στον αυτόματο τηλεφωνητή,\n ενεργοποιήστε την άδεια Τηλεφώνου."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Για να ενεργοποιήσετε την ταχεία κλήση, ενεργοποιήστε την άδεια επαφών."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Για να δείτε το αρχείο καταγραφής κλήσεών σας, ενεργοποιήστε την άδεια τηλεφώνου."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Για να δείτε τις επαφές σας, ενεργοποιήστε την άδεια επαφών."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Για να αποκτήσετε πρόσβαση στον τηλεφωνητή σας, ενεργοποιήστε την άδεια τηλεφώνου."</string>
<string name="permission_no_search" msgid="84152933267902056">"Για να κάνετε αναζήτηση στις επαφές σας, ενεργοποιήστε τις άδειες \"Επαφές\"."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Για να πραγματοποιήσετε κλήση,\n ενεργοποιήστε την άδεια Τηλεφώνου."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Για να πραγματοποιήσετε μια κλήση, ενεργοποιήστε την άδεια τηλεφώνου."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Η εφαρμογή \"Τηλέφωνο\" δεν έχει άδεια εγγραφής στις ρυθμίσεις συστήματος."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Αποκλεισμένος"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Ο χρήστης <xliff:g id="NAMEORNUMBER">^1</xliff:g> είναι ενεργός"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 709867a79..8403de0a6 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Phone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Phone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Phone Dialpad"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Phone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Call history"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Call <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Report inaccurate number"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edit number before call"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Add to a contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Delete from call history"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Clear call history"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Delete voicemail"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Share voicemail"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Your call log is empty"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Make a call"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Call history"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Report inaccurate number"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copy number"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copy transcription"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Block number"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blocked"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Unblock number"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> unblocked"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"UNDO"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"delete"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edit number before call"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Clear call history"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Delete voicemail"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archive voicemail"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Share voicemail"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Voicemail deleted"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Voicemail archived"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"UNDO"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"TO ARCHIVE"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Clear call history?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"This will delete all calls from your history"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Clearing call history…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Phone"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Missed call"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Missed work call"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Message"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Voicemails </item>
<item quantity="one">Voicemail</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"New voicemail from <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Couldn\'t play voicemail"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buffering…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Loading voicemail…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archiving voicemail…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Couldn\'t load voicemail"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Calls with voicemail only"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Incoming calls only"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Call history"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"More options"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"dial pad"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copy"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Show outgoing only"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Show incoming only"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Show missed only"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Outgoing video call"</string>
<string name="type_missed_video" msgid="954396897034220545">"Missed video call"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Voicemail"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Declined call"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blocked call"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Incoming calls"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Play voicemail"</string>
<string name="description_view_contact" msgid="5205669345700598415">"View contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Call <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contact details for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"New voicemail."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> calls."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video call."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Send SMS to <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Payphone"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sec"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sec"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Can\'t call this number"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"To set up voicemail, go to Menu &gt; Settings."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"To call voicemail, first turn off Aeroplane mode."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Voice search not available"</string>
<string name="call_not_available" msgid="8941576511946492225">"Cannot make a phone call because the Phone application has been disabled."</string>
<string name="activity_not_available" msgid="2287665636817987623">"No app for that on this device"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Enter a name or phone number"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"You have no missed calls."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Your voicemail inbox is empty."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Search contacts"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Add number or search contacts"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Your call history is empty"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Make a call"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"You have no missed calls."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Your voicemail inbox is empty."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Your voicemail archive is empty."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Show favourites only"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"History"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Call history"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Voicemail archive"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"All"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Missed"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Voicemail"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"New, simplified blocking"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"To protect you better, Phone needs to change how blocking works. Your blocked numbers will now stop both calls and texts and may be shared with other apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Allow"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Block <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Calls from this number will be blocked and voicemails will be automatically deleted."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Calls from this number will be blocked, but the caller may still be able to leave you voicemails."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"You will no longer receive calls or texts from this number."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCK"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Unblock <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"UNBLOCK"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Speed dial"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recents"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Call history"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contacts"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Voicemail"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Removed from favourites"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Add to a contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Send SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Make video call"</string>
- <string name="show_call_history" msgid="1141502332266697170">"View full call history"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Block number"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> new missed calls"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"No one is on your speed dial yet"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Add a favourite"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Touch image to see all numbers or touch &amp; hold to reorder"</string>
<string name="remove_contact" msgid="1080555335283662961">"Remove"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video call"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Send Message"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Send a message"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Call details"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Call <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Missed call from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Answered call from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Unread voicemail from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Voicemail from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Call to <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"on <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"on <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Call"</string>
<string name="description_call_action" msgid="4000549004089776147">"Call <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Video call <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Quick responses"</string>
<string name="call_settings_label" msgid="313434211353070209">"Calls"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Call blocking"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Call blocking temporarily off"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically re-enabled once the 48 hour period expires."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Import numbers"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"You previously marked some callers to be automatically sent to voicemail via other apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"View Numbers"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Import"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import failed"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Failed to archive voicemail."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Unblock number"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Add number"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Calls from these numbers will be blocked and voicemails will be automatically deleted."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Calls from these numbers will be blocked, but they may still be able to leave you voicemails."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blocked numbers"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> is invalid."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> is already blocked."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Call blocking disabled for 48 hours"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Disabled because an emergency call was made."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Calling accounts"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Turn on"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Set permissions"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"To enable speed dial,\n turn on the Contacts permission."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"To see your call log,\n turn on the Phone permission."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"To see your contacts,\n turn on the Contacts permission."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"To access your voicemail,\n turn on the Phone permission."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"To enable speed dial, turn on the Contacts permission."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"To see your call log, turn on the Phone permission."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"To see your contacts, turn on the Contacts permission."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"To access your voicemail, turn on the Phone permission."</string>
<string name="permission_no_search" msgid="84152933267902056">"To search your contacts, turn on the Contacts permissions."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"To place a call,\n turn on the Phone permission."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"To place a call, turn on the Phone permission."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Phone app does not have permission to write to system settings."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blocked"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> is active"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 709867a79..8403de0a6 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Phone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Phone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Phone Dialpad"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Phone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Call history"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Call <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Report inaccurate number"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edit number before call"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Add to a contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Delete from call history"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Clear call history"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Delete voicemail"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Share voicemail"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Your call log is empty"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Make a call"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Call history"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Report inaccurate number"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copy number"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copy transcription"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Block number"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blocked"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Unblock number"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> unblocked"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"UNDO"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"delete"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edit number before call"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Clear call history"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Delete voicemail"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archive voicemail"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Share voicemail"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Voicemail deleted"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Voicemail archived"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"UNDO"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"TO ARCHIVE"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Clear call history?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"This will delete all calls from your history"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Clearing call history…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Phone"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Missed call"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Missed work call"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Message"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Voicemails </item>
<item quantity="one">Voicemail</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"New voicemail from <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Couldn\'t play voicemail"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buffering…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Loading voicemail…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archiving voicemail…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Couldn\'t load voicemail"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Calls with voicemail only"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Incoming calls only"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Call history"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"More options"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"dial pad"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copy"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Show outgoing only"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Show incoming only"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Show missed only"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Outgoing video call"</string>
<string name="type_missed_video" msgid="954396897034220545">"Missed video call"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Voicemail"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Declined call"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blocked call"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Incoming calls"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Play voicemail"</string>
<string name="description_view_contact" msgid="5205669345700598415">"View contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Call <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contact details for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"New voicemail."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> calls."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video call."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Send SMS to <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Payphone"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sec"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sec"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Can\'t call this number"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"To set up voicemail, go to Menu &gt; Settings."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"To call voicemail, first turn off Aeroplane mode."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Voice search not available"</string>
<string name="call_not_available" msgid="8941576511946492225">"Cannot make a phone call because the Phone application has been disabled."</string>
<string name="activity_not_available" msgid="2287665636817987623">"No app for that on this device"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Enter a name or phone number"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"You have no missed calls."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Your voicemail inbox is empty."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Search contacts"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Add number or search contacts"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Your call history is empty"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Make a call"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"You have no missed calls."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Your voicemail inbox is empty."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Your voicemail archive is empty."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Show favourites only"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"History"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Call history"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Voicemail archive"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"All"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Missed"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Voicemail"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"New, simplified blocking"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"To protect you better, Phone needs to change how blocking works. Your blocked numbers will now stop both calls and texts and may be shared with other apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Allow"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Block <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Calls from this number will be blocked and voicemails will be automatically deleted."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Calls from this number will be blocked, but the caller may still be able to leave you voicemails."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"You will no longer receive calls or texts from this number."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCK"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Unblock <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"UNBLOCK"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Speed dial"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recents"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Call history"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contacts"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Voicemail"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Removed from favourites"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Add to a contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Send SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Make video call"</string>
- <string name="show_call_history" msgid="1141502332266697170">"View full call history"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Block number"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> new missed calls"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"No one is on your speed dial yet"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Add a favourite"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Touch image to see all numbers or touch &amp; hold to reorder"</string>
<string name="remove_contact" msgid="1080555335283662961">"Remove"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video call"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Send Message"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Send a message"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Call details"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Call <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Missed call from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Answered call from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Unread voicemail from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Voicemail from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Call to <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"on <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"on <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Call"</string>
<string name="description_call_action" msgid="4000549004089776147">"Call <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Video call <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Quick responses"</string>
<string name="call_settings_label" msgid="313434211353070209">"Calls"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Call blocking"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Call blocking temporarily off"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically re-enabled once the 48 hour period expires."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Import numbers"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"You previously marked some callers to be automatically sent to voicemail via other apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"View Numbers"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Import"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import failed"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Failed to archive voicemail."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Unblock number"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Add number"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Calls from these numbers will be blocked and voicemails will be automatically deleted."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Calls from these numbers will be blocked, but they may still be able to leave you voicemails."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blocked numbers"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> is invalid."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> is already blocked."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Call blocking disabled for 48 hours"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Disabled because an emergency call was made."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Calling accounts"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Turn on"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Set permissions"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"To enable speed dial,\n turn on the Contacts permission."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"To see your call log,\n turn on the Phone permission."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"To see your contacts,\n turn on the Contacts permission."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"To access your voicemail,\n turn on the Phone permission."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"To enable speed dial, turn on the Contacts permission."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"To see your call log, turn on the Phone permission."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"To see your contacts, turn on the Contacts permission."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"To access your voicemail, turn on the Phone permission."</string>
<string name="permission_no_search" msgid="84152933267902056">"To search your contacts, turn on the Contacts permissions."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"To place a call,\n turn on the Phone permission."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"To place a call, turn on the Phone permission."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Phone app does not have permission to write to system settings."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blocked"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> is active"</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 709867a79..8403de0a6 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Phone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Phone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Phone Dialpad"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Phone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Call history"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Call <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Report inaccurate number"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edit number before call"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Add to a contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Delete from call history"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Clear call history"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Delete voicemail"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Share voicemail"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Your call log is empty"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Make a call"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Call history"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Report inaccurate number"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copy number"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copy transcription"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Block number"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blocked"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Unblock number"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> unblocked"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"UNDO"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"delete"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edit number before call"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Clear call history"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Delete voicemail"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archive voicemail"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Share voicemail"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Voicemail deleted"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Voicemail archived"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"UNDO"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"TO ARCHIVE"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Clear call history?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"This will delete all calls from your history"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Clearing call history…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Phone"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Missed call"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Missed work call"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Missed calls"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missed calls"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Call back"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Message"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Voicemails </item>
<item quantity="one">Voicemail</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"New voicemail from <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Couldn\'t play voicemail"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buffering…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Loading voicemail…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archiving voicemail…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Couldn\'t load voicemail"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Calls with voicemail only"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Incoming calls only"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Call history"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"More options"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"dial pad"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copy"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Show outgoing only"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Show incoming only"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Show missed only"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Outgoing video call"</string>
<string name="type_missed_video" msgid="954396897034220545">"Missed video call"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Voicemail"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Declined call"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blocked call"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Incoming calls"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Play voicemail"</string>
<string name="description_view_contact" msgid="5205669345700598415">"View contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Call <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contact details for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"New voicemail."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> calls."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video call."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Send SMS to <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Payphone"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sec"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sec"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> at <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Can\'t call this number"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"To set up voicemail, go to Menu &gt; Settings."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"To call voicemail, first turn off Aeroplane mode."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Voice search not available"</string>
<string name="call_not_available" msgid="8941576511946492225">"Cannot make a phone call because the Phone application has been disabled."</string>
<string name="activity_not_available" msgid="2287665636817987623">"No app for that on this device"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Enter a name or phone number"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"You have no missed calls."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Your voicemail inbox is empty."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Search contacts"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Add number or search contacts"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Your call history is empty"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Make a call"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"You have no missed calls."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Your voicemail inbox is empty."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Your voicemail archive is empty."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Show favourites only"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"History"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Call history"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Voicemail archive"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"All"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Missed"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Voicemail"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"New, simplified blocking"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"To protect you better, Phone needs to change how blocking works. Your blocked numbers will now stop both calls and texts and may be shared with other apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Allow"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Block <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Calls from this number will be blocked and voicemails will be automatically deleted."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Calls from this number will be blocked, but the caller may still be able to leave you voicemails."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"You will no longer receive calls or texts from this number."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCK"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Unblock <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"UNBLOCK"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Speed dial"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recents"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Call history"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contacts"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Voicemail"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Removed from favourites"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Add to a contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Send SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Make video call"</string>
- <string name="show_call_history" msgid="1141502332266697170">"View full call history"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Block number"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> new missed calls"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"No one is on your speed dial yet"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Add a favourite"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Touch image to see all numbers or touch &amp; hold to reorder"</string>
<string name="remove_contact" msgid="1080555335283662961">"Remove"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video call"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Send Message"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Send a message"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Call details"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Call <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Missed call from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Answered call from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Unread voicemail from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Voicemail from <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Call to <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"on <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"on <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Call"</string>
<string name="description_call_action" msgid="4000549004089776147">"Call <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Video call <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Quick responses"</string>
<string name="call_settings_label" msgid="313434211353070209">"Calls"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Call blocking"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Call blocking temporarily off"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Call blocking has been disabled because you contacted emergency services from this phone within the last 48 hours. It will be automatically re-enabled once the 48 hour period expires."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Import numbers"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"You previously marked some callers to be automatically sent to voicemail via other apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"View Numbers"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Import"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import failed"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Failed to archive voicemail."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Unblock number"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Add number"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Calls from these numbers will be blocked and voicemails will be automatically deleted."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Calls from these numbers will be blocked, but they may still be able to leave you voicemails."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blocked numbers"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> is invalid."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> is already blocked."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Call blocking disabled for 48 hours"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Disabled because an emergency call was made."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Calling accounts"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Turn on"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Set permissions"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"To enable speed dial,\n turn on the Contacts permission."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"To see your call log,\n turn on the Phone permission."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"To see your contacts,\n turn on the Contacts permission."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"To access your voicemail,\n turn on the Phone permission."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"To enable speed dial, turn on the Contacts permission."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"To see your call log, turn on the Phone permission."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"To see your contacts, turn on the Contacts permission."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"To access your voicemail, turn on the Phone permission."</string>
<string name="permission_no_search" msgid="84152933267902056">"To search your contacts, turn on the Contacts permissions."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"To place a call,\n turn on the Phone permission."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"To place a call, turn on the Phone permission."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Phone app does not have permission to write to system settings."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blocked"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> is active"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 493290149..c2782d57c 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Teléfono"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Teléfono"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclado del teléfono"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Teléfono"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historial de llamadas"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Llamar a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Informar número incorrecto"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editar número antes de llamar"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Agregar a un contacto"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Borrar del historial de llamadas"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Eliminar el historial de llamadas"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Borrar mensaje de voz"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Compartir mensaje de voz"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"El registro de llamadas está vacío"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Hacer una llamada"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historial de llamadas"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Informar número incorrecto"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiar número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiar transcripción"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquear número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> bloqueado"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloquear número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> desbloqueado"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESHACER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Borrar"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editar número antes de realizar llamada"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Eliminar el historial de llamadas"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Borrar buzón de voz"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archivar un mensaje de voz"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Compartir buzón de voz"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Buzón de voz borrado"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Se archivó el mensaje de voz"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESHACER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"IR A ARCHIVO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"¿Eliminar el historial de llamadas?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Se borrarán todas las llamadas del historial."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Eliminando historial de llamadas…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Teléfono"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Llamada perdida"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Llamada de trabajo perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Llamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Llamar"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensaje"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> mensajes de voz </item>
<item quantity="one">mensaje de voz</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nuevo mensaje de voz de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Error al reproducir el buzón de voz"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Almacenando en el búfer"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Cargando buzón de voz…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archivando el mensaje de voz…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Error al cargar el buzón de voz"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Solo llamadas con buzón de voz"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Solo llamadas entrantes"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historial de llamadas"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Más opciones"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclado"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiar"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostrar solo salientes"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostrar solo entrantes"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostrar solo perdidas"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videollamada saliente"</string>
<string name="type_missed_video" msgid="954396897034220545">"Te perdiste una videollamada."</string>
<string name="type_voicemail" msgid="5153139450668549908">"Mensaje de voz"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Llamada rechazada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Llamada bloqueada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Llamadas entrantes"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reproducir mensaje de voz"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Llamar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Datos de contacto de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Buzón de voz nuevo"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> llamadas"</string>
<string name="description_video_call" msgid="2933838090743214204">"Videollamada"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Enviar SMS a <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Teléfono público"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"El <xliff:g id="DATE">%1$s</xliff:g> a la hora <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"No se puede llamar a este número."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar el buzón de voz, ve a a Menú &gt; Configuración."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para escuchar los mensajes de tu buzón de voz, desactiva primero el modo avión."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Búsqueda por voz no disponible"</string>
<string name="call_not_available" msgid="8941576511946492225">"No se pueden realizar llamadas porque se inhabilitó la aplicación Teléfono."</string>
<string name="activity_not_available" msgid="2287665636817987623">"No hay una aplicación para esa acción en este dispositivo."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Ingresa nombre o teléfono."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"No tienes llamadas perdidas"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"La bandeja de entrada del buzón de voz está vacía."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Buscar contactos"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Agregar número o buscar contactos"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Tu historial de llamadas está vacío"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Hacer una llamada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"No tienes llamadas perdidas"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"La bandeja de entrada del buzón de voz está vacía."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Tu archivo de mensajes de voz está vacío."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostrar solo favoritos"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historial"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historial de llamadas"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archivo de mensajes de voz"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Todo"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perdidas"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Buzón voz"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nuevo bloqueo simplificado"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Para brindarte mayor protección, el teléfono necesita cambiar el comportamiento de bloqueo. Se detendrán las llamadas y los mensajes de texto de los números bloqueados, y es posible que estos se compartan con otras apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permitir"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"¿Deseas bloquear el <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Se bloquearán las llamadas que provengan de este número y se borrarán los mensajes del buzón de voz de forma automática."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Se bloquearán las llamadas que provengan de este número, pero es posible que la persona que llama pueda dejar mensajes en el buzón de voz."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Ya no recibirás llamadas o mensajes de textos de este número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEAR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"¿Deseas desbloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEAR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Marcado rápido"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recientes"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historial de llamadas"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contactos"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Buzón de voz"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Eliminado de favoritos"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Agregar a un contacto"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Enviar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Realizar videollamada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ver historial de llamadas completo"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquear número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> llamadas perdidas nuevas"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Aún no tienes contactos en la opción de marcado rápido"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Agregar un favorito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toca la imagen para ver todos los números o mantenla presionada para cambiar el orden."</string>
<string name="remove_contact" msgid="1080555335283662961">"Eliminar"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videollamada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Enviar mensaje"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Enviar un mensaje"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalles de la llamada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Llamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Llamada perdida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Llamada contestada de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Mensaje de voz no leído de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Mensaje de voz de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Llamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"en <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"a través de <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"a través de <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"en <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, a través de <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> a través de <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Llamar"</string>
<string name="description_call_action" msgid="4000549004089776147">"Llamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Realizar una videollamada a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respuestas rápidas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Llamadas"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueo de llamadas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bloqueo de llamadas desactivado temporalmente"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Se inhabilitó el bloqueo de llamadas porque te comunicaste con servicios de emergencia en las últimas 48 horas desde este teléfono. Se volverá a habilitar de forma automática una vez que venza el período de 48 horas."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importar números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ya marcaste algunos emisores para que se envíen de forma automática al buzón de voz por medio de otras apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ver números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Error al importar"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"No se pudo archivar el mensaje de voz."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloquear número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Agregar número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Se bloquearán las llamadas que provengan de estos números y se borrarán los mensajes del buzón de voz de forma automática."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Se bloquearán las llamadas que provengan de estos números, pero es posible que se puedan dejar mensajes en el buzón de voz."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloqueados"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> no es válido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ya está bloqueado."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"El bloqueo de llamadas se inhabilitó durante 48 horas"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Se inhabilitó porque se realizó una llamada de emergencia."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Cuentas telefónicas"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activar"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Configurar permisos"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Para habilitar el marcado rápido,\n activa el permiso Contactos."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Para ver el registro de llamadas,\n activa el permiso Teléfono."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Para ver tus contactos,\n activa el permiso Contactos."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Para acceder al buzón de voz,\n activa el permiso Teléfono."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Para habilitar el marcado rápido, activa el permiso Contactos."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Para ver el registro de llamadas, activa el permiso Teléfono."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Para ver los contactos, activa el permiso Contactos."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Para acceder al buzón de voz, activa el permiso Teléfono."</string>
<string name="permission_no_search" msgid="84152933267902056">"Para buscar contactos, activa el permiso Contactos."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Para realizar una llamada,\n activa el permiso Teléfono."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Para realizar una llamada, activa el permiso Teléfono."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"La aplicación de teléfono no tiene permiso para modificar la configuración del sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqueado"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> está activa"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 1bb72ff11..5251cab46 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Teléfono"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Teléfono"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclado del teléfono"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Teléfono"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historial de llamadas"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Llamar a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Notificar número incorrecto"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editar número antes de llamar"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Añadir a un contacto"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Eliminar del historial de llamadas"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Borrar historial de llamadas"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Eliminar mensaje de voz"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Compartir mensaje de voz"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"El registro de llamadas está vacío"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Hacer una llamada"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historial de llamadas"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Informar sobre número incorrecto"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiar número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiar transcripción"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquear número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> bloqueado"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloquear número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> desbloqueado"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESHACER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Eliminar"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editar número antes de llamar"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Borrar historial de llamadas"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Eliminar mensaje de voz"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archivar mensaje de voz"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Compartir mensaje de voz"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Buzón voz eliminado"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Mensaje de voz archivado"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESHACER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"IR A ARCHIVO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"¿Borrar historial de llamadas?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Se eliminarán todas las llamadas del historial."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Borrando historial de llamadas…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Teléfono"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Llamada perdida"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Llamada de trabajo perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Llamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> llamadas perdidas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Llamar"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensaje"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> mensajes de voz </item>
<item quantity="one"> mensaje de voz</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nuevo mensaje de voz de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Error al reproducir el buzón de voz"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Almacenando en búfer..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Cargando buzón de voz…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archivando el mensaje de voz…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Error al cargar el buzón de voz"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Solo llamadas con mensajes de voz"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Solo llamadas entrantes"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historial de llamadas"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Más opciones"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclado"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiar"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostrar solo llamadas salientes"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostrar solo llamadas entrantes"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostrar solo llamadas perdidas"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videollamada realizada"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videollamada perdida"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Buzón de voz"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Llamada rechazada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Llamada bloqueada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Llamadas entrantes"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reproducir mensaje de voz"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Llamar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Información de contacto de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nuevo mensaje de voz."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> llamadas."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videollamada."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Enviar SMS a <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Teléfono público"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min y <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> a las <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"No se puede llamar a este número"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar el buzón de voz, toca la tecla de menú y, a continuación, toca Ajustes."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para llamar al buzón de voz, debes desactivar el modo avión."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"La búsqueda por voz no está disponible"</string>
<string name="call_not_available" msgid="8941576511946492225">"No se puede hacer llamadas porque se ha inhabilitado la aplicación Teléfono."</string>
<string name="activity_not_available" msgid="2287665636817987623">"No hay aplicaciones para esa acción en este dispositivo"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Escribe un nombre o un teléfono"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"No tienes llamadas perdidas."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"La bandeja de entrada del buzón de voz está vacía."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Buscar contactos"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Añade número o busca contactos"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Tu historial de llamadas está vacío"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Hacer una llamada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"No tienes llamadas perdidas."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"La bandeja de entrada del buzón de voz está vacía."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Tu archivo de mensajes de voz está vacío."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostrar solo favoritos"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historial"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historial de llamadas"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archivo de mensajes de voz"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Todas"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perdidas"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Mensaje de voz"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nuevo bloqueo, más sencillo"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Para garantizar tu seguridad, Teléfono necesita cambiar cómo funciona el bloqueo. Ya no recibirás llamadas ni SMS de los números bloqueados y es posible que estos se compartan con otras aplicaciones."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permitir"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"¿Bloquear el número <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Se bloquearán las llamadas de este número y se eliminarán los mensajes del buzón de voz automáticamente."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Se bloquearán las llamadas de este número, pero la persona que llame puede seguir dejando mensajes en el buzón de voz."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Ya no recibirás llamadas ni SMS de este número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEAR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"¿Desbloquear el número <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEAR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Marcación rápida"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recientes"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historial de llamadas"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contactos"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Buzón de voz"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Eliminado de favoritos"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Añadir a un contacto"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Enviar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Hacer videollamada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ver historial de llamadas completo"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquear número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> llamadas perdidas nuevas"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Aún no tienes contactos en la función de marcación rápida"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Añadir un favorito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toca la imagen para ver todos los números o mantenla pulsada para cambiar el orden"</string>
<string name="remove_contact" msgid="1080555335283662961">"Eliminar"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videollamada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Enviar mensaje"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Enviar un mensaje"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalles de la llamada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Llamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Llamada perdida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Has respondido una llamada de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Mensaje de voz sin leer de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Mensaje de voz de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Llamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"en <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"a través del <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"a través del <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"en <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, a través del <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> a través del <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Llamar"</string>
<string name="description_call_action" msgid="4000549004089776147">"Llamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videollamada a <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respuestas rápidas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Llamadas"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueo de llamadas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bloqueo de llamadas desactivado temporalmente"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Se ha inhabilitado el bloqueo de llamadas porque te has puesto en contacto con los servicios de emergencia desde este teléfono en las últimas 48 horas. Se volverá a habilitar automáticamente cuando finalice este periodo de tiempo."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importar números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Anteriormente marcaste algunas llamadas para que se enviaran automáticamente al buzón de voz a través de otras aplicaciones."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ver números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Error al importar"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"No se ha podido archivar mensaje de voz."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloquear número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Añadir número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Se bloquearán las llamadas de estos números y se eliminarán los mensajes del buzón de voz automáticamente."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Se bloquearán las llamadas de estos números, pero podrán seguir dejando mensajes en el buzón de voz."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloqueados"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> no es válido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ya está bloqueado."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Bloqueo de llamadas inhabilitado durante 48 horas"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Inhabilitado porque has hecho una llamada de emergencia."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Cuentas de llamadas"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activar"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Establecer permisos"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Para habilitar la marcación rápida,\n activa el permiso de contactos."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Para ver el registro de llamadas,\n activa el permiso del teléfono."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Para ver tus contactos,\n activa el permiso de contactos."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Para acceder al buzón de voz,\n activa el permiso del teléfono."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Para habilitar la marcación rápida, activa el permiso la aplicación Contactos."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Para ver el registro de llamadas, activa el permiso de la aplicación Teléfono."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Para ver tus contactos, activa el permiso de la aplicación Contactos."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Para acceder al buzón de voz, activa el permiso de la aplicación Teléfono."</string>
<string name="permission_no_search" msgid="84152933267902056">"Para poder buscar tus contactos, activa los permisos de contactos."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Para hacer una llamada,\n activa el permiso del teléfono."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Para hacer una llamada, activa el permiso de la aplicación Teléfono."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"La aplicación Teléfono no tiene permiso para editar los ajustes del sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqueado"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Llamada activa: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index fa8e7a77f..83f69e941 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefoni valimisklahvistik"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Kõneajalugu"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Helista kasutajale <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Valest numbrist teavitamine"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Muuda enne helistamist numbrit"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Lisa kontaktile"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Kõneajaloost kustutamine"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Kõneajaloo kustutamine"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Kustuta kõnepost"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Jaga kõneposti"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Teie kõnelogi on tühi"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Helista"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Kõneajalugu"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Valest numbrist teavitamine"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopeeri number"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopeeri transkribeerimine"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokeeri number"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Number <xliff:g id="NUMBER">%1$s</xliff:g> on blokeeritud"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Deblokeeri number"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Number <xliff:g id="NUMBER">%1$s</xliff:g> on deblokeeritud"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"VÕTA TAG."</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Kustuta"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Muuda enne helistamist numbrit"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Kustuta kõneajalugu"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Kustuta kõnepost"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Kõnepostisõnumi arhiivimine"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Jaga kõnepostisõnumit"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Kõnepost kustutati"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Kõnepostisõnum arhiiviti"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"VÕTA TAGASI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"AVA ARHIIV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Kas kustutada kõneajalugu?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"See kustutab ajaloost kõik kõned"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Kõneajaloo kustutamine ..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Vastamata kõne"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Vastamata kõne töölt"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Vastamata kõned"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> vastamata kõnet"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Helista tagasi"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Saada sõnum"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> kõneposti teadet </item>
<item quantity="one">Kõneposti teade</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Uus kõnepostisõnum kasutajalt <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Kõneposti ei õnnestunud esitada"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Puhverdamine ..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Kõneposti laadimine ..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Kõnepostisõnumi arhiivimine …"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Kõneposti laadimine ebaõnnestus"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Ainult kõnepostiga kõned"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Ainult sissetulevad kõned"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Kõneajalugu"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Rohkem valikuid"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"valimisklahvistik"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopeeri"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Kuva ainult väljuvad"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Kuva ainult sissetulevad"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Kuva ainult vastamata"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Väljaminev videokõne"</string>
<string name="type_missed_video" msgid="954396897034220545">"Vastamata videokõne"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Kõnepost"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Keeldutud kõne"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokeeritud kõne"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Sissetulevad kõned"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Esita kõnepostisõnum"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Kuva kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Helista: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontakti <xliff:g id="NAMEORNUMBER">%1$s</xliff:g> üksikasjad"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Uus kõnepost."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> kõnet."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videokõne."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"SMS-i saatmine kontaktile <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefoniautomaat"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> kell <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Sellele numbrile ei saa helistada"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Kõneposti seadistamiseks minge valikusse Menüü &gt; Seaded."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Kõneposti kuulamiseks lülitage lennurežiim välja."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Häälotsing ei ole saadaval"</string>
<string name="call_not_available" msgid="8941576511946492225">"Helistada ei saa, sest telefonirakendus on keelatud."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Seadmes pole selleks sobilikku rakendust"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Sisestage nimi või telefoninumber"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Vastamata kõnesid pole."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Kõneposti postkast on tühi."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Otsige kontakte"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Lisage nr või otsige kontakte"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Teie kõneajalugu on tühi"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Helista"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Vastamata kõnesid pole."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Kõneposti postkast on tühi."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Teie kõnepostisõnumite arhiiv on tühi."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Kuva ainult lemmikud"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Ajalugu"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Kõneajalugu"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Kõnepostisõnumite arhiiv"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Kõik"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Vastamata"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Kõnepost"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Uus lihtsustatud blokeerimine"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Teie paremaks kaitsmiseks peab rakendus Telefon muutma blokeerimise tööpõhimõtet. Blokeeritud numbrite puhul blokeeritakse nüüd nii helistamine kui ka tekstsõnumid ja blokeeritud numbreid võidakse jagada teiste rakendustega."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Luba"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Kas soovite blokeerida numbri <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Kõned sellelt numbrilt blokeeritakse ja kõnepostisõnumid kustutatakse automaatselt."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Kõned sellelt numbrilt blokeeritakse, kuid helistaja saab võib-olla siiski teile kõnepostisõnumeid jätta."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Te ei saa enam sellelt numbrilt kõnesid ega tekstsõnumeid."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKEERI"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Kas soovite deblokeerida numbri <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DEBLOKEERI"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Kiirvalimine"</string>
- <string name="tab_recents" msgid="929949073851377206">"Hiljutised"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Kõneajalugu"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktid"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Kõnepost"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Eemaldatud lemmikute hulgast"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Lisa kontaktile"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Saada SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Videokõne tegemine"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Kogu kõneajaloo vaatamine"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokeeri number"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> uus/uut vastamata kõne(t)"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Te pole veel kedagi kiirvalimisse lisanud"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Lisa lemmik"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Puudutage kujutist, et näha kõiki numbreid, või puudutage pikalt järjestuse muutmiseks"</string>
<string name="remove_contact" msgid="1080555335283662961">"Eemalda"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videokõne"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Saada sõnum"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Saada sõnum"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Kõne üksikasjad"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Helistamine: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Vastamata kõne: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Vastati kõnele: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Lugemata kõnepost kasutajalt <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Kõnepost kasutajalt <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Kõne: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"kontol <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"numbri <xliff:g id="NUMBER">%1$s</xliff:g> kaudu"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"numbri <xliff:g id="NUMBER">%1$s</xliff:g> kaudu"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"kontol <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, numbri <xliff:g id="NUMBER">%2$s</xliff:g> kaudu"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> numbri <xliff:g id="NUMBER">%2$s</xliff:g> kaudu"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Helistamine"</string>
<string name="description_call_action" msgid="4000549004089776147">"Helistamine: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videokõne kirjele <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Kiirvastused"</string>
<string name="call_settings_label" msgid="313434211353070209">"Kõned"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Kõnede blokeerimine"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Kõnede blokeerimine on ajutiselt väljas"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Kõnede blokeerimine on keelatud, kuna võtsite sellelt telefonilt viimase 48 tunni jooksul ühendust hädaabiteenustega. See lubatakse 48 tunni möödumisel automaatselt uuesti."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Impordi numbrid"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Märkisite varem, et osad helistajad saadetaks muude rakenduste kaudu automaatselt kõneposti."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Vaata numbreid"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Impordi"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importimine ebaõnnestus"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Kõnepostisõnumi arhiivimine ebaõnnestus."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Numbri deblokeerimine"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Lisa number"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Kõned nendelt numbritelt blokeeritakse ja kõnepostisõnumid kustutatakse automaatselt."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Kõned nendelt numbritelt blokeeritakse, kuid helistajad saavad võib-olla siiski teile kõnepostisõnumeid jätta."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokeeritud numbrid"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> on kehtetu."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> on juba blokeeritud."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Kõnede blokeerimine on 48 tunniks keelatud"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Keelatud, kuna tehti hädaabikõne."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Helistamiskontod"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Lülita sisse"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Määra load"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Kiirvalimise lubamiseks\n lülitage sisse kontaktiluba."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Kõnelogi nägemiseks\n lülitage sisse telefoniluba."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Kontaktide nägemiseks\n lülitage sisse kontaktiluba."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Kõnepostile juurdepääsemiseks\n lülitage sisse telefoniluba."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Kiirvalimise lubamiseks lülitage sisse kontaktiluba."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Kõnelogi vaatamiseks lülitage sisse telefoniluba."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Kontaktide vaatamiseks lülitage sisse kontaktiluba."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Kõnepostile juurdepääsemiseks lülitage sisse telefoniluba."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kontaktide otsimiseks lülitage sisse kontaktiload."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Helistamiseks\n lülitage sisse telefoniluba."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Helistamiseks lülitage sisse telefoniluba."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefonirakendusel pole luba süsteemiseadetesse kirjutada."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokeeritud"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> on aktiivne"</string>
</resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index da4733af6..df83a9b72 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefonoa"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Deitu"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefonoaren markagailua"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefonoa"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Deien historia"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Deitu <xliff:g id="NAME">%s</xliff:g> erabiltzaileari"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Jakinarazi zenb. okerra dela"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editatu zenbakia deitu aurretik"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Gehitu kontaktuetan"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Ezabatu deien historiatik"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Garbitu deien historia"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Ezabatu ahots-mezua"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Partekatu ahots-mezua"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Deien erregistroa hutsik dago"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Deitu"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Deien historia"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Jakinarazi zenbakia okerra dela"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiatu zenbakia"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiatu transkripzioa"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokeatu zenbakia"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blokeatuta"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desblokeatu zenbakia"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> desblokeatuta"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESEGIN"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Ezabatu"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editatu zenbakia deitu aurretik"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Garbitu deien historia"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Ezabatu ahots-mezua"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Artxibatu ahots-mezua"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Partekatu ahots-mezua"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Ahots-mezua ezabatzea"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Artxibatu da ahots-mezua"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESEGIN"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"JOAN ARTXIBORA"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Deien historia garbitu?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Historiako dei guztiak ezabatuko dira"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Deien historia garbitzen…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefonoa"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Dei galdua"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Laneko dei bat galdu duzu"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Dei galduak"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> dei galdu"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Itzuli deia"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mezua"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> Erantzungailuko <xliff:g id="COUNT">%1$d</xliff:g> mezu </item>
<item quantity="one">Erantzungailuko mezua</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> deitzailearen ahots-mezu berria"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Ezin izan dira erreproduzitu ahots-mezuak"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buferreratzen…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Erantzungailua kargatzen…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Ahots-mezua artxibatzen…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Ezin izan da kargatu erantzungailua"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Erantzungailuko deiak soilik"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Sarrerako deiak soilik"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Deien historia"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Aukera gehiago"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"markagailua"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiatu"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Erakutsi irteerakoak soilik"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Erakutsi sarrerakoak soilik"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Erakutsi galduak soilik"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Irteerako bideo-deia"</string>
<string name="type_missed_video" msgid="954396897034220545">"Bideo-dei galdua"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Erantzungailua"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Baztertutako deia"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokeatutako deia"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Sarrerako deiak"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Erreproduzitu erantzungailuko ahots-mezuak"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ikusi <xliff:g id="NAME">%1$s</xliff:g> kontaktua"</string>
<string name="description_call" msgid="3443678121983852666">"Deitu <xliff:g id="NAME">%1$s</xliff:g> erabiltzaileari"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> kontaktuaren xehetasunak"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Ahots-mezu berria erantzungailuan."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> dei."</string>
<string name="description_video_call" msgid="2933838090743214204">"Bideo-deia."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Bidali SMSa <xliff:g id="NAME">%1$s</xliff:g> kontaktuari"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefono publikoa"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> (<xliff:g id="TIME">%2$s</xliff:g>)"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Ezin da zenbaki horretara deitu"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Erantzungailua konfiguratzeko, joan Menua &gt; Ezarpenak atalera."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Erantzungailua entzuteko, Hegaldi modua desaktibatu behar duzu."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Ahots bidezko bilaketa ez dago erabilgarri"</string>
<string name="call_not_available" msgid="8941576511946492225">"Ezin da telefono-deirik egin Telefonoa aplikazioa desgaitu egin delako."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Ez dago hori egin dezakeen aplikaziorik gailu honetan"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Idatzi izena edo telefono-zenbakia"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Ez duzu dei galdurik."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Erantzungailuaren sarrerako ontzia hutsik dago."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Bilatu kontaktuetan"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Gehitu zk. edo bilatu kontaktua"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Hutsik dago deien historia"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Deitu"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Ez duzu dei galdurik."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Hutsik dago erantzungailuaren sarrerako ontzia."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Ahots-mezuen artxiboa hutsik dago."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Erakutsi gogokoak soilik"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historia"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Deien historia"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Ahots-mezuen artxiboa"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Guztiak"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Galduak"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Erantzungailuko deiak"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Blokeatzeko aukera berri sinplifikatua"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Zu hobeto babesteko, blokeatzeko funtzioa aldatu behar du Telefonoa aplikazioak. Aurrerantzean, blokeatutako zenbakien deiak eta testu-mezuak jasotzeari utziko zaio, eta baliteke zenbaki horiek beste aplikazioekin partekatzea."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Baimendu"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> blokeatu nahi duzu?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Zenbaki honetatik jasotzen diren deiak blokeatu egingo dira, eta mezuak automatikoki ezabatuko dira erantzungailutik."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Zenbaki honetatik jasotzen diren deiak blokeatu egingo dira, baina deitzaileak mezuak utzi ahal izango dizkizu erantzungailuan."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Ez duzu deirik edo testu-mezurik jasoko zenbaki horretatik."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKEATU"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> desblokeatu nahi duzu?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOKEATU"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Markatze bizkorra"</string>
- <string name="tab_recents" msgid="929949073851377206">"Azkenak"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Deien historia"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktuak"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Erantzungailua"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Gogokoetatik kendu da"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Gehitu kontaktuetan"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Bidali SMS mezua"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Egin bideo-deia"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ikusi deien historia osoa"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokeatu zenbakia"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> dei galdu berri"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Ez duzu inor markatze bizkorrean oraindik"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Gehitu gogokoa"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Ukitu irudia zenbaki guztiak ikusteko, edo eduki ezazu sakatuta berrantolatzeko"</string>
<string name="remove_contact" msgid="1080555335283662961">"Kendu"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Bideo-deia"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Bidali mezua"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Bidali mezua"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Deiaren xehetasunak"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Deitu: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Galdutako deiaren xehetasunak: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Erantzundako deiaren xehetasunak: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Erantzungailuko mezua, irakurri gabe: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Erantzungailuko mezua: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Egindako deiaren xehetasunak: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> kontuan"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> bidez"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> bidez"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> kontuan, <xliff:g id="NUMBER">%2$s</xliff:g> bidez"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, <xliff:g id="NUMBER">%2$s</xliff:g> bidez"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Deitu"</string>
<string name="description_call_action" msgid="4000549004089776147">"Deitu <xliff:g id="NAMEORNUMBER">^1</xliff:g> deitzaileari"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Egin bideo-deia (<xliff:g id="NAMEORNUMBER">^1</xliff:g>)."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Erantzun bizkorrak"</string>
<string name="call_settings_label" msgid="313434211353070209">"Deiak"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Deien blokeoa"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Deien blokeoa aldi baterako desgaituta"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Deiak blokeatzeko aukera desgaitu egin da, azken 48 orduetan larrialdi-zerbitzuekin harremanetan jarri zarelako telefono honetatik. Berriro gaituko da 48 orduko epea igaro ondoren."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Inportatu zenbakiak"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Deitzaile batzuk beste aplikazio batzuen bidez erantzungailura automatikoki bidaltzea aukeratu duzu."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ikusi zenbakiak"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Inportatu"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Ezin izan da inportatu"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Ezin izan da artxibatu ahots-mezua."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desblokeatu zenbakia"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Gehitu zenbakia"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Zenbaki hauetatik jasotzen diren deiak blokeatu egingo dira, eta mezuak automatikoki ezabatuko dira erantzungailutik."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Zenbaki hauetatik jasotzen diren deiak blokeatu egingo dira, baina deitzaileek mezuak utzi ahal izango dizkizute erantzungailuan."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokeatutako zenbakiak"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> zenbakiak ez du balio."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> blokeatuta dago dagoeneko."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Deiak blokeatzeko aukera desgaituta egongo da 48 orduan"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Desgaituta dago, larrialdi-dei bat egin delako."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Deiak egiteko kontuak"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktibatu"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Ezarri baimenak"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Markatze bizkorra gaitzeko,\n aktibatu kontaktuak atzitzeko baimena."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Deien erregistroa ikusteko,\n aktibatu telefonoa atzitzeko baimena."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Kontaktuak ikusteko,\n aktibatu kontaktuak atzitzeko baimena."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Erantzungailua atzitzeko,\n aktibatu telefonoa atzitzeko baimena."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Markatze bizkorra gaitzeko, aktibatu Kontaktuak erabiltzeko baimena."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Deien erregistroa ikusteko, aktibatu Telefonoa erabiltzeko baimena."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Kontaktuak ikusteko, aktibatu Kontaktuak erabiltzeko baimena."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Erantzungailuan sartzeko, aktibatu Telefonoa erabiltzeko baimena."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kontaktuak bilatzeko, aktibatu kontaktuak atzitzeko baimenak."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Deiak egiteko,\n aktibatu telefonoa atzitzeko baimena."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Deiak egiteko, aktibatu Telefonoa erabiltzeko baimena."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefonoaren aplikazioak ez du baimenik sistemaren ezarpenetan ezer idazteko."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokeatuta"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> aktibo dago"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 82c258806..984d93c5c 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"تلفن"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"تلفن"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"صفحه شماره‌گیری تلفن"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"تلفن"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"سابقه تماس"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"تماس با <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"گزارش شماره نادرست"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ویرایش شماره قبل از تماس"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"افزودن به مخاطب"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"حذف از سابقه تماس"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"پاک کردن سابقه تماس"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"حذف پست صوتی"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"اشتراک‌گذاری پست صوتی"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"گزارش تماس شما خالی است"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"برقراری تماس تلفنی"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"سابقه تماس"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"گزارش شماره نادرست"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"کپی کردن شماره"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"کپی کردن آوانویسی"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"مسدود کردن شماره"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> مسدود شد"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"رفع انسداد شماره"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> گشوده شد"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"واگرد"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"حذف"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ویرایش شماره قبل از تماس"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"پاک کردن سابقه تماس"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"حذف پست صوتی"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"بایگانی پست صوتی"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"اشتراک‌گذاری پست صوتی"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"پست صوتی حذف شد"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"پست صوتی بایگانی شد"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"واگرد"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"رفتن به بایگانی"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"سابقه تماس پاک شود؟"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"این کار همه تماس‌ها را از سابقه شما حذف می‌کند"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"در حال پاک کردن سابقه تماس..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"تلفن"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"تماس بی‌پاسخ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"تماس کاری بی‌پاسخ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"تماس‌های بی‌پاسخ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> تماس بی‌پاسخ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"پاسخ تماس"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"پیام"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> پست صوتی </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> پست صوتی </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>، <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"پست صوتی جدید از <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"پست صوتی پخش نشد"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"در حال بافر کردن؟؟؟"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"در حال بارگیری پست صوتی..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"در حال بایگانی کردن پست صوتی..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"پست صوتی بارگیری نشد"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"فقط تماس‌های دارای پست صوتی"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"فقط تماس‌های دریافتی"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"سابقه تماس"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"گزینه‌های بیشتر"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"صفحه شماره‌گیری"</string>
- <string name="menu_copy" msgid="6108677035381940698">"کپی"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"فقط نمایش خروجی"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"فقط نمایش ورودی"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"فقط نمایش بی‌پاسخ"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"تماس ویدیویی خروجی"</string>
<string name="type_missed_video" msgid="954396897034220545">"تماس ویدیویی بی‌پاسخ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"پست صوتی"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"تماس ردشده"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"تماس مسدودشده"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"تماس‌های ورودی"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"پخش پست صوتی"</string>
<string name="description_view_contact" msgid="5205669345700598415">"مشاهده مخاطب <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"تماس با <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"جزئیات تماس برای <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"پست صوتی جدید."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> تماس."</string>
<string name="description_video_call" msgid="2933838090743214204">"تماس ویدیویی."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"ارسال پیامک به <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"تلفن عمومی"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> ثانیه"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> دقیقه <xliff:g id="SECONDS">%s</xliff:g> ثانیه"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ساعت <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"تماس با این شماره ممکن نیست"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"‏برای راه‌اندازی پست صوتی به منو &gt; تنظیمات بروید."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"برای تماس با پست صوتی، ابتدا حالت هواپیما را غیرفعال کنید."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"جستجوی شفاهی در دسترس نیست"</string>
<string name="call_not_available" msgid="8941576511946492225">"برقراری تماس تلفنی ممکن نیست، زیرا برنامه تلفن غیرفعال شده است."</string>
<string name="activity_not_available" msgid="2287665636817987623">"هیچ برنامه‌ای برای انجام این کار در این دستگاه نصب نیست"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"نام یا شماره تلفنی وارد کنید"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"تماس بی‌پاسخی ندارید."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"صندوق پست صوتی‌تان خالی است."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"جستجوی مخاطبین"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"افزودن شماره یا جستجوی مخاطب"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"سابقه تماستان خالی است"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"برقراری تماس تلفنی"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"تماس بی‌پاسخی ندارید."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"صندوق پست صوتی‌تان خالی است."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"بایگانی پست صوتی خالی است."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"فقط نمایش موارد دلخواه"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"سابقه"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"سابقه تماس"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"بایگانی پست صوتی"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"همه موارد"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"بی‌پاسخ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"پست صوتی"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"مسدود کردن جدید و ساده‌شده"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"برای محافظت بهتر از شما، «تلفن» باید عملکرد مسدود کردن را تغییر دهد. شماره‌های مسدود شده دیگر تماس و پیام نوشتاری ارسال/دریافت نخواهند کرد و ممکن است با برنامه‌های دیگر به اشتراک گذاشته شوند."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"اجازه دادن"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> مسدود شود؟"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"تماس‌‌ها از این شماره مسدود می‌شود و پست‌‌های صوتی به‌طور خودکار حذف می‌شود."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"تماس‌ها از این شماره مسدود می‌شود، اما ممکن است تماس‌گیرنده همچنان بتواند برایتان پست صوتی بگذارد."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"دیگر از این شماره، تماس یا پیام نوشتاری دریافت نمی‌کنید."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"مسدود کردن"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> رفع انسداد شود؟"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"رفع انسداد"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"شماره‌گیری سریع"</string>
- <string name="tab_recents" msgid="929949073851377206">"موارد اخیر"</string>
+ <string name="tab_history" msgid="2563144697322434940">"سابقه تماس"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"مخاطبین"</string>
<string name="tab_voicemail" msgid="155024725947496746">"پست صوتی"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"از موارد دلخواه حذف شد"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"افزودن به مخاطب"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"ارسال پیامک"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"برقراری تماس ویدیویی"</string>
- <string name="show_call_history" msgid="1141502332266697170">"مشاهده سابقه تماس به صورت کامل"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"مسدود کردن شماره"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> تماس‌ بی‌پاسخ جدید"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"هنوز کسی در فهرست شماره‌گیری سریع شما نیست"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"افزودن مورد دلخواه"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"برای مشاهده همه شماره‌ها، تصویر را لمس کنید یا برای ترتیب مجدد لمس کنید و نگه دارید"</string>
<string name="remove_contact" msgid="1080555335283662961">"حذف"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"تماس ویدیویی"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"ارسال پیام"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ارسال پیام"</string>
<string name="call_log_action_details" msgid="701345508704970622">"جزئیات تماس"</string>
<string name="call_log_action_call" msgid="463690849042459842">"تماس با <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"تماس از دست رفته از <xliff:g id="NAMEORNUMBER">^1</xliff:g>، ‏<xliff:g id="TYPEORLOCATION">^2</xliff:g>، ‏<xliff:g id="TIMEOFCALL">^3</xliff:g>، ‏<xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"تماس پاسخ داده شده از <xliff:g id="NAMEORNUMBER">^1</xliff:g>، ‏<xliff:g id="TYPEORLOCATION">^2</xliff:g>، ‏<xliff:g id="TIMEOFCALL">^3</xliff:g>، ‏<xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"پست صوتی خوانده نشده از <xliff:g id="NAMEORNUMBER">^1</xliff:g>،‏ <xliff:g id="TYPEORLOCATION">^2</xliff:g>،‏ <xliff:g id="TIMEOFCALL">^3</xliff:g>،‏ <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"پست صوتی از <xliff:g id="NAMEORNUMBER">^1</xliff:g>،‏ <xliff:g id="TYPEORLOCATION">^2</xliff:g>،‏ <xliff:g id="TIMEOFCALL">^3</xliff:g>،‏ <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"تماس با <xliff:g id="NAMEORNUMBER">^1</xliff:g>، ‏<xliff:g id="TYPEORLOCATION">^2</xliff:g>، ‏<xliff:g id="TIMEOFCALL">^3</xliff:g>، ‏<xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"در <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"از طریق <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"از طریق <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"در <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>، از طریق <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> از طریق <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"تماس"</string>
<string name="description_call_action" msgid="4000549004089776147">"تماس با <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"تماس ویدیویی با <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"پاسخ‌های سریع"</string>
<string name="call_settings_label" msgid="313434211353070209">"تماس‌ها"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"مسدود کردن تماس"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"انسداد تماس موقتاً خاموش است"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"چون در ۴۸ ساعت گذشته با این تلفن با سرویس‌های اضطراری تماس گرفتید، انسداد تماس غیرفعال شده است. پس از گذشت ۴۸ ساعت، این قابلیت دوباره فعال می‌شود."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"وارد کردن شماره‌ها"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"قبلاً ازطریق برنامه‌های دیگر، برخی از تماس‌گیرندگان را برای ارسال خودکار به پست صوتی علامت زده‌اید."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"مشاهده شماره‌ها"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"وارد کردن"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"وارد کردن انجام نشد"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"پست صوتی بایگانی نشد."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"رفع انسداد شماره"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"افزودن شماره"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"تماس‌‌ها از این شماره‌ها مسدود می‌شود و پست‌‌های صوتی به‌طور خودکار حذف می‌شود."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"تماس‌‌ها از این شماره‌ها مسدود می‌شود اما ممکن است همچنان بتوانند برای شما پست صوتی بگذارند."</string>
+ <string name="block_list" msgid="7760188925338078011">"شماره‌های مسدود شده"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> نامعتبر است."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> درحال‌حاضر مسدود شده است."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"مسدود کردن تماس برای ۴۸ ساعت غیرفعال شد"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"به علت برقرار شدن تماس اضطراری، غیرفعال شد."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"حساب‌های تماس"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"روشن کردن"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"تنظیم مجوزها"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"برای فعال کردن شماره‌گیر سریع\n مجوز «مخاطبین» را روشن کنید."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"برای دیدن گزارش تماس،\n مجوز تلفن را روشن کنید."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"برای دیدن مخاطبینتان،\n مجوز مخاطبین را روشن کنید."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"برای دسترسی به پست صوتی‌تان،\n مجوز تلفن را روشن کنید."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"برای فعال کردن شماره‌گیری سریع، مجوز «مخاطبین» را روشن کنید."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"برای دیدن گزارش تماستان، مجوز «تلفن» را روشن کنید."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"برای دیدن مخاطبینتان، مجوز «مخاطبین» را روشن کنید."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"برای دسترسی به پست صوتی‌تان، مجوز «تلفن» را روشن کنید."</string>
<string name="permission_no_search" msgid="84152933267902056">"برای جستجوی مخاطبینتان، مجوزهای مخاطبین را روشن کنید."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"برای برقراری تماس،\n مجوز تلفن را روشن کنید."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"برای برقراری تماس، مجوز «تلفن» را روشن کنید."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"برنامه تلفن اجازه نوشتن در تنظیمات سیستم را ندارد."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"مسدودشده"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> فعال است"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 67c9fa760..39b0eb130 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Puhelin"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Puhelin"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Puhelimen näppäimistö"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Puhelin"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Soittohistoria"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Soita: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Ilmoita epätarkasta numerosta"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Muokkaa numeroa ennen puhelua"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Lisää yhteystietoihin"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Poista soittohistoriasta"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Tyhjennä soittohistoria"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Poista vastaajaviesti"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Jaa vastaajaviesti"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Puheluloki on tyhjä."</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Soita puhelu"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Soittohistoria"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Ilmoita epätarkasta numerosta"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopioi numero"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopioi transkriptio"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Estä numero"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Numero <xliff:g id="NUMBER">%1$s</xliff:g> estetty"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Kumoa numeron esto"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Numeron <xliff:g id="NUMBER">%1$s</xliff:g> esto kumottu"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"KUMOA"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Poista"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Muokkaa numeroa ennen puhelua"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Tyhjennä soittohistoria"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Poista vastaajaviesti"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arkistoi vastaajaviesti"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Jaa vastaajaviesti"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Viesti poistettiin."</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Vastaajaviesti arkistoitiin."</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"KUMOA"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARKISTOON"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Tyhjennetäänkö soittohistoria?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Kaikki soittohistorian tiedot poistetaan"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Tyhjennetään soittohistoriaa…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Puhelin"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Vastaamaton puhelu"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Vastaamaton työpuhelu"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Vastaamattomat puhelut"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> vastaamatonta puhelua"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Soita takaisin"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Viesti"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> vastaajaviestiä </item>
<item quantity="one">Vastaajaviesti</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Uusi vastaajaviesti: <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Viestin toistaminen epäonnistui"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Puskuroidaan..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Ladataan puhelinvastaajaa…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arkistoidaan vastaajaviestiä…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Puhelinvastaajan lataaminen epäonnistui"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Vain vastaajaan menneet puhelut"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Vain saapuvat puhelut"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Soittohistoria"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Lisää vaihtoehtoja"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"näppäimistö"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopioi"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Näytä vain soitetut"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Näytä vain saapuneet"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Näytä vain vastaamattomat"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Soitettava videopuhelu"</string>
<string name="type_missed_video" msgid="954396897034220545">"Vastaamaton videopuhelu"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Vastaaja"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Hylätty puhelu"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Estetty puhelu"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Saapuvat puhelut"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Toista vastaajaviesti"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Näytä yhteystieto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Soita: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Yhteystiedot: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Uusi ääniviesti."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> puhelua."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videopuhelu."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Lähetä tekstiviesti: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Maksupuhelin"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> klo <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>.<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Numeroon ei voi soittaa"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Määritä puhelinvastaajan asetukset kohdassa Valikko &gt; Asetukset."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Poista lentokonetila käytöstä ennen vastaajaan soittamista."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Puhehaku ei ole käytettävissä"</string>
<string name="call_not_available" msgid="8941576511946492225">"Puhelua ei voi soittaa, koska Puhelin-sovellus on poistettu käytöstä."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Laitteessa ei ole kyseiseen toimintoon tarvittavaa sovellusta"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Anna nimi tai puhelinnumero"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Sinulla ei ole vastaamattomia puheluita."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Puhelinvastaajasi postilaatikko on tyhjä."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Hae yhteystietoja"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Lisää numero tai hae yhteystiedoista"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Soittohistoriasi on tyhjä."</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Soita puhelu"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Sinulla ei ole vastaamattomia puheluita."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Puhelinvastaajasi postilaatikko on tyhjä."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Vastaaja-arkisto on tyhjä."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Näytä vain suosikit"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historia"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Soittohistoria"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arkistoidut vastaajaviestit"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Kaikki"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Vastaamattomat"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Vastaaja"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Uusi kätevämpi estotapa"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Puhelimen on muokattava estoperiaatetta, jotta suojaus toimii paremmin. Nyt estetyistä numeroista saapuvat puhelut ja tekstiviestit estetään, ja estotiedot voidaan jakaa muille sovelluksille."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Salli"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Estetäänkö <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Tästä numerosta tulevat puhelut estetään, ja vastaajaviestit poistetaan automaattisesti."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Tästä numerosta tulevat puhelut estetään, mutta soittaja voi silti mahdollisesti jättää vastaajaviestejä."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Tästä numerosta tulevat puhelut ja tekstiviestit estetään."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ESTÄ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Kumotaanko numeron <xliff:g id="NUMBER">%1$s</xliff:g> esto?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"KUMOA ESTO"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Pikavalinta"</string>
- <string name="tab_recents" msgid="929949073851377206">"Viimeisimmät"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Soittohistoria"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Yhteystiedot"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Puhelinvastaaja"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Poistettu suosikeista"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Lisää yhteystietoihin"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Lähetä tekstiviesti"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Soita videopuhelu"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Näytä koko soittohistoria"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Estä numero"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> uutta vastaamatonta puhelua"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Pikavalinnassa ei ole vielä yhtään yhteystietoa."</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Lisää suosikki"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Katso kaikki numerot koskettamalla kuvaa tai järjestele tietoja koskettamalla kuvaa pitkään"</string>
<string name="remove_contact" msgid="1080555335283662961">"Poista"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videopuhelu"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Lähetä viesti"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Lähetä viesti"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Puhelun tiedot"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Soita: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Vastaamaton puhelu soittajalta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Vastattu puhelu soittajalta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Lukematon vastaajaviesti: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Vastaajaviesti: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Soita vastaanottajalle <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"numerosta <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"numerosta <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"tililtä <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> numerosta <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> numerosta <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Soita"</string>
<string name="description_call_action" msgid="4000549004089776147">"Soita: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Soita videopuhelu: <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Pikavastaukset"</string>
<string name="call_settings_label" msgid="313434211353070209">"Puhelut"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Puhelujen esto"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Puheluesto väliaikaisesti pois käytöstä"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Puheluiden estäminen on poistettu käytöstä, koska olet ottanut yhteyttä hätäpalveluihin tästä puhelimesta viimeisen 48 tunnin aikana. Esto otetaan automaattisesti uudelleen käyttöön, kun puhelusta on kulunut 48 tuntia."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Tuo numerot"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Valitsit aiemmin muilla sovelluksilla, että tiettyjen soittajien puhelut siirretään automaattisesti vastaajaan."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Näytä numerot"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Tuo"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Tuonti epäonnistui."</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Vastaajaviestin arkistointi epäonnistui."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Poista numeron esto"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Lisää numero"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Näistä numeroista tulevat puhelut estetään, ja vastaajaviestit poistetaan automaattisesti."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Näistä numeroista tulevat puhelut estetään, mutta soittajat voivat silti mahdollisesti jättää vastaajaviestejä."</string>
+ <string name="block_list" msgid="7760188925338078011">"Estetyt numerot"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> on virheellinen."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> on jo estetty."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Puhelujen esto poistettiin käytöstä 48 tunnin ajaksi"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Toiminto poistettiin käytöstä hätäpuhelun vuoksi."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Puhelutilit"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Ota käyttöön"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Määritä käyttöoikeudet"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Jos haluat ottaa käyttöön pikavalinnan, \nota käyttöön yhteystietojen käyttöoikeus."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Jos haluat nähdä puhelulokisi, \nota käyttöön puhelimen käyttöoikeudet."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Jos haluat nähdä yhteystietosi, \nota käyttöön yhteystietojen käyttöoikeudet."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Jos haluat käyttää puhelinvastaajaa, \nota käyttöön puhelimen käyttöoikeus."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Jos haluat käyttää pikavalintaa, ota Yhteystiedot-käyttöoikeus käyttöön."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Jos haluat katsella puhelulokiasi, ota Puhelin-käyttöoikeus käyttöön."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Jos haluat katsella yhteystietojasi, ota Yhteystiedot-käyttöoikeus käyttöön."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Jos haluat käyttää puhelinvastaajaa, ota Puhelin-käyttöoikeus käyttöön."</string>
<string name="permission_no_search" msgid="84152933267902056">"Jos haluat hakea kontaktejasi, ota käyttöön kontaktien käyttöoikeudet."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Jos haluat soittaa puhelun, \nota käyttöön puhelimen käyttöoikeus."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Jos haluat soittaa puheluja, ota Puhelin-käyttöoikeus käyttöön."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Puhelinsovelluksella ei ole oikeutta muokata järjestelmän asetuksia."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Estetyt"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> on aktiivinen."</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 6aa54eaad..19d9f850e 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Téléphone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Téléphone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Clavier du téléphone"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Téléphone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historique des appels"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Appeler <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Signaler un numéro incorrect"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Modifier le numéro avant de passer l\'appel"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Ajouter à un contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Supprimer l\'historique des appels"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Effacer l\'historique d\'appels"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Supprimer le message vocal"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Partager le message vocal"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Votre journal d\'appels est vide"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Faire un appel"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historique des appels"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Signaler un numéro incorrect"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copier le numéro"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copier la transcription"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquer le numéro"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Le numéro « <xliff:g id="NUMBER">%1$s</xliff:g> » est bloqué"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Débloquer le numéro"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Le numéro « <xliff:g id="NUMBER">%1$s</xliff:g> » est débloqué"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANNULER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Supprimer"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Modifier le numéro avant l\'appel"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Effacer l\'historique des appels"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Supprimer le message vocal"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archiver les messages vocaux"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Partager les messages vocaux"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Mess. vocal supprimé"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Messages vocaux archivés"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANNULER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARCHIVE"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Effacer l\'historique des appels?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Tous les appels seront supprimés de votre historique."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Suppression historique des appels…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Téléphone"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Appel manqué"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Appel professionnel manqué"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Appels manqués"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Rappeler"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Message"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> message vocal </item>
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> messages vocaux </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nouveau message vocal de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Impossible de lire le message vocal"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Mise mémoire tampon"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Chargement du message vocal en cours…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archivage des messages vocaux en cours…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Impossible de charger la messagerie vocale"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Seulement les appels avec message vocal"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Seulement les appels entrants"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historique des appels"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Plus d\'options"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"clavier numérique"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copier"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Afficher appels sortants uniq."</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Afficher appels entrants uniq."</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Afficher appels manqués uniq."</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Appel vidéo sortant"</string>
<string name="type_missed_video" msgid="954396897034220545">"Appel vidéo manqué"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Messagerie vocale"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Appel refusé"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Appel bloqué"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Appels entrants"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Écouter le message vocal"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Afficher le contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Appeler <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Coordonnées de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nouveau message vocal."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> appels."</string>
<string name="description_video_call" msgid="2933838090743214204">"Appel vidéo."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Envoyer un texto à <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Cabine téléphonique"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min et <xliff:g id="SECONDS">%s</xliff:g> sec"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> à <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Vous ne pouvez pas appeler ce numéro"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Pour configurer la messagerie vocale, accédez à Menu &gt; Paramètres."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Veuillez désactiver le mode Avion avant d\'appeler la messagerie vocale."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Recherche vocale non disponible"</string>
<string name="call_not_available" msgid="8941576511946492225">"Impossible d\'effectuer un appel téléphonique, car l\'application Téléphone a été désactivée."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Cette action ne peut être effectuée par aucune application sur cet appareil."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Entrez nom ou numéro de tél."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Vous n\'avez aucun appel manqué."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"La boîte de réception de votre messagerie vocale est vide."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Rechercher des contacts"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Ajouter nº ou chercher contact"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Votre historique des appels est vide"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Faire un appel"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Vous n\'avez aucun appel manqué."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"La boîte de réception de votre messagerie vocale est vide."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Votre archive de messages vocaux est vide."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Afficher les contacts favoris uniquement"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historique"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historique des appels"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archive des messages vocaux"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Tous"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Manqués"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Mess. voc."</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nouveau blocage simplifié"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Afin de mieux vous protéger, l\'application Téléphone doit modifier la façon dont le blocage fonctionne. Le blocage de numéros s\'appliquera désormais aux appels et aux messages texte et pourra être partagé avec d\'autres applications."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Autoriser"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Bloquer le numéro <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Les appels provenant de ce numéro seront bloqués et les messages vocaux seront automatiquement supprimés."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Les appels provenant de ce numéro seront bloqués, mais il se peut que l\'appelant puisse quand même vous laisser des messages vocaux."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Vous ne recevrez plus d\'appels ni de messages texte de ce numéro."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUER"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Débloquer le numéro <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DÉBLOQUER"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Composition abrégée"</string>
- <string name="tab_recents" msgid="929949073851377206">"Récents"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historique des appels"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contacts"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Messagerie vocale"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Supprimé des favoris"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Ajouter à un contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Envoyer un texto"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Faire un appel vidéo"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Afficher tout l\'historique des appels"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquer le numéro"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nouveaux appels manqués"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Aucun contact ne figure dans vos numéros de composition abrégée"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Ajouter un favori"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Touchez l\'image pour afficher tous les numéros, ou maintenez votre doigt sur l\'écran pour les réorganiser"</string>
<string name="remove_contact" msgid="1080555335283662961">"Supprimer"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Appel vidéo"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Envoyer un message"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Envoyer un message"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Détails de l\'appel"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Appeler <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Appel manqué : <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Appel répondu : <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Message vocal non écouté de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Message vocal de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Appel effectué : <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"sur <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"au <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"au <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"sur <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, au <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, au <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Appeler"</string>
<string name="description_call_action" msgid="4000549004089776147">"Appeler <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Appel vidéo avec <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Réponses rapides"</string>
<string name="call_settings_label" msgid="313434211353070209">"Appels"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blocage des appels"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blocage appels désactivé temporairement"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Le blocage des appels a été désactivé, car vous avez communiqué avec les services d\'urgence à partir de ce téléphone au cours des dernières 48 heures. Le blocage sera réactivé automatiquement après 48 heures."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importer les numéros"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Vous avez indiqué que certains appelants devaient automatiquement être renvoyés vers la messagerie vocale par d\'autres applications."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Afficher les numéros"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importer"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Échec de l\'importation"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Échec de l\'archivage des messages vocaux"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Débloquer le numéro"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Ajouter un numéro"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Les appels provenant de ces numéros seront bloqués et les messages vocaux seront automatiquement supprimés."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Les appels provenant de ces numéros seront bloqués, mais il se peut que les appelants puissent quand même vous laisser des messages vocaux."</string>
+ <string name="block_list" msgid="7760188925338078011">"Numéros bloqués"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Le numéro <xliff:g id="NUMBER">%1$s</xliff:g> n\'est pas valide."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Le numéro <xliff:g id="NUMBER">%1$s</xliff:g> est déjà bloqué."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blocage des appels désactivé pendant 48 heures"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Désactivé, car un appel d\'urgence a été effectué"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Comptes d\'appel"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activer"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Définir les autorisations"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Pour activer la numérotation abrégée, \nactivez l\'autorisation Contacts."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Pour voir votre journal d\'appels, \nactivez l\'autorisation Téléphone."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Pour voir vos contacts, \nactivez l\'autorisation Contacts."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Pour accéder à votre messagerie vocale, \nactivez l\'autorisation Téléphone."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Pour activer la composition abrégée, activez l\'autorisation Contacts."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Pour consulter votre journal d\'appels, activez l\'autorisation Téléphone."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Pour consulter vos contacts, activez l\'autorisation Contacts."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Pour accéder à votre messagerie vocale, activez l\'autorisation Téléphone."</string>
<string name="permission_no_search" msgid="84152933267902056">"Pour rechercher vos contacts et les lieux à proximité, activez les autorisations Contacts."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Pour faire un appel, \nactivez l\'autorisation Téléphone."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Pour faire un appel, activez l\'autorisation Téléphone."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"L\'application Téléphone n\'est pas autorisée à modifier les paramètres du système."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqué"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Appel en cours avec : <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index b9f4db19b..9d063e1d4 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Téléphone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Téléphone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Clavier du téléphone"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Tél."</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historique des appels"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Appeler <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Signaler un numéro incorrect"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Modifier le numéro avant d\'effectuer l\'appel"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Ajouter à un contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Supprimer de l\'historique des appels"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Supprimer l\'historique des appels"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Supprimer le message vocal"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Partager le message vocal"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Votre journal d\'appels est vide."</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Passer un appel"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historique des appels"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Signaler un numéro incorrect"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copier le numéro"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copier la transcription"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquer le numéro"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Le numéro \"<xliff:g id="NUMBER">%1$s</xliff:g>\" est bloqué."</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Débloquer le numéro"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Le numéro \"<xliff:g id="NUMBER">%1$s</xliff:g>\" est débloqué."</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANNULER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Supprimer"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Modifier numéro avant d\'appeler"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Supprimer l\'historique des appels"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Supprimer le message vocal"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archiver le message vocal"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Partager le message vocal"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Mess. vocal supprimé"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Message vocal archivé"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANNULER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ACCÉDER À L\'ARCHIVE"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Supprimer l\'historique des appels ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Tous les appels seront supprimés de votre historique."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Suppression historique des appels…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Téléphoner"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Appel manqué"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Appel professionnel manqué"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Appels manqués"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> appels manqués"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Rappeler"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Envoyer un SMS"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> message vocal </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> messages vocaux </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nouveau message vocal de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Impossible de lire le message vocal."</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Mise en mémoire tampon..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Chargement du message vocal en cours…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archivage du message vocal…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Impossible de charger le message vocal."</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Seulement les appels avec message vocal"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Seulement les appels entrants"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historique des appels"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Plus d\'options"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"clavier numérique"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copier"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Afficher appels sortants uniq."</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Afficher appels entrants uniq."</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Afficher appels manqués uniq."</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Appel vidéo sortant"</string>
<string name="type_missed_video" msgid="954396897034220545">"Appel vidéo manqué"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Messagerie vocale"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Appel refusé"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Appel bloqué"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Appels entrants"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Écouter le message vocal"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Afficher le contact <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Appeler <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Coordonnées associées à <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nouveau message vocal"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> appels"</string>
<string name="description_video_call" msgid="2933838090743214204">"Appel vidéo"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Envoyer un SMS à <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Cabine téléphonique"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> secondes"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min et <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> à <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Impossible d\'appeler ce numéro."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Pour configurer la messagerie vocale, accédez à Menu &gt; Paramètres."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Veuillez désactiver le mode Avion avant d\'appeler la messagerie vocale."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Recherche vocale non disponible"</string>
<string name="call_not_available" msgid="8941576511946492225">"Impossible d\'effectuer un appel téléphonique, car l\'application Téléphone a été désactivée."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Cette action ne peut être effectuée via aucune application sur cet appareil."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Saisir nom ou numéro téléphone"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Vous n\'avez aucun appel manqué."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"La boîte de réception de la messagerie vocale est vide."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Rechercher dans vos contacts"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Ajouter num. ou rech. contacts"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Votre historique des appels est vide."</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Passer un appel"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Vous n\'avez aucun appel manqué."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"La boîte de réception de la messagerie vocale est vide."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"L\'archive de messages vocaux est vide."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Afficher les contacts ajoutés aux favoris uniquement"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historique"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historique des appels"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archive de messages vocaux"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Tous"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Manqués"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Mess. vocale"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nouveau processus de blocage simplifié"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Afin de mieux vous protéger, la fonctionnalité de blocage de numéros doit être modifiée. Le blocage pourra désormais être appliqué aux appels entrants comme aux SMS entrants, et être étendu à d\'autres applications."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Autoriser"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Bloquer le numéro \"<xliff:g id="NUMBER">%1$s</xliff:g>\" ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Les appels associés à ce numéro seront bloqués, et les messages vocaux seront automatiquement supprimés."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Les appels associés à ce numéro seront bloqués, mais l\'appelant pourra peut-être toujours vous laisser des messages vocaux."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Vous ne recevrez plus d\'appels ni de SMS provenant de ce numéro."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUER"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Débloquer le numéro \"<xliff:g id="NUMBER">%1$s</xliff:g>\" ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DÉBLOQUER"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Numérotation abrégée"</string>
- <string name="tab_recents" msgid="929949073851377206">"Récents"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historique des appels"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contacts"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Messagerie vocale"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Supprimé des favoris."</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Ajouter à un contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Envoyer un SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Passer un appel vidéo"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Afficher tout l\'historique des appels"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquer le numéro"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Nouveaux appels manqués : <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Vous n\'avez encore défini la numérotation abrégée pour aucun contact."</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Ajouter un favori"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Appuyer sur l\'image pour afficher tous les numéros, ou appuyer dessus de manière prolongée pour réorganiser ces derniers"</string>
<string name="remove_contact" msgid="1080555335283662961">"Supprimer"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Appel vidéo"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Envoyer un message"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Envoyer un message"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Informations sur l\'appel"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Appeler <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Appel manqué <xliff:g id="TIMEOFCALL">^3</xliff:g> (appelant : <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Appel reçu <xliff:g id="TIMEOFCALL">^3</xliff:g> (appelant : <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Message vocal à écouter de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Message vocal de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Appel émis <xliff:g id="TIMEOFCALL">^3</xliff:g> (destinataire : <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)"</string>
<string name="description_phone_account" msgid="1767072759541443861">"sur <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"au <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"au <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"sur <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, au <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> au <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Appeler"</string>
<string name="description_call_action" msgid="4000549004089776147">"Appeler <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Appel vidéo de \"<xliff:g id="NAMEORNUMBER">^1</xliff:g>\""</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Réponses rapides"</string>
<string name="call_settings_label" msgid="313434211353070209">"Appels"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blocage des appels"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blocage appels désactivé temporairement"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Le blocage des appels a été désactivé, car vous avez contacté les services d\'urgence à l\'aide de ce téléphone au cours des dernières 48 heures. Le blocage sera réactivé automatiquement après 48 heures."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importer les numéros"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Vous avez indiqué que certains appelants devaient automatiquement être renvoyés vers la messagerie vocale via d\'autres applications."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Afficher les numéros"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importer"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Échec lors de l\'importation."</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Échec de l\'archivage du message vocal."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Débloquer le numéro"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Ajouter un numéro"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Les appels associés à ces numéros seront bloqués, et les messages vocaux seront automatiquement supprimés."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Les appels associés à ces numéros seront bloqués, mais les appelants pourront peut-être toujours vous laisser des messages vocaux."</string>
+ <string name="block_list" msgid="7760188925338078011">"Numéros bloqués"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Le numéro \"<xliff:g id="NUMBER">%1$s</xliff:g>\" n\'est pas valide."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Le numéro \"<xliff:g id="NUMBER">%1$s</xliff:g>\" est déjà bloqué."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blocage des appels désactivé pendant 48 heures"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Désactivé, car un appel d\'urgence a été effectué"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Comptes téléphoniques"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activer"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Définir les autorisations"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Pour activer la numérotation abrégée,\n activez l\'autorisation Contacts."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Pour consulter votre journal d\'appels,\n activez l\'autorisation Téléphone."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Pour consulter vos contacts,\n activez l\'autorisation Contacts."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Pour accéder à votre messagerie vocale,\n activez l\'autorisation Téléphone."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Pour activer la numérotation abrégée, activez l\'autorisation Contacts."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Pour consulter votre journal d\'appels, activez l\'autorisation Téléphone."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Pour consulter vos contacts, activez l\'autorisation Contacts."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Pour accéder à votre messagerie vocale, activez l\'autorisation Téléphone."</string>
<string name="permission_no_search" msgid="84152933267902056">"Pour rechercher vos contacts, activez l\'autorisation Contacts."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Pour passer un appel,\n activez l\'autorisation Téléphone."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Pour passer un appel, activez l\'autorisation Téléphone."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"L\'application Téléphone n\'est pas autorisée à modifier les paramètres du système."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqué"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> est actif."</string>
</resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 33163cb8f..f08ea0a50 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Teléfono"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Teléfono"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclado de marcación do teléfono"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Teléfono"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historial de chamadas"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Chamar a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Informar dun número incorrecto"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editar número antes chamar"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Engadir a un contacto"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Eliminar do historial de chamadas"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Borrar historial de chamadas"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Eliminar correo de voz"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Compartir correo de voz"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"O rexistro de chamadas está baleiro"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Realizar unha chamada"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historial de chamadas"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Informar dun número incorrecto"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiar número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiar transcrición"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquear número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Bloqueouse o <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloquear número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Desbloqueouse o <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESFACER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Eliminar"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editar número antes de chamar"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Borrar historial de chamadas"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Eliminar correo de voz"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arquivar correo de voz"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Compartir correo de voz"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Correo voz eliminado"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Correo de voz arquivado"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESFACER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARQUIVO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Borrar o historial de chamadas?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Esta acción eliminará todas as chamadas do teu historial"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Borrando historial de chamadas…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Teléfono"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Chamada perdida"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Chamada de traballo perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Devolver chamada"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensaxe"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> correos de voz </item>
<item quantity="one">Correo de voz</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Novo correo de voz de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Non se puido reproducir o correo de voz"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Almacenando no búfer..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Cargando correo de voz…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arquivando correo de voz…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Non se puido cargar o correo de voz"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Só chamadas con correo de voz"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Só chamadas entrantes"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historial de chamadas"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Máis opcións"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclado de marcación"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiar"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostrar só as saíntes"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostrar só as entrantes"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostrar só as perdidas"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videochamada saínte"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videochamada perdida"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Correo de voz"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Chamada rexeitada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Chamada bloqueada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Chamadas entrantes"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reproducir correo de voz"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Chamar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalles de contacto de <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Correo de voz novo"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> chamadas"</string>
<string name="description_video_call" msgid="2933838090743214204">"Videochamada"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Envía unha SMS a <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Teléfono público"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ás <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> (<xliff:g id="DURATION">%2$s</xliff:g>)"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Non é posible chamar a este número"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar o correo de voz, vai a Menú &gt; Configuración."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para chamar ao correo de voz, primeiro desactiva o modo avión."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Busca de voz non dispoñible"</string>
<string name="call_not_available" msgid="8941576511946492225">"Non se pode facer unha chamada telefónica porque se desactivou a aplicación de teléfono."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Non hai ningunha aplicación para esa acción neste dispositivo"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Insire un nome/número teléfono"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Non tes chamadas perdidas."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"A caixa de entrada do correo de voz está baleira."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Buscar contactos"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Engade número/busca contactos"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"O teu historial de chamadas está baleiro"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Facer unha chamada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Non tes chamadas perdidas."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"A caixa de entrada do correo de voz está baleira."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"O teu arquivo de correo de voz está baleiro."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostrar só os favoritos"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historial"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historial de chamadas"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arquivo de correo de voz"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Todas"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perdidas"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Correo de voz"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo bloqueo simplificado"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Para protexerte mellor, a aplicación do teléfono necesita cambiar o funcionamento do bloqueo. Os teus números bloqueados agora deterán as chamadas e as mensaxes de texto e, ademais, pode que se compartan con outras aplicacións."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permitir"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Queres bloquear o <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Bloquearanse as chamadas deste número e eliminaranse automaticamente os correos de voz."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Bloquearanse as chamadas deste número, pero é posible que o emisor da chamada aínda poida deixarche correos de voz."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Xa non recibirás máis chamadas nin mensaxes de texto deste número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEAR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Queres desbloquear o <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEAR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Marcación rápida"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recentes"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historial de chamadas"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contactos"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Correo de voz"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Eliminado dos favoritos"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Engadir a un contacto"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Enviar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Realizar unha videochamada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ver historial de chamadas completo"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquear número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> chamadas perdidas novas"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Aínda non tes ningún contacto na marcación directa"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Engadir un favorito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toca a imaxe para ver todos os números ou mantena premida para reordenala"</string>
<string name="remove_contact" msgid="1080555335283662961">"Eliminar"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videochamada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Enviar mensaxe"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Enviar unha mensaxe"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalles da chamada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Chamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Chamada perdida desde <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Chamada respondida desde <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Correo de voz non lido de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Correo de voz de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Chamada a <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"en <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"a través do <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"a través do <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"en <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, a través do <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> a través do <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Chamar"</string>
<string name="description_call_action" msgid="4000549004089776147">"Chamar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videochamada a <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respostas rápidas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Chamadas"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueo de chamadas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"O bloqueo de chamadas desactivouse temporalmente"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"O bloqueo de chamadas desactivouse porque contactaches cos servizos de emerxencias desde este teléfono nas últimas 48 horas. Volverase activar automaticamente unha vez que pase o período de 48 horas."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importar números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Previamente marcaches algúns emisores da chamada para que se envíen automaticamente ao correo de voz a través doutras aplicacións."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ver números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Produciuse un erro na importación"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Erro ao arquivar o correo de voz."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloquear número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Engadir número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Bloquearanse as chamadas destes números e eliminaranse automaticamente os correos de voz."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Bloquearanse as chamadas destes números, pero é posible que aínda poidan deixarche correos de voz."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloqueados"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"O <xliff:g id="NUMBER">%1$s</xliff:g> non e válido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"O <xliff:g id="NUMBER">%1$s</xliff:g> xa está bloqueado."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Desactivouse o bloqueo de chamadas durante 48 horas"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Desactivouse porque se realizou unha chamada de emerxencia."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Contas de chamadas"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activar"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Establecer permisos"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Para activar a marcación rápida,\n activa o permiso Contactos."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Para ver o teu rexistro de chamadas,\n activa o permiso de Teléfono"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Para ver os teus contactos,\n activa o permiso de Contactos."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Para acceder ao correo de voz,\n activa o permiso de Teléfono."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Para activar a marcación rápida, activa o permiso de Contactos."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Para ver o teu rexistro de chamadas, activa o permiso de Teléfono."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Para ver os teus contactos, activa o permiso de Contactos."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Para acceder ao correo de voz, activa o permiso de Teléfono."</string>
<string name="permission_no_search" msgid="84152933267902056">"Para buscar os teus contactos, activa os permisos de Contactos."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Para realizar unha chamada,\n activa o permiso de Teléfono."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Para facer unha chamada, activa o permiso de Teléfono."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"A aplicación Teléfono non ten permiso para modificar a configuración do sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqueado"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Chamada activa: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index cff229037..44624adc2 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ફોન"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ફોન"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ફોન ડાયલપેડ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ફોન"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"કૉલ ઇતિહાસ"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> ને કૉલ કરો"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"અચોક્કસ નંબરની જાણ કરો"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"કૉલ કરતાં પહેલાં નંબર સંપાદિત કરો"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"સંપર્કમાં ઉમેરો"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"કૉલ ઇતિહાસમાંથી કાઢી નાખો"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"કૉલ ઇતિહાસ સાફ કરો"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"વૉઇસમેઇલ કાઢી નાખો"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"વૉઇસમેઇલ શેર કરો"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"તમારો કૉલ લૉગ ખાલી છે"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"એક કૉલ કરો"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"કૉલ ઇતિહાસ"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"અચોક્કસ નંબરની જાણ કરો"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"નંબર કૉપિ કરો"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ટ્રાંસ્ક્રિપ્શન કૉપિ કરો"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"નંબર અવરોધિત કરો"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> અવરોધિત કર્યો"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"નંબર અનાવરોધિત કરો"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> અનાવરોધિત કર્યો"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"પૂર્વવત્ કરો"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"કાઢી નાખો"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"કૉલ કરતાં પહેલાં નંબર સંપાદિત કરો"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"કૉલ ઇતિહાસ સાફ કરો"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"વૉઇસમેઇલ કાઢી નાખો"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"વૉઇસમેઇલને આર્કાઇવ કરો"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"વૉઇસમેઇલ શેર કરો"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"વૉઇસમેઇલ કાઢી નાખ્યો"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"વૉઇસમેઇલ આર્કાઇવ કર્યો"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"પૂર્વવત્ કરો"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"આર્કાઇવ પર જાઓ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"કૉલ ઇતિહાસ સાફ કરીએ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"આ તમારા ઇતિહાસમાંથી તમામ કૉલ્સ કાઢી નાખશે"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"કૉલ ઇતિહાસ સાફ કરી રહ્યાં છે…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ફોન"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"છૂટેલો કૉલ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"ચૂકી ગયેલ કાર્ય કૉલ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"છૂટેલા કૉલ્સ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> છૂટેલા કૉલ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"કૉલ બૅક કરો"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"સંદેશ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> વૉઇસમેઇલ્સ </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> વૉઇસમેઇલ્સ </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> તરફથી નવો વૉઇસમેઇલ."</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"વૉઇસમેઇલ ચલાવી શકાઈ નથી"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"બફર કરી રહ્યું છે…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"વૉઇસમેઇલ લોડ કરી રહ્યું છે…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"વૉઇસમેઇલને આર્કાઇવ કરી રહ્યાં છે…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"વૉઇસમેઇલ લોડ કરી શકાઈ નથી"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"ફક્ત વૉઇસમેઇલ સાથેના કૉલ્સ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ફક્ત ઇનકમિંગ કૉલ્સ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"કૉલ ઇતિહાસ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"વધુ વિકલ્પો"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ડાયલ પેડ"</string>
- <string name="menu_copy" msgid="6108677035381940698">"કૉપિ કરો"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"ફક્ત આઉટગોઇંગ બતાવો"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ફક્ત આવનારા બતાવો"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"ફક્ત છૂટેલ બતાવો"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"આઉટગોઇંગ વિડિઓ કૉલ"</string>
<string name="type_missed_video" msgid="954396897034220545">"વિડિઓ કૉલ ચૂકી ગયાં"</string>
<string name="type_voicemail" msgid="5153139450668549908">"વૉઇસમેઇલ"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"નકારેલો કૉલ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"અવરોધિત કૉલ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ઇનકમિંગ કૉલ્સ"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"વૉઇસમેઇલ ચલાવો"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> સંપર્ક જુઓ"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> ને કૉલ કરો"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> માટે સંપર્ક વિગતો"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"નવો વૉઇસમેઇલ."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> કૉલ્સ."</string>
<string name="description_video_call" msgid="2933838090743214204">"વિડિઓ કૉલ."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> ને SMS મોકલો"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"પેફોન"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> સેકંડ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> મિ <xliff:g id="SECONDS">%s</xliff:g> સે"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> નાં રોજ <xliff:g id="TIME">%2$s</xliff:g> વાગ્યે"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"આ નંબર પર કૉલ કરી શકતાં નથી"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"વૉઇસમેઇલ સેટ કરવા માટે, મેનૂ &gt; સેટિંગ્સ પર જાઓ."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"વૉઇસમેઇલ પર કૉલ કરવા માટે, પહેલાં એરપ્લેન મોડને બંધ કરો."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"વૉઇસ શોધ ઉપલબ્ધ નથી"</string>
<string name="call_not_available" msgid="8941576511946492225">"ફોન કૉલ કરી શકાતો નથી કારણ કે ફોન ઍપ્લિકેશન અક્ષમ કરવામાં આવી છે."</string>
<string name="activity_not_available" msgid="2287665636817987623">"આ ઉપકરણ પર તે માટે કોઈ ઍપ્લિકેશન નથી"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"નામ અથવા ફોન નંબર દાખલ કરો"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"તમારી પાસે કોઇ છૂટેલાં કૉલ્સ નથી."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"તમારું વૉઇસમેઇલ ઇનબોક્સ ખાલી છે."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"સંપર્કો શોધો"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"નંબર ઉમેરો અથવા સંપર્કો શોધો"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"તમારો કૉલ ઇતિહાસ ખાલી છે"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"એક કૉલ કરો"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"તમારી પાસે કોઇ છૂટેલાં કૉલ્સ નથી."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"તમારું વૉઇસમેઇલ ઇનબોક્સ ખાલી છે."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"તમારું વૉઇસમેઇલ આર્કાઇવ ખાલી છે."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ફક્ત મનપસંદ બતાવો"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ઇતિહાસ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"કૉલ ઇતિહાસ"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"વૉઇસમેઇલ આર્કાઇવ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"તમામ"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"છૂટેલ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"વૉઇસમેઇલ"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"અવરોધિત કરવાની નવી, સરળ રીત"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"તમારી બહેતર સુરક્ષા માટે, ફોનને, અવરોધિત કરવું કેવી રીતે કાર્ય કરે છે તે બદલવાની જરૂર છે. તમારા અવરોધિત નંબર્સ હવે કૉલ્સ અને ટેક્સ્ટ્સ બન્નેને રોકશે અને તે અન્ય ઍપ્લિકેશનો સાથે શેર કરવામાં આવી શકે છે."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"મંજૂરી આપો"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> ને અવરોધિત કરીએ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"આ નંબરથી આવનારા કૉલ્સ અવરોધિત કરવામાં આવશે અને વૉઇસમેઇલ્સ આપમેળે કાઢી નાખવામાં આવશે."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"આ નંબરથી આવનારા કૉલ્સ અવરોધિત કરવામાં આવશે, પરંતુ કૉલર હજી પણ તમારા માટે વૉઇસમેઇલ્સ મૂકવામાં સમર્થ હોઈ શકે છે."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"તમે હવે આ નંબરથી કૉલ્સ અથવા ટેક્સ્ટ પ્રાપ્ત કરશો નહીં."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"અવરોધિત કરો"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> ને અનાવરોધિત કરીએ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"અનાવરોધિત કરો"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"સ્પીડ ડાયલ"</string>
- <string name="tab_recents" msgid="929949073851377206">"તાજેતરના"</string>
+ <string name="tab_history" msgid="2563144697322434940">"કૉલ ઇતિહાસ"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"સંપર્કો"</string>
<string name="tab_voicemail" msgid="155024725947496746">"વૉઇસમેઇલ"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"મનપસંદમાંથી દૂર કર્યું"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"સંપર્કમાં ઉમેરો"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS મોકલો"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"વિડિઓ કૉલ કરો"</string>
- <string name="show_call_history" msgid="1141502332266697170">"પૂર્ણ કૉલ ઇતિહાસ જુઓ"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"નંબર અવરોધિત કરો"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> નવા છૂટેલા કૉલ્સ"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"તમારા ઝડપી ડાયલ પર હજી સુધી કોઇ નથી"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"એક મનપસંદ ઉમેરો"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"બધા નંબર્સ જોવા માટે છબી ટેપ કરો અથવા પુનઃક્રમાંકિત કરવા માટે પકડી રાખો"</string>
<string name="remove_contact" msgid="1080555335283662961">"દૂર કરો"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"વિડિઓ કૉલ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"સંદેશ મોકલો"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"એક સંદેશ મોકલો"</string>
<string name="call_log_action_details" msgid="701345508704970622">"કૉલની વિગતો"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ને કૉલ કરો"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> નો છૂટેલ કૉલ"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> નો જવાબી કૉલ"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> તરફથી ન વાંચેલો વૉઇસમેઇલ"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> તરફથી વૉઇસમેઇલ"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> પર કૉલ."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> પર"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> મારફતે"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> મારફતે"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> પર, <xliff:g id="NUMBER">%2$s</xliff:g> મારફતે"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> પર, <xliff:g id="NUMBER">%2$s</xliff:g> મારફતે"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"કૉલ કરો"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ને કૉલ કરો"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ને વિડિઓ કૉલ કરો."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ઝડપી પ્રતિસાદ"</string>
<string name="call_settings_label" msgid="313434211353070209">"કૉલ્સ"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"કૉલ અવરોધ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"કૉલ અવરોધિત કરવાનું અસ્થાયીરૂપે બંધ છે"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"કૉલ અવરોધિત કરવાનું અક્ષમ કરવામાં આવ્યું છે કારણ કે તમે આ ફોનમાંથી છેલ્લા 48 કલાકમાં કટોકટીની સેવાઓનો સંપર્ક કર્યો હતો. એકવાર 48 કલાકનો સમયગાળો સમાપ્ત થાય, પછી તે આપમેળે ફરીથી સક્ષમ કરવામાં આવશે."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"નંબર્સ આયાત કરો"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"તમે પહેલાં કેટલાક કૉલર્સને અન્ય ઍપ્લિકેશનો મારફતે વૉઇસમેઇલ પર આપમેળે મોકલવા માટે ચિહ્નિત કર્યા."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"સંખ્યા જુઓ"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"આયાત કરો"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"આયાત નિષ્ફળ થયું"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"વૉઇસમેઇલને આર્કાઇવ કરવામાં નિષ્ફળ થયાં."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"નંબર અનાવરોધિત કરો"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"નંબર ઉમેરો"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"આ નંબરથી આવનારા કૉલ્સ અવરોધિત કરવામાં આવશે અને વૉઇસમેઇલ્સ આપમેળે કાઢી નાખવામાં આવશે."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"આ નંબરથી આવનારા કૉલ્સ અવરોધિત કરવામાં આવશે, પરંતુ તેઓ હજી પણ તમારા માટે વૉઇસમેઇલ્સ મૂકવામાં સમર્થ હોઈ શકે છે."</string>
+ <string name="block_list" msgid="7760188925338078011">"અવરોધિત નંબરો"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> અમાન્ય છે."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ને પહેલેથી અવરોધિત કરવામાં આવ્યો છે."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"કૉલ અવરોધિત કરવાનું 48 કલાક માટે અક્ષમ કરાયું"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"અક્ષમ કરાયું કારણ કે એક કટોકટીનો કૉલ કરવામાં આવ્યો હતો."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"કૉલિંગ એકાઉન્ટ્સ"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ચાલુ કરો"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"પરવાનગીઓ સેટ કરો"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"ઝડપી ડાયલ સક્ષમ કરવા માટે,\n સંપર્કોની પરવાનગી ચાલુ કરો."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"તમારા કૉલ લોગ જોવા માટે,\n ફોન પરવાનગી ચાલુ કરો."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"તમારા સંપર્કો જોવા માટે,\n સંપર્કોની પરવાનગી ચાલુ કરો."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"તમારો વૉઇસમેઇલ ઍક્સેસ કરવા માટે,\n ફોન પરવાનગી ચાલુ કરો."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"ઝડપી ડાયલ સક્ષમ કરવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"તમારો કૉલ લૉગ જોવા માટે, ફોન પરવાનગી ચાલુ કરો."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"તમારા સંપર્કો જોવા માટે, સંપર્કોની પરવાનગી ચાલુ કરો."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"તમારી વૉઇસમેઇલને ઍક્સેસ કરવા માટે, ફોન પરવાનગી ચાલુ કરો."</string>
<string name="permission_no_search" msgid="84152933267902056">"તમારા સંપર્કો શોધવા માટે, સંપર્કોની પરવાનગીઓ ચાલુ કરો."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"કૉલ કરવા માટે,\n ફોન પરવાનગી ચાલુ કરો."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"કૉલ કરવા માટે, ફોન પરવાનગી ચાલુ કરો."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ફોન એપ્લિકેશનને સિસ્ટમ સેટિંગ્સ પર લખવાની પરવાનગી નથી."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"અવરોધિત"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> સક્રિય છે"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 421f673fc..87d84da70 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"फ़ोन"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"फ़ोन"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"फ़ोन डायलपैड"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"फ़ोन"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"कॉल इतिहास"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> को कॉल करें"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"गलत संख्या की रिपोर्ट करें"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"कॉल करने से पहले नंबर संपादित करें"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"किसी संपर्क में जोड़ें"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"कॉल इतिहास से साफ़ करें"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"कॉल इतिहास साफ़ करें"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"वॉयस मेल हटाएं"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ध्‍वनिमेल साझा करें"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"आपका कॉल लॉग खाली है"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"कॉल करें"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"कॉल इतिहास"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"गलत नंबर की रिपोर्ट करें"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"नंबर कॉपी करें"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ट्रांसक्रिप्शन को कॉपी करें"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"नंबर अवरुद्ध करें"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> अवरोधित किया गया"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"नंबर अनवरोधित करें"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> अनवरोधित किया गया"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"वापस लाएं"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"हटाएं"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"कॉल करने से पहले नंबर संपादित करें"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"कॉल इतिहास साफ़ करें"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"वॉइसमेल हटाएं"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"वॉइसमेल संग्रहीत करें"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"वॉइसमेल साझा करें"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"वॉइसमेल हटाया गया"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"वॉइसमेल संग्रहीत किया गया"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"वापस लाएं"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"संग्रह पर जाएं"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"कॉल इतिहास साफ़ करें?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"इससे आपके इतिहास से सभी कॉल हटा दिए जाएंगे"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"कॉल इतिहास साफ़ किया जा रहा है…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"फ़ोन"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"छूटा कॉल"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"कार्यस्थल का छूटा हुआ कॉल"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"छूटे कॉल"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> छूटे कॉल"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"वापस कॉल करें"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"संदेश"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> वॉइसमेल </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> वॉइसमेल </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> की ओर से नया ध्‍वनिमेल"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"वॉइसमेल नहीं चलाया जा सका"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"बफ़र हो रहा है…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"वॉइसमेल लोड हो रहा है…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"वॉइसमेल संग्रहीत किया जा रहा है…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"वॉइसमेल लोड नहीं किया जा सका"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"केवल वॉयस मेल वाले कॉल"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"केवल इनकमिंग कॉल"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"कॉल इतिहास"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"अधिक विकल्प"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"डायलपैड"</string>
- <string name="menu_copy" msgid="6108677035381940698">"प्रतिलिपि"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"केवल आउटगोइंग ही दिखाएं"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"केवल इनकमिंग ही दिखाएं"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"केवल छूटे हुए ही दिखाएं"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"जावक वीडियो कॉल"</string>
<string name="type_missed_video" msgid="954396897034220545">"छूटे वीडियो कॉल"</string>
<string name="type_voicemail" msgid="5153139450668549908">"वॉयस मेल"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"अस्वीकृत किया गया कॉल"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"अवरुद्ध किए गए कॉल"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"इनकमिंग कॉल"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ध्‍वनिमेल चलाएं"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> संपर्क देखें"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> को कॉल करें"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> का संपर्क विवरण"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"नया वॉयस मेल."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> कॉल."</string>
<string name="description_video_call" msgid="2933838090743214204">"वीडियो कॉल."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> को SMS भेजें"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"पे-फ़ोन"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> सेकंड"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> मि. <xliff:g id="SECONDS">%s</xliff:g> से."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> को <xliff:g id="TIME">%2$s</xliff:g> बजे"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"इस नंबर पर कॉल नहीं किया जा सकता"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ध्‍वनिमेल सेट करने के लिए, मेनू &gt; सेटिंग पर जाएं."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ध्‍वनिमेल कॉल करने के लिए, पहले हवाई जहाज़ मोड बंद करें."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"बोलकर खोजना उपलब्‍ध नहीं है"</string>
<string name="call_not_available" msgid="8941576511946492225">"फ़ोन कॉल नहीं किया जा सकता क्योंकि फ़ोन ऐप्लिकेशन अक्षम कर दिया गया है."</string>
<string name="activity_not_available" msgid="2287665636817987623">"उसके लिए इस डिवाइस पर कोई एेप नहीं है"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"नाम या फ़ोन नंबर डालें"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"आपके पास कोई भी छूटा हुआ कॉल नहीं है."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"आपका वॉइसमेल इनबाॅक्‍स खाली है."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"संपर्क खोजें"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"नंबर जोड़ें या संपर्क खोजें"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"आपका कॉल इतिहास खाली है"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"कॉल करें"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"आपके पास कोई भी छूटा हुआ कॉल नहीं है."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"आपका वॉइसमेल इनबाॅक्‍स खाली है."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"आपका वॉइसमेल संग्रह खाली है."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"केवल पसंदीदा दिखाएं"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"इतिहास"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"कॉल इतिहास"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"वॉइसमेल संग्रह"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"सभी"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"छूटे हुए"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"वॉयस मेल"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"नया, सरल अवरोधन"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"आपकी बेहतर सुरक्षा के लिए, फ़ोन के अवरुद्ध करने के तरीके को बदलने की आवश्यकता है. आपके अवरोधित नंबर अब कॉल और लेख संदेश दोनों को रोक देंगे तथा उन्हें अन्य ऐप्लिकेशन के साथ साझा किया जा सकता है."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"अनुमति दें"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> को अवरुद्ध करें?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"इस नंबर से आने वाले कॉल अवरुद्ध कर दिए जाएंगे और वॉइसमेल अपने आप हटा दिए जाएंगे."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"इस नंबर से आने वाले कॉल अवरुद्ध कर दिए जाएंगे, लेकिन कॉलर अब भी आपके लिए वॉइसमेल भेज सकेंगे."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"अब आपको इस नंबर से कॉल या लेख संदेश प्राप्त नहीं होंगे."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"अवरुद्ध करें"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> को अनवरोधित करें?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"अनवरोधित करें"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"स्पीड डायल"</string>
- <string name="tab_recents" msgid="929949073851377206">"हाल ही के"</string>
+ <string name="tab_history" msgid="2563144697322434940">"कॉल इतिहास"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"संपर्क"</string>
<string name="tab_voicemail" msgid="155024725947496746">"वॉइसमेल"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"पसंदीदा से निकाल दिया गया"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"किसी संपर्क में जोड़ें"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS भेजें"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"वीडियो कॉल करें"</string>
- <string name="show_call_history" msgid="1141502332266697170">"पूरा कॉल इतिहास देखें"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"नंबर अवरुद्ध करें"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> छूटे हुए नए कॉल"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"आपके स्‍पीड डायल पर अभी तक कोई भी नहीं है"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"कोई पसंदीदा जोड़ें"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"सभी नंबर देखने के लिए चित्र को स्‍पर्श करें या पुन: क्रमित करने के लिए स्‍पर्श करके रखें"</string>
<string name="remove_contact" msgid="1080555335283662961">"निकालें"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"वीडियो कॉल"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"संदेश भेजें"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"संदेश भेजें"</string>
<string name="call_log_action_details" msgid="701345508704970622">"कॉल विवरण"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> को कॉल करें"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> से छूटा हुआ कॉल."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> से आए कॉल का उत्तर दिया गया."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> के अपठित वॉइसमेल."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> के वॉइसमेल."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> पर किया गया कॉल."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> पर"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> से"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> से"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> पर, <xliff:g id="NUMBER">%2$s</xliff:g> से"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> <xliff:g id="NUMBER">%2$s</xliff:g> से"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"कॉल करें"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> को कॉल करें"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> को वीडियो कॉल करें."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"झटपट उत्तर"</string>
<string name="call_settings_label" msgid="313434211353070209">"कॉल"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"कॉल अवरुद्ध करें"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"कॉल अवरुद्ध करना अस्‍थायी रूप से बंद है"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"कॉल अवरुद्ध किए जाने को अक्षम कर दिया गया है क्योंकि पिछले 48 घंटों में आपने इस फ़ोन से आपातकालीन सेवाओं से संपर्क किया है. 48 घंटे की अवधि बीत जाने पर यह अपने आप फिर से सक्षम हो जाएगी."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"नंबर आयात करें"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"आपने पहले कुछ कॉलर को अपने आप अन्य ऐप्स के द्वारा वॉइसमेल भेजे जाने के लिए चिह्नित किया था."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"नंबर देखें"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"आयात करें"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"आयात करना विफल रहा"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"वॉइसमेल संग्रहीत नहीं कर सके."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"नंबर अनवरोधित करें"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"नंबर जोड़ें"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"इन नंबर से आने वाले कॉल अवरुद्ध कर दिए जाएंगे और वॉइसमेल अपने आप हटा दिए जाएंगे."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"इन नंबर से आने वाले कॉल अवरुद्ध कर दिए जाएंगे, लेकिन वे अब भी आपके लिए वॉइसमेल भेज सकेंगे."</string>
+ <string name="block_list" msgid="7760188925338078011">"अवरोधित नंबर"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> अमान्य है."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> पहले से अवरोधित है."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"कॉल अवरुद्ध करना 48 घंटे के लिए अक्षम कर दिया गया"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"आपातकालीन कॉल किए जाने के कारण अक्षम कर दिया गया."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"कॉलिंग खाते"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"चालू करें"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"अनुमतियां सेट करें"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"स्‍पीड डायल सक्षम करने के लिए,\n संपर्क अनुमति को चालू करें."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"अपना कॉल लॉग देखने के लिए,\n फ़ोन अनुमति को चालू करें."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"अपने संपर्कों को देखने के लिए,\n संपर्क अनुमति को चालू करें."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"अपना वॉइसमेल ऐक्‍सेस करने के लिए,\n फ़ोन अनुमति को चालू करें."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"स्पीड डायल सक्षम करने के लिए, संपर्क अनुमति चालू करें."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"अपना कॉल लॉग देखने के लिए, फ़ोन अनुमति चालू करें."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"अपने संपर्क देखने के लिए, संपर्क अनुमति चालू करें."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"अपना वॉइसमेल ऐक्सेस करने के लिए, फ़ोन अनुमति चालू करें."</string>
<string name="permission_no_search" msgid="84152933267902056">"अपने संपर्कों की खोज करने के लिए, संपर्क अनुमतियों को चालू करें."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"कॉल करने के लिए,\n फ़ोन अनुमति को चालू करें."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"कॉल करने के लिए, फ़ोन अनुमति चालू करें."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"फ़ोन ऐप को सिस्टम सेटिंग में लिखने की अनुमति नहीं है."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"अवरोधित"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> सक्रिय है"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 8e5df76d6..a69a79022 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Numerička tipkovnica telefona"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Povijest poziva"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Nazovi <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Prijavi netočan broj"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Uredi broj prije pozivanja"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Dodaj kontaktu"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Izbriši iz povijesti poziva"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Izbriši povijest poziva"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Brisanje govorne pošte"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Podijeli govornu poštu"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Vaš je zapisnik poziva prazan"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Uputite poziv"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Povijest poziva"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Prijavi netočan broj"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiraj broj"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiraj prijepis"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokiraj broj"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> blokiran"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Deblokiraj broj"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> deblokiran"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"PONIŠTI"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Izbriši"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Uredi broj prije pozivanja"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Izbriši povijest poziva"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Izbriši govornu poštu"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arhiviranje govorne pošte"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Dijeljenje govorne pošte"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Gov. pošta izbrisana"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Govorna je pošta arhivirana"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"PONIŠTI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"IDI NA ARHIVIRANO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Želite li izbrisati povijest poziva?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Izbrisat će se svi pozivi iz vaše povijesti"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Brisanje povijesti poziva…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Propušteni poziv"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Propušten poslovni poziv"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Propušteni pozivi"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Propušteni pozivi (<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>)"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Uzvrati poziv"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Poruka"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> poruka govorne pošte </item>
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> poruke govorne pošte </item>
@@ -43,8 +59,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova govorna pošta od kontakta <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Nije moguće reproducirati govornu poštu"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Stavljanje u međuspremnik..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Učitavanje govorne pošte…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arhiviranje govorne pošte..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Govorna pošta nije učitana"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Samo pozivi s govornom poštom"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Samo dolazni pozivi"</string>
@@ -74,7 +90,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Povijest poziva"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Više opcija"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"površina za biranje brojeva"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiranje"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Prikaži samo odlazne"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Prikaži samo dolazne"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Prikaži samo propuštene"</string>
@@ -97,12 +112,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Odlazni videopoziv"</string>
<string name="type_missed_video" msgid="954396897034220545">"Propušten videopoziv"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Govorna pošta"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Odbijeni poziv"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokirani poziv"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Dolazni pozivi"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reprodukcija govorne pošte"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Prikaz kontakta <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Pozovi: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Pojedinosti o kontaktu <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nova govorna pošta."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Broj poziva: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videopoziv."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Slanje SMS-a kontaktu <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -115,6 +131,11 @@
<string name="payphone" msgid="7726415831153618726">"Javna telefonska govornica"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> u <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>.<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Nije moguće nazvati taj broj"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Da biste postavili govornu poštu, idite na Izbornik &gt; Postavke."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Da biste nazvali govornu poštu, najprije isključite način rada u zrakoplovu."</string>
@@ -127,16 +148,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Glasovno pretraživanje nije dostupno"</string>
<string name="call_not_available" msgid="8941576511946492225">"Telefoniranje nije moguće jer je aplikacija Telefon onemogućena."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Na ovom uređaju nema aplikacije za to"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Unesite ime ili tel. broj"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nemate propuštene pozive."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Nemate pristiglih poruka govorne pošte."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Pretražite kontakte"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Dodaj broj ili potraži kontakt"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Vaša je povijest poziva prazna"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Uputite poziv"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nemate propuštene pozive."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Nemate pristiglih poruka govorne pošte."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arhiv govorne pošte je prazan."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Prikaži samo favorite"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Povijest"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Povijest poziva"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arhivirana govorna pošta"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Sve"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Propušteni"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Gov. pošta"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo, jednostavnije blokiranje"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Da bi vas bolje zaštitio, Phone mora promijeniti način funkcioniranja blokiranja. S blokiranih brojeva više nećete primati pozive ni SMS poruke. Osim toga, blokirani brojevi moći će se dijeliti s drugim aplikacijama."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Omogući"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Želite li blokirati <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Pozivi s tog broja blokirat će se, a govorna pošta automatski će se brisati."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Pozivi s tog broja blokirat će se, ali pozivatelj će vam moći ostavljati govornu poštu."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Više nećete primati pozive ni poruke s tog broja."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKIRAJ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Želite li deblokirati <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DEBLOKIRAJ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Brzo biranje"</string>
- <string name="tab_recents" msgid="929949073851377206">"Najnoviji"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Povijest poziva"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakti"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Govorna pošta"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Uklonjeno iz favorita"</string>
@@ -146,7 +182,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Dodaj kontaktu"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Pošalji SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Uputite videopoziv"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Prikaz cijele povijesti poziva"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokiraj broj"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Broj novih propuštenih poziva: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Još nemate nikog na brzom biranju"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Dodaj omiljeni kontakt"</string>
@@ -155,13 +191,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Dodirnite sliku da biste vidjeli sve brojeve ili dodirnite i zadržite da biste promijenili raspored"</string>
<string name="remove_contact" msgid="1080555335283662961">"Ukloni"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videopoziv"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Pošalji poruku"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Pošalji poruku"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Pojedinosti poziva"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Nazovi <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Propušten poziv: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Prihvaćen poziv: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nepročitana govorna pošta kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Govorna pošta kontakta <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Poziv: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"na <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"putem <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"putem <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"na računu <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, putem broja <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> putem <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Poziv"</string>
<string name="description_call_action" msgid="4000549004089776147">"Pozovi <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videopoziv <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -201,14 +243,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Brzi odgovori"</string>
<string name="call_settings_label" msgid="313434211353070209">"Pozivi"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokiranje poziva"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokiranje poziva privremeno isključeno"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blokiranje poziva onemogućeno je jer ste kontaktirali hitne službe s ovog telefona u posljednjih 48 sati. Automatski će se ponovo omogućiti kada prođe 48 sati."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Uvoz brojeva"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ranije ste na drugim aplikacijama naveli da se neki pozivatelji automatski šalju na govornu poštu."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Prikaži brojeve"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Uvezi"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Uvoz nije uspio"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Arhiviranje govorne pošte nije uspjelo."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Deblokiranje broja"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Dodaj broj"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Pozivi s tih brojeva blokirat će se, a govorna pošta automatski će se brisati."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Pozivi s tih brojeva blokirat će se, ali pozivatelji će vam moći ostavljati govornu poštu."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokirani brojevi"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Broj <xliff:g id="NUMBER">%1$s</xliff:g> nije važeći."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Broj <xliff:g id="NUMBER">%1$s</xliff:g> već je blokiran."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokiranje poziva onemogućeno je na 48 sati"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Onemogućeno jer je upućen hitni poziv."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Pozivanje računa"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Uključi"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Postavi dopuštenja"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Da biste omogućili brzo biranje,\n uključite dopuštenje za kontakte."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Da biste vidjeli zapisnik poziva,\n uključite dopuštenje za telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Da biste vidjeli svoje kontakte,\n uključite dopuštenje za kontakte."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Da biste pristupili govornoj pošti,\n uključite dopuštenje za telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Da biste omogućili brzo biranje, uključite dopuštenje za kontakte."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Da biste vidjeli zapisnik poziva, uključite dopuštenje za telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Da biste vidjeli svoje kontakte, uključite dopuštenje za kontakte."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Da biste pristupili govornoj pošti, uključite dopuštenje za telefon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Da biste pretraživali kontakte, uključite dopuštenja za kontakte."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Da biste uputili poziv,\n uključite dopuštenje za telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Da biste nazvali nekog, uključite dopuštenje za telefon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikacija Telefon nema dopuštenje za pisanje u postavke sustava."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokirano"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Aktivan/a: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a6553130f..86b9e42a7 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefon tárcsázója"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Híváslista"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> hívása"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Pontatlan szám jelentése"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Szám szerkesztése hívás előtt"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Hozzáadás névjegyhez"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Törlés a híváslistáról"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"A híváslista törlése"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Hangposta törlése"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Hangposta megosztása"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"A hívásnapló üres"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Hívásindítás"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Híváslista"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Pontatlan szám jelentése"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Szám másolása"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Átírás másolása"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Szám tiltása"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"A következő szám letiltva: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Szám tiltásának feloldása"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"A következő szám tiltása feloldva: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"VISSZAVONÁS"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Törlés"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Szám szerkesztése hívás előtt"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"A híváslista törlése"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Hangposta törlése"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Hangpostaüzenet archiválása"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Hangposta megosztása"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Hangposta törölve"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Hangpostaüzenet archiválva"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"VISSZAVONÁS"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARCHÍVUM"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Törli a híváslistát?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Ezzel törli az összes hívást az előzmények közül"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Híváslista törlése…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefonhívás"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Elmulasztott hívás"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Nem fogadott munkahelyi hívás"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Elmulasztott hívások"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> elmulasztott hívás"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Visszahívás"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Üzenet"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> hangpostaüzenet </item>
<item quantity="one">Hangpostaüzenet</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Új hangüzenet tőle: <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Nem sikerült lejátszani a hangpostát"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Pufferelés…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Hangposta betöltése…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Hangpostaüzenet archiválása…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Nem sikerült betölteni a hangpostát"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Csak hangpostahívások"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Csak bejövő hívások"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Hívási előzmények"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"További beállítások"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tárcsázó"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Másolás"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Csak a kimenők megjelenítése"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Csak a bejövők megjelenítése"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Csak a nem fogadottak"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Kimenő videohívás"</string>
<string name="type_missed_video" msgid="954396897034220545">"Nem fogadott videohívás"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Hangposta"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Elutasított hívás"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Letiltott hívás"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Bejövő hívások"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Hangposta lejátszása"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> névjegyének megtekintése"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> hívása"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> részletes adatai."</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Új hangpostaüzenet."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> hívás"</string>
<string name="description_video_call" msgid="2933838090743214204">"Videohívás."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"SMS küldése <xliff:g id="NAME">%1$s</xliff:g> részére"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Nyilvános telefon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> másodperc"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> perc <xliff:g id="SECONDS">%s</xliff:g> másodperc"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Nem lehet felhívni ezt a számot"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"A hangposta beállításához válassza a Menü &gt; Beállítások pontot."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Hangposta hívásához kapcsolja ki a Repülőgép üzemmódot."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"A hangalapú keresés nem érhető el"</string>
<string name="call_not_available" msgid="8941576511946492225">"Nem lehet telefonhívást kezdeményezni, mert a Telefon alkalmazást letiltották."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Nincs megfelelő alkalmazás a művelethez ezen az eszközön"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Név vagy telefonszám megadása"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nincsenek nem fogadott hívásai."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Hangpostafiókjában nincsenek beérkezett üzenetek."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Névjegyek keresése"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Adjon meg egy számot, vagy keressen a névjegyek között"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"A híváslista üres"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Hívásindítás"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nincsenek nem fogadott hívások."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Hangpostafiókjában nincsenek beérkezett üzenetek."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"A hangpostaüzenet-archívum üres."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Csak kedvencek megjelenítése"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Előzmények"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Híváslista"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Hangpostaüzenet-archívum"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Összes"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Nem fogadott"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Hangposta"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Új, egyszerűbb letiltás"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Az Ön fokozottabb védelme érdekében a telefonnak módosítania kell a tiltás működését. A letiltott számok most már a hívásokat és az SMS-eket is megakadályozzák, és megoszthatók más alkalmazásokkal is."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Engedélyezés"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Letiltja a következő számot: <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Az erről a számról érkező hívásokat a rendszer letiltja, továbbá automatikusan törli az onnan érkező hangpostaüzeneteket is."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Az erről a számról érkező hívásokat letiltja a rendszer, azonban a hívó fél továbbra is hagyhat hangpostaüzeneteket."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"A továbbiakban nem fogad hívásokat vagy SMS-eket erről a számról."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"LETILTÁS"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Feloldja a következő szám tiltását: <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"TILTÁS FELOLDÁSA"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Gyorshívó"</string>
- <string name="tab_recents" msgid="929949073851377206">"Legutóbbiak"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Híváslista"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Címtár"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Hangposta"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Eltávolítva a kedvencek közül"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Hozzáadás névjegyhez"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS küldése"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Videohívás kezdeményezése"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Teljes híváslista megtekintése"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Szám tiltása"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> új nem fogadott hívás"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Még semelyik telefonszám sincs gyorshívón"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Kedvenc hozzáadása"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Érintse meg a képet az összes szám megjelenítéséhez, vagy tartsa nyomva az átrendezéshez"</string>
<string name="remove_contact" msgid="1080555335283662961">"Eltávolítás"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videohívás"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Üzenet küldése"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Üzenet küldése"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Hívás adatai"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> hívása"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Elmulasztott hívás: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Fogadott hívás: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Olvasatlan hangpostaüzenet a következőtől: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Hangpostaüzenet a következőtől: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Kimenő hívás: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"szám: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"szám: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"fiók: <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, szám: <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, szám: <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Telefonhívás"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> hívása"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"A következő hívása videokapcsolattal: <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Gyors válaszok"</string>
<string name="call_settings_label" msgid="313434211353070209">"Hívások"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Hívásletiltás"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Hívástiltás átmenetileg felfüggesztve"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Felfüggesztettük a hívások tiltását, mert az elmúlt 48 órában tárcsázta a segélyhívót erről a telefonról. A funkciót automatikusan újból engedélyezzük 48 óra elteltével."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Számok importálása"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Más alkalmazásokban korábban beállította, hogy bizonyos személyeket automatikusan a hangpostafiókba irányítsa a rendszer, amikor felhívják Önt."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Számok megtekintése"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importálás"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Az importálás nem sikerült"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Sikertelen hangpostaüzenet-archiválás."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Szám tiltásának feloldása"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Szám hozzáadása"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Az ezekről a számokról érkező hívásokat a rendszer letiltja, továbbá automatikusan törli az onnan érkező hangpostaüzeneteket is."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Az ezekről a számokról érkező hívásokat letiltja a rendszer, azonban a hívó felek továbbra is hagyhatnak hangpostaüzeneteket."</string>
+ <string name="block_list" msgid="7760188925338078011">"Letiltott számok"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"A(z) <xliff:g id="NUMBER">%1$s</xliff:g> érvénytelen."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"A következő szám már le van tiltva: <xliff:g id="NUMBER">%1$s</xliff:g>."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"A hívások tiltása funkció kikapcsolva 48 órára"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Letiltva vészhívás miatt."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Telefonos fiókok"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Engedélyezés"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Engedélyek beállítása"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"A gyorshívás engedélyezéséhez\n adja meg a Névjegyek engedélyt."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"A hívásnapló megtekintéséhez\n adja meg a Telefon engedélyt."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"A névjegyek megtekintéséhez\n adja meg a Névjegyek engedélyt."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"A hangpostafiók eléréséhez\n adja meg a Telefon engedélyt."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Gyorshívás engedélyezéséhez kapcsolja be a Névjegyek engedélyt."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"A hívásnapló megtekintéséhez kapcsolja be a Telefon engedélyt."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"A névjegyek megtekintéséhez kapcsolja be a Névjegyek engedélyt."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"A hangposta eléréséhez kapcsolja be a Telefon engedélyt."</string>
<string name="permission_no_search" msgid="84152933267902056">"A névjegyek kereséséhez adja meg a Névjegyek engedélyeket."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Hívás indításához\n adja meg a Telefon engedélyt."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Hívásindításhoz kapcsolja be a Telefon engedélyt."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"A Telefon alkalmazásnak nincs engedélye szerkeszteni a rendszerbeállításokat."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Letiltva"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> aktív"</string>
</resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 79d607557..35071c307 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Հեռախոս"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Հեռախոս"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Հեռախոսի թվաշար"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Հեռախոս"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Զանգերի պատմություն"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Զանգել <xliff:g id="NAME">%s</xliff:g>-ին"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Հաղորդել սխալ համարի մասին"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Փոխել համարը զանգելուց առաջ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Ավելացնել կոնտակտների ցանկում"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Ջնջել զանգերի պատմությունից"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Մաքրել զանգերի պատմությունը"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Ջնջել ձայնային փոստը"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Տարածել ձայնային փոստը"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Զանգերի մատյանը դատարկ է"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Զանգել"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Զանգերի պատմությունը"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Հաղորդել սխալ համարի մասին"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Պատճենել համարը"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Պատճենել տառադարձությունը"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Արգելափակել համարը"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Արգելափակվել է <xliff:g id="NUMBER">%1$s</xliff:g> համար"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Արգելաբացել համարը"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Արգելաբացվել է <xliff:g id="NUMBER">%1$s</xliff:g> համար"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ՀԵՏԱՐԿԵԼ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Ջնջել"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Փոփոխել համարը զանգելուց առաջ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Ջնջել զանգերի պատմությունը"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Ջնջել ձայնային փոստը"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Արխիվացնել ձայնային փոստը"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Ուղարկել ձայնային փոստը"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Ձայնային փոստը ջնջվեց"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Ձայնային փոստն արխիվացվեց"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ՀԵՏԱՐԿԵԼ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ԱՆՑՆԵԼ ԱՐԽԻՎ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Մաքրե՞լ զանգերի պատմությունը:"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Այս գործողությունը ամբողջովին կջնջի զանգերի պատմությունը"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Զանգերի պատմության մաքրում…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Հեռախոս"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Բաց թողնված զանգ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Բաց թողնված աշխատանքային զանգ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Բաց թողնված զանգեր"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> բաց թողնված զանգ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Հետ զանգել"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Հաղորդագրություն"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> ձայնային փոստ </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ձայնային փոստ </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Նոր ձայնային փոստ <xliff:g id="CALLER">%1$s</xliff:g>-ից"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Հաղորդագրությունը չհաջողվեց նվագարկել"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Պահնակավորում..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Ձայնային հաղորդագրության բեռնում…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Ձայնային փոստի արխիվացում…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Հաղորդագրությունը չհաջողվեց բեռնել"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Միայն ձայնային փոստով զանգերը"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Միայն մուտքային զանգեր"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Զանգերի պատմությունը"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Այլ ընտրանքներ"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"թվաշար"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Պատճենել"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Ցույց տալ միայն ելքայինները"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Ցույց տալ միայն մուտքայինները"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Ցույց տալ միայն բաց թողնվածները"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Ելքային տեսազանգ"</string>
<string name="type_missed_video" msgid="954396897034220545">"Բաց թողնված տեսազանգ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Ձայնային փոստ"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Մերժված զանգ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Արգելափակված զանգ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Մուտքային զանգեր"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Նվագարկել ձայնային փոստը"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Դիտել <xliff:g id="NAME">%1$s</xliff:g> կոնտակտը"</string>
<string name="description_call" msgid="3443678121983852666">"Զանգել <xliff:g id="NAME">%1$s</xliff:g>-ին"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>-ի կոնտակտային տվյալները"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Նոր ձայնային հաղորդագրություն:"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> զանգ:"</string>
<string name="description_video_call" msgid="2933838090743214204">"Տեսազանգ"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Ուղարկել SMS <xliff:g id="NAME">%1$s</xliff:g>-ին"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Հանրային հեռախոս"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> վրկ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> րոպե <xliff:g id="SECONDS">%s</xliff:g> վայրկյան"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>-ին, ժամը <xliff:g id="TIME">%2$s</xliff:g>-ին"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Հնարավոր չէ զանգահարել այս համարով"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ձայնային փոստը կարգավորելու համար գնացեք Ցանկ &gt; Կարգավորումներ:"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Ձայնային փոստին զանգելու համար նախ անջատեք թռիչքային ռեժիմը:"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Ձայնային որոնումը հասանելի չէ"</string>
<string name="call_not_available" msgid="8941576511946492225">"Հնարավոր չէ զանգահարել, քանի որ Հեռախոս հավելվածն անջատված է:"</string>
<string name="activity_not_available" msgid="2287665636817987623">"Սարքի վրա համապատասխան հավելված չկա"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Մուտքագրեք անուն կամ համար"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Բաց թողած զանգեր չունեք:"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Ձայնային փոստի մուտքի արկղը դատարկ է:"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Կոնտակտների որոնում"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Ավելացրեք համար/որոնեք կոնտակտներ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Զանգերի մատյանը դատարկ է"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Զանգել"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Բաց թողած զանգեր չունեք:"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Ձայնային փոստի մուտքի արկղը դատարկ է:"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Ձեր ձայնային փոստի արխիվը դատարկ է:"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Ցույց տալ միայն ընտրյալները"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Պատմություն"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Զանգերի պատմությունը"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Ձայնային փոստի արխիվ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Բոլորը"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Բաց թողնված"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Ձայնափոստ"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Նոր, պարզեցված արգելափակում"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Ձեզ ավելի լավ պաշտպանելու նպատակով Հեռախոսին անհրաժեշտ է փոխել արգելափակման կարգավորումները: Արգելափակված համարներից զանգերի և տեքստային հաղորդագրությունների ստացումը կկասեցվի, իսկ այդ համարները կարող են տրամադրվել այլ հավելվածներին:"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Թույլատրել"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Արգելափակե՞լ <xliff:g id="NUMBER">%1$s</xliff:g> համարը:"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Այս համարից զանգերը կարգելափակվեն, իսկ ձայնային փոստի հաղորդագրություններն ավտոմատ կերպով կջնջվեն:"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Այս համարից զանգերը կարգելափակվեն, սակայն զանգողը կկարողանա ձեզ համար ձայնային փոստի հաղորդագրություններ թողնել:"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Այս համարից զանգեր կամ տեքստային հաղորդագրություններ այլևս չեք ստանա:"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ԱՐԳԵԼԱՓԱԿԵԼ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Արգելաբացե՞լ <xliff:g id="NUMBER">%1$s</xliff:g> համարը:"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ԱՐԳԵԼԱԲԱՑԵԼ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Արագ համարարկում"</string>
- <string name="tab_recents" msgid="929949073851377206">"Վերջինները"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Զանգերի պատմությունը"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Կոնտակտներ"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Ձայնային փոստ"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Հեռացված է ընտրյալներից"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Ավելացնել կոնտակտին"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Ուղարկել SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Կատարել տեսազանգ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Դիտել բոլոր զանգերի պատմությունը"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Արգելափակել համարը"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> նոր բաց թողնված զանգ"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Արագ համարահավաքման ցանկը դատարկ է"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Ավելացնել կոնտակտ"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Բոլոր համարները տեսնելու համար հպեք պատկերին: Վերադասավորելու համար հպեք և պահեք:"</string>
<string name="remove_contact" msgid="1080555335283662961">"Հեռացնել"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Տեսազանգ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Ուղարկել հաղորդագրություն"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Ուղարկել հաղորդագրություն"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Զանգի մանրամասները"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Զանգել <xliff:g id="NAMEORNUMBER">^1</xliff:g>-ին"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Բաց է թողնվել զանգ <xliff:g id="NAMEORNUMBER">^1</xliff:g> կոնտակտից, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>:"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Ընդունվել է զանգ <xliff:g id="NAMEORNUMBER">^1</xliff:g> կոնտակտից, <xliff:g id="TYPEORLOCATION">^2</xliff:g> , <xliff:g id="TIMEOFCALL">^3</xliff:g> , <xliff:g id="PHONEACCOUNT">^4</xliff:g>:"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Չկարդացված ձայնային փոստի հաղորդագրություն <xliff:g id="NAMEORNUMBER">^1</xliff:g>-ից, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>:"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Ձայնային փոստի հաղորդագրություն <xliff:g id="NAMEORNUMBER">^1</xliff:g>-ից, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>:"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Զանգ <xliff:g id="NAMEORNUMBER">^1</xliff:g> կոնտակտին, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>:"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> համարի միջոցով"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> համարի միջոցով"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>-ին <xliff:g id="NUMBER">%2$s</xliff:g> համարի միջոցով"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>-ին <xliff:g id="NUMBER">%2$s</xliff:g> համարի միջոցով"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Զանգել"</string>
<string name="description_call_action" msgid="4000549004089776147">"Զանգել <xliff:g id="NAMEORNUMBER">^1</xliff:g>-ին"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Տեսազանգ <xliff:g id="NAMEORNUMBER">^1</xliff:g> կոնտակտին:"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Արագ պատասխաններ"</string>
<string name="call_settings_label" msgid="313434211353070209">"Զանգեր"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Զանգերի արգելափակում"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Զանգերի արգելափակումը կասեցվել է"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Զանգերի արգելափակումը կասեցվել է, քանի որ վերջին 48 ժամվա ընթացքում դուք այս հեռախոսից զանգել եք արտակարգ իրավիճակների ծառայություններին: 48 ժամ տևողությամբ ժամանակահատվածի ավարտից հետո այն ավտոմատ կերպով կվերամիացվի:"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Ներմուծել համարները"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Համաձայն ձեր նախկին կարգավորումների՝ որոշ զանգողների պետք է ինքնաշխատորեն ուղարկվի ձայնային փոստ այլ հավելվածների միջոցով:"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Կոնտակտների թիվը"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Ներմուծում"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Ներմուծումը չհաջողվեց"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Չհաջողվեց արխիվացնել ձայնային փոստը:"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Արգելաբացել համարը"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Ավելացնել համար"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Այս համարներից զանգերը կարգելափակվեն, իսկ ձայնային փոստի հաղորդագրություններն ավտոմատ կերպով կջնջվեն:"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Այս համարներից զանգերը կարգելափակվեն, սակայն նրանք կկարողանան ձեզ համար ձայնային փոստի հաղորդագրություններ թողնել:"</string>
+ <string name="block_list" msgid="7760188925338078011">"Արգելափակված համարներ"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> համարը սխալ է:"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> համարն արդեն արգելափակված է:"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Զանգերի արգելափակումն անջատվել է 48 ժամով"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Անջատվել է, քանի որ շտապ կանչ է կատարվել։"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Հաշիվներ զանգերի համար"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Միացնել"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Թույլտվությունների սահմանում"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Արագ համարահավաքը միացնելու համար\n միացրեք Կոնտակտներ թույլտվությունը:"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Զանգերի մատյանը տեսնելու համար\n միացրեք Հեռախոս թույլտվությունը:"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Ձեր կոնտակտները տեսնելու համար\n միացրեք Կոնտակտներ թույլտվությունը:"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Ձայնային փոստից օգտվելու համար\n միացրեք Հեռախոս թույլտվությունը:"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Արագ համարահավաքը թույլատրելու համար միացրեք Կոնտակտների թույլտվությունը:"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Ձեր զանգերի մատյանը տեսնելու համար միացրեք Հեռախոսի թույլտվությունը:"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Ձեր կոնտակտները տեսնելու համար միացրեք Կոնտակտների թույլտվությունը:"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Ձայնային փոստն օգտագործելու համար միացրեք Հեռախոսի թույլտվությունը:"</string>
<string name="permission_no_search" msgid="84152933267902056">"Կոնտակտները որոնելու համար միացրեք Կոնտակտների թույլտվությունները:"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Զանգ կատարելու համար\n միացրեք Հեռախոս թույլտվությունը:"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Զանգ կատարելու համար միացրեք Հեռախոսի թույլտվությունը:"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Հեռախոս հավելվածը համակարգի կարգավորումները գրելու թույլտվություն չունի:"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Արգելափակված"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>-ն ակտիվ է"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 5be3226f3..8c90d9eb7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telepon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telepon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Tombol Nomor Ponsel"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telepon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Riwayat panggilan"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Telepon <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Laporkan nomor yang tidak akurat"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edit nomor sebelum memanggil"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Tambah ke kontak"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Hapus dari riwayat panggilan"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Hapus riwayat panggilan"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Hapus pesan suara"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Bagikan kotak pesan"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Log panggilan kosong"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Lakukan panggilan telepon"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Riwayat panggilan"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Laporkan nomor yang tidak akurat"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Salin nomor"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Salin transkripsi"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokir nomor"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> diblokir"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Bebaskan nomor"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> dibebaskan"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"URUNGKAN"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Hapus"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edit nomor sebelum memanggil"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Hapus riwayat panggilan"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Hapus pesan suara"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arsipkan pesan suara"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Bagikan pesan suara"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Pesan suara dihapus"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Pesan suara diarsipkan"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"URUNGKAN"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"BUKA ARSIP"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Hapus riwayat panggilan?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Tindakan ini akan menghapus semua panggilan telepon dari riwayat"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Menghapus riwayat panggilan..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telepon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Panggilan tak terjawab"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Panggilan tak terjawab di telepon kerja"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Panggilan tak terjawab"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> panggilan tak terjawab"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Telepon balik"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Pesan"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Pesan suara </item>
<item quantity="one">Pesan suara</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Pesan suara baru dari <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Tidak dapat memutar pesan suara"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Menyangga…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Memuat pesan suara..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Mengarsipkan pesan suara…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Tidak dapat memuat pesan suara"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Hanya panggilan dengan pesan suara"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Hanya panggilan masuk"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Riwayat Panggilan"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Opsi lainnya"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tombol nomor"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Salin"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Tampilkan panggilan keluar"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Tampilkan panggilan masuk saja"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Tampilkan panggilan terlewat"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Video call keluar"</string>
<string name="type_missed_video" msgid="954396897034220545">"Video call tak terjawab"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Kotak Pesan"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Panggilan ditolak"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Panggilan diblokir"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Panggilan masuk"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Putar pesan suara"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Lihat kontak <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Telepon <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detail kontak untuk <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Pesan suara baru."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> panggilan."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video call."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Kirim SMS ke <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telepon Umum"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> dtk"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> mnt <xliff:g id="SECONDS">%s</xliff:g> dtk"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> pukul <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>.<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Tidak dapat menelepon nomor ini"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Untuk menyiapkan kotak pesan, buka Menu &gt; Setelan."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Untuk memanggil pesan suara, pertama-tama matikan mode Pesawat."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Penelusuran suara tidak tersedia"</string>
<string name="call_not_available" msgid="8941576511946492225">"Tidak dapat melakukan panggilan telepon karena aplikasi Telepon telah dinonaktifkan."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Tidak ada aplikasi untuk tindakan tersebut di perangkat ini"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Masukkan nama / nomor telepon"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Tidak ada panggilan yang tidak terjawab."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Kotak masuk pesan suara kosong."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Telusuri kontak"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Tambahkan nomor atau telusuri kontak"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Riwayat panggilan kosong"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Lakukan panggilan telepon"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Tidak ada panggilan yang tidak terjawab."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Kotak masuk pesan suara kosong."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arsip pesan suara Anda kosong."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Hanya tampilkan favorit"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Riwayat"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Riwayat Panggilan"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arsip Pesan Suara"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Semua"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Tak Dijawab"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"PesanSuara"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Pemblokiran baru yang disederhanakan"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Untuk semakin melindungi Anda, Telepon harus mengubah cara kerja pemblokiran. Sekarang nomor yang diblokir akan menghentikan panggilan telepon dan SMS, dan mungkin dibagikan dengan aplikasi lain."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Izinkan"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blokir <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Panggilan telepon dari nomor ini akan diblokir dan pesan suara akan dihapus secara otomatis."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Panggilan telepon dari nomor ini akan diblokir, tetapi penelepon mungkin masih dapat meninggalkan pesan suara."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Anda tidak akan menerima telepon atau SMS lagi dari nomor ini."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKIR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Bebaskan <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"BEBASKAN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Panggilan cepat"</string>
- <string name="tab_recents" msgid="929949073851377206">"Terbaru"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Riwayat Panggilan"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontak"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Pesan suara"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Dihapus dari favorit"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Tambah ke kontak"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Kirim SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Lakukan video call"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Lihat riwayat panggilan telepon lengkap"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokir nomor"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> panggilan tidak terjawab baru"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Daftar panggilan cepat masih kosong"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Tambahkan favorit"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Sentuh foto untuk melihat semua nomor atau sentuh &amp; tahan untuk menyusun ulang"</string>
<string name="remove_contact" msgid="1080555335283662961">"Hapus"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Panggilan video"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Kirim Pesan"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Kirim pesan"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detail panggilan"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Telepon <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Panggilan tak terjawab dari <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Panggilan terjawab dari <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Pesan suara yang belum dibaca dari <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Pesan suara dari <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Panggilan ke <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"di <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"melalui <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"melalui <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"di <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, melalui <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> melalui <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Telepon"</string>
<string name="description_call_action" msgid="4000549004089776147">"Telepon <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Lakukan panggilan video ke <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respons cepat"</string>
<string name="call_settings_label" msgid="313434211353070209">"Panggilan telepon"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Pemblokiran panggilan telepon"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokir panggilan dinonaktifkan sementara"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Pemblokiran panggilan telepon telah dinonaktifkan karena Anda menghubungi layanan darurat dari telepon ini dalam 48 jam terakhir. Akan diaktifkan kembali secara otomatis setelah masa 48 jam berakhir."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Impor nomor"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Anda sebelumnya menandai beberapa penelepon agar dialihkan secara otomatis ke pesan suara melalui aplikasi lain."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Lihat Nomor"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Impor"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Impor gagal"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Gagal mengarsipkan pesan suara."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Bebaskan nomor"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Tambahkan nomor"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Panggilan telepon dari nomor ini akan diblokir dan pesan suara akan dihapus secara otomatis."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Panggilan telepon dari nomor ini akan diblokir, tetapi penelepon mungkin masih dapat meninggalkan pesan suara."</string>
+ <string name="block_list" msgid="7760188925338078011">"Nomor yang diblokir"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> tidak valid."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> sudah diblokir."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Pemblokiran panggilan dinonaktifkan selama 48 jam"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Dinonaktifkan karena panggilan darurat dilakukan."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Akun panggilan"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktifkan"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Setel izin"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Untuk mengaktifkan panggilan cepat,\n aktifkan izin Kontak."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Untuk melihat log panggilan,\n aktifkan izin Telepon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Untuk melihat kontak,\n aktifkan izin Kontak."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Untuk mengakses pesan suara,\n aktifkan izin Telepon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Untuk mengaktifkan panggilan cepat, aktifkan izin Kontak."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Untuk melihat log panggilan, aktifkan izin Telepon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Untuk melihat kontak, aktifkan izin Kontak."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Untuk mengakses pesan suara, aktifkan izin Telepon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Untuk menelusuri kontak, aktifkan izin Kontak."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Untuk melakukan panggilan,\n aktifkan izin Telepon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Untuk melakukan panggilan, aktifkan izin Telepon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikasi telepon tidak memiliki izin untuk menulis ke setelan sistem."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Diblokir"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> aktif"</string>
</resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 838478bbe..2e39c0924 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Sími"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Sími"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Takkaborð síma"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Sími"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Símtalaferill"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Hringja í <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Tilkynna rangt númer"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Breyta númeri áður en hringt er"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Bæta við tengilið"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Eyða af símtalaferli"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Hreinsa símtalaferil"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Eyða talhólfsskilaboðum"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Deila talhólfsskilaboðum"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Símtalaskráin er tóm"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Hringja"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Símtalaferill"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Tilkynna rangt númer"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Afrita númer"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Afrita umritun"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Setja númer á bannlista"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Lokað fyrir <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Taka númer af bannlista"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> tekið af bannlista"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"AFTURKALLA"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Eyða"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Breyta númeri áður en hringt er"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Hreinsa símtalaferil"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Eyða talhólfsskilaboðum"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Setja talhólfsskilaboð í geymslu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Deila talhólfsskilaboðum"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Talhólfi eytt"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Talhólfsskilaboð sett í geymslu"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"AFTURKALLA"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"FARA Í GEYMSLU"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Hreinsa símtalaferil?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Þetta eyðir öllum símtölum af ferlinum"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Hreinsar símtalaferil…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Sími"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Ósvarað símtal"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Ósvarað vinnusímtal"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Ósvöruð símtöl"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ósvöruð símtöl"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Hringja til baka"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Skilaboð"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> talhólfsskilaboð </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> talhólfsskilaboð </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Ný talhólfsskilaboð frá <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Ekki tókst að spila talhólfsskilaboð"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Setur í biðminni…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Hleður talhólfsskilaboð…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Setur talhólfsskilaboð í geymslu..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Ekki tókst að hlaða talhólfsskilaboð"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Símtöl með talhólfi eingöngu"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Móttekin símtöl eingöngu"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Símtalaferill"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Fleiri valkostir"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"takkaborð"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Afrita"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Sýna hringd símtöl eingöngu"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Sýnir móttekin símtöl eingöngu"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Sýna ósvöruð símtöl eingöngu"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Myndsímtal hringt"</string>
<string name="type_missed_video" msgid="954396897034220545">"Ósvarað myndsímtal"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Talhólfsskilaboð"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Símtali hafnað"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Símtal á bannlista"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Móttekin símtöl"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Spila talhólfsskilaboð"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Skoða tengiliðinn <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Hringja í <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Tengiliðaupplýsingar um <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Ný talhólfsskilaboð."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> símtöl."</string>
<string name="description_video_call" msgid="2933838090743214204">"Myndsímtal"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Senda SMS til <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Símasjálfsali"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> mín. og <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Ekki er hægt að hringja í þetta númer"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Til að setja upp talhólf þarftu að opna valmyndina og velja Stillingar."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Til að hringja í talhólfið þarftu fyrst að slökkva á flugstillingu."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Raddleit er ekki í boði"</string>
<string name="call_not_available" msgid="8941576511946492225">"Ekki er hægt að hringja vegna þess að forritið Sími hefur verið gert óvirkt."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Ekkert forrit fyrir þetta er í tækinu"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Sláðu inn nafn eða símanúmer"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Þú ert ekki með nein ósvöruð símtöl."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Talhólfið þitt er tómt."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Leita að tengiliðum"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Bættu við númeri eða tengilið"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Símtalaferillinn er auður"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Hringja"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Þú ert ekki með nein ósvöruð símtöl."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Talhólfið þitt er tómt."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Talhólfsskilaboðageymslan er tóm."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Sýna aðeins uppáhaldstengiliði"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Ferill"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Símtalaferill"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Geymsla talhólfsskilaboða"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Allt"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Ósvöruð"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Talhólf"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nýr, einfaldari bannlisti"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Til að vernda þig enn betur þarf símaforritið að breyta því hvernig farið er með bannlista. Séu númer á bannlista verður bæði lokað fyrir símtöl og skilaboð frá þeim og hugsanlega verður þeim deilt með öðrum forritum."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Leyfa"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Setja <xliff:g id="NUMBER">%1$s</xliff:g> á bannlista?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Lokað verður fyrir símtöl frá þessu númeri og talhólfsskilaboðum sjálfkrafa eytt."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Lokað verður fyrir símtöl frá þessu númeri. Hugsanlegt er að sá sem hringir geti engu að síður sent þér talhólfsskilaboð."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Þú munt ekki lengur fá símtöl eða textaskilaboð úr þessu númeri."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"SETJA Á BANNLISTA"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Taka <xliff:g id="NUMBER">%1$s</xliff:g> af bannlista?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"TAKA AF BANNLISTA"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Hraðval"</string>
- <string name="tab_recents" msgid="929949073851377206">"Nýlegt"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Símtalaferill"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Tengiliðir"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Talhólf"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Fjarlægður úr uppáhaldi"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Bæta við tengilið"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Senda SMS-skilaboð"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Hringja myndsímtal"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Skoða símtalaferil í heild"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Setja númer á bannlista"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ný ósvöruð símtöl"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Þú ert ekki með neinn í hraðvali enn sem komið er"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Bæta uppáhaldi við"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Snertu myndina til að sjá öll númer eða haltu henni inni til að endurraða"</string>
<string name="remove_contact" msgid="1080555335283662961">"Fjarlægja"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Myndsímtal"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Senda skilaboð"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Senda skilaboð"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Símtalsupplýsingar"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Hringja í <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Ósvarað símtal frá <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Svarað símtal frá <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ólesin talhólfsskilaboð frá <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Talhólfsskilaboð frá <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Símtal til <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"í gegnum <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"í gegnum <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"í gegnum <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"á <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, í gegnum <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> í gegnum <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Hringja"</string>
<string name="description_call_action" msgid="4000549004089776147">"Hringja í <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Hringja myndsímtal í <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Snarsvör"</string>
<string name="call_settings_label" msgid="313434211353070209">"Símtöl"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Lokað fyrir símtöl"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Tímabundið slökkt á lokun fyrir símtöl"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Lokun fyrir símtöl hefur verið gerð óvirk vegna þess að þú hafðir samband við neyðarþjónustu úr þessum síma á undanförnum tveimur sólarhringum. Lokunin verður aftur virk að þessum tveimur sólarhringum liðnum."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Flytja inn númer"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Þú merktir áður nokkra hringjendur þannig að þeir verði sjálfkrafa sendir í talhólfið í gegnum önnur forrit."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Skoða tölur"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Flytja inn"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Innflutningur mistókst"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Ekki tókst að setja talhólfsskilaboð í geymslu."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Taka númer af bannlista"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Bæta númeri við"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Lokað verður fyrir símtöl frá þessum númerum og talhólfsskilaboðum sjálfkrafa eytt."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Lokað verður fyrir símtöl frá þessum númerum. Hugsanlegt er að þeir sem hringja geti engu að síður sent þér talhólfsskilaboð."</string>
+ <string name="block_list" msgid="7760188925338078011">"Númer á bannlista"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> er ógilt."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> er nú þegar á bannlista."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Slökkt á lokun símtala í 48 klukkustundir"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Óvirkt vegna þess að neyðarsímtal var hringt."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Símtalareikningar"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Kveikja"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Stilla heimildir"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Kveiktu á tengiliðaheimildinni\ntil að gera hraðval virkt."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Kveiktu á símaheimildinni\ntil að sjá símtalaskrána."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Kveiktu á tengiliðaheimildinni\ntil að sjá tengiliðina þína."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Kveiktu á símaheimildinni\ntil að fá aðgang að talhólfinu."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Kveiktu á tengiliðaheimildinni til að gera hraðval virkt."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Kveiktu á heimild símaforritsins til að sjá símtalaskrána þína."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Kveiktu á tengiliðaheimildinni til að sjá tengiliðina þína."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Kveiktu á heimild símaforritsins til að fá aðgang að talhólfinu þínu."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kveiktu á heimildunum fyrir tengiliði til að leita að tengiliðum."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Kveiktu á símaheimildinni\ntil að hringja símtal."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Kveiktu á heimild símaforritsins til að hringja símtal."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Símaforritið hefur ekki heimild til að breyta kerfisstillingum."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Á bannlista"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Símtal við <xliff:g id="NAMEORNUMBER">^1</xliff:g> er í gangi"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index c83338472..3386017f2 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefono"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefono"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Tastierino del telefono"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefono"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Cronologia chiamate"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Chiama <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Segnala numero sbagliato"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Modifica prima di chiamare"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Aggiungi a un contatto"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Elimina da cronologia chiamate"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Cancella cronologia chiamate"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Elimina messaggio vocale"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Condividi messaggio vocale"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Il registro chiamate è vuoto"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Fai una chiamata"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Cronologia chiamate"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Segnala numero sbagliato"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copia numero"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copia trascrizione"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blocca numero"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> bloccato"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Sblocca numero"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> sbloccato"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANNULLA"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Elimina"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Modifica numero prima di effettuare la chiamata"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Cancella cronologia chiamate"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Elimina messaggi della segreteria"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archivia messaggio vocale"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Condividi messaggio vocale"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Mes vocali eliminati"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Messaggio vocale archiviato"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANNULLA"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"VAI AD ARCHIVIO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Cancellare la cronologia chiamate?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Verranno eliminate tutte le chiamate dalla cronologia"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Cancellazione cronologia chiamate…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefono"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Chiamata senza risposta"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Chiamata di lavoro persa"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Chiamate senza risposta"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chiamate senza risposta"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Richiama"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Messaggio"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> messaggi in segreteria </item>
<item quantity="one">Messaggio in segreteria</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nuovo messaggio vocale da <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Impossibile riprodurre i messaggi vocali"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buffering..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Caricamento dei messaggi vocali…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archiviazione messaggio vocale…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Impossibile caricare i messaggi vocali"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Solo chiamate con segreteria"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Solo chiamate in arrivo"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Cronologia chiamate"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Altre opzioni"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tastierino"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copia"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostra solo in uscita"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostra solo in arrivo"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostra solo senza risposta"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videochiamata in uscita"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videochiamata persa"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Segreteria"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Chiamata rifiutata"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Chiamata bloccata"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Chiamate in arrivo"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Riproduci messaggio vocale"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualizza <xliff:g id="NAME">%1$s</xliff:g> contatto"</string>
<string name="description_call" msgid="3443678121983852666">"Chiama <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Dettagli contatto <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nuovo messaggio di segreteria."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> chiamate."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videochiamata."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Invia SMS a <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Cabina telefonica"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> secondi"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> alle ore <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Impossibile chiamare questo numero"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Per configurare la segreteria, seleziona Menu &gt; Impostazioni."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Per chiamare la segreteria, disattiva la modalità aereo."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Ricerca vocale non disponibile"</string>
<string name="call_not_available" msgid="8941576511946492225">"Impossibile effettuare una telefonata perché l\'applicazione Telefono è stata disattivata."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Sul dispositivo non sono presenti app per tale azione"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Inserisci un nome o un numero"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nessuna chiamata senza risposta."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"La casella della segreteria è vuota."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Cerca nei contatti"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Aggiungi numero/cerca contatti"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"La cronologia delle chiamate è vuota"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Fai una chiamata"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nessuna chiamata senza risposta."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"La segreteria è vuota."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"L\'archivio dei messaggi vocali è vuoto."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostra solo i preferiti"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Cronologia"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Cronologia chiamate"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archivio messaggi vocali"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Tutte"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perse"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Segreteria"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nuovo blocco semplificato"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Per una migliore protezione, l\'app Telefono deve modificare il funzionamento del blocco. Ora gli SMS e le chiamate provenienti dai numeri bloccati non verranno ricevuti. I numeri bloccati, inoltre, possono essere condivisi con altre app."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Consenti"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Bloccare il numero <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Le chiamate da questo numero verranno bloccate e i messaggi in segreteria verranno automaticamente eliminati."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Le chiamate da questo numero verranno bloccate, ma il chiamante potrebbe lasciarti messaggi in segreteria."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Non riceverai più chiamate o SMS da questo numero."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCCA"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Sbloccare il numero <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"SBLOCCA"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Composizione rapida"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recenti"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Cronologia chiamate"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contatti"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Segreteria"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Rimosso dai preferiti"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Aggiungi a un contatto"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Invia SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Fai una videochiamata"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Visualizza cronologia completa delle chiamate"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blocca numero"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nuove chiamate senza risposta"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Nessun preferito disponibile nella Composizione rapida"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Aggiungi un preferito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Tocca l\'immagine per visualizzare tutti i numeri, oppure tocca e tieni premuto per cambiare l\'ordine"</string>
<string name="remove_contact" msgid="1080555335283662961">"Rimuovi"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videochiamata"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Invia messaggio"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Invia un messaggio"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Dettagli chiamata"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Chiama <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Chiamata senza risposta di <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Risposta alla chiamata di <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Messaggio in segreteria da ascoltare da <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Messaggio in segreteria da <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Chiamata a <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"da o verso <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"tramite <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"tramite <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"su <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, tramite <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> tramite <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Chiama"</string>
<string name="description_call_action" msgid="4000549004089776147">"Chiama <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videochiamata <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Risposte rapide"</string>
<string name="call_settings_label" msgid="313434211353070209">"Chiamate"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blocco delle chiamate"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blocco chiamate temporaneam. disattivato"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Il blocco chiamate è stato disattivato perché hai contattato servizi di emergenza da questo telefono nelle ultime 48 ore. Verrà riattivato automaticamente una volta trascorso il periodo di 48 ore."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importa numeri"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Hai già contrassegnato alcuni chiamanti da inviare automaticamente alla segreteria tramite altre app."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Visualizza numeri"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importa"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importazione non riuscita"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Impossibile archiviare messaggio vocale."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Sblocca numero"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Aggiungi numero"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Le chiamate da questi numeri verranno bloccate e i messaggi in segreteria verranno automaticamente eliminati."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Le chiamate da questi numeri verranno bloccate, ma i chiamanti potrebbero lasciarti messaggi in segreteria."</string>
+ <string name="block_list" msgid="7760188925338078011">"Numeri bloccati"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> non è valido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> è già bloccato."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Il blocco chiamate è stato disattivato per 48 ore"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Funzione disattivata: è stata fatta una chiamata di emergenza."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Account di chiamata"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Attiva"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Imposta autorizzazioni"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Per attivare la composizione rapida,\n attiva l\'autorizzazione Contatti."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Per accedere al registro chiamate,\n attiva l\'autorizzazione Telefono."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Per accedere ai tuoi contatti,\n attiva l\'autorizzazione Contatti."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Per accedere alla segreteria,\n attiva l\'autorizzazione Telefono."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Per attivare la composizione rapida, attiva l\'autorizzazione Contatti."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Per accedere al registro chiamate, attiva l\'autorizzazione sul telefono."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Per accedere ai tuoi contatti, attiva l\'autorizzazione Contatti."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Per accedere alla segreteria, attiva l\'autorizzazione sul telefono."</string>
<string name="permission_no_search" msgid="84152933267902056">"Per cercare nei tuoi contatti, attiva le autorizzazioni Contatti."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Per fare una telefonata,\n attiva l\'autorizzazione Telefono."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Per fare una chiamata, attiva l\'autorizzazione sul telefono."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"L\'app Telefono non dispone dell\'autorizzazione per modificare le impostazioni di sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloccato"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> è attivo"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 7e503e180..e02c6b2c7 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"טלפון"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"טלפון"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"לוח חיוג של הטלפון"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"טלפון"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"היסטוריית שיחות"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"התקשר אל <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"דווח על מספר לא מדויק"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ערוך מספר לפני השיחה"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"הוסף לאיש קשר"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"מחק מהיסטוריית השיחות"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"נקה את היסטוריית השיחות"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"מחק דואר קולי"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"שתף דואר קולי"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"יומן השיחות שלך ריק"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"התקשר"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"היסטוריית שיחות"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"דווח על מספר לא מדויק"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"העתק מספר"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"העתק תמלול"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"חסום מספר"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> חסום"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"בטל חסימת מספר"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"בוטלה החסימה של <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"בטל"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"מחק"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ערוך את המספר לפני השיחה"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"נקה את היסטוריית השיחות"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"מחק דואר קולי"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"העברת דואר קולי לארכיון"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"שיתוף של הדואר הקולי"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"דואר קולי נמחק"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"הדואר הקולי הועבר לארכיון"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"בטל"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"לארכיון"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"האם לנקות את היסטוריית השיחות?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"פעולה זו תמחק את כל השיחות מההיסטוריה שלך"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"מנקה היסטוריית שיחות…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"טלפון"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"שיחה שלא נענתה"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"שיחה עסקית שלא נענתה"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"שיחות שלא נענו"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> שיחות שלא נענו"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"התקשר חזרה"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"הודעה"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="two"> <xliff:g id="COUNT">%1$d</xliff:g> הודעות דואר קולי </item>
<item quantity="many"> <xliff:g id="COUNT">%1$d</xliff:g> הודעות דואר קולי </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"דואר קולי חדש מאת <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"לא ניתן היה להשמיע דואר קולי"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"מבצע אחסון זמני..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"טוען דואר קולי…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"מעביר את הדואר הקולי לארכיון..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"לא ניתן היה לטעון דואר קולי"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"שיחות עם דואר קולי בלבד"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"שיחות נכנסות בלבד"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"היסטוריית שיחות"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"אפשרויות נוספות"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"לוח חיוג"</string>
- <string name="menu_copy" msgid="6108677035381940698">"העתק"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"הצג רק שיחות יוצאות"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"הצג רק שיחות נכנסות"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"הצג רק שיחות שלא נענו"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"שיחת וידאו יוצאת"</string>
<string name="type_missed_video" msgid="954396897034220545">"שיחת וידאו שלא נענתה"</string>
<string name="type_voicemail" msgid="5153139450668549908">"דואר קולי"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"שיחה שנדחתה"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"שיחה חסומה"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"שיחות נכנסות"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"הפעל דואר קולי"</string>
<string name="description_view_contact" msgid="5205669345700598415">"הצג את איש הקשר <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"התקשר אל <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"פרטי יצירת קשר עבור <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"דואר קולי חדש."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> שיחות."</string>
<string name="description_video_call" msgid="2933838090743214204">"שיחת וידאו."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"‏שלח SMS אל <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"טלפון ציבורי"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> שניות"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> דק\' <xliff:g id="SECONDS">%s</xliff:g> שנ\'"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ב-<xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"לא ניתן להתקשר אל המספר הזה"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"‏כדי להגדיר את הדואר הקולי, עבור אל \'תפריט\' &gt; \'הגדרות\'."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"כדי להתקשר לדואר קולי, ראשית כבה את מצב הטיסה."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"חיפוש קולי אינו זמין"</string>
<string name="call_not_available" msgid="8941576511946492225">"לא ניתן לבצע שיחת טלפון מפני שאפליקציית הטלפון הושבתה."</string>
<string name="activity_not_available" msgid="2287665636817987623">"אין אפליקציה עבור הפעולה הזו במכשיר הזה"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"הזן שם או מספר טלפון"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"אין שיחות שלא נענו."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"תיבת הדואר הקולי ריקה."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"חפש אנשי קשר"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"הוסף מספר או חפש אנשי קשר"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"היסטוריית השיחות שלך ריקה"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"התקשר"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"אין שיחות שלא נענו."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"תיבת הדואר הקולי ריקה."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"הארכיון של הדואר הקולי ריק."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"הצג מועדפים בלבד"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"היסטוריה"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"היסטוריית שיחות"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"הארכיון של הדואר הקולי"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"הכל"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"שיחה שלא נענתה"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"דואר קולי"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"תהליך חסימה חדש ופשוט"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"כדי להגן עליך טוב יותר, הטלפון צריך לשנות את האופן שבו החסימה פועלת. לא תוכל לקבל שיחות והודעות טקסט ממספרים חסומים, וייתכן שהם ישותפו עם אפליקציות אחרות."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"אפשר"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"האם לחסום את המספר <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"שיחות ממספר זה ייחסמו והודעות דואר קולי יימחקו באופן אוטומטי."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"שיחות ממספר זה ייחסמו, אבל המתקשר עדיין יוכל להשאיר לך הודעות דואר קולי."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"לא תקבל יותר שיחות או הודעות טקסט מהמספר הזה."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"חסום"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"האם לבטל את חסימת המספר <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ביטול חסימה"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"חיוג מהיר"</string>
- <string name="tab_recents" msgid="929949073851377206">"אחרונים"</string>
+ <string name="tab_history" msgid="2563144697322434940">"היסטוריית שיחות"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"אנשי קשר"</string>
<string name="tab_voicemail" msgid="155024725947496746">"דואר קולי"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"הוסר מהמועדפים"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"הוסף לאיש קשר"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"‏שלח SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"בצע שיחת וידאו"</string>
- <string name="show_call_history" msgid="1141502332266697170">"הצג את היסטוריית השיחות המלאה"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"חסום מספר"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> שיחות חדשות שלא נענו"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"עדיין לא הוגדר חיוג מהיר לאף איש קשר"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"הוסף פריט מועדף"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"גע בתמונה כדי לראות את כל המספרים או גע נגיעה ממושכת כדי לשנות את הסדר"</string>
<string name="remove_contact" msgid="1080555335283662961">"הסר"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"שיחת וידאו"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"שלח הודעה"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"שלח הודעה"</string>
<string name="call_log_action_details" msgid="701345508704970622">"פרטי שיחה"</string>
<string name="call_log_action_call" msgid="463690849042459842">"התקשר אל <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"שיחה לא נענתה מ-<xliff:g id="NAMEORNUMBER">^1</xliff:g>‏, <xliff:g id="TYPEORLOCATION">^2</xliff:g>‏, <xliff:g id="TIMEOFCALL">^3</xliff:g>‏, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"נענתה שיחה מ-<xliff:g id="NAMEORNUMBER">^1</xliff:g>‏, <xliff:g id="TYPEORLOCATION">^2</xliff:g>‏, <xliff:g id="TIMEOFCALL">^3</xliff:g>‏, <xliff:g id="PHONEACCOUNT">^4</xliff:g>‏."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"דואר קולי שלא נקרא מ-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"דואר קולי מ-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"שיחה אל <xliff:g id="NAMEORNUMBER">^1</xliff:g>‏, <xliff:g id="TYPEORLOCATION">^2</xliff:g>‏, <xliff:g id="TIMEOFCALL">^3</xliff:g>‏, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"ב-<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"דרך <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"דרך <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"ב-<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, דרך <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> דרך <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"התקשר"</string>
<string name="description_call_action" msgid="4000549004089776147">"התקשר אל <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"שיחת וידאו עם <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"תגובות מהירות"</string>
<string name="call_settings_label" msgid="313434211353070209">"שיחות"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"חסימת שיחות"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"חסימת השיחות מושבתת באופן זמני"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"חסימת השיחות הושבתה מפני שיצרת קשר מטלפון זה עם שירותי חירום במהלך 48 השעות האחרונות. הפונקציה תופעל מחדש באופן אוטומטי בתום 48 השעות."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"יבא מספרים"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"סימנת בעבר באמצעות יישומים אחרים כמה מתקשרים שיישלחו באופן אוטומטי לדואר קולי."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"הצג מספרים"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"יבא"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"הייבוא נכשל"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"העברת הדואר הקולי לארכיון נכשלה."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"בטל חסימת מספר"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"הוסף מספר"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"שיחות ממספרים אלה ייחסמו והודעות דואר קולי יימחקו באופן אוטומטי."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"שיחות ממספרים אלה ייחסמו, אבל המתקשרים עדיין יוכלו להשאיר לך הודעות דואר קולי."</string>
+ <string name="block_list" msgid="7760188925338078011">"מספרים חסומים"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> אינו חוקי."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> כבר חסום."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"חסימת השיחות הושבתה ל-48 שעות"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"מושבתת מפני שבוצעה שיחת חירום."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"חשבונות לביצוע שיחות"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"הפעל"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"הגדר הרשאות"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"כדי לאפשר חיוג מהיר,\n הפעל את הרשאת \'אנשי קשר\'."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"כדי לראות את יומן השיחות,\n הפעל את ההרשאה \'טלפון\'."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"כדי לראות את אנשי הקשר,\n הפעל את ההרשאה \'אנשי קשר\'."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"כדי לגשת לדואר הקולי,\n הפעל את ההרשאה \'טלפון\'."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"כדי להפעיל חיוג מהיר, הפעל את ההרשאה \'אנשי קשר\'."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"כדי לראות את יומן השיחות, הפעל את ההרשאה \'טלפון\'."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"כדי להציג את אנשי הקשר, הפעל את ההרשאה \'אנשי קשר\'."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"כדי לגשת לדואר הקולי, הפעל את ההרשאה \'טלפון\'."</string>
<string name="permission_no_search" msgid="84152933267902056">"כדי לחפש באנשי הקשר, הפעל את ההרשאה \'אנשי קשר\'."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"כדי להתקשר,\n הפעל את ההרשאה \'טלפון\'."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"כדי להתקשר, הפעל את ההרשאה \'טלפון\'."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"לאפליקציית הטלפון אין הרשאה לכתוב בהגדרות המערכת."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"חסום"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> זמין/ה"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index efa4fbd2a..8e1c4eec5 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"電話"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"電話"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"電話ダイヤルパッド"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"電話"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"通話履歴"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g>に発信"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"不正確な番号を報告"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"発信前に番号を編集"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"連絡先に追加"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"通話履歴から削除"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"通話履歴を消去"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ボイスメールを削除"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ボイスメールを共有"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"通話履歴はありません"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"発信"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"通話履歴"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"不正確な番号を報告"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"番号をコピー"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"音声文字変換をコピー"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"番号をブロック"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g>をブロックしました"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"番号のブロックを解除"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g>のブロックを解除しました"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"元に戻す"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"削除"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"発信前に番号を編集"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"通話履歴を消去"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ボイスメールを削除"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"ボイスメールをアーカイブする"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ボイスメールを共有"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ボイスメールの削除"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ボイスメールをアーカイブしました"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"元に戻す"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"アーカイブ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"通話履歴を消去しますか?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"消去すると、すべての通話が履歴から削除されます"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"通話履歴の消去中…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"電話"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"不在着信"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"仕事の通話の不在着信"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"不在着信"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"不在着信 <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 件"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"折り返す"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"メッセージ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g>件のボイスメール</item>
<item quantity="one">1件のボイスメール</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>、<xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g>から新着ボイスメール"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ボイスメールを再生できませんでした"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"バッファリング中..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"ボイスメールを読み込んでいます…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"ボイスメールをアーカイブしています…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ボイスメールを読み込めませんでした"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"ボイスメールのある着信のみ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"着信のみ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"通話履歴"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"その他のオプション"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ダイヤルパッド"</string>
- <string name="menu_copy" msgid="6108677035381940698">"コピー"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"発信のみを表示"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"着信のみを表示"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"不在着信のみを表示"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ビデオハングアウト発信"</string>
<string name="type_missed_video" msgid="954396897034220545">"ビデオハングアウト不在着信"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ボイスメール"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"拒否された通話"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ブロックされた通話"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"着信"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ボイスメールを再生"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g>の連絡先を表示"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g>に発信"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>の連絡先の詳細"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"新着のボイスメール。"</string>
<string name="description_num_calls" msgid="1601505153694540074">"通話回数は<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>回。"</string>
<string name="description_video_call" msgid="2933838090743214204">"ビデオハングアウト"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>さんにSMSを送信"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"公衆電話"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g>秒"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g>分<xliff:g id="SECONDS">%s</xliff:g>秒"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>、<xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g> 分 <xliff:g id="SECONDS">%2$02d</xliff:g> 秒"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g>(<xliff:g id="DURATION">%2$s</xliff:g>)"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"この番号に電話できません"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ボイスメールをセットアップするには、MENUキー&gt;[設定]をタップします。"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"機内モードをOFFにしてからボイスメールを呼び出してください。"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"音声検索を利用できません"</string>
<string name="call_not_available" msgid="8941576511946492225">"電話アプリが無効になっているため発信できません。"</string>
<string name="activity_not_available" msgid="2287665636817987623">"この操作を行うアプリが端末上にありません"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"名前または電話番号を入力"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"不在着信はありません。"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"ボイスメール受信トレイは空です。"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"連絡先を検索"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"番号を追加するか連絡先を検索"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"通話履歴はありません"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"発信"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"不在着信はありません。"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"ボイスメール受信トレイは空です。"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"ボイスメールのアーカイブが空です。"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"お気に入りのみを表示"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"履歴"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"通話履歴"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ボイスメールのアーカイブ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"すべて"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"不在着信"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ボイスメール"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"新しい、簡素化されたブロック"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"セキュリティを強化するため、スマートフォンはブロック動作を変更する必要があります。ブロックされた電話番号からの通話とテキスト メッセージの両方が停止されます。また、ブロックされた電話番号は他のアプリと共有できます。"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"許可"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g>をブロックしますか?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"この番号からの着信はブロックされ、ボイスメールは自動的に削除されます。"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"この番号からの着信はブロックされますが、発信者は今後もボイスメールを残すことができます。"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"今後はこの番号からの通話やテキスト メッセージは受信しなくなります。"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ブロック"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g>のブロックを解除しますか?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ブロックを解除"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"クイックアクセス"</string>
- <string name="tab_recents" msgid="929949073851377206">"最近"</string>
+ <string name="tab_history" msgid="2563144697322434940">"通話履歴"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"連絡先"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ボイスメール"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"お気に入りから削除されました"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"連絡先に追加"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMSを送信"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ビデオハングアウト"</string>
- <string name="show_call_history" msgid="1141502332266697170">"通話履歴をすべて表示"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"番号をブロック"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g>件の不在着信"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"クイックアクセスに登録済みの連絡先はまだありません"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"お気に入りを追加"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"画像をタップするとすべての番号を表示でき、押し続けると並べ替えることができます"</string>
<string name="remove_contact" msgid="1080555335283662961">"削除"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ビデオハングアウト"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"メッセージを送信"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"メッセージを送信"</string>
<string name="call_log_action_details" msgid="701345508704970622">"通話の詳細"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>に発信"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="TIMEOFCALL">^3</xliff:g>の<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="PHONEACCOUNT">^4</xliff:g>)からの不在着信。"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="TIMEOFCALL">^3</xliff:g>の<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="PHONEACCOUNT">^4</xliff:g>)からの着信。"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="TIMEOFCALL">^3</xliff:g>の<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="PHONEACCOUNT">^4</xliff:g>)からの未読のボイスメール。"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="TIMEOFCALL">^3</xliff:g>の<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="PHONEACCOUNT">^4</xliff:g>)からのボイスメール。"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="TIMEOFCALL">^3</xliff:g>の<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="PHONEACCOUNT">^4</xliff:g>)への発信。"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> で受信"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> で受信"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>(<xliff:g id="NUMBER">%2$s</xliff:g>)で受信"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>(<xliff:g id="NUMBER">%2$s</xliff:g>)で受信"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"発信"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>に発信します"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>にビデオハングアウト発信します。"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"クイック返信"</string>
<string name="call_settings_label" msgid="313434211353070209">"通話"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"着信のブロック"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"着信のブロックは一時的にOFFです"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"このスマートフォンから緊急通報番号への発信が過去48時間以内に行われているため、着信のブロックは無効になっています。48時間経過すると、着信のブロックは自動的に有効になります。"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"番号をインポート"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"以前に一部の発信者について、他のアプリを通じて自動的にボイスメールに転送するようマークを付けています。"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"番号を表示"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"インポート"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"インポートに失敗しました"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"ボイスメールをアーカイブできませんでした。"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"番号のブロックを解除"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"電話番号を追加"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"この番号からの着信はブロックされ、ボイスメールは自動的に削除されます。"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"この番号からの着信はブロックされますが、発信者は今後もボイスメールを残すことができます。"</string>
+ <string name="block_list" msgid="7760188925338078011">"ブロックした番号"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g>は無効な番号です。"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g>は既にブロックしています。"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"着信のブロックは48時間経過するまで無効になりました"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"緊急通報を行ったため無効になりました。"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"通話アカウント"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ONにする"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"権限を設定"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"クイックアクセスを有効にするには、\n連絡先権限をONにしてください。"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"通話履歴を表示するには、\n電話権限をONにしてください。"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"連絡先を表示するには、\n連絡先権限をONにしてください。"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"ボイスメールにアクセスするには、\n電話権限をONにしてください。"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"クイックアクセスを有効にするには、連絡先権限をONにしてください。"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"通話履歴を表示するには、電話権限をONにしてください。"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"連絡先を表示するには、連絡先権限をONにしてください。"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ボイスメールにアクセスするには、電話権限をONにしてください。"</string>
<string name="permission_no_search" msgid="84152933267902056">"連絡先を検索するには、連絡先権限をONにしてください。"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"電話をかけるには、\n電話権限をONにしてください。"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"電話をかけるには、電話権限をONにしてください。"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"電話アプリにはシステム設定への書き込み権限がありません。"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ブロック済み"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> さんが通話中です"</string>
</resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 9be0fbc72..2d9a21f7e 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ტელეფონი"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ტელეფონი"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ტელეფონის ციფერბლატი"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ტელეფონი"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"საუბრის ისტორია"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g>-თან დარეკვა"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"არაზუსტი ნომრის შეტყობინება"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ნომრის რედაქტირება დარეკვამდე"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"კონტაქტისადმი დამატება"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ზარის ისტორიიდან წაშლა"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ზარის ისტორიის გასუფთავება"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ხმოვანი ფოსტის წაშლა"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ხმოვანი ფოსტის გაზიარება"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"თქვენი ზარების ჟურნალი ცარიელია"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"დარეკვა"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"საუბრის ისტორია"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"არაზუსტი ნომრის შეტყობინება"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"ნომრის კოპირება"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ტრანსკრიპტის კოპირება"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"ნომრის დაბლოკვა"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> დაბლოკილია"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"ნომრის განბლოკვა"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> განბლოკილია"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"დაბრუნება"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"წაშლა"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ნომრის რედაქტირება დარეკვამდე"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"საუბრის ისტორიის გასუფთავება"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ხმოვანი ფოსტის წაშლა"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"ხმოვანი ფოსტის დაარქივება"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ხმოვანი ფოსტის გაზიარება"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ხმოვანი ფოსტა წაიშალა"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ხმოვანი ფოსტა დაარქივებულია"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"დაბრუნება"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"არქივი"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"გასუფთავდეს ზარის ისტორია?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"ეს წაშლის ყველა ზარს თქვენი ისტორიიდან"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"მიმდ. ზარ. ისტ. გასუფთავება…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"დარეკვა"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"გამოტოვებული ზარი"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"გამოტოვებული ზარი (სამსახური)"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"გამოტოვებული ზარები"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> გამოტოვებული ზარი"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"გადარეკვა"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"შეტყობინება"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ხმოვანი ფოსტა </item>
<item quantity="one">ხმოვანი ფოსტა</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"ახალი ხმოვანი ფოსტა <xliff:g id="CALLER">%1$s</xliff:g>-ისგან"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ვერ ხორციელდება ხმოვანი ფოსტა ჩართვა"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"ბუფერიზაცია…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"ხმოვანი ფოსტა იტვირთება…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"ხმოვანი ფოსტის დაარქივება…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ვერ ხორციელდება ხმოვანი ფოსტის ჩატვირთვა"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"მხოლოდ ზარები ხმოვანი ფოსტით"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"მხოლოდ შემომავალი ზარები"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"საუბრის ისტორია"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"სხვა პარამეტრები"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ციფერბლატი"</string>
- <string name="menu_copy" msgid="6108677035381940698">"კოპირება"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"მხოლოდ გამავალის ჩვენება"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"მხოლოდ შემომავალის ჩვენება"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"მხოლოდ გამოტოვებულის ჩვენება"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"გამავალი ვიდეოზარი"</string>
<string name="type_missed_video" msgid="954396897034220545">"გამოტოვებული ვიდეოზარი"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ხმოვანი ფოსტა"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"უარყოფილი ზარი"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"დაბლოკილი ზარი"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"შემომავალი ზარები"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ხმოვანი ფოსტის ჩართვა"</string>
<string name="description_view_contact" msgid="5205669345700598415">"კონტაქტის <xliff:g id="NAME">%1$s</xliff:g> ნახვა"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g>-თან დარეკვა"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>-ის კონტაქტის დეტალები"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"ახალი ხმოვანი ფოსტა."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ზარი."</string>
<string name="description_video_call" msgid="2933838090743214204">"ვიდეოზარი."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"გააგზავნეთ SMS <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"გადახდის ტელეფონი"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> წმ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> მინ <xliff:g id="SECONDS">%s</xliff:g> წამ"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ვერ ხორციელდება ამ ნომერზე დარეკვა"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ხმოვანი ფოსტის დასაყენებლად გადადით მენიუს &gt; პარამეტრებზე."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ხმოვან ფოსტასთან დასაკავშირებლად პირველ რიგში გამორთეთ თვითმფრინავის რეჟიმი."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"ხმოვანი ძიება არ არის ხელმისაწვდომი"</string>
<string name="call_not_available" msgid="8941576511946492225">"სატელეფონო ზარის განხორციელება ვერ ხერხდება, ვინაიდან ტელეფონის აპლიკაცია გაუქმებულია."</string>
<string name="activity_not_available" msgid="2287665636817987623">"ამ მოწყობილობაზე არ არის შესაბამისი აპლიკაცია"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"შეიყვანეთ სახელი ან ტელ. ნომერი"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"გამოტოვებული ზარები არ გაქვთ."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"თქვენი ხმოვანი ელფოსტის შემოსულები ცარიელია."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"კონტაქტების ძიება"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"დაამატეთ ნომერი ან მოიძიეთ კონტაქტებიდან"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"თქვენი საუბრის ისტორია ცარიელია"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"დარეკვა"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"გამოტოვებული ზარები არ გაქვთ."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"თქვენი ხმოვანი ელფოსტის შემოსულები ცარიელია."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"თქვენი ხმოვანი ფოსტის არქივი ცარიელია."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"მხოლოდ რჩეულების ჩვენება"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ისტორია"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"საუბრის ისტორია"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ხმოვანი ფოსტის არქივი"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ყველა"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"გამოტოვებული"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ხმოვანი ფოსტა"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"დაბლოკვის ახალი, მარტივი ხერხი"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"თქვენი უკეთ დაცვის მიზნით, ტელეფონმა დაბლოკვის წესი უნდა შეცვალოს. თქვენ მიერ დაბლოკილი ნომრებიდან როგორც ზარები, ისე ტექსტური შეტყობინებები შეწყდება და შესაძლოა მოხდეს ამ ნომრების სხვა აპებთან გაზიარება."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"დაშვება"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"გსურთ, დაბლოკოთ <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ამ ნომრიდან შემოსული ზარები დაიბლოკება, ხოლო ხმოვანი ფოსტა ავტომატურად წაიშლება."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ამ ნომრიდან შემოსული ზარები დაიბლოკება, თუმცა აბონენტს მაინც შეეძლება თქვენთვის ხმოვანი ფოსტის დატოვება."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ამ ნომრიდან ზარებს ან ტექსტურ შეტყობინებებს აღარ მიიღებთ."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"დაბლოკვა"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"გსურთ, განბლოკოთ <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"განბლოკვა"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"სწრაფი დარეკვა"</string>
- <string name="tab_recents" msgid="929949073851377206">"ბოლო"</string>
+ <string name="tab_history" msgid="2563144697322434940">"საუბრის ისტორია"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"კონტაქტები"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ხმოვანი ფოსტა"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"წაიშალა რჩეულებიდან"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"კონტაქტისადმი დამატება"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS-ის გაგზავნა"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ვიდეოზარის განხორციელება"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ზარების სრული ისტორიის ნახვა"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"ნომრის დაბლოკვა"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ახალი გაცდენილი ზარი"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"სწრაფი აკრეფისთვის რჩეულები ჯერ არ გყავთ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"რჩეული კონტაქტის დამატება"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"ყველა ნომრის სანახავად შეეხეთ სურათს ან და გეჭიროთ მასზე ხელახალი შეკვეთისათვის"</string>
<string name="remove_contact" msgid="1080555335283662961">"ამოშლა"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ვიდეო ზარი"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"შეტყობინების გაგზავნა"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"შეტყობინების გაგზავნა"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ზარის მონაცემები"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>-თან დარეკვა"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"გამოტოვებული ზარი აბონენტისგან: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"უპასუხო ზარი აბონენტისგან <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"წაუკითხავი ხმოვანი ფოსტა აბონენტისგან: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"ხმოვანი ფოსტა აბონენტისგან: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"ზარი აბონენტთან <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>-ზე"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g>-ის მეშვეობით"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g>-ის მეშვეობით"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>-ზე, <xliff:g id="NUMBER">%2$s</xliff:g>-ის მეშვეობით"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, <xliff:g id="NUMBER">%2$s</xliff:g>-ის მეშვეობით"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"დარეკვა"</string>
<string name="description_call_action" msgid="4000549004089776147">"დარეკვა <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"ვიდეო ზარი <xliff:g id="NAMEORNUMBER">^1</xliff:g>-თან."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"სწრაფი პასუხი"</string>
<string name="call_settings_label" msgid="313434211353070209">"ზარები"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ზარების დაბლოკვა"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ზარების დაბლოკვა დროებით გამოირთო"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ზარების დაბლოკვა გაითიშა, რადგან ბოლო 48 საათში ამ ტელეფონიდან საგანგებო სამსახურებს დაუკავშირდით. 48 საათის გასვლის შემდეგ ის ავტომატურად ჩაირთვება."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"ნომრების იმპორტი"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"სხვა აპების მეშვეობით თქვენ მიერ ადრე ზოგიერთი აბონენტის ხმოვან ფოსტაზე ავტომატური გადამისამართება მოინიშნა."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"ნომრების ნახვა"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"იმპორტი"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"იმპორტი ვერ მოხერხდა"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"ხმოვანი ფოსტის დაარქივება ვერ მოხერხდა."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"ნომრის განბლოკვა"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"ნომრის დამატება"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ამ ნომრებიდან შემოსული ზარები დაიბლოკება, ხოლო ხმოვანი ფოსტა ავტომატურად წაიშლება."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ამ ნომრებიდან შემოსული ზარები დაიბლოკება, თუმცა აბონენტებს მაინც შეეძლებათ თქვენთვის ხმოვანი ფოსტის დატოვება."</string>
+ <string name="block_list" msgid="7760188925338078011">"დაბლოკილი ნომრები"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> არასწორია."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> უკვე დაბლოკილია."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ზარების დაბლოკვა გაითიშა 48 საათით"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"გათიშულია, რადგან განხორციელდა საგანგებო ზარი."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"ანგარიშების გამოძახება"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ჩართვა"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ნებართვების დაყენება"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"სწრაფი აკრეფის გასააქტიურებლად\n ჩართეთ კონტაქტების ნებართვები."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"თქვენი ზარების ჟურნალის სანახავად\n ჩართეთ ტელეფონის ნებართვები."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"თქვენი კონტაქტების სანახავად\n ჩართეთ კონტაქტების ნებართვები."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"თქვენს ხმოვან ფოსტაზე წვდომისთვის\n ჩართეთ ტელეფონის ნებართვები."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"სწრაფი აკრეფის გასააქტიურებლად, ჩართეთ კონტაქტების ნებართვა."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ზარების ჟურნალის სანახავად, ჩართეთ ტელეფონის ნებართვა."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"კონტაქტების სანახავად, ჩართეთ კონტაქტების ნებართვა."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ხმოვან ფოსტაზე წვდომისთვის, ჩართეთ ტელეფონის ნებართვა."</string>
<string name="permission_no_search" msgid="84152933267902056">"თქვენი კონტაქტების მოსაძებნად ჩართეთ კონტაქტების ნებართვები."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ზარის განსახორციელებლად\n ჩართეთ ტელეფონის ნებართვები."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ზარის განსახორციელებლად, ჩართეთ ტელეფონის ნებართვა."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ტელეფონის აპს სისტემის პარამეტრებში ჩაწერის ნებართვა არ აქვს."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"დაბლოკილი"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> აქტიურია"</string>
</resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index b927df708..2773a6b0c 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Телефон теру тақтасы"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Қоңыраулар тарихы"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> нөміріне қоңырау шалу"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Қате нөмір туралы есеп беру"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Қоңырау алдында нөмірді жөндеңіз"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Контактіге қосу"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Қоңыраулар тарихынан жою"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Қоңыраулар тарихын тазалау"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Дауыс-хабарды жою"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Дауыс-хабармен бөлісу"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Қоңыраулар журналы бос"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Қоңырау шалу"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Қоңыраулар тарихы"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Қате нөмір туралы есеп беру"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Нөмірді көшіру"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Транскрипцияны көшіру"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Нөмірді бөгеу"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгелген"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Нөмірге рұқсат беру"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгеуден шығарылған"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"КЕРІ ОРЫНДАУ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Жою"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Қоңырау алдында нөмірді өзгерту"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Қоңыраулар тарихын тазалау"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Дауыстық хабарды жою"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Дауыстық поштаны мұрағаттау"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Дауыстық хабармен бөлісу"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Дауыстық хабар жойылды"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Дауыстық пошта мұрағатталды"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"КЕРІ ҚАЙТАРУ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"МҰР-ҚА ӨТУ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Қоңыраулар тарихын тазалау керек пе?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Тарихтағы барлық қоңыраулар жойылады"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Қоңыраулар тарихы тазалануда…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Телефон"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Өткізіп алған қоңырау"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Өткізіп алынған жұмыс қоңырауы"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Қабылданбаған қоңыраулар"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> өткізіп алған қоңырау"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Кері қоңырау шалу"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Хабар"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> дауыстық хабар </item>
<item quantity="one">Дауыстық хабар</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> жіберген жаңа дауыс-хабар"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Дауыстық хабарды ойнату мүмкін болмады"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Буферлеуде..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Дауыстық хабар жүктелуде…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Дауыстық пошта мұрағатталуда…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Дауыстық хабарды жүктеу мүмкін болмады"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Дауыс хабары бар қоңыраулар ғана"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Келген қоңыраулар ғана"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Қоңырау тарихы"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Басқа опциялар"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"теру тақтасы"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Көшіру"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Шығыс қоңырауларды ғана көрсету"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Келгендерді ғана көрсету"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Қабылданбағандарды ғана көрсету"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Шығыс бейне қоңырау"</string>
<string name="type_missed_video" msgid="954396897034220545">"Өткізіп алынған бейне қоңырау"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Дауыстық пошта"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Қабылданбаған қоңырау"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Тыйым салынған қоңырау"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Келген қоңыраулар"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Дауыс-хабарды ойнату"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> контактісін көру"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> нөміріне қоңырау шалу"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> контакт деректері"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Жаңа дауыс-хабары."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> қоңыраулар."</string>
<string name="description_video_call" msgid="2933838090743214204">"Бейне қоңырау."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Мынаған SMS жіберу: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Автомат-телефон"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> мин <xliff:g id="SECONDS">%s</xliff:g> сек"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Бұл нөмірге қоңырау шалу мүмкін емес"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Дауыс-хабарын жасақтау үшін Mәзір &gt; Параметрлер тармақтарына кіріңіз."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Дауыс-хабарына қоңырау шалу үшін ұшақ режимін өшіру қажет."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Дауыс арқылы іздеу қол жетімді емес"</string>
<string name="call_not_available" msgid="8941576511946492225">"Телефон қоңырауын шалу мүмкін емес, өйткені «Телефон» қолданбасы өшірілген."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Бұл үшін осы құрылғыда қолданба жоқ"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Атты немесе телефон нөм. енг."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Қабылданбаған қоңыраулар жоқ."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Дауыс поштасының \"Кіріс\" қалтасы бос."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Контактілерді іздеу"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Нөмірді енгізіңіз немесе контактілерден іздеп табыңыз"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Қоңыраулар тарихы бос"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Қоңырау шалу"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Қабылданбаған қоңыраулар жоқ."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Дауыстық поштаның \"Кіріс\" қалтасы бос."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Дауыстық пошта мұрағатыңыз бос."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Сүйіктілерді ғана көрсету"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Тарих"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Қоңыраулар тарихы"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Дауыстық пошта мұрағаты"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Барлық"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Қабылданбаған"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Дауыстық хабар"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Жаңа, қарапайым бөгеу"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Қорғанысыңызды арттыру үшін телефон бөгеудің қолданылу жолын өзгертуі керек. Бөгелген нөмірлер енді қоңырауларды да, мәтіндік хабарларды да тоқтатып, басқа қолданбаларда көрсетілуі мүмкін."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Рұқсат беру"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгеу керек пе?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Осы нөмірден болашақ қоңыраулар бөгеледі және дауыстық хабарлар автоматты түрде жойылады."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Осы нөмірден қоңыраулар бөгеледі, бірақ қоңырау шалушы әлі де сізге дауыстық хабарлар қалдыра алуы мүмкін."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Бұдан былай осы нөмірден қоңыраулар немесе мәтіндік хабарлар алмайсыз."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БӨГЕУ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгеуден шығару керек пе?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"БӨГЕУДЕН ШЫҒАРУ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Жылдам теру"</string>
- <string name="tab_recents" msgid="929949073851377206">"Жақындағылар"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Қоңыраулар тарихы"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Контактілер"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Дауыстық хабар"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Сүйіктілерден алынған"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Контактіге қосу"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS жіберу"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Бейне қоңырау шалу"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Толық қоңыраулар тарихын көру"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Нөмірді бөгеу"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> жаңа қабылданбаған қоңыраулар"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Жылдам теруде әлі ешкім жоқ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Таңдаулыны қосу"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Барлық нөмірлерді көру үшін түртіңіз немесе ретін өзгерту үшін түртіп, ұстап тұрыңыз"</string>
<string name="remove_contact" msgid="1080555335283662961">"Алып тастау"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Бейне қоңырау"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Хабар жіберу"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Хабар жіберу"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Қоңырау мәліметтері"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> нөміріне қоңырау шалу"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> қоңырауы өткізіп алынды, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> қоңырауына жауап берілді, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Оқылмаған дауыстық хабар: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Дауыстық хабар: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> нөміріне қоңырау шалу, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> ішінде"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"Нөмірі: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"Нөмірі: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>. Нөмірі: <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>. Нөмірі: <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Қоңырау шалу"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> нөміріне қоңырау шалу"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> бейне қоңырау шалу."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Жылдам жауаптар"</string>
<string name="call_settings_label" msgid="313434211353070209">"Қоңыраулар"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Қоңырауларға тыйым салу"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Қоңырауларға тыйым салу уақытша өшірулі"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Қоңырауларға тыйым салу өшірілді, өйткені сіз соңғы 48 сағат ішінде осы телефоннан төтенше қызметтерге хабарластыңыз. Ол 48 сағаттық кезең өткеннен кейін автоматты түрде қайта қосылады."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Нөмірлерді импорттау"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Сіз бұрын кейбір қоңырау шалушыларды басқа қолданбалар арқылы дауыс поштасына автоматты түрде жіберу үшін белгілеген."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Нөмірлерді көру"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Импорттау"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Импорттау сәтсіз аяқталды"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Дауыстық пошта мұрағатталған жоқ."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Нөмірді бөгеуден шығару"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Нөмір қосу"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Осы нөмірлерден қоңыраулар бөгеледі және дауыстық хабарлар автоматты түрде жойылады."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Осы нөмірлерден қоңыраулар бөгеледі, бірақ олар әлі де сізге дауыстық хабарлар қалдыра алуы мүмкін."</string>
+ <string name="block_list" msgid="7760188925338078011">"Бөгелген нөмірлер"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> жарамсыз."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгеліп қойылған."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Қоңырауларға тыйым салу 48 сағат бойы өшірілген"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Өшірілген, өйткені төтенше қоңырау соғылған."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Қоңырау шалу есептік жазбалары"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Қосу"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Рұқсаттар орнату"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Жылдам теруді қосу үшін\n \"Контактілер\" рұқсатын қосыңыз."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Қоңыраулар журналын көру үшін\n \"Телефон\" рұқсатын қосыңыз."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Контактілерді көру үшін\n \"Контактілер\" рұқсатын қосыңыз."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Дауыс поштасы көрсетілуі үшін\n \"Телефон\" рұқсатын қосыңыз."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Жылдам теруді қосу үшін \"Контактілер\" рұқсатын қосыңыз."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Қоңыраулар журналы көру үшін \"Телефон\" рұқсатын қосыңыз."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Контактілерді көру үшін \"Контактілер\" рұқсатын қосыңыз."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Дауыс поштасына қатынасу үшін \"Телефон\" рұқсатын қосыңыз."</string>
<string name="permission_no_search" msgid="84152933267902056">"Контактілерді іздеу үшін \"Контактілер\" рұқсаттарын қосыңыз."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Қоңырау шалу үшін\n \"Телефон\" рұқсатын қосыңыз."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Қоңырауды шалу үшін \"Телефон\" рұқсатын қосыңыз."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Телефон қолданбасында жүйелік параметрлерге жазуға рұқсат жоқ."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Бөгелген"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> белсенді"</string>
</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index ab82d8fc9..5fc677cb2 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ទូរស័ព្ទ"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ទូរសព្ទ"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"បន្ទះលេខទូរស័ព្ទ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ទូរស័ព្ទ"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ប្រវត្តិ​ហៅ"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"ហៅ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"រាយការណ៍ពីលេខដែលមិនត្រឹមត្រូវ"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"កែ​លេខ​មុន​ពេល​ហៅ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"បន្ថែមទៅទំនាក់ទំនង"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"លុបចេញពីប្រវត្តិហៅ"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"សម្អាតប្រវត្តិហៅ"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"លុប​សារ​ជា​សំឡេង"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ចែករំលែក​សារ​ជា​សំឡេង"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"កំណត់ហេតុហៅរបស់អ្នកទទេ"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ហៅទូរស័ព្ទ"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ប្រវត្តិ​ហៅ"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"រាយការណ៍ពីលេខដែលមិនត្រឹមត្រូវ"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"ថតចម្លងលេខទូរស័ព្ទ"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ថតចម្លងសំណៅពីសារសម្លេង"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"រារាំងលេខ"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"បានរារាំង <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"ឈប់រារាំងលេខ"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"បានឈប់រារាំង <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"មិនធ្វើវិញ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"លុប"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"កែ​លេខ​មុន​ពេល​ហៅ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"សម្អាត​ប្រវត្តិហៅ"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"លុប​សារ​ជា​សំឡេង"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"រក្សាទុក​សារ​ជាសំឡេង​ក្នុង​ប័ណ្ណសារ"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ចែករំលែក​សារ​ជា​សំឡេង"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"បានលុបសារសម្លេង"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"បាន​រក្សាទុក​សារ​ជាសំឡេង​ក្នុង​ប័ណ្ណសារ"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"​មិន​ធ្វើវិញ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ទៅ​កាន់​ប័ណ្ណសារ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"សម្អាតប្រវត្តិហៅ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"វានឹងលុបការហៅទាំងអស់ចេញពីប្រវត្តិរបស់អ្នក"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"កំពុងជម្រះប្រវត្តិហៅ…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ទូរស័ព្ទ"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"ខកខាន​ទទួល"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"បានខកខានការហៅចូលពីកន្លែងការងារ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"ខកខាន​ទទួល"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"ខកខានទទួល <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ដង"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ហៅ​ទៅ​វិញ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"សារ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other">សារជាសម្លេង <xliff:g id="COUNT">%1$d</xliff:g> </item>
<item quantity="one">សារជាសម្លេង</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"សារ​ជា​សំឡេង​ថ្មី​ពី <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"មិនអាចចាក់សារជាសម្លេងបានទេ"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"កំពុង​គណនា..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"កំពុងផ្ទុកសារជាសម្លេង…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"កំពុង​​រក្សាទុក​សារ​ជាសំឡេង​ក្នុង​ប័ណ្ណសារ..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"មិនអាចផ្ទុកសារជាសម្លេងបានទេ"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"តែ​ការ​ហៅ​ជា​សារ​សំឡេង"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"តែ​ការ​ហៅ​ចូល"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ប្រវត្តិ​ហៅ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ជម្រើស​បន្ថែម"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"បន្ទះ​លេខ"</string>
- <string name="menu_copy" msgid="6108677035381940698">"ចម្លង"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"បង្ហាញ​តែ​ការ​ហៅ​ចេញ"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"បង្ហាញ​តែ​ការ​ហៅ​ចូល"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"បង្ហាញ​តែ​ការ​ខកខាន​ទទួល"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ការ​ហៅ​ជា​វីដេអូ​ចេញ"</string>
<string name="type_missed_video" msgid="954396897034220545">"ខកខាន​ទទួល​ការ​ហៅ​ជា​វីដេអូ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"សារ​ជា​សំឡេង"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ការហៅដែលបានបដិសេធ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ការហៅដែលបានរារាំង"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ការ​ហៅ​ចូល"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ចាក់​សារ​ជា​សំឡេង"</string>
<string name="description_view_contact" msgid="5205669345700598415">"មើល​ទំ​នាក់ទំនង <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"ហៅ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"ព័ត៌មាន​លម្អិត​ទំនាក់ទំនង​សម្រាប់ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"សារ​ជា​សំឡេង​ថ្មី។"</string>
<string name="description_num_calls" msgid="1601505153694540074">"ការ​ហៅ <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ។"</string>
<string name="description_video_call" msgid="2933838090743214204">"ការ​ហៅ​ជា​វីដេអូ​។"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"ផ្ញើសារ SMS ទៅ <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"ទូរស័ព្ទសាធារណៈ"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> វិនាទី"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> នាទី <xliff:g id="SECONDS">%s</xliff:g> វិនាទី"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> នៅម៉ោង <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"មិនអាចហៅលេខនេះបានទេ"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ដើម្បី​កំណត់​សារ​ជា​សំឡេង ចូល​ម៉ឺនុយ &gt; ការ​កំណត់។"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ដើម្បី​ហៅ​សារ​ជា​សំឡេង ដំបូង​ត្រូវ​បិទ​របៀប​ពេល​ជិះ​យន្តហោះ។"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"ការស្វែងរកជាសម្លេងមិនមានទេ"</string>
<string name="call_not_available" msgid="8941576511946492225">"មិន​អាច​ហៅ​បាន​ទេ​ ព្រោះ​កម្មវិធី​ទូរស័ព្ទ​ត្រូវ​បាន​បិទ។"</string>
<string name="activity_not_available" msgid="2287665636817987623">"មិនមានកម្មវិធីសម្រាប់សកម្មភាពនេះនៅលើឧបករណ៍នេះទេ"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"បញ្ចូលឈ្មោះ ឬលេខទូរស័ព្ទ"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"អ្នកមិនមានការខកខានទទួលទូរស័ព្ទទេ។"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"ប្រអប់ទទួលសារជាសំឡេងរបស់អ្នកទទេ។"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"ស្វែងរកទំនាក់ទំនង"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"បន្ថែមលេខទូរស័ព្ទ ឬស្វែងរកទំនាក់ទំនង"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"ប្រវត្តិហៅរបស់អ្នកទទេ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ហៅទូរស័ព្ទ"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"អ្នកមិនមានការខកខានទទួលទូរស័ព្ទទេ។"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"ប្រអប់ទទួលសារជាសំឡេងរបស់អ្នកទទេ។"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"បណ្ណសារជាសំឡេងរបស់អ្នកគឺទទេ។"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"បង្ហាញ​តែ​​និយម​ប្រើ​ប៉ុណ្ណោះ"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ប្រវត្តិ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ប្រវត្តិហៅ"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"បណ្ណសារសារជាសំឡេង"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ទាំង​អស់"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"ខកខាន​ទទួល"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"សារ​ជា​សំឡេង"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"ថ្មី ការ​ទប់ស្កាត់​ដែល​ងាយស្រួល"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"ដើម្បីការពារអ្នកឲ្យបានប្រសើរជាងមុន ទូរសព្ទ​ត្រូវធ្វើការផ្លាស់ប្តូររបៀប​​​ដែល​ការ​ទប់ស្កាត់​ដំណើរការ។ លេខដែល​បាន​ទប់ស្កាត់​របស់អ្នក​ឥឡូវ​នឹងបញ្ឈប់​ទាំង​ការហៅ និងការផ្ញើសារ និងអាច​ត្រូវបានចែករំលែកជាមួយកម្មវិធីផ្សេងទៀត។"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"អនុញ្ញាត"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"រារាំង <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ការហៅចេញពីលេខនេះនឹងត្រូវបានរារាំង ហើយសារជាសំឡេងនឹងត្រូវបានលុបដោយស្វ័យប្រវត្តិ។"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ការហៅចេញពីលេខនេះនឹងត្រូវបានរារាំង ប៉ុន្តែអ្នកហៅនៅតែអាចទុកសារជាសំឡេងឲ្យអ្នកបាន។"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"អ្នក​នឹង​លែង​ទទួល​​ការ​ហៅ ឬ​​សារ​​អត្ថបទ​ពី​លេខ​នេះ​ទៀត​ហើយ។"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"រារាំង"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"ឈប់រារាំង <xliff:g id="NUMBER">%1$s</xliff:g> ឬ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ឈប់រារាំង"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"ហៅទូរស័ព្ទល្បឿនលឿន"</string>
- <string name="tab_recents" msgid="929949073851377206">"ថ្មីៗ"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ប្រវត្តិហៅ"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"ទំនាក់ទំនង"</string>
<string name="tab_voicemail" msgid="155024725947496746">"សារជាសំឡេង"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"បាន​លុប​ចេញពី​ទំនាក់ទំនង​ដែល​និយម​ប្រើ"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"បន្ថែមទៅទំនាក់ទំនង"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"ផ្ញើសារ SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ការ​ហៅ​ជា​វីដេអូ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"មើលប្រវត្តិហៅទាំងស្រុង"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"រារាំងលេខ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"ខកខាន​ទទួល​ថ្មី <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"គ្មាននរណាម្នាក់នៅក្នុងការហៅរហ័សរបស់អ្នកនៅឡើយទេ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"បន្ថែមសំណព្វ"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"ប៉ះរូបភាពដើម្បីមើលលេខទាំងអស់ ឬប៉ះ &amp; សង្កត់ឲ្យជាប់ដើម្បីតម្រៀបឡើងវិញ"</string>
<string name="remove_contact" msgid="1080555335283662961">"លុបចេញ"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ហៅជាវីដេអូ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"ផ្ញើសារ"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ផ្ញើសារ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ព័ត៌មានលម្អិតអំពីការហៅ"</string>
<string name="call_log_action_call" msgid="463690849042459842">"ហៅ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"ខកខានទទួលកាហៅពី <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>។"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"បានឆ្លើយតបការហៅពី <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>។"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"សារជាសំឡេងដែលមិនទាន់អានពី <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"សារជាសំឡេងពី <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"ហៅទៅ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>។"</string>
<string name="description_phone_account" msgid="1767072759541443861">"នៅ <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"តាមរយៈ <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"តាមរយៈ <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"នៅ​លើ <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, តាមរយៈ <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> តាមរយៈ <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ហៅ"</string>
<string name="description_call_action" msgid="4000549004089776147">"ហៅ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"ហៅទៅ <xliff:g id="NAMEORNUMBER">^1</xliff:g> ជាវីដេអូ។"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ឆ្លើយតប​រហ័ស"</string>
<string name="call_settings_label" msgid="313434211353070209">"ការហៅ"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ការរារាំងការហៅ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ការរារាំងការហៅត្រូវបានបិទជាបណ្តោះអាសន្ន"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ការរារាំងការហៅត្រូវបានបិទដំណើរការ ដោយសារតែអ្នកបានទាក់ទងទៅសេវាអាសន្នចេញពីទូរស័ព្ទនេះក្នុងចន្លោះពេល 48 ម៉ោងកន្លងមកនេះ។ វានឹងបើកដំណើរការឡើងវិញ បន្ទាប់ពីរយៈពេល 48 ម៉ោងផុតកំណត់។"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"នាំចូលលេខ"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"កាលពីមុនអ្នកបានដាក់សម្គាល់ឲ្យបញ្ជូនអ្នកហៅមួយចំនួនដោយស្វ័យប្រវត្តិទៅកាន់សារជាសំឡេងតាមរយៈកម្មវិធីផ្សេងទៀត។"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"មើលលេខ"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"នាំចូល"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"ការនាំចូលបានបរាជ័យ"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"បាន​បរាជ័យ​រក្សាទុក​សារជាសំឡេង​ក្នុង​ប័ណ្ណសារ។"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"ឈប់ទប់ស្កាត់លេខ"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"បន្ថែមលេខ"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ការហៅចេញពីលេខទាំងនេះនឹងត្រូវបានរារាំង ហើយសារជាសំឡេងនឹងត្រូវបានលុបដោយស្វ័យប្រវត្តិ។"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ការហៅចេញពីលេខទាំងនេះនឹងត្រូវបានរារាំង ប៉ុន្តែពួកគេនៅតែអាចទុកសារជាសំឡេងឲ្យអ្នកបាន។"</string>
+ <string name="block_list" msgid="7760188925338078011">"លេខដែលបានរារាំង"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> មិនត្រឹមត្រូវទេ"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ត្រូវបានទប់ស្កាត់រួចហើយ"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ការរារាំងការហៅត្រូវបានបិទដំណើរការរយៈពេល 48 ម៉ោង"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"បានបិទដំណើរការពីព្រោះការហៅបន្ទាន់ត្រូវបានធ្វើឡើង"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"គណនីហៅទូរស័ព្ទ"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"បើក"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"កំណត់សិទ្ធិអនុញ្ញាត"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"ដើម្បីបើកការហៅរហ័ស\n សូមបើកសិទ្ធិអនុញ្ញាតទំនាក់ទំនង។"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"ដើម្បីមើលកំណត់ហេតុការហៅរបស់អ្នក\n សូមបើកសិទ្ធិអនុញ្ញាតទូរស័ព្ទ។"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"ដើម្បីមើលទំនាក់ទំនងរបស់អ្នក\n សូមបើកសិទ្ធិអនុុញ្ញាតទំនាក់ទំនង។"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"ដើម្បីចូលដំណើរការសារជាសំឡេង\n សូមបើកសិទ្ធិអនុញ្ញាតទូរស័ព្ទ។"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"ដើម្បីបើកដំណើរការហៅរហ័ស សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីទំនាក់ទំនង។"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ដើម្បីមើលកំណត់ហេតុហៅទូរស័ព្ទរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"ដើម្បីមើលទំនាក់ទំនងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីទំនាក់ទំនង។"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ដើម្បីចូលដំណើរការសារជាសំឡេងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។"</string>
<string name="permission_no_search" msgid="84152933267902056">"ដើម្បីស្វែងរកទំនាក់ទំនងរបស់អ្នក សូមបើកសិទ្ធិអនុញ្ញាតទំនាក់ទំនង។"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ដើម្បីធ្វើការហៅ\n សូមបើកសិទ្ធិអនុញ្ញាតទូរស័ព្ទ។"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ដើម្បីធ្វើការហៅទូរស័ព្ទ សូមបើកសិទ្ធិអនុញ្ញាតកម្មវិធីហៅទូរស័ព្ទ។"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"កម្មវិធីទូរស័ព្ទមិនមានសិទ្ធិអនុញ្ញាតដើម្បីសរសេរការកំណត់ប្រព័ន្ធទេ។"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"បានរារាំង"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> គឺសកម្ម"</string>
</resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 6bf780462..b3eff808f 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ಫೋನ್"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ಫೋನ್"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ಫೋನ್ ಡಯಲ್‌ಪ್ಯಾಡ್"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ಫೋನ್"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ಕರೆ ಇತಿಹಾಸ"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> ಕರೆ ಮಾಡಿ"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"ನಿಖರವಾಗಿಲ್ಲದ ಸಂಖ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ಕರೆ ಮಾಡುವ ಮೊದಲು ಸಂಖ್ಯೆಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"ಸಂಪರ್ಕಕ್ಕೆ ಸೇರಿಸು"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ಕರೆ ಇತಿಹಾಸದಿಂದ ಅಳಿಸಿ"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ಕರೆ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ಧ್ವನಿಮೇಲ್‌ ಅಳಿಸಿ"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ಧ್ವನಿಮೇಲ್‌ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಖಾಲಿ ಇದೆ"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ಕರೆ ಮಾಡಿ"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ಕರೆ ಇತಿಹಾಸ"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"ನಿಖರವಾಗಿಲ್ಲದ ಸಂಖ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"ಸಂಖ್ಯೆಯನ್ನು ನಕಲಿಸಿ"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ಟ್ರಾನ್ಸ್‌ಕ್ರಿಪ್ಶನ್ ನಕಲಿಸಿ"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸು"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"ಸಂಖ್ಯೆಯನ್ನು ಅನಿರ್ಬಂಧಿಸು"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> ನಿರ್ಬಂಧ ತೆಗೆಯಲಾಗಿದೆ"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ರದ್ದುಮಾಡು"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"ಅಳಿಸು"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ಕರೆ ಮಾಡುವ ಮೊದಲು ಸಂಖ್ಯೆಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"ಕರೆ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸಿ"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ಧ್ವನಿಮೇಲ್‌ ಅಳಿಸಿ"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್ ಮಾಡಿ"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ಧ್ವನಿಮೇಲ್‌ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ಧ್ವನಿಮೇಲ್ ಅಳಿಸಲಾಗಿದೆ"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ರದ್ದುಮಾಡು"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ಆರ್ಕೈವ್‌ಗೆ ಹೋಗು"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"ಕರೆ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸುವುದೇ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"ಇದು ನಿಮ್ಮ ಇತಿಹಾಸದಿಂದ ಎಲ್ಲಾ ಕರೆಗಳನ್ನು ಅಳಿಸುತ್ತದೆ"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"ಕರೆ ಇತಿಹಾಸವನ್ನು ತೆರವುಗೊಳಿಸಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ಫೋನ್"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"ತಪ್ಪಿದ ಕರೆ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"ತಪ್ಪಿದ ಕೆಲಸದ ಕರೆ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"ತಪ್ಪಿದ ಕರೆಗಳು"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ತಪ್ಪಿದ ಕರೆಗಳು"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ಮರಳಿ ಕರೆ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"ಸಂದೇಶ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> ಧ್ವನಿಮೇಲ್‌ಗಳು </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ಧ್ವನಿಮೇಲ್‌ಗಳು </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> ಇವರಿಂದ ಹೊಸ ಧ್ವನಿಮೇಲ್‌"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ಧ್ವನಿಮೇಲ್‌ ಪ್ಲೇ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"ಬಫರ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"ಧ್ವನಿಮೇಲ್‌ ಲೋಡ್‌ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ಧ್ವನಿಮೇಲ್‌ ಲೋಡ್‌ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"ಧ್ವನಿಮೇಲ್‌ ಕರೆಗಳು ಮಾತ್ರ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ಒಳಬರುವ ಕರೆಗಳು ಮಾತ್ರ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ಕರೆ ಇತಿಹಾಸ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ಡಯಲ್‌ ಪ್ಯಾಡ್‌"</string>
- <string name="menu_copy" msgid="6108677035381940698">"ನಕಲಿಸು"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"ಹೊರಹೋಗುವುದನ್ನು ಮಾತ್ರ ತೋರಿಸು"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ಒಳಬರುವುದನ್ನು ಮಾತ್ರ ತೋರಿಸು"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"ತಪ್ಪಿಹೋದದ್ದನ್ನು ಮಾತ್ರ ತೋರಿಸು"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ಹೊರಹೋಗುವ ವೀಡಿಯೊ ಕರೆ"</string>
<string name="type_missed_video" msgid="954396897034220545">"ಮಿಸ್ಡ್‌ ವೀಡಿಯೊ ಕಾಲ್‌"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ಧ್ವನಿಮೇಲ್"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ನಿರಾಕರಿಸಿದ ಕರೆ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ನಿರ್ಬಂಧಿಸಿದ ಕರೆ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ಒಳಬರುವ ಕರೆಗಳು"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ಧ್ವನಿಮೇಲ್‌ ಪ್ಲೇ ಮಾಡಿ"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> ಸಂಪರ್ಕ ವೀಕ್ಷಿಸಿ"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> ಕರೆ ಮಾಡಿ"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕ ವಿವರಗಳು"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"ಹೊಸ ಧ್ವನಿಮೇಲ್‌."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ಕರೆಗಳು."</string>
<string name="description_video_call" msgid="2933838090743214204">"ವೀಡಿಯೊ ಕರೆ."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> ಅವರಿಗೆ SMS ಕಳುಹಿಸಿ"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"ಪೇಫೋನ್"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> ಸೆಕೆಂ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%s</xliff:g> ಸೆಕೆಂ"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ರಂದು <xliff:g id="TIME">%2$s</xliff:g> ಗಂಟೆಗೆ"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ಈ ಸಂಖ್ಯೆಗೆ ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ಧ್ವನಿಮೇಲ್‌ ಹೊಂದಿಸಲು, ಮೆನು &gt; ಸೆಟ್ಟಿಂಗ್‌ಗಳುಗೆ ಹೋಗಿ."</string>
<!-- no translation found for dialog_voicemail_airplane_mode_message (530922773669546093) -->
@@ -127,16 +148,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"ಧ್ವನಿ ಹುಡುಕಾಟ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="call_not_available" msgid="8941576511946492225">"ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿರುವುದರಿಂದ ಫೋನ್ ಕರೆ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="activity_not_available" msgid="2287665636817987623">"ಈ ಸಾಧನದಲ್ಲಿ ಅದಕ್ಕಾಗಿ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಲ್ಲ"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"ಹೆಸರು ಅಥವಾ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ನಮೂದಿಸಿ"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"ನೀವು ಯಾವುದೇ ಮಿಸ್ಡ್ ಕರೆಗಳನ್ನು ಹೊಂದಿಲ್ಲ."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಇನ್‌ಬಾಕ್ಸ್ ಖಾಲಿ ಇದೆ."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಿ"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"ಸಂ. ಸೇರಿಸಿ ಅಥವಾ ಸಂಪರ್ಕ ಹುಡುಕಿ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"ನಿಮ್ಮ ಕರೆ ಇತಿಹಾಸ ಖಾಲಿಯಾಗಿದೆ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ಕರೆ ಮಾಡಿ"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"ನೀವು ಯಾವುದೇ ಮಿಸ್ಡ್ ಕರೆಗಳನ್ನು ಹೊಂದಿಲ್ಲ."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಇನ್‌ಬಾಕ್ಸ್ ಖಾಲಿ ಇದೆ."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್ ಖಾಲಿಯಿದೆ."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ಮೆಚ್ಚಿನವುಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ಇತಿಹಾಸ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ಕರೆ ಇತಿಹಾಸ"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ಎಲ್ಲಾ ಕರೆಗಳು"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"ತಪ್ಪಿದ ಕರೆಗಳು"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ಧ್ವನಿಮೇಲ್"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"ಹೊಸ, ಸರಳೀಕರಿಸಿದ ನಿರ್ಬಂಧ"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"ನಿಮ್ಮನ್ನು ಉತ್ತಮ ರೀತಿಯಲ್ಲಿ ರಕ್ಷಿಸಲು, ನಿರ್ಬಂಧ ಹೇಗೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಎಂದು ಫೋನ್ ಬದಲಾಯಿಸಬೇಕಾಗಿದೆ. ನಿಮ್ಮ ನಿರ್ಬಂಧಿಸಿದ ಸಂಖ್ಯೆಗಳು ಈಗ ಕರೆ ಮತ್ತು ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ನಿಲ್ಲಿಸುತ್ತವೆ ಹಾಗೂ ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಬಹುದು."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"ಅನುಮತಿಸು"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> ನಿರ್ಬಂಧಿಸುವುದೇ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ಈ ಸಂಖ್ಯೆಗೆ ಕರೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ಈ ಸಂಖ್ಯೆಗೆ ಕರೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುವುದು, ಆದರೆ ಕರೆಮಾಡುವವರು ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಈಗಲೂ ನಿಮಗೆ ಕಳುಹಿಸಬಹುದು."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ಈ ಸಂಖ್ಯೆಯಿಂದ ನೀವು ಇನ್ನು ಮುಂದೆ ಕರೆಗಳು ಅಥವಾ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸುವುದಿಲ್ಲ."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ನಿರ್ಬಂಧಿಸು"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> ನಿರ್ಬಂಧ ತೆಗೆಯುವುದೇ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ನಿರ್ಬಂಧ ತೆಗೆ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"ಸ್ಪೀಡ್ ಡಯಲ್"</string>
- <string name="tab_recents" msgid="929949073851377206">"ಇತ್ತೀಚಿನವುಗಳು"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ಕರೆ ಇತಿಹಾಸ"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"ಸಂಪರ್ಕಗಳು"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ಧ್ವನಿಮೇಲ್"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ಮೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ"</string>
@@ -146,7 +182,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"ಸಂಪರ್ಕಕ್ಕೆ ಸೇರಿಸು"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS ಕಳುಹಿಸು"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ವೀಡಿಯೊ ಕರೆ ಮಾಡಿ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ಕರೆಯ ಪೂರ್ಣ ಇತಿಹಾಸವನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸು"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ಹೊಸ ತಪ್ಪಿದ ಕರೆಗಳು"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"ನಿಮ್ಮ ತ್ವರಿತ ಡಯಲ್‌ನಲ್ಲಿ ಇದುವರೆಗೆ ಯಾರೂ ಇಲ್ಲ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ಮೆಚ್ಚಿನದನ್ನು ಸೇರಿಸಿ"</string>
@@ -155,13 +191,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"ಎಲ್ಲ ಸಂಖ್ಯೆಗಳನ್ನು ನೋಡಲು ಚಿತ್ರವನ್ನು ಸ್ಫರ್ಶಿಸಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ &amp; ಹೋಲ್ಡ್‌ ಮಾಡಿ"</string>
<string name="remove_contact" msgid="1080555335283662961">"ತೆಗೆದುಹಾಕು"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ವೀಡಿಯೊ ಕರೆ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"ಸಂದೇಶ ಕಳುಹಿಸಿ"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ಸಂದೇಶ ಕಳುಹಿಸಿ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ಕರೆಯ ವಿವರಗಳು"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ಕರೆ ಮಾಡಿ"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ರಿಂದ ತಪ್ಪಿದ ಕರೆ."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ರಿಂದ ಕರೆಗೆ ಉತ್ತರಿಸಲಾಗಿದೆ."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ರಿಂದ ಓದದಿರುವ ಧ್ವನಿಮೇಲ್."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ರಿಂದ ಧ್ವನಿಮೇಲ್."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ಗೆ ಕರೆ."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> ನಲ್ಲಿ"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> ಮೂಲಕ"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> ಮೂಲಕ"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> ರಲ್ಲಿ, <xliff:g id="NUMBER">%2$s</xliff:g> ಮೂಲಕ"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> ಮೂಲಕ <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ಕರೆಮಾಡಿ"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ಕರೆ ಮಾಡಿ"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ಗೆ ವೀಡಿಯೊ ಕರೆ ಮಾಡಿ."</string>
@@ -200,14 +242,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ತ್ವರಿತ ಪ್ರತಿಕ್ರಿಯೆಗಳು"</string>
<string name="call_settings_label" msgid="313434211353070209">"ಕರೆಗಳು"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆ ತಾತ್ಕಾಲಿಕ ಆಫ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ನೀವು ಕಳೆದ 48 ಗಂಟೆಗಳಲ್ಲಿ ಈ ಫೋನ್‌ನಿಂದ ತುರ್ತು ಸೇವೆಗಳಿಗೆ ಸಂಪರ್ಕಿಸಿರುವ ಕಾರಣದಿಂದ ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಒಮ್ಮೆ 48 ಗಂಟೆಗಳ ಅವಧಿಯು ಮುಕ್ತಾಯಗೊಂಡ ನಂತರ ಅದನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರುಸಕ್ರಿಯಗೊಳಿಸಲಾಗುವುದು."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"ಸಂಖ್ಯೆಗಳನ್ನು ಆಮದು ಮಾಡಿ"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"ನೀವು ಈ ಹಿಂದೆ ಗುರುತು ಮಾಡಲಾದ ಕೆಲವು ಕಾಲರ್‌ಗಳನ್ನು ಇತರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಮೂಲಕ ಧ್ವನಿಮೇಲ್‌ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"ಸಂಖ್ಯೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"ಆಮದು ಮಾಡಿ"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"ಆಮದು ವಿಫಲವಾಗಿದೆ"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"ಧ್ವನಿಮೇಲ್ ಆರ್ಕೈವ್‌ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"ಸಂಖ್ಯೆಯನ್ನು ಅನಿರ್ಬಂಧಿಸು"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ಈ ಸಂಖ್ಯೆಗಳಿಗೆ ಕರೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ಈ ಸಂಖ್ಯೆಗಳಿಗೆ ಕರೆಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುವುದು, ಆದರೆ ಅವರು ಧ್ವನಿಮೇಲ್‌ಗಳನ್ನು ಈಗಲೂ ನಿಮಗೆ ಕಳುಹಿಸಬಹುದು."</string>
+ <string name="block_list" msgid="7760188925338078011">"ನಿರ್ಬಂಧಿಸಲಾದ ಸಂಖ್ಯೆಗಳು"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ಅಮಾನ್ಯವಾಗಿದೆ."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ಈಗಾಗಲೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ಕರೆ ನಿರ್ಬಂಧಿಸುವಿಕೆ 48 ಗಂಟೆಗಳವರೆಗೆ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"ತುರ್ತು ಕರೆಯನ್ನು ಮಾಡಿರುವ ಕಾರಣದಿಂದ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"ಕರೆ ಮಾಡುವ ಖಾತೆಗಳು"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ಆನ್ ಮಾಡು"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ಅನುಮತಿಗಳನ್ನು ಹೊಂದಿಸು"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"ವೇಗ ಡಯಲ್ ಸಕ್ರಿಯಗೊಳಿಸಲು, \n ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ನೋಡಲು, \n ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ನೋಡಲು, \n ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಪ್ರವೇಶಿಸಲು, \n ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"ವೇಗ ಡಯಲ್ ಸಕ್ರಿಯಗೊಳಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ನಿಮ್ಮ ಕರೆಯ ಲಾಗ್ ಅನ್ನು ವೀಕ್ಷಿಸಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ವೀಕ್ಷಿಸಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ನಿಮ್ಮ ಧ್ವನಿಮೇಲ್ ಪ್ರವೇಶಿಸಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
<string name="permission_no_search" msgid="84152933267902056">"ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ಹುಡುಕಲು, ಸಂಪರ್ಕಗಳ ಅನುಮತಿಗಳನ್ನು ಆನ್ ಮಾಡಿ."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ಕರೆ ಮಾಡಲು, \n ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ಕರೆ ಮಾಡಲು, ಫೋನ್ ಅನುಮತಿಯನ್ನು ಆನ್ ಮಾಡಿ."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಬರೆಯಲು ಫೋನ್ ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಯನ್ನು ಹೊಂದಿಲ್ಲ."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ಸಕ್ರಿಯವಾಗಿದೆ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 14f1790eb..9a914aa0e 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"전화"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"전화"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"전화 다이얼패드"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"휴대전화"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"통화 기록"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"전화걸기: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"적절하지 않은 번호 신고하기"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"통화하기 전에 번호 수정"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"연락처에 추가"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"통화 기록에서 삭제"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"통화 기록 삭제"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"음성사서함 삭제"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"음성사서함 공유"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"통화 기록이 비어있습니다."</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"전화 걸기"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"통화 기록"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"잘못된 번호 신고하기"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"전화번호 복사"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"텍스트 변환 복사"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"번호 차단"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> 차단됨"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"번호 차단 해제"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> 차단 해제됨"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"실행취소"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"삭제"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"통화하기 전에 번호 수정"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"통화 기록 삭제"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"음성사서함 삭제"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"음성사서함 보관처리"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"음성사서함 공유"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"음성사서함 삭제됨"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"음성사서함 보관처리됨"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"실행취소"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"보관함으로 이동"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"통화 기록을 삭제하시겠습니까?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"모든 통화가 기록에서 삭제됩니다."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"통화 기록을 삭제하는 중…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"전화"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"부재중 전화"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"부재중 업무 통화"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"부재중 전화"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"부재중 전화 <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>통"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"전화 걸기"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"메시지"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other">음성메일 <xliff:g id="COUNT">%1$d</xliff:g>개</item>
<item quantity="one">음성메일</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g>님이 보낸 새 음성사서함"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"음성사서함을 재생할 수 없습니다."</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"버퍼링 중..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"음성사서함 로드 중…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"음성사서함 보관처리 중…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"음성사서함을 로드할 수 없습니다."</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"음성사서함 메시지만"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"수신 전화만"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"통화 기록"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"옵션 더보기"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"다이얼패드"</string>
- <string name="menu_copy" msgid="6108677035381940698">"복사"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"발신 전화만 표시"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"수신 전화만 표시"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"부재중 전화만 표시"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"발신 화상 통화"</string>
<string name="type_missed_video" msgid="954396897034220545">"부재중 화상 통화"</string>
<string name="type_voicemail" msgid="5153139450668549908">"음성사서함"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"거부된 통화"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"차단된 통화"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"수신전화"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"음성사서함 재생"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g>님의 연락처 보기"</string>
<string name="description_call" msgid="3443678121983852666">"전화하기:<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>의 연락처 세부정보"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"새로운 음성사서함이 있습니다."</string>
<string name="description_num_calls" msgid="1601505153694540074">"통화 횟수: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>번"</string>
<string name="description_video_call" msgid="2933838090743214204">"화상 통화"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>님에게 SMS 보내기"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"공중전화"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g>초"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g>분 <xliff:g id="SECONDS">%s</xliff:g>초"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>분 <xliff:g id="SECONDS">%2$02d</xliff:g>초"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"이 번호로 전화를 걸 수 없습니다."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"음성사서함을 설정하려면 메뉴 &gt; 설정으로 이동하세요."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"음성사서함에 메시지를 남기려면 먼저 비행기 모드를 해제하세요."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"음성검색이 지원되지 않습니다."</string>
<string name="call_not_available" msgid="8941576511946492225">"전화 애플리케이션을 사용 중지했으므로 전화를 걸 수 없습니다."</string>
<string name="activity_not_available" msgid="2287665636817987623">"이 기기에 작업을 처리할 수 있는 앱이 없습니다."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"이름 또는 전화번호 입력"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"부재중 전화가 없습니다."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"음성사서함 받은편지함이 비어 있습니다."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"연락처 검색"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"번호 추가 또는 연락처 검색"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"통화 기록이 비어있습니다."</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"전화 걸기"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"부재중 전화가 없습니다."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"음성사서함 받은편지함이 비어 있습니다."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"음성사서함 보관함이 비어있습니다."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"즐겨찾는 연락처만 표시"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"기록"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"통화 기록"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"음성사서함 보관함"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"전체"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"부재중 전화"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"음성사서함"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"새로운 간편 차단 기능"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"사용자를 보호하기 위하여 전화에서 차단 작동 방식을 변경해야 합니다. 차단된 번호에서 발송되는 통화 및 문자 메시지는 수신되지 않으며 다른 앱과 차단 사실이 공유될 수 있습니다."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"허용"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g>번을 차단할까요?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"이 번호에서 걸려오는 전화가 차단되며 음성사서함이 자동으로 삭제됩니다."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"이 번호에서 걸려오는 전화가 차단되지만, 발신자가 음성사서함에 메시지를 남길 수는 있습니다."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"이 번호로부터 수신되는 전화와 문자를 더 이상 받지 않습니다."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"차단"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g>번을 차단 해제할까요?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"차단 해제"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"단축번호"</string>
- <string name="tab_recents" msgid="929949073851377206">"최근"</string>
+ <string name="tab_history" msgid="2563144697322434940">"통화 기록"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"주소록"</string>
<string name="tab_voicemail" msgid="155024725947496746">"음성사서함"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"즐겨찾기에서 삭제됨"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"연락처에 추가"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS 보내기"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"화상 통화하기"</string>
- <string name="show_call_history" msgid="1141502332266697170">"전체 통화 기록 조회"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"번호 차단"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"새로운 부재중 전화 <xliff:g id="NUMBER">%s</xliff:g>건"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"아직 단축 다이얼이 설정된 연락처가 없습니다."</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"단축 다이얼 추가"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"이미지를 터치하여 모든 번호를 확인하거나 길게 터치하여 재정렬합니다."</string>
<string name="remove_contact" msgid="1080555335283662961">"삭제"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"화상 통화"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"메시지 보내기"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"메시지 보내기"</string>
<string name="call_log_action_details" msgid="701345508704970622">"통화 세부정보"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>에 전화 걸기"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>의 부재중 전화(<xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>에게 걸려온 수신 전화(<xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>에서 보낸 읽지 않은 음성사서함"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>에서 보낸 음성사서함"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>에게 건 전화(<xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> 계정"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g>번으로 수신"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g>번으로 수신"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>에서 <xliff:g id="NUMBER">%2$s</xliff:g>번으로 수신"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> <xliff:g id="NUMBER">%2$s</xliff:g>번으로 수신"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"통화"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>에 전화 걸기"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>에 화상 통화 걸기"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"빠른 응답"</string>
<string name="call_settings_label" msgid="313434211353070209">"통화"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"통화 차단"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"통화 차단 기능이 일시적으로 중지됨"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"지난 48시간 이내에 이 휴대전화를 사용해 응급 서비스에 연락했으므로 통화 차단 기능이 중지되었습니다. 48시간이 지나면 통화 차단 기능이 자동으로 다시 사용 설정됩니다."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"번호 가져오기"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"이전에 다른 앱을 통해 일부 발신자를 자동으로 음성사서함으로 보내도록 표시했습니다."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"개수 보기"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"가져오기"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"가져오지 못했습니다."</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"음성사서함을 보관처리하지 못했습니다."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"번호 차단 해제"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"번호 추가"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"이러한 번호에서 걸려오는 전화가 차단되며 음성사서함이 자동으로 삭제됩니다."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"이러한 번호에서 걸려오는 전화가 차단되지만, 발신자가 음성사서함에 메시지를 남길 수는 있습니다."</string>
+ <string name="block_list" msgid="7760188925338078011">"차단된 번호"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g>번은 잘못된 번호입니다."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g>번은 이미 차단되었습니다."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"통화 차단이 48시간 동안 중지됨"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"긴급 통화를 사용했기 때문에 중지되었습니다."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"통화 계정"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"사용"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"권한 설정"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"단축번호를 사용하려면\n 주소록 권한을 사용 설정하세요."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"통화 기록을 보려면\n전화 권한을 사용 설정하세요."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"주소록을 보려면\n주소록 권한을 사용 설정하세요."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"음성사서함에 액세스하려면\n전화 권한을 사용 설정하세요."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"단축번호를 사용하려면 주소록 권한을 사용하도록 설정하세요."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"통화 기록을 보려면 전화 권한을 사용하도록 설정하세요."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"주소록을 보려면 주소록 권한을 사용하도록 설정하세요."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"음성사서함에 액세스하려면 전화 권한을 사용하도록 설정하세요."</string>
<string name="permission_no_search" msgid="84152933267902056">"주소록을 검색하려면 주소록 권한을 사용하도록 설정하세요."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"전화를 걸려면\n전화 권한을 사용 설정하세요."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"전화를 걸려면 전화 권한을 사용하도록 설정하세요."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"전화 앱은 시스템 설정에 쓸 수 있는 권한이 없습니다."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"차단됨"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>이(가) 활성화되었습니다."</string>
</resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 7639aaf84..676739d79 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -19,23 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Телефон тергичи"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Чалуулар таржымалы"</string>
- <!-- no translation found for recentCalls_callNumber (1756372533999226126) -->
- <skip />
- <string name="call_detail_menu_report" msgid="587960283417977382">"Номер туура эмес"</string>
- <!-- no translation found for recentCalls_editNumberBeforeCall (7756171675833267857) -->
- <skip />
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Байланышка кошуу"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Чалуулар таржымалынан жок кылуу"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Чалуулар таржымалын тазалоо"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Үнкатты жок кылуу"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Үнкатты бөлүшүү"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Чалуулар таржымалында эч нерсе жок"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Чалуу"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Чалуулар таржымалы"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Номер туура эмес"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Номерди көчүрүү"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Транскрипцияны көчүрүү"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Номерди бөгөттөө"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгөттөлдү"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Номерди бөгөттөн чыгаруу"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгөттөн чыгарылды"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"КАЙТАРУУ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Жок кылуу"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Чалуудан мурун номерди түзөтүү"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Чалуулар таржымалын тазалоо"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Үн почтасын жок кылуу"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Үн каттарын архивдөө"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Үн билдирүүсүн жөнөтүү"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Үн почтасы жок кылнд"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Үн каттары архивделди"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"КАЙТАРУУ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"АРХВГЕ ӨТ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Чалуулар таржымалы тазалансынбы?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Ушуну менен бул таржымалдагы бардык чалуулар жок болот"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Чалуулар таржымалы тазаланууда…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Телефон"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Кабыл алынбаган чалуу"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Кабыл алынбай калган чалуу (жумуш)"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Кабыл алынбаган чалуулар"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> кабыл алынбаган чалуу"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Кайра чалуу"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Билдирүү"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Үн каты </item>
<item quantity="one">Үн каты</item>
@@ -44,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> жаңы үнкат калтырды"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Үн почтасы ойнолгон жок"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Топтолууда…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Үн почтасы жүктөлүүдө…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Үн каттары архивделүүдө…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Үн почтасы жүктөлгөн жок"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Үнкат чалуулары"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Кириш чалуулар"</string>
@@ -75,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Чалуулар таржымалы"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Көбүрөөк мүмкүнчүлүктөр"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"чалгыч такта"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Көчүрүү"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Чыккан чалуу-ды гана көрсөтүү"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Кириш чалууларды гана көрсөтүү"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Өткөз. чалуу-ды гана көрсөтүү"</string>
@@ -98,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Чыгып жаткан видео чалуу"</string>
<string name="type_missed_video" msgid="954396897034220545">"Кабыл алынбаган видео чалуу"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Үн почтасы"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Четке кагылган чалуу"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Бөгөттөлгөн чалуу"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Кирүүчү чалуулар"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Үнкатты угуу"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Байланышты кароо <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Чалуу <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> байланыш маалыматтары"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Жаңы үнкат."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> чалуу."</string>
<string name="description_video_call" msgid="2933838090743214204">"Видео чалуу."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> дегенге SMS жөнөтүү"</string>
@@ -116,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Таксофон"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> мүн. <xliff:g id="SECONDS">%s</xliff:g> сек."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> саат <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Бул номурга чалуу мүмкүн болбой жатат"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Үнкат орноотуу үчүн Меню &gt; Тууралоолорго кириңиз."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Үнкатты текшерүү үчүн, алгач Учак тартибин өчүрүңүз."</string>
@@ -128,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Үн менен издөө жеткиликтүү эмес"</string>
<string name="call_not_available" msgid="8941576511946492225">"Телефон колдонмосу өчүрүлгөндүктөн, чалуу мүмкүн болбой жатат."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Бул түзмөктө ал үчүн колдонмо жок"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Атын же телеф номерин киргизңз"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Байкалбай калган чалуулар жок."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Үн почтаңыздын келген билдирүүлөр куржуну бош."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Байланыштардан издеп көрүңүз"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Номер кошуңуз же байлнш издңз"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Чалуулар таржымалыңыз бош"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Чалуу"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Кабыл алынбаган чалуулар жок."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Үн почтаңыздын келген билдирүүлөр куржуну бош."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Үн каттар архивиңиз бош."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Тандамалдарды гана көрсөтүү"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Тарыхы"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Чалуулар таржымалы"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Үн каттар архиви"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Бардыгы"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Кабыл алынбагандар"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Үнкат"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Номерлерди жаңы жөнөкөй ыкма менен бөгөттөө"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Сизди жакшыраак коргоо үчүн, \"Телефон\" колдонмосу бөгөттөө жөндөөлөрүн өзгөртүшү керек. Бөгөттөлгөн номерлерден чалуулар жана билдирүүлөр келбейт жана алар башка колдонмолор менен бөлүшүлүшү мүмкүн."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Уруксат берүү"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгөттөлсүнбү?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Бул номерден келген чалуулар бөгөттөлөт жана үн билдирүүлөрү автоматтык түрдө жок кылынат."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Бул номерден келген чалуулар бөгөттөлөт, бирок чалуучу сизге үн билдирүүлөрүн калтыра берет."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Бул номерден келген чалууларды же SMS билдирүүлөрдү албай каласыз."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БӨГӨТТӨӨ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> бөгөттөн чыгарылсынбы?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"БӨГӨТТӨН ЧЫГАРУУ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Тез терүү"</string>
- <string name="tab_recents" msgid="929949073851377206">"Акыркылар"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Чалуулар таржымалы"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Байланыштар"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Үн почтасы"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Тандамалдардан өчүрүлдү"</string>
@@ -147,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Байланышка кошуу"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS жөнөтүү"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Видео түрүндө чалуу"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Чалуулардын толук таржымалын көрүү"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Номерди бөгөттөө"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> жаңы өткөзүлгөн чалуу"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Азырынча тез териле турган номерлер жок"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Сүйүктүү номер кошуу"</string>
@@ -156,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Бардык номурларды көрүү үчүн сүрөткө тийип коюңуз же иреттештирүү үчүн жана коё бербей басып туруңуз"</string>
<string name="remove_contact" msgid="1080555335283662961">"Алып салуу"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Видео чалуу"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Билдирүү жөнөтүү"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Билдирүү жөнөтүү"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Чалуунун чоо-жайы"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> чалуу"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> дегенден жооп берилбей калган чалуу."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> дегенден жооп берилген чалуу."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> дегенден окула элек үн почтасы, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> дегенден үн почтасы, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> дегенге чалуу."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> боюнча"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> аркылуу"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> аркылуу"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> боюнча <xliff:g id="NUMBER">%2$s</xliff:g> аркылуу"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> аркылуу <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Чалуу"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> чалуу"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> видео чалуу."</string>
@@ -201,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Тез жооптор"</string>
<string name="call_settings_label" msgid="313434211353070209">"Чалуулар"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Чалууларды бөгөттөө"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Чалууну бөгөттөө убактылуу өчүрүлгөн"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Акыркы 48 саат ичинде бул телефондон өзгөчө кырдаал кызматына байланышкандыктан чалууну бөгөттөө өчүрүлдү. 48 сааттык мөөнөтү аяктагандан кийин ал автоматтык түрдө кайра иштетилет."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Номерлерди импорттоо"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Мурда башка колдонмолор аркылуу айрым чалуучуларга автоматтык түрдө үн почтасы жөнөтүлгүдөй кылып белгилегенсиз."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Номерлерди көрүү"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Импорттоо"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Импорттолбой калды"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Үн каттарын архивдей албай койдук."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Номерди бөгөттөн чыгаруу"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Номер кошуу"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Бул номерлерден келген чалуулар бөгөттөлөт жана үн билдирүүлөрү автоматтык түрдө жок кылынат."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Бул номерлерден келген чалуулар бөгөттөлөт, бирок алар сизге үн билдирүүлөрүн калтыра берет."</string>
+ <string name="block_list" msgid="7760188925338078011">"Бөгөттөлгөн номерлер"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> - жараксыз."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> мурунтан эле бөгөттөлгөн."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Чалууну бөгөттөө 48 саатка өчүрүлгөн"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Шашылыш чалуу аткарылгандыктан өчүрүлгөн."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Чалуу каттоо эсептери"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Күйгүзүү"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Уруксаттарды берүү"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Тез терүүнү иштетүү үчүн,\n \"Байланыштар\" уруксатын күйгүзүңүз."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Чалуу таржымалыңызды көрүү үчүн,\n \"Телефон\" уруксатын күйгүзүңүз."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Байланыштарыңызды көрүү үчүн,\n \"Байланыштар\" уруксатын күйгүзүңүз."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Үн почтаңызга кирүү үчүн,\n \"Телефон\" уруксатын күйгүзүңүз."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Тез терүүнү иштетүү үчүн, \"Байланыштар\" колдонмосуна уруксат бериңиз."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Чалуулар таржымалыңызды көрүү үчүн, \"Телефон\" колдонмосуна уруксат бериңиз."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Байланыштар тизмесин көрүү үчүн, \"Байланыштар\" колдонмосуна уруксат бериңиз."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Үн почтаңызга кирүү үчүн, \"Телефон\" колдонмосуна уруксат бериңиз."</string>
<string name="permission_no_search" msgid="84152933267902056">"Байланыштарыңызды издөө үчүн, Байланыштарга уруксатты күйгүзүңүз."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Чалуу үчүн,\n \"Телефон\" уруксатын күйгүзүңүз."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Чалуу үчүн, \"Телефон\" колдонмосуна уруксат бериңиз."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Телефон колдонмосунун Тутум жөндөөлөрүнө жазууга уруксаты жок."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Бөгөттөлгөн"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> жүрүп жатат"</string>
</resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 7f43f2390..2f3347053 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ໂທລະສັບ"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ໂທລະສັບ"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ໜ້າ​ປັດ​ກົດ​ເບີ​ໂທ​ລະ​ສັບ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ໂທລະສັບ"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ປະຫວັດການໂທ"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"ໂທຫາ <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"ລາຍງານໝາຍເລກທີ່ບໍ່ຖືກຕ້ອງ"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ແກ້ໄຂເບີກ່ອນໂທ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"ເພີ່ມ​ໃສ່​ລາຍ​ຊື່"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ລຶບ​ຈາກ​ປະ​ຫວັດ​ການ​ໂທ"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ລຶບ​ປະ​ຫວັດ​ການ​ໂທ​"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ລຶບຂໍ້ຄວາມສຽງ"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ແບ່ງປັນຂໍ້ຄວາມສຽງ"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"ບັນ​ທຶກ​ການ​ໂທ​ຂອງ​ທ່ານ​ຫວ່າງ​ເປົ່າ"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"​ໂທ​ອອກ"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ປະຫວັດການໂທ"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"ລາຍງານໝາຍເລກທີ່ບໍ່ຖືກຕ້ອງ"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"ອັດ​ສຳ​ເນົາ​ໝາຍເລກ"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ອັດ​ສຳ​ເນົາ​ການ​ກ່າຍ​ເປັນ​ໜັງ​ສື"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"ບ​ລັອກ​ໝາຍເລກ"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ຖືກບ​ລັອກໄວ້​ແລ້ວ"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"ປົດ​ບ​ລັອກ​ໝາຍເລກ"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> ຖືກບ​ລັອກໄວ້​ແລ້ວ"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ບໍ່​ເຮັດ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"​ລຶບ"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ແກ້ໄຂໝາຍເລກກ່ອນໂທ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"ລຶບ​ປະ​ຫວັດ​ການ​ໂທ​"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ລຶບຂໍ້ຄວາມສຽງ"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"ຈັດເກັບຂໍ້ຄວາມສຽງເຂົ້າແຟ້ມ"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ແບ່ງປັນຂໍ້ຄວາມສຽງ"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ລຶບ​ຂໍ້​ຄວາມ​ສຽງ​ແລ້ວ"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ຈັດເກັບຂໍ້ຄວາມສຽງເຂົ້າແຟ້ມແລ້ວ"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ບໍ່​ເຮັດ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ໄປທີ່ແຟ້ມຈັດເກັບ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"ລຶບ​ປະ​ຫວັດ​ການ​ໂທ​ບໍ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"ອັນ​ນີ້​ຈະ​ລຶບ​ທຸກ​ສາຍ​ໂທ​ຈາກ​ປະ​ຫວັດ​ຂອງ​ທ່ານ"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"ກຳ​ລັງ​ລຶບ​ປະ​ຫວັດ​ການ​ໂທ…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ໂທລະສັບ"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"ສາຍທີ່ບໍ່ໄດ້ຮັບ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"ສາຍບໍ່ໄດ້ຮັບຈາກບ່ອນເຮັດວຽກ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"ສາຍທີ່ບໍ່ໄດ້ຮັບ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ສາຍບໍ່ໄດ້ຮັບ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ໂທກັບ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"ຂໍ້ຄວາມ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ຂໍ້ຄວາມສຽງ </item>
<item quantity="one">ຂໍ້ຄວາມສຽງ</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"ບໍ່ມີຂໍ້ຄວາມສຽງຈາກ <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ບໍ່​ສາ​ມາດ​ຫຼິ້ນ​ຂໍ້​ຄວາມ​ສຽງ​ໄດ້"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"ກຳລັງດຶງຂໍ້ມູນມາກຽມ..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"ກຳ​ລັງ​ໂຫຼດ​ຂໍ້​ຄວາມ​ສຽງ…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"ກຳລັງຈັດເກັບຂໍ້ຄວາມສຽງເຂົ້າແຟ້ມ…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ບໍ່​ສາ​ມາດ​ໂຫຼດ​ຂໍ້​ຄວາມ​ສຽງ​ໄດ້"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"ເບີໂທຂໍ້ຄວາມສຽງເທົ່ານັ້ນ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ສາຍໂທເຂົ້າເທົ່ານັ້ນ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ປະຫວັດການໂທ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ໂຕເລືອກເພີ່ມເຕີມ"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ປຸ່ມໂທລະສັບ"</string>
- <string name="menu_copy" msgid="6108677035381940698">"ສຳເນົາ"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"ສະແດງສະເພາະສາຍໂທອອກ"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ສະແດງສະເພາະສາຍໂທເຂົ້າ"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"ສະແດງສະເພາະສາຍບໍ່ໄດ້ຮັບ"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ສາຍ​ໂທ​ອອກ​ດ້ວຍ​ວິດີໂອ"</string>
<string name="type_missed_video" msgid="954396897034220545">"ສາຍ​ວິດີໂອ​ທີ່​ບໍ່​ໄດ້​ຮັບ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ຂໍ້ຄວາມສຽງ"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ສາຍ​ໂທ​ທີ່​ຖືກ​ປະ​ຕິ​ເສດ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ສາຍ​ໂທ​ທີ່​ຖືກບ​ລັອກ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ສາຍໂທເຂົ້າ"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ເປີດຂໍ້ຄວາມສຽງ"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ເບິ່ງລາຍຊື່ຜູ່ຕິດຕໍ່ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"ໂທຫາ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"ລາຍລະອຽດ​ລາຍຊື່​ຜູ່ຕິດຕໍ່​ສຳລັບ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"ຂໍ້ຄວາມ​ສຽງ​ໃໝ່."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ການໂທ."</string>
<string name="description_video_call" msgid="2933838090743214204">"ການ​ໂທ​ດ້ວຍ​ວິ​ດີ​ໂອ."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"ສົ່ງ SMS ຫາ <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"ຕູ້​ໂທ​ລະ​ສັບ​ສາ​ທາ​ລະ​ນະ"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> ວິນາທີ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> ນ​ທ <xliff:g id="SECONDS">%s</xliff:g> ວິ"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ເວລາ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ບໍ່​ສາ​ມາດ​ໂທ​ຫາ​ເບີ​ນີ້​ໄດ້"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ເພື່ອຕັ້ງຄ່າຂໍ້ຄວາມສຽງ ໃຫ້ໄປທີ່ ເມນູ &gt; ການຕັ້ງຄ່າ."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ເພື່ອໂທຫາເບີຂໍ້ຄວາມສຽງ ທ່ານຕ້ອງປິດໂໝດຢູ່ເທິງຍົນກ່ອນ."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"ບໍ່​ມີ​ການ​ຊອກ​ຫາ​ດ້ວຍ​ສຽງ​ຢູ່"</string>
<string name="call_not_available" msgid="8941576511946492225">"ບໍ່​ສາ​ມາດ​ໂທ​ໄດ​້​ເນື່ອງ​ຈາກ​ແອັບ​ພ​ລິ​ເຄ​ຊັນ​ໂທ​ລະ​ສັບ​ຖືກ​ປິດ​ການ​ນຳ​ໃຊ້​ໄວ້."</string>
<string name="activity_not_available" msgid="2287665636817987623">"ບໍ່​ມີ​ແອັ​ບຯ​ສຳ​ລັບ​ສິ່ງນັ້ນ​ຢູ່​ໃນ​ອຸ​ປະ​ກອນ​ນີ້"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"ປ້ອນ​ຊື່ ຫຼື​ເບີ​ໂທ​ລະ​ສັບ​ເຂົ້າ​ໄປ"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"ທ່ານບໍ່ມີສາຍທີ່ບໍ່ໄດ້ຮັບ."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"ກ່ອງເຂົ້າ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ​ຫວ່າງ​ເປົ່າ."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"ຊອກຫາລາຍຊື່ຜູ່ຕິດຕໍ່"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"ເພີ່ມ​ເບີ​ໂທ​ລະ​ສັບ ຫຼື ຊອກ​ຫາ​ລາຍ​ຊື່​ຕິດ​ຕໍ່"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"ປະ​ຫວັດ​ການ​ໂທ​ຂອງ​ທ່ານ​ຫວ່າງ​ເປົ່າ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"​ໂທ​ອອກ"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"ທ່ານບໍ່ມີສາຍທີ່ບໍ່ໄດ້ຮັບ."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"ກ່ອງເຂົ້າ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ​ຫວ່າງ​ເປົ່າ."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"ແຟ້ມຈັດເກັບຂໍ້ຄວາມສຽງຂອງທ່ານຫວ່າງເປົ່າຢູ່."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ສະ​ແດງ​ສະເພາະລາຍການທີ່ນິຍົມເທົ່ານັ້ນ"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ປະຫວັດການໂທ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ປະຫວັດການໂທ"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ແຟ້ມຈັດເກັບຂໍ້ຄວາມສຽງ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ທັງໝົດ"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"ສາຍທີ່ບໍ່ໄດ້ຮັບ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ຂໍ້ຄວາມສຽງ"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"ການລັອກແບບໃໝ່ທີ່ງ່າຍດາຍ"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"ເພື່ອປົກປ້ອງທ່ານໄດ້ດີຂຶ້ນ, ແອັບໂທລະສັບຕ້ອງການປ່ຽນວິທີການບລັອກ. ເບີໂທທີ່ທ່ານບລັອກໄວ້ຈະປິດກັ້ນທັງການໂທ ແລະ ຂໍ້ຄວາມ ແລະ ອາດມີການແບ່ງປັນກັບແອັບອື່ນໆນຳ."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"ອະນຸຍາດ"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"ບ​ລັອກ <xliff:g id="NUMBER">%1$s</xliff:g> ບໍ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ການໂທຈາກເບີໂທນີ້ຈະຖືກບລັອກໄວ້ ແລະຂໍ້ຄວາມສຽງຈະຖືກລຶບໂດຍອັດຕະໂນມັດ."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ການໂທຈາກເບີນີ້ຈະຖືກບລັອກໄວ້, ແຕ່ຜູ່ໂທອາດຈະຍັງສາມາດຝາກຂໍ້ຄວາມສຽງໃຫ້ທ່ານໄດ້."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ທ່ານຈະບໍ່ໄດ້ຮັບສາຍ ຫຼື ຂໍ້ຄວາມຈາກເບີນີ້ອີກຕໍ່ໄປ."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ບລັອກ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"ປົດ​ບ​ລັອກ <xliff:g id="NUMBER">%1$s</xliff:g> ບ​ໍ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"​ປົດ​ບລັອກ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"ການ​ໂທ​ດ່ວນ"</string>
- <string name="tab_recents" msgid="929949073851377206">"ຫາ​ກໍ​ໃຊ້"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ປະຫວັດການໂທ"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"ລາຍ​ຊື່​ຜູ່​ຕິດ​ຕໍ່"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ຂໍ້ຄວາມສຽງ"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ລຶບອອກຈາກລາຍການທີ່ມັກແລ້ວ"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"ເພີ່ມ​ໃສ່​ລາຍ​ຊື່"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"ສົ່ງ SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"​ໂທ​ອອກ​ດ້ວຍ​ວິ​ດີ​ໂອ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ເບິ່ງ​ປະ​ຫວັດ​ການ​ໂທ​ແບບເຕັມ"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"ບ​ລັອກ​ໝາຍ​ເລກ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ສາຍທີ່ບໍ່ໄດ້ຮັບໃໝ່"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"ບໍ່​ມີ​ຜູ້​ໃດ​ຢູ່​ໃນ​ການ​ໂທ​ດ່ວນ​ຂອງ​ທ່ານ​ເທື່ອ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ເພີ່ມ​ລາຍ​ການ​ທີ່​ມັກ"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"ແຕະ​ຮູບ ເພື່ອ​ເບິ່ງ​ທຸກ​ເລກ​ໝາຍ ຫຼື​ແຕະ &amp; ຄ້າງ​ໄວ້ ເພື່ອ​ບັນ​ທຶກ"</string>
<string name="remove_contact" msgid="1080555335283662961">"​ລຶບ​ອອກ"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"​ໂທ​ດ້ວຍ​ວິ​ດີ​ໂອ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"​ສົ່ງ​ຂໍ້​ຄວາມ"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ສົ່ງຂໍ້ຄວາມ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ລາຍລະອຽດ​ການໂທ"</string>
<string name="call_log_action_call" msgid="463690849042459842">"ໂທຫາ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"ສາຍ​ບໍ່​ໄດ້​ຮັບ​ຈາກ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"ຮັບ​ສາຍ​ໂທ​ຈາກ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"ຂໍ້​ຄວາມ​ສຽງ​ບໍ່​ໄດ້​ອ່ານ​ຈາກ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"ຂໍ້​ຄວາມ​ສຽງ​ຈາກ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"ໂທ​ຫາ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"ຢູ່​ເທິງ <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"ຜ່ານ <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"ຜ່ານ <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"ຢູ່ <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, ຜ່ານ <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> ຜ່ານ <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ໂທ"</string>
<string name="description_call_action" msgid="4000549004089776147">"ໂທ​ຫາ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"ການ​ໂທວິ​ດີ​ໂອ <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ການຕອບກັບດ່ວນ"</string>
<string name="call_settings_label" msgid="313434211353070209">"​ການ​ໂທ"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ການບ​ລັອກ​ສາຍ​ໂທ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ການບ​ລັອກ​ສາຍ​ໂທ​ປິດ​ຊົ່ວ​ຄາວ"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ການບ​ລັອກ​ສາຍ​ໂທ​ຖືກ​ປິດ​ໃຊ້​ງານ​ແລ້ວ ເພາະ​ວ່າ​ທ່ານ​ໄດ້​ຕິດ​ຕໍ່​ຫາ​ຝ່າຍ​ບໍ​ລິ​ການ​ສຸກ​ເສີນ​ຈາກ​ໂທ​ລະ​ສັບ​ນີ້​ພາຍ​ໃນ 48 ຊົ່ວ​ໂມງ​ສຸດ​ທ້າຍ. ມັນ​ຈະ​ຖືກ​ເປີດ​ໃຊ້​ງານ​ອີກ​ໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ ເມື່ອ​ໝົດ​ໄລ​ຍະ 48 ຊົ່ວ​ໂມງ​ໄປ​ແລ້ວ."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"ນຳ​ຕົວ​ເລກ​ເຂົ້າ"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"ຜ່ານ​ມາ​ທ່ານ​ໄດ້​ໝາຍ​ຜູ້​ໂທ​ບາງ​ຄົນ​ໃຫ້​ຖືກ​ສົ່ງ​​ຫາ​ຂໍ້​ຄວາມ​ສຽງໂດຍ​ອັດ​ຕະ​ໂນ​ມັດ​ຜ່ານ​ແອັບ​ອື່ນ​."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"ເບິ່ງ​ຕົວ​ເລກ"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"ນໍາເຂົ້າ"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"ນຳ​ເຂົ້າ​ລົ້ມ​ເຫລວ"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"ລົ້ມເຫລວໃນການຈັດເກັບຂໍ້ຄວາມສຽງເຂົ້າແຟ້ມ."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"ປົດ​ບ​ລັອກ​ໝາຍ​ເລກ"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"ເພີ່ມໝາຍເລກ"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ການໂທຈາກເບີໂທເຫຼົ່ານີ້ຈະຖືກບລັອກໄວ້ ແລະຂໍ້ຄວາມສຽງຈະຖືກລຶບໂດຍອັດຕະໂນມັດ."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ການໂທຈາກເບີໂທເຫຼົ່ານີ້ຈະຖືກບລັອກໄວ້, ແຕ່ພວກເຂົາອາດຈະຍັງສາມາດຝາກຂໍ້ຄວາມສຽງໃຫ້ທ່ານໄດ້."</string>
+ <string name="block_list" msgid="7760188925338078011">"ເບີໂທທີ່ບລັອກໄວ້"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ບໍ່ຖືກຕ້ອງ."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ຖືກ​ບ​ລັອກ​ແລ້ວ."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ການບ​ລັອກ​ສາຍ​ໂທ​ຖືກ​ປິດ​ໃຊ້​ງານ​ແລ້ວ​ເປັນ​ເວ​ລາ 48 ຊົ່​ວ​ໂມງ"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"ປິດ​ໃຊ້​ງານ​ແລ້ວ ເພາະ​ວ່າ​ໄດ້​ມີ​ການ​ໂທ​ສຸກ​ເສີນ."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"ບັນ​ຊີ​ໂທ"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ເປີດ​"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ຕັ້ງ​ການ​ອະ​ນຸ​ຍາດ"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"ເພື່ອ​ເປີດ​ໃຊ້​ງານ​ການໂທດ່ວນ,\n ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"ເພື່ອ​ເບິ່ງ​ບັນ​ທຶກ​ການ​ໂທ​ຂອງ​ທ່ານ,\n ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"ເພື່ອ​ເບິ່ງ​ລາຍ​ຊື່​ຂອງ​ທ່ານ,\n ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"ເພື່ອ​ເຂົ້າ​ຫາ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ,\n ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"ເພື່ອ​ເປີດ​ໃຊ້​ງານ​ການໂທດ່ວນ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ເພື່ອ​ເບິ່ງ​ບັນ​ທຶກ​ການ​ໂທ​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"ເພື່ອ​ເບິ່ງ​ລາຍ​ຊື່​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ລາຍ​ຊື່"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ເພື່ອ​ເຂົ້າ​ຫາ​ຂໍ້​ຄວາມ​ສຽງ​ຂອງ​ທ່ານ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ."</string>
<string name="permission_no_search" msgid="84152933267902056">"ເພື່ອຄົ້ນຫາລາຍາຊື່ຂອງທ່ານ, ໃຫ້ເປີດການອະນຸຍາດລາຍຊື່."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ເພື່ອ​ໂທ​ອອກ,\n ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ເພື່ອ​ເຮັດການໂທ, ເປີດ​ການ​ອະ​ນຸ​ຍາດ​ໂທ​ລະ​ສັບ."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ແອັບໂທລະສັບບໍ່ມີການອະນຸຍາດໃຫ້ຂຽນໃສ່ການຕັ້ງຄ່າລະບົບ."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ບລັອກໄວ້ແລ້ວ"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"ຢູ່ໃນສາຍ <xliff:g id="NAMEORNUMBER">^1</xliff:g> ຢູ່"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 24f165c3f..d62925dc7 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefonas"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefonas"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefono skambinimo skydelis"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefonas"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Skambučių istorija"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Skambinti <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Pranešti apie netikslų numerį"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Redaguoti numerį prieš skambutį"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Pridėti prie kontakto"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Ištrinti iš skambučių istorijos"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Išvalyti skambučių istoriją"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Ištrinti balso pašto pran."</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Bendrinti balso paštą"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Skambučių žurnalas yra tuščias"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Skambinti"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Skambučių istorija"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Pranešti apie netikslų numerį"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopijuoti numerį"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopijuoti transkribuotą tekstą"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokuoti numerį"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> užblokuotas"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Panaikinti numerio blokavimą"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Panaikintas <xliff:g id="NUMBER">%1$s</xliff:g> blokavimas"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANULIUOTI"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Ištrinti"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Redaguoti numerį prieš skambinant"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Išvalyti skambučių istoriją"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Ištrinti balso pašto pranešim."</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archyvuoti balso pašto pran."</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Bendrinti balso paštą"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Balso pšt. ištrintas"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Balso pašto pran. suarchyvuoti"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANULIUOTI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"Į ARCHYVĄ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Išvalyti skambučių istoriją?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Bus ištrinti visi skambučiai iš istorijos"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Išvaloma skambučių istorija..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefonas"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Praleisti skambučiai"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Praleistas darbo skambutis"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Praleisti skambučiai"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Praleistų skambučių: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Perskambinti"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Siųsti pranešimą"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> balso pašto pranešimas </item>
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> balso pašto pranešimai </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nauji b. pašto pran. iš <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Nepavyko paleisti balso pašto pranešimo"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Rašoma į buferį…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Įkeliamas balso pašto pranešimas..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archyvuojami balso pašto pranešimai…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Nepavyko įkelti balso pašto pranešimo"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Tik skambučiai su balso paštu"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Tik gaunami skambučiai"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Skambučių istorija"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Daugiau parinkčių"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"skambinimo skydelis"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopijuoti"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Rodyti tik išsiunčiamus"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Rodyti tik gaunamus"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Rodyti tik praleistus"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Siunčiamasis vaizdo skambutis"</string>
<string name="type_missed_video" msgid="954396897034220545">"Praleistas vaizdo skambutis"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Balso paštas"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Atmestas skambutis"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Užblokuotas skambutis"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Gaunami skambučiai"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Paleisti balso pašto pranešimus"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Žiūrėti kontaktą <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Skambinti <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Išsami kontaktinė informacija: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Naujas balso pašto pranešimas."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Skambučių: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Vaizdo skambutis."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Siųsti SMS <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Taksofonas"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Negalima skambinti šiuo numeriu"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Jei norite nustatyti balso paštą, eikite į „Meniu“ &gt; „Nustatymai“."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Jei norite skambinti į balso paštą, išjunkite lėktuvo režimą."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Paieška balsu nepasiekiama"</string>
<string name="call_not_available" msgid="8941576511946492225">"Negalima skambinti telefonu, nes Telefono programa išjungta."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Šiame įrenginyje nėra tam skirtos programos"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Įveskite vardą ar telefono nr."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nėra praleistų skambučių."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Balso pašto gautųjų aplankas yra tuščias."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Ieškokite kontaktų"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Prid. nr. arba iešk. kontaktų"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Skambučių istorija yra tuščia"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Skambinti"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nėra jokių praleistų skambučių."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Balso pašto gautųjų aplankas yra tuščias."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Jūsų balso pašto pranešimų archyvas tuščias."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Rodyti tik mėgstamiausius"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Istorija"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Skambučių istorija"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Balso pašto pranešimų archyvas"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Visi"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Praleisti"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Balso paštas"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Naujas supaprast. blokavimas"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Siekiant geriau jus apsaugoti, Telefono programa turi pakeisti blokavimo veikimo būdą. Blokuotų numerių skambučiai ir teksto pranešimai nebus priimami ir jie gali būti bendrinami su kitomis programomis."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Leisti"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blokuoti numerį <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Skambučiai iš šio numerio bus užblokuoti, o balso pašto pranešimai bus automatiškai ištrinti."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Skambučiai iš šio numerio bus užblokuoti, tačiau skambintojas vis tiek galės palikti jums balso pašto pranešimus."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Nebegausite skambučių ar teksto pranešimų iš šio numerio."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKUOTI"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Panaikinti numerio <xliff:g id="NUMBER">%1$s</xliff:g> blokavimą?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"PANAIKINTI BLOKAVIMĄ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Spartusis rinkimas"</string>
- <string name="tab_recents" msgid="929949073851377206">"Naujausi"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Skambučių istorija"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktai"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Balso paštas"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Pašalintas iš adresyno"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Pridėti prie kontakto"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Siųsti SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Atlikti vaizdo skambutį"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Visos skambučių istorijos peržiūra"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokuoti numerį"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Naujų praleistų skambučių: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Dar nieko neįtraukėte į sparčiojo rinkimo sąrašą"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Pridėti mėgstamiausią"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Palieskite vaizdą, kad peržiūrėtumėte visus numerius, arba palieskite ir laikykite, kad pertvarkytumėte"</string>
<string name="remove_contact" msgid="1080555335283662961">"Pašalinti"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Vaizdo skambutis"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Siųsti pranešimą"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Siųsti pranešimą"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Išsami skambučio informacija"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Skambinti <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Praleistas skambutis: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Atsakytas skambutis: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Neskaitytas balso pašto pranešimas: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Balso pašto pranešimas: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Skambutis: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"numeriu <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"numeriu <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, numeriu <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> numeriu <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Skambinti"</string>
<string name="description_call_action" msgid="4000549004089776147">"Skambinti <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Vaizdo skambutis <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Greiti atsakai"</string>
<string name="call_settings_label" msgid="313434211353070209">"Skambučiai"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Skambučių blokavimas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Skamb. blokavimo funkcija laikinai išj."</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Skambučių blokavimo funkcija buvo išjungta, nes iš šio telefono buvote susisiekę su pagalbos tarnybomis per pastarąsias 48 val. Ši funkcija bus automatiškai įgalinta iš naujo, kai 48 val. laikotarpis pasibaigs."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importuoti numerius"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Naudodami kitas programas anksčiau buvote pažymėję, kad kai kurie skambintojai būtų automatiškai nusiųsti į balso paštą."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Žr. skaičius"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importuoti"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importuoti nepavyko"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Nepavyko suarchyvuoti balso pašto pran."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Panaikinti numerio blokavimą"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Pridėti numerį"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Skambučiai iš šių numerių bus užblokuoti, o balso pašto pranešimai bus automatiškai ištrinti."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Skambučiai iš šių numerių bus užblokuoti, tačiau skambintojai vis tiek galės palikti jums balso pašto pranešimus."</string>
+ <string name="block_list" msgid="7760188925338078011">"Užblokuoti numeriai"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> yra netinkamas numeris."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> jau užblokuotas."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Skambučių blokavimas išjungtas 48 val."</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Išjungta, nes skambinta pagalbos numeriu."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Skambinimo paskyros"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Įjungti"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Nustatyti leidimus"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Kad įgalintumėte spartųjį rinkimą,\n įjunkite Kontaktų leidimą."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Norėdami peržiūrėti skambučių žurnalą,\n įjunkite telefono leidimą."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Norėdami peržiūrėti kontaktus,\n įjunkite kontaktų leidimą."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Norėdami pasiekti balso paštą,\n įjunkite telefono leidimą."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Jei norite įgalinti spartųjį rinkimą, įjunkite Kontaktų programos leidimą."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Jei norite peržiūrėti skambučių žurnalą, įjunkite Telefono programos leidimą."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Jei norite peržiūrėti kontaktus, įjunkite Kontaktų programos leidimą."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Jei norite pasiekti balso paštą, įjunkite Telefono programos leidimą."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kad galėtumėte ieškoti kontaktų, įjunkite Kontaktų leidimus."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Norėdami skambinti,\n įjunkite telefono leidimą."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Jei norite paskambinti, įjunkite Telefono programos leidimą."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefono programa neturi leidimo keisti sistemos nustatymų."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Užblokuota"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> aktyvus"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 4abfd2c8e..7c67f4ab7 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Tālrunis"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Tālrunis"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Tālruņa numuru sastādīšanas tastatūra"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Zvanīt"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Zvanu vēsture"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Zvanīt: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Ziņot par nepareizu numuru"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Rediģēt numuru pirms zvanīšanas"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Pievienot kontaktpersonai"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Dzēst no zvanu vēstures"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Dzēst zvanu vēsturi"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Dzēst balss pasta ziņojumu"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Kopīgot balss pastu"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Zvanu žurnāls ir tukšs."</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Zvanīt"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Zvanu vēsture"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Ziņot par nepareizu numuru"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopēt numuru"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopēt transkripciju"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloķēt numuru"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> bloķēts"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Atbloķēt numuru"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> atbloķēts"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ATSAUKT"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Dzēst"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Rediģēt numuru pirms zvanīšanas"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Dzēst zvanu vēsturi"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Dzēst balss pasta ziņojumu"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arhivēt balss pasta ziņojumu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Kopīgot balss pasta ziņojumu"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Balss pasts dzēsts"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Balss pasta ziņojums arhivēts"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ATSAUKT"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"UZ ARHĪVU"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Vai dzēst zvanu vēsturi?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Tiks dzēsti visi vēsturē saglabātie zvani."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Notiek zvanu vēstures dzēšana…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Tālruņa zvans"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Neatbildēts zvans"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Neatbildēts darba zvans"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Neatbildēti zvani"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> neatbildēti zvani"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Atzvanīt"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Sūtīt ziņojumu"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="zero"><xliff:g id="COUNT">%1$d</xliff:g> balss pasta ziņojumi </item>
<item quantity="one"><xliff:g id="COUNT">%1$d</xliff:g> balss pasta ziņojums </item>
@@ -43,8 +59,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Jauns b. pasta ziņ. no: <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Nevarēja atskaņot balss pasta ziņojumu."</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Notiek buferizācija..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Notiek balss pasta ziņojumu ielāde…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Tiek arhivēts balss pasta ziņojums…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Nevarēja ielādēt balss pasta ziņojumu."</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Tikai balss pasta zvani"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Tikai ienākošie zvani"</string>
@@ -74,7 +90,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Zvanu vēsture"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Vairāk opciju"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"numura sastādīšanas tastatūra"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopēt"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Rādīt tikai izejošos zvanus"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Rādīt tikai ienākošos zvanus"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Rādīt tikai neatbildētos zvanus"</string>
@@ -97,12 +112,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Izejošs videozvans"</string>
<string name="type_missed_video" msgid="954396897034220545">"Neatbildēts videozvans"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Balss pasts"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Noraidīts zvans"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Bloķēts zvans"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Ienākošie zvani"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Atskaņot balss pasta ziņojumu"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Skatīt kontaktpersonu <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Zvanīt šim: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktpersonas informācija: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Jauns balss pasta ziņojums."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> zvani."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videozvans"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Sūtīt īsziņu šai kontaktpersonai: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -115,6 +131,11 @@
<string name="payphone" msgid="7726415831153618726">"Maksas tālrunis"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> plkst. <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Uz šo numuru nevar piezvanīt."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Lai iestatītu balss pastu, atveriet sadaļu Izvēlne &gt; Iestatījumi."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Lai piezvanītu balss pastam, vispirms izslēdziet lidojuma režīmu."</string>
@@ -127,16 +148,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Meklēšana ar balsi nav pieejama."</string>
<string name="call_not_available" msgid="8941576511946492225">"Nevar veikt tālruņa zvanu, jo lietojumprogramma Tālrunis tika atspējota."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Šajā ierīcē nav nevienas šai darbībai piemērotas lietotnes."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Ievadiet vārdu/tālruņa numuru"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Jums nav neatbildētu zvanu."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Jūsu balss pasta iesūtne ir tukša."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Meklēt kontaktpersonas"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Pievienojiet numuru vai meklējiet kontaktpersonas"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Jūsu zvanu vēsturē nav ierakstu."</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Zvanīt"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Jums nav neatbildētu zvanu."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Jūsu balss pasta iesūtne ir tukša."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Jūsu balss pasta ziņojumu arhīvs ir tukšs."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Rādīt tikai izlasi"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Vēsture"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Zvanu vēsture"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Balss pasta ziņojumu arhīvs"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Visi"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Neatb."</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Balss p."</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Jauna, vienkāršota bloķēšanas funkcija"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Lai jūs labāk aizsargātu, lietotnē Tālrunis ir jāmaina bloķēšanas darbība. Turpmāk no bloķētajiem numuriem nevarēs saņemt zvanus un īsziņas, un bloķētos numurus varēs kopīgot ar citām lietotnēm."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Atļaut"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Vai bloķēt numuru <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"No šī numura saņemtie zvani tiks bloķēti, un balss pasta ziņojumi tiks automātiski dzēsti."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"No šī numura saņemtie zvani tiks bloķēti, taču zvanītājs joprojām varēs jums atstāt balss pasta ziņojumus."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Jūs vairs nesaņemsiet zvanus un īsziņas no šī numura."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOĶĒT"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Vai atbloķēt numuru <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ATBLOĶĒT"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Ātrie zvani"</string>
- <string name="tab_recents" msgid="929949073851377206">"Pēdējie"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Zvanu vēsture"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktpersonas"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Balss pasts"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Noņemts no izlases"</string>
@@ -146,7 +182,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Pievienot kontaktpersonai"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Sūtīt īsziņu"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Veikt videozvanu"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Visas zvanu vēstures skatīšana"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloķēt numuru"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Jauni neatbildēti zvani: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Ātro zvanu sarakstā vēl nav nevienas kontaktpersonas."</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Pievienot izlasei"</string>
@@ -155,13 +191,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Pieskarieties attēlam, lai skatītu visus numurus, vai pieskarieties attēlam un turiet to, lai veiktu pārkārtošanu."</string>
<string name="remove_contact" msgid="1080555335283662961">"Noņemt"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videozvans"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Nosūtīt ziņojumu"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Sūtīt ziņojumu"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Informācija par zvanu"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Zvanīt: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Neatbildēts zvans no: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Atbildēts zvans no: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nelasīts balss pasts no <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Balss pasts no <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Izejošs zvans: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"kontā <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"izmantojot numuru <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"izmantojot numuru <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"kontā <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, izmantojot numuru <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, izmantojot numuru <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Zvanīt"</string>
<string name="description_call_action" msgid="4000549004089776147">"Zvanīt: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Zvaniet kontaktpersonai <xliff:g id="NAMEORNUMBER">^1</xliff:g>, izmantojot videozvanu."</string>
@@ -201,14 +243,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Ātrās atbildes"</string>
<string name="call_settings_label" msgid="313434211353070209">"Zvani"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Zvanu bloķēšana"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Zvanu bloķēšana ir īslaicīgi izslēgta"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Zvanu bloķēšana ir atspējota, jo pēdējo 48 stundu laikā jūs sazinājāties ar ārkārtas palīdzības dienestiem, izmantojot šo tālruni. Zvanu bloķēšana tiks automātiski iespējota, tiklīdz beigsies 48 stundu periods."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importēt numurus"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Jūs iepriekš atzīmējāt dažus zvanītājus, kuri automātiski jānovirza uz balss pastu, izmantojot citas lietotnes."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Skatīt numurus"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importēt"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importēšana neizdevās"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Neizdevās arhivēt balss pasta ziņojumu."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Atbloķēt numuru"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Pievienot numuru"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"No šiem numuriem saņemtie zvani tiks bloķēti, un balss pasta ziņojumi tiks automātiski dzēsti."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"No šiem numuriem saņemtie zvani tiks bloķēti, taču zvanītāji joprojām varēs jums atstāt balss pasta ziņojumus."</string>
+ <string name="block_list" msgid="7760188925338078011">"Bloķētie numuri"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> nav derīgs."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> jau ir bloķēts."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Zvanu bloķēšana atspējota uz 48 stundām"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Zvanu bloķēšana atspējota, jo tika veikts ārkārtas zvans."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Zvanu konti"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Ieslēgt"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Iestatīt atļaujas"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Lai iespējotu ātro numura sastādīšanu,\nieslēdziet atļauju Kontaktpersonas."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Lai skatītu zvanu žurnālu,\n ieslēdziet atļauju Tālrunis."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Lai skatītu kontaktpersonas, \n ieslēdziet atļauju Kontaktpersonas."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Lai piekļūtu balss pastam,\nieslēdziet atļauju Tālrunis."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Lai iespējotu ātros zvanus, ieslēdziet atļauju Kontaktpersonas."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Lai skatītu zvanu žurnālu, ieslēdziet atļauju Tālrunis."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Lai skatītu kontaktpersonas, ieslēdziet atļauju Kontaktpersonas."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Lai piekļūtu balss pastam, ieslēdziet atļauju Tālrunis."</string>
<string name="permission_no_search" msgid="84152933267902056">"Lai meklētu savas kontaktpersonas, ieslēdziet atļauju Kontaktpersonas."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Lai veiktu zvanu,\nieslēdziet atļauju Tālrunis."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Lai veiktu zvanu, ieslēdziet atļauju Tālrunis."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Tālruņa lietotnei nav atļaujas rakstīt sistēmas iestatījumos."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloķēts"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>: aktīvs"</string>
</resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index a6754a541..8b902200e 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Телефонска тастатура"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Историја на повици"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Повикај <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Пријави неточен број"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Уреди број пред повик"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Додај на контакт"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Избришете од историјата на повици"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Избришете историја на повици?"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Избриши говорна пошта"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Сподели говорна пошта"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Евиденцијата на повици е празна"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Повикај"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Историја на повици"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Пријави неточен број"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Копирај го бројот"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Копирај транскрипција"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Блокирај го бројот"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> е блокиран"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Одблокирај го бројот"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> е деблокиран"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ВРАТИ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Избриши"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Уредете го бројот пред повикот"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Избришете ја историјата на повици"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Избришете ја говорната пошта"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Архивирајте говорна пошта"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Споделете ја говорната пошта"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Гов. пошта е избриш."</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Говорната пошта е архивирана"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ВРАТИ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ДО АРХИВА"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Избришете историја на повици?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Ова ќе ги избрише сите повици од историјата"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Се чисти историјата на повици…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Телефон"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Пропуштен повик"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Пропуштен работен повик"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Пропуштени повици"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> пропуштени повици"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Повикај назад"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Порака"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> говорна порака </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> говорни пораки </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Нова говорна пошта од <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Говорната пошта не можеше да се репродуцира"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Меѓумеморирање..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Се вчитува говорната пошта…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Говорната пошта се архивира…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Говорната пошта не можеше да се вчита"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Само повици со говорна пошта"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Само дојдовни повици"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Историја на повици"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Повеќе опции"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"тастатура за избирање"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Копирај"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Прикажи само појдовни"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Прикажи само дојдовни"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Прикажи само пропуштени"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Појдовен видеоповик"</string>
<string name="type_missed_video" msgid="954396897034220545">"Пропуштен видеоповик"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Говорна пошта"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Одбиен повик"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Блокирани повик"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Дојдовни повици"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Преслушај говорна пошта"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Прикажи контакт <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Повикај <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Детали за контакт за <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Нова говорна пошта."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> повици."</string>
<string name="description_video_call" msgid="2933838090743214204">"Видеоповик."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Испратете SMS до <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Говорница"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> мин. <xliff:g id="SECONDS">%s</xliff:g> сек."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> во <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Бројот не може да се повика"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"За да подесите говорна пошта, одете на Мени &gt; Поставки."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"За да се јавите во говорна пошта, прво исклучете режим на работа во авион."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Гласовното пребарување не е достапно"</string>
<string name="call_not_available" msgid="8941576511946492225">"Не може да се воспостави телефонски повик, бидејќи апликацијата Телефон е оневозможена."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Нема апликација за тоа на уредот"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Внесете име или телефонски број"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Немате пропуштени повици."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Приемното сандаче на говорната пошта е празно."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Пребарајте контакти"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Додајте број или побарајте контакти"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Историјата на повици е празна"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Повикај"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Немате пропуштени повици."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Приемното сандаче на говорната пошта е празно."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Архивата на говорна пошта е празна."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Прикажи само омилени"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Историја"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Историја на повици"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Архива на говорна пошта"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Сите"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Пропуштени"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Говорна пошта"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Ново, поедноставено блокирање"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"За подобра заштита, Телефонот треба да го промени начинот на блокирање. Блокираните броеви сега ќе ги сопрат повиците и текстуалните пораки и ќе може да се споделат со други апликации."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Дозволи"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Блокирај го <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Повиците од овој број ќе се блокираат, а говорната пошта автоматски ќе се брише."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Повиците од овој број ќе се блокираат, но можно е повикувачот сѐ уште да може да ви остава говорна пошта."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Веќе нема да примате повици или текстуални пораки од овој број."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛОКИРАЈ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Одблокирај го <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ДЕБЛОКИРАЈ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Брзо бирање"</string>
- <string name="tab_recents" msgid="929949073851377206">"Неодамнешни"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Историја на повици"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Контакти"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Говорна пошта"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Отстранет од омилени"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Додај на контакт"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Испрати SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Остварете видеоповик"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Погледнете цела историја на повик"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Блокирај го бројот"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> нови пропуштени повици"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Сè уште немате никого на брзо бирање"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Додај омилено"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Допрете ја сликата за да ги видите сите броеви или допрете и држете за промена на редоследот"</string>
<string name="remove_contact" msgid="1080555335283662961">"Отстрани"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Видеоповик"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Испрати порака"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Испрати порака"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Детали на повик"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Повикај <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Пропуштен повик од <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Одговорен повик од <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Непрочитана говорна порака од <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Говорна порака од <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Повик до <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"на <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"на <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"на <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"на <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, на <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> на <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Повикај"</string>
<string name="description_call_action" msgid="4000549004089776147">"Повикај <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Видеоповик до <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Брзи одговори"</string>
<string name="call_settings_label" msgid="313434211353070209">"Повици"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Блокирање повик"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Блокирањето повик е привремено исклучено"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Блокирањето повици е исклучено бидејќи ја контактиравте службата за итни случаи од телефонов во изминатите 48 часа. Повторно ќе се овозможи автоматски откако ќе истече периодот од 48 часа."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Увези броеви"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Претходно означивте некои повикувачи да се испратат автоматски на говорната пошта преку други апликации."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Прикажи броеви"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Увези"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Увоз не успеа"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Говорната пошта не се архивираше."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Одблокирај го бројот"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Додај број"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Повиците од овие броеви ќе се блокираат, а говорната пошта автоматски ќе се брише."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Повиците од овие броеви ќе се блокираат, но можно е сѐ уште да може да ви оставаат говорна пошта."</string>
+ <string name="block_list" msgid="7760188925338078011">"Блокирани броеви"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> не е важечки."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> веќе е блокиран."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Блокирањето на повикот е оневозможено 48 часа"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Оневозможено е затоа што беше направен итен повик."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Сметки за повикување"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Вклучи"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Постави дозволи"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"За да овозможите брзо бирање,\n вклучете ја дозволата за контакти."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"За да ја видите евиденцијата на повици,\n вклучете ја дозволата за телефон."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"За да ги видите контактите,\n вклучете ја дозволата за контакти."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"За да пристапите кон говорната пошта,\n вклучете ја дозволата за телефон."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"За да овозможите брзо бирање, вклучете ја дозволата за контакти."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"За да ја видите евиденцијата на повици, вклучете ја дозволата за телефон."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"За да ги видите контактите, вклучете ја дозволата за контакти."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"За да пристапите кон говорната пошта, вклучете ја дозволата за телефон."</string>
<string name="permission_no_search" msgid="84152933267902056">"За да ги пребарувате контактите, вклучете ги дозволите за контакти."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"За повици,\n вклучете ја дозволата за телефон."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"За да воспоставите повик, вклучете ја дозволата за телефон."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Апликацијата на телефонот нема дозвола да пишува во поставките на системот."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Блокиран"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> е активен"</string>
</resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index f1c5bdcae..da5ebd03d 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ഫോണ്‍"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ഫോണ്‍"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ഫോൺ ഡയൽപാഡ്"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ഫോണ്‍"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"കോള്‍‌ ചരിത്രം"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"വിളിക്കുക <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"കൃത്യമല്ലാത്ത നമ്പർ റിപ്പോർട്ടുചെയ്യുക"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"കോൾ ചെയ്യുംമുമ്പ് നമ്പർ എഡിറ്റുചെയ്യൂ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"ഒരുകോൺടാക്റ്റിൽ ചേർക്കൂ"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"കോൾ ചരിത്രത്തിൽ നിന്ന് മായ്‌ക്കുക"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"കോൾ ചരിത്രം മായ്‌ക്കുക"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"വോയ്‌സ്മെയിൽ ഇല്ലാതാക്കുക"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"വോയ്‌സ്‌മെയിൽ പങ്കിടുക"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"നിങ്ങളുടെ കോൾ ലോഗ് ശൂന്യമാണ്"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ഒരു കോൾ ചെയ്യുക"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"കോള്‍‌ ചരിത്രം"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"കൃത്യമല്ലാത്ത നമ്പർ റിപ്പോർട്ടുചെയ്യുക"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"നമ്പർ പകർത്തുക"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ട്രാൻസ്ക്രിപ്ഷൻ പകർത്തുക"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"നമ്പർ ബ്ലോക്കുചെയ്യുക"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ബ്ലോക്കുചെയ്തു"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"നമ്പർ അൺബ്ലോക്കുചെയ്യുക"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> അൺബ്ലോക്കുചെയ്തു"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"പഴയപടിയാക്കുക"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"ഇല്ലാതാക്കുക"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"കോൾ ചെയ്യുംമുമ്പ് നമ്പർ എഡിറ്റുചെയ്യൂ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"കോൾ ചരിത്രം മായ്‌ക്കുക"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"വോയ്‌സ്മെയിൽ ഇല്ലാതാക്കുക"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"വോയ്‌സ്‌മെയിൽ ആർക്കൈവുചെയ്യുക"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"വോയ്‌സ്‌മെയിൽ പങ്കിടുക"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"വോയ്സ്മെയിൽ ഇല്ലാതാക്കി"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"വോയ്‌സ്‌മെയിൽ ആർക്കൈവുചെയ്‌തു"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"പഴയപടിയാക്കുക"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ആർക്കൈവ് ബട്ടണിലേക്ക് പോകുക"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"കോൾ ചരിത്രം മായ്‌ക്കണോ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"ഇത് നിങ്ങളുടെ ചരിത്രത്തിൽ നിന്ന് എല്ലാ കോളുകളും ഇല്ലാതാക്കും"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"കോൾ ചരിത്രം മായ്‌ക്കുന്നു..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ഫോൺ"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"മിസ്‌ഡ് കോൾ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"മിസ്ഡ് ഔദ്യോഗിക കോൾ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"മിസ്‌ഡ് കോളുകൾ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> മിസ്‌ഡ് കോളുകൾ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"തിരിച്ചുവിളിക്കുക"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"സന്ദേശം"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> വോയ്‌സ്‌മെയിലുകൾ </item>
<item quantity="one">വോയ്‌സ്‌മെയിൽ</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> എന്നയാളിൽ നിന്നുള്ള പുതിയ വോയ്‌സ്‌മെയിൽ"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"വോയ്‌സ്‌മെയിൽ പ്‌ലേ ചെയ്യാനായില്ല"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"ബഫർ ചെയ്യുന്നു…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"വോയ്‌സ്‌മെയിൽ ലോഡുചെയ്യുന്നു..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"വോയ്‌സ്‌മെയിൽ ആർക്കൈവുചെയ്യുന്നു…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"വോയ്‌സ്‌മെയിൽ ലോഡുചെയ്യാനായില്ല"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"വോയ്‌സ്മെയിൽ ഉള്ള കോളുകൾ മാത്രം"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ഇൻകമിംഗ് കോളുകൾ മാത്രം"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"കോള്‍‌ ചരിത്രം"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"കൂടുതൽ‍ ഓപ്‌ഷനുകള്‍"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ഡയൽ പാഡ്"</string>
- <string name="menu_copy" msgid="6108677035381940698">"പകര്‍ത്തുക"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"ഔട്ട്‌ഗോയിംഗ് മാത്രം കാണിക്കുക"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ഇൻ‌കമിംഗ് മാത്രം കാണിക്കുക"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"മിസ്‌ഡ് മാത്രം കാണിക്കുക"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"വിളിച്ച വീഡിയോ കോൾ"</string>
<string name="type_missed_video" msgid="954396897034220545">"വീഡിയോ കോൾ നഷ്‌ടമായി"</string>
<string name="type_voicemail" msgid="5153139450668549908">"വോയ്‌സ്‌മെയിൽ"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"നിരസിച്ച കോൾ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ബ്ലോക്കുചെയ്ത കോൾ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ഇൻകമിംഗ് കോളുകൾ"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"വോയ്‌സ്‌മെയിൽ പ്ലേ ചെയ്യുക"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> എന്ന കോൺടാക്റ്റ് കാണുക"</string>
<string name="description_call" msgid="3443678121983852666">"വിളിക്കുക <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> എന്നതിന്റെ കോൺ‌ടാക്റ്റ് വിശദാംശങ്ങൾ"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"പുതിയ വോയ്‌സ്‌മെയിൽ."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> കോളുകൾ."</string>
<string name="description_video_call" msgid="2933838090743214204">"വീഡിയോ കോൾ."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> എന്നയാൾക്ക് SMS അയയ്‌ക്കുക"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"പണം നൽകി ഉപയോഗിക്കുന്ന ഫോൺ"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> സെക്കൻഡ്"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> മി. <xliff:g id="SECONDS">%s</xliff:g> സെ."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>-ന്"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ഈ നമ്പറിലേക്ക് കോൾ ചെയ്യാനാവില്ല"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"വോയ്‌സ്‌മെയിൽ സജ്ജീകരിക്കുന്നതിന്, മെനു &gt; ക്രമീകരണങ്ങൾ എന്നതിലേക്ക് പോകുക."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"വോയ്‌സ്‌മെയിൽ വിളിക്കാൻ ആദ്യം ഫ്ലൈറ്റ് മോഡ് ഓഫാക്കുക."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"വോയ്‌സ് തിരയൽ ലഭ്യമല്ല"</string>
<string name="call_not_available" msgid="8941576511946492225">"ഫോൺ അപ്ലിക്കേഷൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നതിനാൽ ഫോൺ കോൾ ചെയ്യാനാകില്ല."</string>
<string name="activity_not_available" msgid="2287665636817987623">"അതിനായി ഈ ഉപകരണത്തിൽ അപ്ലിക്കേഷനുകളൊന്നുമില്ല"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"ഒരു പേരോ ഫോൺ നമ്പറോ നൽകുക"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"നിങ്ങൾക്ക് മിസ്‌ഡ് കോളുകളൊന്നുമില്ല."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"നിങ്ങളുടെ വോയ്സ്മെയിൽ ഇൻബോക്സ് ശൂന്യമാണ്."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"കോണ്‍‌ടാക്റ്റുകള്‍ തിരയുക"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"നമ്പർ ചേർക്കുക അല്ലെങ്കിൽ കോൺടാക്റ്റുകൾ തിരയുക"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"നിങ്ങളുടെ കോൾ ചരിത്രം ശൂന്യമാണ്"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ഒരു കോൾ ചെയ്യുക"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"നിങ്ങൾക്ക് മിസ്‌ഡ് കോളുകളൊന്നുമില്ല."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"നിങ്ങളുടെ വോയ്സ്മെയിൽ ഇൻബോക്സ് ശൂന്യമാണ്."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"നിങ്ങളുടെ വോയ്‌സ്‌മെയിൽ ആർക്കൈവ് ശൂന്യമാണ്."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"പ്രിയപ്പെട്ടവ മാത്രം കാണിക്കുക"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ചരിത്രം"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"കോൾ ചരിത്രം"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"വോയ്‌സ്മെയിൽ ആർക്കൈവ്"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"എല്ലാം"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"മിസ്‌ഡ്"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"വോയ്‌സ്‌മെയിൽ"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"പുതിയ, ലളിതമായ ബ്ലോക്കുചെയ്യൽ"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"നിങ്ങളെ മെച്ചപ്പെട്ട രീതിയിൽ പരിരക്ഷിക്കുന്നതിന്, ഫോണിലെ ബ്ലോക്കുചെയ്യൽ പ്രവർത്തന രീതി മാറ്റേണ്ടതുണ്ട്. നിങ്ങളുടെ ബ്ലോക്കുചെയ്‌ത നമ്പറുകളിൽ നിന്നുള്ള കോൾ, ടെക്‌സ്‌റ്റ് എന്നിവ ഇപ്പോൾ അവസാനിപ്പിക്കും, ഈ വിവരം അത് മറ്റ് ആപ്‌സുമായി പങ്കിടാനുമിടയുണ്ട്."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"അനുവദിക്കുക"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> ബ്ലോക്കുചെയ്യണോ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ഈ നമ്പറിൽ നിന്നുള്ള കോളുകൾ ബ്ലോക്കുചെയ്യും, വോയ്സ്മെയിലുകളെ സ്വയമേവ ഇല്ലാതാക്കും."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ഈ നമ്പറിൽ നിന്നുള്ള കോളുകൾ ബ്ലോക്കുചെയ്യും, എന്നാൽ വിളിക്കുന്നയാൾക്ക് അപ്പോഴും നിങ്ങൾക്ക് വോയ്സ്‌മെയിലുകൾ അയയ്ക്കാൻ കഴിഞ്ഞേക്കാം."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"നിങ്ങൾക്ക് ഇനി ഈ നമ്പറിൽ നിന്ന് കോളുകളോ ടെക്‌‌സ്‌റ്റോ ലഭിക്കില്ല."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ബ്ലോക്കുചെയ്യുക"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> അൺബ്ലോക്കുചെയ്യണോ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"അൺബ്ലോക്കുചെയ്യുക"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"സ്‌പീഡ് ഡയൽ"</string>
- <string name="tab_recents" msgid="929949073851377206">"പുതിയവ"</string>
+ <string name="tab_history" msgid="2563144697322434940">"കോൾ ചരിത്രം"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"കോണ്‍ടാക്റ്റുകള്‍"</string>
<string name="tab_voicemail" msgid="155024725947496746">"വോയ്‌സ്‌മെയിൽ"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"പ്രിയപ്പെട്ടവയിൽ നിന്നും നീക്കംചെയ്‌തു"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"ഒരുകോൺടാക്റ്റിൽ ചേർക്കൂ"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS അയയ്ക്കുക"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"വീഡിയോ കോൾ ചെയ്യുക"</string>
- <string name="show_call_history" msgid="1141502332266697170">"മുഴുവൻ കോൾ ചരിത്രവും കാണുക"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"നമ്പർ ബ്ലോക്കുചെയ്യുക"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> പുതിയ മിസ്‌ഡ് കോളുകൾ"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"ഇതുവരെ ആരും നിങ്ങളുടെ സ്പീഡ് ഡയലിൽ ഇല്ല"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"പ്രിയപ്പെട്ടത് ചേർക്കുക"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"എല്ലാ നമ്പറുകളും കാണാൻ ചിത്രം സ്‌പർശിക്കുക അല്ലെങ്കിൽ വീണ്ടും ക്രമീകരിക്കാൻ സ്‌പർശിച്ച് പിടിക്കുക"</string>
<string name="remove_contact" msgid="1080555335283662961">"നീക്കംചെയ്യുക"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"വീഡിയോ കോള്‍"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"സന്ദേശം അയയ്ക്കുക"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ഒരു സന്ദേശം അയയ്‌ക്കുക"</string>
<string name="call_log_action_details" msgid="701345508704970622">"കോൾ വിശദാംശങ്ങൾ"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> എന്ന നമ്പർ/വ്യക്തിയെ വിളിക്കൂ"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> എന്നതിൽ നിന്നുള്ള മിസ്ഡ് കോൾ."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> എന്നതിൽ നിന്നുള്ള മറുപടി നൽകിയ കോൾ."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> എന്നതിൽ നിന്നുള്ള വായിക്കാത്ത വോയ്സ്മെയിൽ."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> എന്നതിൽ നിന്നുള്ള വോയ്സ്മെയിൽ."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> എന്നതിലേക്കുള്ള കോൾ."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> എന്നതിൽ"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> നമ്പർ വഴി"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> നമ്പർ വഴി"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="NUMBER">%2$s</xliff:g> നമ്പർ വഴി, <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> അക്കൗണ്ടിൽ"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> നമ്പർ വഴി, <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"വിളിക്കുക"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> വിളിക്കുക"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> എന്നതുമായി വീഡിയോ കോൾ നടത്തുക."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"അതിവേഗ പ്രതികരണങ്ങൾ"</string>
<string name="call_settings_label" msgid="313434211353070209">"കോളുകൾ"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"കോൾ ബ്ലോക്കുചെയ്യൽ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"കോൾ ബ്ലോക്കുചെയ്യൽ താൽക്കാലികമായി ഓഫാണ്"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"കഴിഞ്ഞ 48 മണിക്കൂറിനുള്ളിൽ നിങ്ങൾ ഈ ഫോണിൽ നിന്ന് അടിയന്തിര സേവനങ്ങളുമായി ബന്ധപ്പെട്ടതിനാൽ കോൾ ബ്ലോക്കുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കി. 48 മണിക്കൂർ സമയപരിധി കഴിഞ്ഞയുടൻ ഇത് സ്വയമേവ പ്രവർത്തനക്ഷമമാക്കപ്പെടും."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"നമ്പറുകൾ ഇമ്പോർട്ടുചെയ്യുക"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"മറ്റ് ആപ്സ് വഴി വോയ്സ്‌മെയിൽ സ്വയമേവ അയയ്ക്കുന്നതിന് കോൾ ചെയ്യുന്നവരിൽ ചിലരെ നിങ്ങൾ മുമ്പ് അടയാളപ്പെടുത്തി."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"നമ്പറുകൾ കാണുക"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"ഇമ്പോർട്ടുചെയ്യുക"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"ഇമ്പോർട്ടുചെയ്യൽ പരാജയപ്പെട്ടു"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"വോയ്‌സ്‌മെയിൽ ആർക്കൈവുചെയ്യാനായില്ല."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"നമ്പർ അൺബ്ലോക്കുചെയ്യുക"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"നമ്പർ ചേർക്കുക"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ഈ നമ്പറുകളിൽ നിന്നുള്ള കോളുകൾ ബ്ലോക്കുചെയ്യും, വോയ്സ്മെയിലുകളെ സ്വയമേവ ഇല്ലാതാക്കും."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ഈ നമ്പറുകളിൽ നിന്നുള്ള കോളുകൾ ബ്ലോക്കുചെയ്യും, എന്നാൽ വിളിക്കുന്നവർക്ക് അപ്പോഴും നിങ്ങൾക്ക് വോയ്സ്‌മെയിലുകൾ അയയ്ക്കാൻ കഴിഞ്ഞേക്കാം."</string>
+ <string name="block_list" msgid="7760188925338078011">"ബ്ലോക്കുചെയ്ത നമ്പറുകൾ"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> അസാധുവാണ്."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"ഇതിനകം തന്നെ <xliff:g id="NUMBER">%1$s</xliff:g> ബ്ലോക്കുചെയ്തിരിക്കുന്നു"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"48 മണിക്കൂർ നേരത്തേക്ക് കോൾ ബ്ലോക്കുചെയ്യൽ പ്രവർത്തനരഹിതമാക്കി"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"എമർജൻസി കോൾ നടത്തിയതിനാൽ പ്രവർത്തനരഹിതമാക്കി."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"കോളിംഗ് അക്കൗണ്ട്"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ഓണാക്കുക"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"അനുമതികൾ സജ്ജമാക്കുക"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"സ്‌പീഡ് ഡയൽ പ്രവർത്തനക്ഷമാക്കാൻ,\n കോൺടാക്റ്റുകൾക്കുള്ള അനുമതി ഓണാക്കുക."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"നിങ്ങളുടെ കോൾ ലോഗ് കാണുന്നതിന്,\n ഫോൺ അനുമതി ഓണാക്കുക."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ കാണുന്നതിന്,\n കോൺടാക്റ്റുകളുടെ അനുമതി ഓണാക്കുക."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"നിങ്ങളുടെ വോയ്‌സ്‌മെയിൽ ആക്സസ് ചെയ്യുന്നതിന്,\n ഫോൺ അനുമതി ഓണാക്കുക."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"സ്പീഡ് ഡയൽ പ്രവർത്തനക്ഷമാക്കുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"നിങ്ങളുടെ കോൾ ലോഗ് കാണുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ കാണുന്നതിന്, \'കോൺടാക്റ്റുകൾ\' അനുമതി ഓണാക്കുക."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"നിങ്ങളുടെ വോയ്‌സ്‌മെയിൽ ആക്സസ് ചെയ്യുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക."</string>
<string name="permission_no_search" msgid="84152933267902056">"നിങ്ങളുടെ കോൺടാക്റ്റുകൾ തിരയുന്നതിന് കോൺടാക്റ്റുകൾക്കുള്ള അനുമതികൾ ഓണാക്കുക."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"കോൾ ചെയ്യുന്നതിന്,\n ഫോൺ അനുമതി ഓണാക്കുക."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"കോൾ വിളിക്കുന്നതിന്, \'ഫോൺ\' അനുമതി ഓണാക്കുക."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"സിസ്റ്റം ക്രമീകരണത്തിലേക്ക് എഴുതാൻ ഫോൺ ആപ്പിന് അനുമതിയില്ല."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ബ്ലോക്കുചെയ്തു"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> സജീവമാണ്"</string>
</resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index ba63713aa..55f598a17 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Гар утас"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Утас"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Утасны дуудлага хийх дэлгэц"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Утас"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Дуудлагын түүх"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> руу залгах"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Тохиромжгүй дугаарыг мэдээлэх"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Дуудлага хийхийн өмнө дугаарыг засах"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Харилцагчийн хаягт нэмэх"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Дуудлагын түүхээс устгах"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Дуудлагын түүхийг устгах уу?"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Дуут шууданг устгах"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Дуут шууданг хуваалцах"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Таны дуудлагын жагсаалт хоосон байна"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Залгах"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Дуудлагын түүх"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Тохиромжгүй дугаарыг мэдээлэх"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Дугаар хуулах"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Галиглалыг хуулах"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Дугаар блоклох"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g>-г блоклосон"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Дугаар блокноос гаргах"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g>-г блокоос гаргасан"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"БУЦААХ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Устгах"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Залгахын өмнө дугаар засах"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Дуудлагын түүхийг устгах уу?"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Дуут шууданг устгах"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Дуут шууданг архивлах"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Дуут шууданг хуваалцах"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Дуут шууданг устгасан"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Дуут шууданг архивласан"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"БУЦААХ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"АРХИВ РУУ ОЧИХ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Дуудлагын түүхийг устгах уу?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Энэ нь таны хийсэн бүх дуудлагыг түүхээс устгана."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Дуудлагын түүхийг устгаж байна..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Утас"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Аваагүй дуудлага"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Аваагүй албаны дуудлага"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Аваагүй дуудлага"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> аваагүй дуудлага"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Буцааж залгах"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Зурвас"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Дуут шуудан </item>
<item quantity="one">Дуут шуудан</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g>-с ирсэн шинэ дуут шуудан"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Дуут шууданг тоглуулж чадсангүй"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Буферлэж байна…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Дуут шууданг ачаалж байна..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Дуут шууданг архивлаж байна..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Дуут шууданг ачаалж чадсангүй"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Зөвхөн дуут шуудантай дуудлагуудыг"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Зөвхөн ирсэн дуудлага"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Дуудлагын түүх"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Нэмэлт сонголтууд"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"дугаар цуглуулагч"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Хуулах"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Зөвхөн залгасан дуудлагуудыг харуулах"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Зөвхөн ирсэн дуудлагуудыг харуулах"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Зөвхөн аваагүй дуудлагуудыг харуулах"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Залгасан видео дуудлага"</string>
<string name="type_missed_video" msgid="954396897034220545">"Аваагүй видео дуудлага"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Дуут шуудан"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Татгалзсан дуудлага"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Блоклосон дуудлага"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Ирж буй дуудлага"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Дуут шууданг тоглуулах"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> харилцагчийг харах"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> руу залгах"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>-н харилцагчийн мэдээлэл"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Шинэ дуут шуудан."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> дуудлага."</string>
<string name="description_video_call" msgid="2933838090743214204">"Видео дуудлага."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>-д мессеж илгээх"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Payphone"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> минут <xliff:g id="SECONDS">%s</xliff:g> секунд"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>-д"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Энэ дугаар луу залгах боломжгүй байна"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Дуут шууданг тохируулахын тулд Цэс &gt; Тохиргоо руу очно уу."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Дуут шуудан руу залгахын тулд юуны өмнө Нислэгийн төлвийг идэвхгүйжүүлнэ үү."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Дуут хайлт хийх боломжгүй байна"</string>
<string name="call_not_available" msgid="8941576511946492225">"Утас аппликешныг идэвхгүйжүүлсэн тул утасны дуудлага хийх боломжгүй."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Энэхүү төхөөрөмж дээр тухайн үйлдлийг гүйцэтгэх апликейшн байхгүй байна."</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Нэр эсвэл утасны дугаар оруулна уу"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Танд аваагүй дуудлага байхгүй байна."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Таны дуут шуудангийн хайрцаг хоосон байна."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Харилцагч хайх"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Дугаар нэмэх болон харилцагч хайх"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Таны дуудлагын түүх хоосон байна"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Дуудлага хийх"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Танд аваагүй дуудлага байхгүй байна."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Таны дуут шуудангийн хайрцаг хоосон байна."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Таны дуут шуудангийн архив хоосон байна."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Зөвхөн дуртайнуудыг харуулах"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Түүх"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Дуудлагын түүх"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Дуут шуудангийн архив"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Бүгд"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Аваагүй"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Дуут шуудан"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Шинэ, хялбаршуулсан хориг"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Таныг илүү сайн хамгаалахын тулд утасны хоригийн тохиргоог өөрчлөх шаардлагатай. Таны хориглосон дугааруудаас дуудлага, зурвас ирэхгүй бөгөөд тэдгээрийг бусад апп-тай хуваалцаж болзошгүй."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Зөвшөөрөх"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g>-г блоклох уу?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Энэ дугаараас ирэх дуудлагыг блоклох бөгөөд дуут шуудан автоматаар устах болно."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Энэ дугаараас ирэх дуудлагыг блоклосон, гэхдээ залгагч танд дуут шуудан илгээх боломжтой."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Та энэ дугаараас цаашид дуудлага буюу мессеж хүлээж авахгүй."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛОКЛОХ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g>-г блокоос гаргах уу?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"БЛОКООС ГАРГАХ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Түргэн залгалт"</string>
- <string name="tab_recents" msgid="929949073851377206">"Саяхных"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Дуудлагын түүх"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Харилцагчид"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Дуут шуудан"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Дуртай жагсаалтаас хасав"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Харилцагчийн хаягт нэмэх"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Мессеж илгээх"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Видео дуудлага хийх"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Дуудлагын түүхийг бүхэлд нь харах"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Дугаар блоклох"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> шинэ аваагүй дуудлага"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Таны яаралтай залгах тохиргоон дээр одоогоор харилцагч байхгүй байна"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Таалагдсан хэсэгт нэмэх"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Бүх дугаарыг харахын тулд зурган дээр дарна уу эсвэл жагсаалтыг өөрчлөхийн тулд удаан дарна уу."</string>
<string name="remove_contact" msgid="1080555335283662961">"Хасах"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Видео дуудлага"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Зурвас Илгээх"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Зурвас илгээх"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Дуудлагын мэдээлэл"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> руу дуудлага хийх"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Дараах дуудлагыг хүлээн аваагүй <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Дараах дуудлагыг хүлээн авсан <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>-н уншаагүй дуут шуудан"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>-н дуут шуудан"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Дараах дугаар луу залгасан <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>-р залгасан"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g>-р"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g>-р"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> дээр, <xliff:g id="NUMBER">%2$s</xliff:g>-р"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g>-р <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Дуудлага"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> руу дуудлага хийх"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>-ын видео дуудлага."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Шуурхай хариунууд"</string>
<string name="call_settings_label" msgid="313434211353070209">"Дуудлага"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Дуудлага блоклох"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Дуудлага блоклох тохиргоог түр хугацаагаар унтраасан"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Та сүүлийн 48 цагийн дотор энэ утсаар тусламжийн дуудлага хийсэн тул дуудлага блоклох тохиргоог идэвхгүй болгосон. Энэ тохиргоо нь 48 цагийн хугацаа дуусахад автоматаар идэвхэжнэ."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Импортын тоо"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Тань руу залгасан зарим хүмүүсийг бусад апп ашиглан автоматаар дуут шуудан илгээж байхаар өмнө нь тэмдэглэсэн."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Дугаар харах"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Импортлох"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Импортолж чадсангүй"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Дуут шууданг архивлаж чадсангүй."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Дугаар блокноос гаргах"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Дугаар нэмэх"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Эдгээр дугаараас ирэх дуудлагыг блоклож, дуут шууданг автоматаар устгана."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Эдгээр дугаараас ирэх дуудлагыг блоклож, харин танд дуут шуудан илгээх боломжтой."</string>
+ <string name="block_list" msgid="7760188925338078011">"Блоклосон дугаар"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> хүчингүй байна."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g>-г аль хэдийн блоклосон байна."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Дуудлага блоклохыг 48 цагийн турш идэвхгүй болгосон."</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Яаралтай дуудлага хийсэн тул идэвхгүй болгосон."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Дуудах бүртгэл"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Идэвхжүүлэх"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Зөвшөөрөл тохируулах"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Яаралтай дуудлагыг идэвхжүүлэхийн тулд,\n Харилцагчийн жагсаалтын зөвшөөрлийг идэвхжүүлнэ үү."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Дуудлагын жагсаалтаа харахын тулд,\n Утасны зөвшөөрлийг идэвхжүүлнэ үү."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Харилцагчийн жагсаалтаа харахын тулд,\n Харилцагчийн жагсаалтын зөвшөөрлийг идэвхжүүлнэ үү."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Дуут шуудангаа ашиглахын тулд,\n Утасны зөвшөөрлийг идэвхжүүлнэ үү."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Яаралтай дуудлагыг идэвхжүүлэхийн тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Дуудлагын жагсаалтыг харахын тулд утасны зөвшөөрлийг идэвхжүүлнэ үү."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Харилцагчдаа харахын тулд Харилцагчдын зөвшөөрлийг идэвхжүүлнэ үү."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Дуут шууданд хандахын тулд Утасны зөвшөөрлийг идэвхжүүлнэ үү."</string>
<string name="permission_no_search" msgid="84152933267902056">"Харилцагчаа хайхын тулд, Харилцагчийн жагсаалтын зөвшөөрлийг идэвхжүүлнэ үү."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Дуудлага хийхийн тулд,\n Утасны зөвшөөрлийг идэвхжүүлнэ үү."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Залгахын тулд Утасны зөвшөөрлийг идэвхжүүлнэ үү."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Гар утасны апп-д системийн тохиргоо бичих зөвшөөрөл алга."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Блоклосон"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> идэвхтэй байна"</string>
</resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index f80f3b588..b0219865d 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"फोन"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"फोन"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"फोन डायलपॅड"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"फोन"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"कॉल इतिहास"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> ला कॉल करा"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"चुकीच्या नंबरचा अहवाल द्या"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"कॉल करण्यापूर्वी नंबर संपादित करा"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"संपर्कांमध्‍ये जोडा"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"कॉल इतिहासातून हटवा"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"कॉल इतिहास साफ करा"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"व्हॉइसमेल हटवा"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"व्हॉइसमेल सामायिक करा"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"आपला कॉल लॉग रिक्त आहे"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"एक कॉल करा"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"कॉल इतिहास"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"चुकीच्या नंबरचा अहवाल द्या"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"नंबर कॉपी करा"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"लिप्यंतरण कॉपी करा"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"नंबर अवरोधित करा"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> अवरोधित केला"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"नंबर अनावरोधित करा"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> अनावरोधित केला"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"पूर्ववत करा"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"हटवा"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"कॉल करण्यापूर्वी नंबर संपादित करा"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"कॉल इतिहास साफ करा"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"व्हॉइसमेल हटवा"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"व्हॉइसमेलचे संग्रहण करा"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"व्हॉइसमेल सामायिक करा"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"व्हॉइसमेल आढळले"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"व्हॉइसमेल संग्रहित केले"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"पूर्ववत करा"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"संग्रहणावर जा"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"कॉल इतिहास साफ करायचा?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"हे आपल्या कॉल इतिहासातून सर्व कॉल हटवेल"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"कॉल इतिहास साफ करत आहे…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"फोन"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"सुटलेला कॉल"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"कार्याचा कॉल चुकविला"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"सुटलेले कॉल"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> सुटलेले कॉल"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"पुन्हा कॉल करा"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"संदेश"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> व्हॉइसमेल </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> व्हॉइसमेल </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> कडील नवीन व्हॉइसमेल"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"व्हॉइसमेल प्ले करू शकलो नाही"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"बफर करत आहे..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"व्हॉइसमेल लोड करत आहे…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"व्हॉइसमेल संग्रहित करीत आहे..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"व्हॉइसमेल लोड करू शकलो नाही"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"केवळ व्हॉइसमेल सह कॉल"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"केवळ येणारे कॉल"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"कॉल इतिहास"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"अधिक पर्याय"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"डायल पॅड"</string>
- <string name="menu_copy" msgid="6108677035381940698">"कॉपी करा"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"केवळ केले जाणारे दर्शवा"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"केवळ येणारे दर्शवा"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"केवळ सुटलेले दर्शवा"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"जाणारे व्हिडिओ कॉल"</string>
<string name="type_missed_video" msgid="954396897034220545">"सुटलेला व्हिडिओ कॉल"</string>
<string name="type_voicemail" msgid="5153139450668549908">"व्हॉइसमेल"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"नाकारलेला कॉल"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"अवरोधित केलेला कॉल"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"येणारे कॉल"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"व्हॉइसमेल प्ले करा"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> संपर्क पहा"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> ला कॉल करा"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> साठी संपर्क तपशील"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"नवीन व्हॉइसमेल."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> कॉल."</string>
<string name="description_video_call" msgid="2933838090743214204">"व्हिडिओ कॉल."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> वर SMS पाठवा"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"सार्वजनिक फोन"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> सेकंद"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> मिनिट <xliff:g id="SECONDS">%s</xliff:g> सेकंद"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> रोजी <xliff:g id="TIME">%2$s</xliff:g> वाजता"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"या नंबरवर कॉल करू शकत नाही"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"व्हॉइसमेल सेट करण्‍यासाठी, मेनू आणि सेटिंग्‍ज वर जा."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"व्हॉइसमेलला कॉल करण्यासाठी, प्रथम विमान मोड बंद करा."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"व्हॉइस शोध उपलब्ध नाही"</string>
<string name="call_not_available" msgid="8941576511946492225">"फोन अनुप्रयोग अक्षम केला गेला असल्याने फोन कॉल करणे शक्य नाही."</string>
<string name="activity_not_available" msgid="2287665636817987623">"या डिव्हाइसवर त्यासाठी कोणताही अॅप नाही"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"नाव किंवा फोन नंबर प्रविष्ट करा"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"आपल्‍याकडे कोणतेही सुटलेले कॉल नाहीत."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"आपला व्हॉइसमेल इनबॉक्स रिक्त आहे."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"संपर्क शोधा"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"नंबर जोडा किंवा संपर्क शोधा"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"आपला कॉल इतिहास रिक्त आहे"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"एक कॉल करा"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"आपल्‍याकडे कोणतेही सुटलेले कॉल नाहीत."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"आपला व्हॉइसमेल इनबॉक्स रिक्त आहे."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"आपले व्हॉइसमेल संग्रहण रिक्त आहे."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"केवळ आवडीचे दर्शवा"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"इतिहास"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"कॉल इतिहास"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"व्हॉइसमेल संग्रहण"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"सर्व"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"सुटलेले"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"व्हॉइसमेल"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"नवीन, सरलीकृत अवरोधित करणे"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"आपले अधिक चांगले संरक्षण करण्यासाठी, अवरोधित करणे ज्या पद्धतीने कार्य करते ते बदलण्याची फोनला गरज आहे. आपले अवरोधित केलेले नंबर कॉल आणि मजकूर थांबवतील आणि कदाचित इतर अॅप्ससह सामायिक केले जाऊ शकतील."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"अनुमती द्या"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> अवरोधित करायचा?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"या नंबर वरून केलेले कॉल अवरोधित केले जातील आणि व्हॉइसमेल स्वयंचलितपणे हटविले जातील."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"या नंबर वरून केलेले कॉल अवरोधित केले जातील परंतु कॉलर आपल्‍यासाठी व्हॉइसमेल सोडण्यात अद्याप सक्षम असू शकेल."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"आपल्याला या नंबर वरून कॉल किंवा मजकूर प्राप्त होणार नाहीत."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"अवरोधित करा"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> ला अनावरोधित करायचे?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"अनावरोधित करा"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"स्पीड डायल"</string>
- <string name="tab_recents" msgid="929949073851377206">"अलीकडील"</string>
+ <string name="tab_history" msgid="2563144697322434940">"कॉल इतिहास"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"संपर्क"</string>
<string name="tab_voicemail" msgid="155024725947496746">"व्हॉइसमेल"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"आवडी मधून काढले"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"संपर्कांमध्‍ये जोडा"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS पाठवा"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"व्‍हिडिओ कॉल करा"</string>
- <string name="show_call_history" msgid="1141502332266697170">"संपूर्ण कॉल इतिहास पहा"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"नंबर अवरोधित करा"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> नवीन सुटलेले कॉल"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"अद्याप आपल्‍या स्पीड डायलवर कोणीही नाही"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"एक आवडते जोडा"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"सर्व नंबर पाहण्यासाठी प्रतिमेस स्पर्श करा किंवा पुन्हा क्रम लावण्यासाठी स्पर्श करा आणि धरून ठेवा"</string>
<string name="remove_contact" msgid="1080555335283662961">"काढा"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"व्हिडिओ कॉल"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"संदेश पाठवा"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"एक संदेश पाठवा"</string>
<string name="call_log_action_details" msgid="701345508704970622">"कॉल तपशील"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> वर कॉल करा"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> वरून कॉल सुटला."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> वरून कॉलला उत्तर दिले."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> कडून न वाचलेला व्हॉइसमेल."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> कडून व्हॉॅइसमेल."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> वर कॉल करा."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> वर"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> द्वारे"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> द्वारे"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> वर, <xliff:g id="NUMBER">%2$s</xliff:g> द्वारे"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> द्वारे <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"कॉल करा"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> वर कॉल करा"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"व्हिडिओ कॉल <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"द्रुत प्रतिसाद"</string>
<string name="call_settings_label" msgid="313434211353070209">"कॉल"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"कॉल अवरोधित करणे"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"कॉल अवरोधित करणे तात्पुरते बंद"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"आपण मागील 48 तासात या फोनवरून आणीबाणी सेवांशी संपर्क साधला असल्याने कॉल अवरोधित करणे अक्षम केले गेले आहे. एकदा 48 तासांचा कालावधी कालबाह्य झाला की ते स्वयंचलितपणे पुन्हा सक्षम केले जाईल."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"नंबर अायात करा"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"आपण पूर्वीपासून काही कॉलरना स्वयंचलितपणे इतर अॅप्सद्वारे व्हॉइसमेलमध्ये पाठविण्यासाठी चिन्हांकित केले आहे."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"नंबर पहा"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"आयात करा"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"आयात अयशस्वी झाले"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"व्हॉइसमेल संग्रहित करण्यात अयशस्वी झाले."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"नंबर अनावरोधित करा"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"नंबर जोडा"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"या नंबरवरून केलेले कॉल अवरोधित केले जातील आणि व्हॉइसमेल स्वयंचलितपणे हटविले जातील."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"या नंबर वरून केलेले कॉल अवरोधित केले जातील परंतु ते आपल्‍यासाठी व्हॉइसमेल सोडण्यात अद्याप कदाचित सक्षम असतील."</string>
+ <string name="block_list" msgid="7760188925338078011">"अवरोधित केलेले नंबर"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> अवैध आहे."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> आधीच अवरोधित केलेला आहे."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"कॉल अवरोधित करणे 48 तासांसाठी अक्षम केले"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"एक आणीबाणीचा कॉल केल्‍याने अक्षम केले."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"कॉल करण्याची खाती"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"चालू करा"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"परवानग्या सेट करा"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"स्पीड डायल सक्षम करण्‍यासाठी,\n संपर्क परवानगी चालू करा."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"आपला कॉल लॉग पाहण्यासाठी,\n फोन परवानगी चालू करा."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"आपले संपर्क पाहण्‍यासाठी,\n संपर्क परवानगी चालू करा."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"आपल्या व्हॉइसमेलमध्‍ये प्रवेश करण्‍यासाठी,\n फोन परवानगी चालू करा."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"स्पीड डायल सक्षम करण्‍यासाठी, संपर्क परवानगी चालू करा."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"आपला कॉल लॉग पाहण्‍यासाठी, फोन परवानगी चालू करा."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"आपले संपर्क पाहण्‍यासाठी, संपर्क परवानगी चालू करा."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"आपल्‍या व्हॉइसमेलमध्‍ये प्रवेश करण्‍यासाठी, फोन परवानगी चालू करा."</string>
<string name="permission_no_search" msgid="84152933267902056">"आपले संपर्क शोधण्‍यासाठी, संपर्क परवानग्या चालू करा."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"कॉल करण्‍यासाठी,\n फोन परवानगी चालू करा."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"कॉल करण्यासाठी, फोन परवानगी चालू करा."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"फोन अॅपला सिस्टीम स‍ेटिंग्जमध्ये लिहिण्याची परवानगी नाही."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"अवरोधित केले"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> सक्रिय आहे"</string>
</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 4d58c4ebd..bb05c1a9e 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Pad Dail Telefon"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Sejarah panggilan"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Panggil <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Laporkan nombor yang tidak tepat"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edit nombor sebelum panggilan"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Tambahkan pada kenalan"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Padamkan dari sejarah panggilan"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Kosongkan sejarah panggilan"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Padamkan mel suara"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Kongsi mel suara"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Log panggilan anda kosong"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Buat panggilan"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Sejarah panggilan"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Laporkan nombor yang tidak tepat"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Salin nombor"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Salin transkripsi"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Sekat nombor"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> disekat"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Nyahsekat nombor"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> dinyahsekat"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"BUAT ASAL"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Padam"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edit nombor sebelum memanggil"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Kosongkan sejarah panggilan"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Padamkan mel suara"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arkibkan mel suara"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Kongsi mel suara"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Mel suara dipadamkan"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Mel suara diarkibkan"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"BUAT ASAL"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"PRG KE ARKIB"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Kosongkan sejarah panggilan?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Tindakan ini akan memadamkan semua panggilan daripada sejarah anda"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Mengosongkan sejarah panggilan..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Panggilan terlepas"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Panggilan terlepas daripada tempat kerja"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Panggilan terlepas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> panggilan terlepas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Panggil balik"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mesej"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Mel suara </item>
<item quantity="one">Mel suara</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Mel suara baharu daripada <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Tidak dapat memainkan mel suara"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Menimbal…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Memuatkan mel suara..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Mengarkib mel suara…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Tidak dapat memuatkan mel suara"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Panggilan dengan mel suara sahaja"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Panggilan masuk sahaja"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Sejarah Panggilan"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Lagi pilihan"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"pad dail"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Salin"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Tunjuk panggilan keluar shj"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Tunjuk panggilan masuk shj"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Tunjuk panggilan terlepas shj"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Panggilan video keluar"</string>
<string name="type_missed_video" msgid="954396897034220545">"Telah terlepas panggilan video"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Mel suara"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Panggilan yang ditolak"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Panggilan yang disekat"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Panggilan masuk"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Mainkan mel suara"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Lihat kenalan <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Panggil <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Butiran hubungan untuk <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Mel suara baharu."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> panggilan."</string>
<string name="description_video_call" msgid="2933838090743214204">"Panggilan video."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Hantar SMS kepada <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefon Awam"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> saat"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> saat"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> pada <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Tidak dapat menghubungi nombor ini"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Untuuk menyediakan mel suara, pergi ke Menu &gt; Tetapan."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Untuk membuat panggilan ke mel suara, mula-mula matikan mod Pesawat."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Carian suara tidak tersedia"</string>
<string name="call_not_available" msgid="8941576511946492225">"Tidak boleh membuat panggilan telefon kerana aplikasi Telefon telah dilumpuhkan."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Tiada apl untuk tindakan itu pada peranti ini"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Masukkan nama atau nombor tel"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Anda tiada panggilan terlepas."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Peti masuk mel suara anda kosong."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Cari kenalan"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Tambahkn no. atau cari kenalan"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Sejarah panggilan anda kosong"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Buat panggilan"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Anda tiada panggilan terlepas."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Peti masuk mel suara anda kosong."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arkib mel suara anda kosong."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Tunjukkan kegemaran sahaja"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Sejarah"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Sejarah Panggilan"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arkib Mel Suara"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Semua"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Tidak dijawab"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Mel suara"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Penyekatan mudah yang baharu"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Untuk melindungi anda dengan lebih berkesan, Telefon perlu menukar cara penyekatan berfungsi. Nombor yang disekat akan menghentikan panggilan dan teks serta boleh dikongsi dengan apl lain."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Benarkan"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Sekat <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Panggilan daripada nombor ini akan disekat dan mel suara akan dipadamkan secara automatik."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Panggilan daripada nombor ini akan disekat, tetapi pemanggil masih boleh meninggalkan mel suara kepada anda."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Anda tidak akan menerima panggilan atau teks daripada nombor ini lagi."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"SEKAT"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Nyahsekat <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"NYAHSEKAT"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Dail laju"</string>
- <string name="tab_recents" msgid="929949073851377206">"Terkini"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Sejarah Panggilan"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kenalan"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Mel suara"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Dialih keluar daripada kegemaran"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Tambahkan pada kenalan"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Hantar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Buat panggilan video"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Lihat sejarah panggilan penuh"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Sekat nombor"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> panggilan terlepas baharu"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Belum ada sesiapa pada dail pantas anda"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Tambahkan kegemaran"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Sentuh imej untuk melihat semua nombor atau sentuh &amp; tahan untuk menyusun semula"</string>
<string name="remove_contact" msgid="1080555335283662961">"Alih keluar"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Panggilan video"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Hantar Mesej"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Hantar mesej"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Butiran panggilan"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Panggil <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Panggilan tidak dijawab daripada <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Panggilan telah dijawab daripada <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Mel suara yang belum dibaca daripada <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Mel suara daripada <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Buat panggilan kepada <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"pada <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"melalui <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"melalui <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"pada <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, melalui <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> melalui <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Panggil"</string>
<string name="description_call_action" msgid="4000549004089776147">"Panggil <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Panggilan video <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respons pantas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Panggilan"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Sekatan panggilan"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Sekatan panggilan dimatikan sementara"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Sekatan panggilan telah dilumpuhkan kerana anda menghubungi perkhidmatan kecemasan daripada telefon ini dalam masa 48 jam yang lalu. Ciri ini akan didayakan semula secara automatik apabila tempoh 48 jam berakhir."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Import nombor"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Sebelum ini anda telah menandakan beberapa pemanggil dihantar ke mel suara secara automatik melalui aplikasi lain."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Lihat nombor"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Import"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Pengimportan gagal"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Gagal mengarkib mel suara."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Nyahsekat nombor"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Tambah nombor"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Panggilan daripada nombor ini akan disekat dan mel suara akan dipadamkan secara automatik."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Panggilan daripada nombor ini akan disekat, tetapi mereka masih boleh meninggalkan mel suara kepada anda."</string>
+ <string name="block_list" msgid="7760188925338078011">"Nombor yang disekat"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> tidak sah."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> sudah disekat."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Sekatan panggilan dilumpuhkan selama 48 jam"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Dilumpuhkan kerana panggilan kecemasan telah dibuat."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Akaun panggilan"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Hidupkan"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Tetapkan kebenaran"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Untuk mendayakan dail pantas,\n hidupkan kebenaran Kenalan."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Untuk melihat log panggilan anda,\n hidupkan kebenaran Telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Untuk melihat kenalan anda,\n hidupkan kebenaran Kenalan."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Untuk mengakses mel suara anda,\n hidupkan kebenaran Telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Untuk mendayakan dail laju, hidupkan kebenaran Kenalan."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Untuk melihat log panggilan anda, hidupkan kebenaran Telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Untuk melihat kenalan anda, hidupkan kebenaran Kenalan."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Untuk mengakses mel suara anda, hidupkan kebenaran Telefon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Untuk mencari kenalan anda, hidupkan kebenaran Kenalan."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Untuk membuat panggilan,\n hidupkan kebenaran Telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Untuk membuat panggilan, hidupkan kebenaran Telefon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Apl telefon tiada kebenaran untuk menulis ke tetapan sistem."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Disekat"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> aktif"</string>
</resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 1f87a4b1f..85f548432 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ဖုန်း"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ဖုန်း"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ဖုန်းခလုတ်ခုံ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ဖုန်း"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ခေါ်ဆိုမှု မှတ်တမ်း"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> ကိုခေါ်ပါ"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"မတိကျသော နံပါတ်အား သတင်းပို့ပါ"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ဖုန်းမခေါ်ခင် နံပါတ်အားပြင်ရန်"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"အဆက်အသွယ်သို့ ပေါင်းထည့်ရန်"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ခေါ်ဆိုမှု မှတ်တမ်း ထဲမှာ ဖျက်ရန်"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ခေါ်ဆိုမှု မှတ်တမ်း ရှင်းရန်"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"အသံပို့စာ အားဖျက်ရန်"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"အသံပို့စာ အား မျှဝေရန်"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"သင်၏ ခေါ်ဆိုမှုမှတ်တမ်းတွင် ဘာမှ မရှိပါ။"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ဖုန်းခေါ်ရန်"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ခေါ်ဆိုမှု မှတ်တမ်း"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"မမှန်ကန်သည့် နံပါတ်အား သတင်းပို့ပါ"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"နံပါတ်ကိုကူးရန်"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"အသံမှစာအဖြစ်ဘာသာပြန်ခြင်းကို ကူးရန်"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"နံပါတ်ကို ပိတ်ရန်"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ကိုပိတ်ဆို့လိုက်ပါပြီ"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"နံပါတ်ကို ဖွင့်မည်"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> ကိုပိတ်ဆို့ခြင်းမှ ဖယ်ရှားလိုက်ပါပြီ"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"နောက်ပြန်လုပ်ပါ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"ဖျက်ရန်"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"မခေါ်ဆိုမီ နံပါတ်ကိုတည်းဖြတ်ရန်"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"ခေါ်ဆိုမှု မှတ်တမ်း ရှင်းရန်"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"အသံပို့စာ အားဖျက်ရန်"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"အသံမေးလ်ကို မှတ်တမ်းသိမ်းပါ"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"အသံမေးလ်ကို မျှဝေပါ"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"အသံမေးလ် ရှာတွေ့ခဲ့"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"သိုလှောင်ထားသည့် အသံစာ"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ပြန်ဖျက်ရန်"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"မှတ်တမ်းသို့ သွားပါ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"ခေါ်ဆိုမှု မှတ်တမ်းကို ဖယ်ရှားရမလား။"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"သင့်မှတ်တမ်းထဲရှိ ခေါ်ဆိုမှုများအားလုံးကို ဖျက်ပါမည်"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"ခေါ်ဆိုမှု မှတ်တမ်းကို ရှင်းနေ…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ဖုန်း"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"လွတ်သွားသော ခေါ်ဆိုမှု"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"လွတ်သွားသော အလုပ်ဖုန်းခေါ်ဆိုမှု"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"လွတ်သွားသော ခေါ်ဆိုမှုများ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"လွတ်သွားသော ခေါ်ဆိုမှု <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ပြန်ခေါ်ပါ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"မက်ဆေ့ဂျ်"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> အသံမေးလ်များ </item>
<item quantity="one"> အသံမေးလ်</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> ဆီမှ အသံစာ အသစ်"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"အသံမေးလ်ကို ဖွင့်မပေးနိုင်ခဲ့"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"ယာယီကြားခံနေစဉ်…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"အသံမေးလ်ကို တင်ပေးနေ…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"အသံစာတိုကို သိမ်းနေသည်..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"အသံမေးလ်ကို တင်မပေးနိုင်ခဲ့"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"အသံမေးလ်ပါသော အဝင်ခေါ်ဆိုမှုများသာ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"အဝင်ဖုန်းသာ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ယခင်ခေါ်ဆိုမှုများ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ပိုမိုရွေးချယ်စရာများ"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ဖုန်းနံပါတ်ကွက်"</string>
- <string name="menu_copy" msgid="6108677035381940698">"ကူးခြင်း"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"အထွက်ခေါ်ဆိုခြင်းများသာပြပါ"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"အဝင်ခေါ်ဆိုမှုသာ ပြပါ"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"လွတ်သွားသော ခေါ်ဆိုမှုများသာပြပါ"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ပြုလုပ်နေဆဲ ဗီဒီယို ခေါ်ဆိုမှု"</string>
<string name="type_missed_video" msgid="954396897034220545">"လွတ်သွားသော ဗီဒီယို ခေါ်ဆိုမှု"</string>
<string name="type_voicemail" msgid="5153139450668549908">"အသံစာပို့စနစ်"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ငြင်းဆိုခဲ့သည့် ခေါ်ဆိုမှု"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ခေါ်ဆိုမှု ပိတ်ဆို့ထား"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"အဝင်ခေါ်ဆိုမှုများ"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"အသံပို့စာ နားထောင်ရန်"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> လိပ်စာကြည့်ရန်"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> ကိုခေါ်ပါ"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> ရဲ့ အဆက်အသွယ် အသေးစိတ်"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"အသံပို့စာ အသစ်"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ခါ"</string>
<string name="description_video_call" msgid="2933838090743214204">"ဗီဒီယို ခေါ်ဆိုမှု"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>ထံသို့ SMS ပို့ရန်"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"ငွေပေးရသည့်ဖုန်း"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> စက္ကန့်"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> မိနစ် <xliff:g id="SECONDS">%s</xliff:g> စက္ကန့်"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> ၌"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ဒီနံပါတ်ကို မခေါ်ဆိုနိုင်ပါ"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"အသံစာပို့စနစ်ကို ပြင်ဆင်ရန်၊ မီနူး ပြီးနောက် ဆက်တင် သို့သွားပါ"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"အသံစာပို့စနစ်ကို ခေါ်ဆိုမှုပြုရန် လေယာဉ်ပျံပေါ်သုံးစနစ်ကို ပိတ်ပါ"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"အသံဖြင့် ရှာဖွေမှု မရှိ"</string>
<string name="call_not_available" msgid="8941576511946492225">"ဖုန်း အပလီကေးရှင်းကို ပိတ်ထား၍ ဖုန်း ခေါ်ဆိုမှု မပြုလုပ်နိုင်ခဲ့ပါ။"</string>
<string name="activity_not_available" msgid="2287665636817987623">"ဒီကိရိယာထဲမှာ အဲဒါ့အတွက် အက်ပ်မရှိပါ"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"အမည် သို့မဟုတ် ဖုန်း နံပါတ်ကို ထည့်ပါ"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"သင့်တွင် လွတ်သွားသည့်ခေါ်ဆိုမှုများ မရှိပါ။"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"သင့်အသံမေးလ် စာတိုက်ပုံးတွင် ဘာမှမရှိပါ။"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"အဆက်အသွယ်များရှာပါ"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"နံပါတ်ပေါင်းထည့်ပါ သို့မဟုတ် အဆက်အသွယ်များ ရှာဖွေပါ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"သင့်ခေါ်ဆိုမှတ်တမ်းတွင် ဘာမှမရှိပါ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ဖုန်းခေါ်ရန်"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"သင့်တွင် လွတ်သွားသည့်ခေါ်ဆိုမှုများ မရှိပါ။"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"သင့်အသံမေးလ် စာတိုက်ပုံးတွင် ဘာမှမရှိပါ။"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"သင့် အသံမေးလ်မှတ်တမ်းတွင် ဘာမှမရှိပါ။"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"အနှစ်သက်ဆုံးများသာ ပြပါ"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"မှတ်တမ်း"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ခေါ်ဆိုမှုသမိုင်း"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"အသံမေးလ် မှတ်တမ်း"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"အားလုံး"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"မကိုင်မိလိုက်သော"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"အသံစာ"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"အသစ်၊ ရိုးရှင်းသည့် ပိတ်ဆို့မှု"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"သင့်အား ပိုမိုကောင်းမွန်စွာကာကွယ်နိုင်ရန်၊ ဖုန်းသည် ပိတ်ဆို့ခြင်းအလုပ်လုပ်ပုံကို ပြောင်းလဲရန် လိုအပ်ပါသည်။ သင် ပိတ်ဆို့ထားသည့် နံပါတ်များမှ ခေါ်ဆိုခြင်းနှင့် စာပို့ခြင်းများကို ရပ်တန့်လိုက်မည်ဖြစ်ပြီး၊ ၎င်းနံပါတ်များကို အခြားအက်ပ်များဖြင့်လည်း မျှဝေနိုင်ပါသည်။"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"ခွင့်ပြုမည်"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g>ကို ပိတ်ဆို့မလား။"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ဤနံပါတ်မှခေါ်ဆိုမှုများကို ပိတ်ဆို့လိုက်မည်ဖြစ်ပြီး အသံမေးလ်များကို အလိုအလျောက် ဖျက်လိုက်ပါမည်။"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ဤနံပါတ်မှ ခေါ်ဆိုမှုများကို ပိတ်ဆို့လိုက်ပါမည်၊ သို့သော် ၎င်းတို့သည် သင့်ကို အသံမေးလ်ချန်ခဲ့နိုင်ပါသည်။"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ဤနံပါတ်ထံမှ ဖုန်းခေါ်ဆိုမှုများနှင့် စာများကို သင် ထပ်မံရရှိတော့မည် မဟုတ်ပါ။"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ပိတ်ဆို့ပါ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> အား ပိတ်ဆို့မှု ဖယ်ရှားလိုက်ရမလား။"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ပိတ်ဆို့ခြင်းမှ ဖယ်ရှားပါ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"အမြန် နံပါတ်လှည့်မှု"</string>
- <string name="tab_recents" msgid="929949073851377206">"မကြာမီက"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ခေါ်ဆိုမှု မှတ်တမ်း"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"အဆက်အသွယ်များ"</string>
<string name="tab_voicemail" msgid="155024725947496746">"အသံမေးလ်"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"အနှစ်သက်ဆုံးများထဲမှာ ထုတ်လိုက်ပါပြီ"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"အဆက်အသွယ်သို့ ပေါင်းထည့်ရန်"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"စာတို ပို့ရန်"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ဗီဒီယို ဖုန်းခေါ်ရန်"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ခေါ်ဆိုမှု မှတ်တမ်း အပြည့်ကို ကြည့်ရန်"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"နံပါတ်ကို ပိတ်ဆို့ရန်"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"လွတ်သွားသောဖုန်း <xliff:g id="NUMBER">%s</xliff:g> ခါ"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"သင်၏အမြန်ခေါ်စာရင်းတွင် မည်သူမျှ မရှိသေးပါ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"အနှစ်သက်ဆုံးတစ်ခု ထည့်ရန်"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"နံပါတ်များ အားလုံးကိုကြည့်ရန် ပုံကို ထိပါ သို့မဟုတ် ပြန်စီရန် ထိလျက် &amp; ကိုင်ထားပါ"</string>
<string name="remove_contact" msgid="1080555335283662961">"ဖယ်ရှာခြင်း"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ဗီဒီယို ခေါ်ဆိုမှု"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"စာ ပို့ရန်"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"စာ တစ်စောင် ပို့ပါ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ဖုန်းခေါ်မှု အသေးစိတ်အချက်အလက်"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> အား ခေါ်ပါ"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>၊ <xliff:g id="TYPEORLOCATION">^2</xliff:g>၊ <xliff:g id="TIMEOFCALL">^3</xliff:g>၊ <xliff:g id="PHONEACCOUNT">^4</xliff:g> မှ ခေါ်ဆိုမှု လွတ်သွား၏။"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>၊ <xliff:g id="TYPEORLOCATION">^2</xliff:g>၊ <xliff:g id="TIMEOFCALL">^3</xliff:g>၊ <xliff:g id="PHONEACCOUNT">^4</xliff:g> မှ ခ​ေါ်ဆိုမှုအား ဖြေထား၏။"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>၊ <xliff:g id="TYPEORLOCATION">^2</xliff:g>၊ <xliff:g id="TIMEOFCALL">^3</xliff:g>၊ <xliff:g id="PHONEACCOUNT">^4</xliff:g>ထံမှ အသံစာကို ဖတ်ပါ။"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>၊ <xliff:g id="TYPEORLOCATION">^2</xliff:g>၊ <xliff:g id="TIMEOFCALL">^3</xliff:g>၊ <xliff:g id="PHONEACCOUNT">^4</xliff:g>ထံမှ အသံစာ။"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>၊ <xliff:g id="TYPEORLOCATION">^2</xliff:g>၊ <xliff:g id="TIMEOFCALL">^3</xliff:g>၊ <xliff:g id="PHONEACCOUNT">^4</xliff:g> အား ခေါ်ခြင်း။"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> ၌"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> မှတစ်ဆင့်"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> မှတစ်ဆင့်"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> တွင်၊<xliff:g id="NUMBER">%2$s</xliff:g> မှတစ်ဆင့်"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> <xliff:g id="NUMBER">%2$s</xliff:g> မှတစ်ဆင့်"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ခေါ်ဆိုမှု"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> အားခေါ်ရန်"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ကိုဗီဒီယိုခေါ်ဆိုမည်။"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"အမြန် တုံ့ပြန်ချက်များ"</string>
<string name="call_settings_label" msgid="313434211353070209">"ခေါ်ဆိုမှုများ"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ခေါ်ဆိုမှု ပိတ်ဆို့ခြင်း"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ခေါ်ဆိုမှုပိတ်ဆို့ခြင်း ယာယီပိတ်ထားသည်"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"သင်သည် လွန်ခဲ့သည့် ၄၈ နာရီအတွင်း ဤဖုန်းဖြင့် အရေးပေါ်ဌာနကိုဖုန်း ခေါ်ဆိုခဲ့သောကြောင့် ခေါ်ဆိုမှုပိတ်ဆို့ခြင်းကို ဖြုတ်ထားသည်။ ၄၈ နာရီကျော်လွန်သည်နှင့် ၎င်းကိုအလိုအလျောက် ပြန်ဖွင့်ပေးပါမည်။"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"နံပါတ်များ သွင်းရန်"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"သင်သည် ယခင်က အချို့ခေါ်ဆိုသူများကို အလိုအလျောက် အခြား အက်ပ်များမှ တဆင့် အသံစာသို့ ပို့ရန် မှတ်ပေးခဲ့သည်။"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"နံပါတ်များကို ကြည့်ရန်"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"တင်သွင်းရန်"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"တင်သွင်းမှု မအောင်မြင်ပါ"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"အသံစာတိုကို သိမ်း၍မရပါ။"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"နံပါတ်ကို ဖွင့်မည်"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"နံပါတ် ထည့်သွင်းပါ"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ဤနံပါတ်များမှ ခေါ်ဆိုမှုများကို ပိတ်ဆို့လိုက်မည်ဖြစ်ပြီး အသံမေးလ်များကို အလိုအလျောက် ဖျက်လိုက်ပါမည်။"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ဤနံပါတ်များမှ ခေါ်ဆိုမှုများကို ပိတ်ဆို့လိုက်ပါမည်၊ သို့သော် ၎င်းတို့သည် သင့်ကို အသံမေးလ်ချန်ခဲ့နိုင်ပါသည်။"</string>
+ <string name="block_list" msgid="7760188925338078011">"ပိတ်ထားသည့် နံပါတ်များ"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> သည်တရားမဝင်ပါ။"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> အားပိတ်ဆို့ထားပြီးပါပြီ။"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ခေါ်ဆိုမှုပိတ်ဆို့ခြင်းကို ၄၈ နာရီပိတ်ထားသည်"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"အရေးပေါ်ခေါ်ဆိုမှု ပြုလုပ်ခဲ့သည့်အတွက် ပိတ်ထားပါသည်။"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"ခေါ်ဆိုသော အကောင့်များ"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ဖွင့်ထားရန်"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ခွင့်ပြုချက်များ သတ်မှတ်မည်"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"လျှင်မြန်စွာ ဖုန်းခေါ်ဆိုရန်၊ \n အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"သင့်ခေါ်ဆိုမှု မှတ်တမ်းကိုကြည့်ရန်၊ \n ဖုန်းခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"သင့်အဆက်အသွယ်များကို ကြည့်ရန်၊ \n အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"သင့်အသံမေးလ်ကို အသုံးပြုရန်၊ \n ဖုန်းခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"မြန်နှုန်းမြင့်ဖုန်းခေါ်ဆိုမှုကို ဖွင့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ခေါ်ဆိုမှုမှတ်တမ်းကို ကြည့်ရန်၊ ဖုန်းခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"အဆက်အသွယ်များကိုကြည့်ရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"အသံမေးလ်ကိုအသုံးပြုရန်၊ ဖုန်းခွင့်ပြုချက်ကိုဖွင့်ပါ။"</string>
<string name="permission_no_search" msgid="84152933267902056">"သင့်အဆက်အသွယ်များကို ရှာဖွေရန်၊ အဆက်အသွယ်ခွင့်ပြုချက်များကို ဖွင့်ပါ။"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ဖုန်းခေါ်ဆိုရန်၊ \n ဖုန်းခွင့်ပြုချက်ကို ဖွင့်ပါ။"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ဖုန်းခေါ်ဆိုရန်၊ ဖုန်းခွင့်ပြုချက်ကိုဖွင့်ပါ။"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ဖုန်း အက်ပ်ဆီတွင် စနစ် ဆက်တင်များသို့ ရေးသားခွင့် မရှိပါ။"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ပိတ်ဆို့ထားသည်"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ရှိနေသည်"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index fb51b6422..dd87d64df 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefontastatur"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Anropslogg"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ring <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Rapportér feil nummer"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Rediger nummer før anrop"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Legg til for en kontakt"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Slett fra anropsloggen"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Slett anropsloggen"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Slett talepost"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Del talepost"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Samtaleloggen din er tom"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Ring"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Anropslogg"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Rapportér feil nummer"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiér nummeret"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiér transkripsjonen"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokkér nummeret"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> er blokkert"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Opphev blokkeringen av nummeret"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Blokkeringen av <xliff:g id="NUMBER">%1$s</xliff:g> er opphevet"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANGRE"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Slett"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Endre nummeret før du ringer"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Slett anropsloggen"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Slett talepost"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arkivér taleposten"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Del talepost"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Taleposten er slettet"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Taleposten ble arkivert"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANGRE"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"GÅ TIL ARKIV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Vil du slette anropsloggen?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Dette sletter alle anrop fra loggen"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Sletter anropsloggen …"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Ring"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Tapt anrop"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Tapt jobbanrop"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Tapte anrop"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> tapte anrop"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Ring tilbake"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Melding"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> talemeldinger </item>
<item quantity="one">talemelding</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nye talemeldinger fra <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Kunne ikke spille av talepost"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Bufrer …"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Laster inn talepost …"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arkiverer taleposten …"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Kunne ikke laste inn taleposten"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Bare anrop som gikk til talepostkasse"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Bare innkommende anrop"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Anropslogg"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Flere alternativer"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tastatur"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiér"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Vis bare utgående"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Vis bare innkommende"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Vis bare tapte"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Utgående videoanrop"</string>
<string name="type_missed_video" msgid="954396897034220545">"Ubesvart videoanrop"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Talepostkasse"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Avvist anrop"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokkert anrop"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Innkommende samtaler"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Spill av talemelding"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Se kontakten <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ring til <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktinformasjon for <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Ny talemelding."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> samtaler."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videoanrop."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Send SMS til <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefonkiosk"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sek"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Kan ikke ringe dette nummeret"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Du konfigurerer talepost ved å gå til Meny &amp;gt Innstillinger"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Du må slå av flymodus før du kan sjekke talepostkassen."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Talesøk er ikke tilgjengelig"</string>
<string name="call_not_available" msgid="8941576511946492225">"Kan ikke ringe fordi Telefon-appen er deaktivert."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Det finnes ingen apper for det på denne enheten"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Angi navn eller telefonnummer"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Du har ingen tapte anrop."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Talepostkassen din er tom."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Søk i kontakter"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Legg til nummer eller søk etter kontakter"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Anropsloggen din er tom"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Start en samtale"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Du har ingen tapte anrop."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Talepostkassen din er tom."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Talepostarkivet ditt er tomt."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Vis bare favoritter"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Logg"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Anropslogg"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Talepostarkiv"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Alle"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Ubesvarte"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Talemeldinger"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Ny, forenklet blokkering"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Telefon-appen endrer innstillingene for blokkering for at du skal være bedre beskyttet. Du mottar verken meldinger eller anrop fra blokkerte numre, og det kan hende at disse numrene blir delt med andre apper."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Tillat"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Vil du blokkere <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Anrop fra dette nummeret blokkeres, og talepost blir automatisk slettet."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Anrop fra dette nummeret blokkeres, men den som ringer kan fortsatt legge igjen beskjeder i talepostkassen din."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Du kommer ikke lenger til å motta anrop eller SMS-er fra dette nummeret."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKKÉR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Vil du oppheve blokkeringen av <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"OPPHEV BLOKKERINGEN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Hurtigvalg"</string>
- <string name="tab_recents" msgid="929949073851377206">"Sist brukte"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Anropslogg"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakter"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Talepostkasse"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Fjernet fra favoritter"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Legg til for en kontakt"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Send SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Start en videosamtale"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Se hele anropsloggen"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokkér nummeret"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nye tapte anrop"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Du har ingen på hurtigoppringning ennå"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Legg til en favoritt"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Trykk på bildet for å se alle numre, eller trykk på og hold nede for å omorganisere"</string>
<string name="remove_contact" msgid="1080555335283662961">"Fjern"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videoanrop"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Send meldingen"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Send en melding"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Samtaleinformasjon"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Ring <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Ubesvart anrop fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Besvart anrop fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ulest talepost fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Talepost fra <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Ring til <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"på <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"på <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Ring"</string>
<string name="description_call_action" msgid="4000549004089776147">"Ring <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Start videoanrop med <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Hurtigsvar"</string>
<string name="call_settings_label" msgid="313434211353070209">"Anrop"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Anropsblokkering"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokkering av anrop er midlertidig slått av"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blokkering av anrop er slått av fordi du kontaktet nødtjenester fra denne telefonen i løpet av de siste 48 timene. Funksjonen blir automatisk slått på igjen når perioden på 48 timer er utløpt."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importér numre"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Du markerte tidligere noen anropere for automatisk overføring til talepost via andre apper."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Se numre"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importér"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importeringen mislyktes"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Kunne ikke arkivere taleposten."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Opphev blokkeringen av nummeret"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Legg til nummer"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Anrop fra disse numrene blokkeres, og talepost blir automatisk slettet."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Anrop fra dette nummeret blokkeres, men du kan fortsatt motta talepost."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokkerte telefonnumre"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> er ugyldig."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> er allerede blokkert."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Anropsblokkering er slått av i 48 timer"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Slått av fordi du foretok et nødanrop."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Ringekontoer"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Slå på"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Angi tillatelser"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"For å aktivere hurtigoppringning,\n slå på tillatelsen for Kontakter."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"For å se anropsloggen,\n slå på tillatelsen for telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"For å se kontaktene dine,\n slå på tillatelsen for Kontakter."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"For å få tilgang til talepostkassen,\n slå på tillatelsen for telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"For å slå på hurtigoppringning, slå på Kontakter-tillatelsen."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"For å se samtaleloggen din, slå på Telefon-tillatelsen."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"For å se kontaktene dine, slå på Kontakter-tillatelsen."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"For å få tilgang til talepostkassen, slå på Telefon-tillatelsen."</string>
<string name="permission_no_search" msgid="84152933267902056">"For å søke i kontaktene dine, slå på tillatelser for Kontakter."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"For å ringe,\n slå på tillatelsen for telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"For å ringe, slå på Telefon-tillatelsen."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefonappen har ikke tillatelse til å skrive til systeminnstillinger."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokkert"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> er aktiv"</string>
</resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index 06ebe2326..ac0d4df92 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"फोन"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"फोन"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"फोन डायलप्याड"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"फोन"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"कल इतिहास"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"कल <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"गलत नम्बर रिपोर्ट गर्नुहोस्"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"कल गर्नुअगाडी नम्बर सम्पादन गर्नुहोस्"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"सम्पर्कमा थप्नुहोस्"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"कल इतिहासबाट मेट्नुहोस्"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"कल इतिहास हटाउनुहोस्"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"भ्वाइसमेल हटाउनुहोस्"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"भ्वाइसमेल साझेदारी गर्नुहोस्"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"तपाईँको कल लग खाली छ।"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"कल गर्नुहोस्"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"कल इतिहास"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"गलत नम्बर रिपोर्ट गर्नुहोस्"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"नम्बर प्रतिलिपि गर्नुहोस्"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ट्रान्सक्रिप्शनको प्रतिलिपि बनाउँनुहोस्"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"नम्बरलाई रोक्नुहोस्"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> रोकियो"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"नम्बर माथिको रोक हटाउनुहोस्"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> रोकियो"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"अनडू गर्नुहोस्"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"मेटाउनुहोस्"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"कल गर्न अगाडि नम्बर सम्पादन गर्नुहोस्"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"कल इतिहास मेटाउनुहोस्"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"भ्वाइसमेल हटाउनुहोस्"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"भ्वाइस मेलको अभिलेख राख्नुहोस्"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"भ्वाइस मेल साझेदारी गर्नुहोस्"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"भ्वाइस मेल मेटाइयो"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"भ्वाइस मेलको अभिलेख राखियो"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"अनडू गर्नुहोस्"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"अभिलेखमा जानुहोस्"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"कल इतिहास मेटाउने हो?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"यस कार्यले तपाईँको इतिहासबाट सबै कल मेट्नेछ"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"कल इतिहास हाटउँदै..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"फोन"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"छुटेको कल"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"कामबाट आएको छुटेको कल"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"छुटेका कलहरू"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> छुटेका कलहरू"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"कल फर्काउने"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"सन्देश"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> भ्वाइसमेलहरू </item>
<item quantity="one">भ्वाइसमेल</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g> , <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> बाट नयाँ भ्वाइसमेल"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"भ्वाइस मेललाई बजाउन सकिएन"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"बफरिङ हुदै..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"भ्वाइस मेल लोड हुँदै ..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"भ्वाइस मेलको अभिलेख राख्दै..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"भ्वाइस मेललाई लोड गर्न सकिएन"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"भ्वाइसमेलका साथ मात्र कल गर्नुहोस्"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"आगमन कलहरू मात्र"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"कल इतिहास"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"थप विकल्पहरू"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"डायल प्याड"</string>
- <string name="menu_copy" msgid="6108677035381940698">"प्रतिलिपि गर्नुहोस्"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"बहिर्गमन मात्र देखाउनुहोस्"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"आगमन कल मात्र देखाउनुहोस्"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"छुटेकाहरू मात्र देखाउनुहोस्"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"बहिर्गमन भिडियो कल"</string>
<string name="type_missed_video" msgid="954396897034220545">"छुटेको भिडियो कल"</string>
<string name="type_voicemail" msgid="5153139450668549908">"भ्वाइसमेल"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"अस्वीकृत कल"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"अवरुद्ध कल"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"आगमन कलहरू"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"भ्वाइसमेल बजाउनुहोस्"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> सम्पर्क हेर्नुहोस्"</string>
<string name="description_call" msgid="3443678121983852666">"कल <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> को लागि सम्पर्क विवरणहरू"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"नयाँ भ्वाइसमेल।"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> कल।"</string>
<string name="description_video_call" msgid="2933838090743214204">"भिडियो कल।"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>लाई SMS पठाउनुहोस्"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"पेफोन"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> सेकेन्ड"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> मिनेट <xliff:g id="SECONDS">%s</xliff:g> सकेन्ड"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> मा <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"यस नम्बरलाई कल गर्न सकिंदैन"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"भ्वाइसमेल सेट गर्नका लागि मेनु सेटिङमा जानुहोस्।"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"भ्वाइसमेल कल गर्नका लागि पहिले हवाइजहाज मोड बन्द गर्नुहोस्।"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"आवाज खोजी उपलब्ध छैन"</string>
<string name="call_not_available" msgid="8941576511946492225">"फोन अनुप्रयोग असक्षम गरिएकोले फोन गर्न सकिँदैन।"</string>
<string name="activity_not_available" msgid="2287665636817987623">"यस यन्त्रमा त्यसका लागि कुनै पनि अनुप्रयोग छैन"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"एक नाम वा फोन नम्बर प्रविष्टि गर्नुहोस्"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"तपाईँसँग कुनै छुटेका कलहरू छैनन्।"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"तपाईँको भ्वाइस मेल खाली छ।"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"सम्पर्क ठेगानाहरू खोज्नुहोस्"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"नम्बर थप्नुहोस् वा सम्पर्कहरू खोज्नुहोस्"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"तपाईँको कल इतिहास खाली छ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"कल गर्नुहोस्"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"तपाईँसँग कुनै पनि छुटेका कलहरू छैनन्।"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"तपाईँको भ्वाइस मेल खाली छ।"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"तपाईंको भ्वाइस मेलको अभिलेख खाली छ।"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"मनपर्ने मात्र देखाउनुहोस्"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"इतिहास"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"कल इतिहास"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"भ्वाइस मेलको अभिलेख"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"सबै"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"छुटेको"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Voicemail"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"नयाँ, सरलीकृत रोकावट"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"तपाईँको थप सुरक्षाका लागि फोनको रोकावट गर्ने विधिमा परिवर्तन गर्न आवश्यक छ। तपाईँबाट रोकावट गरिएका नम्बरहरूले अब कल र पाठ सन्देशहरूलाई रोक्नेछन् र यी नम्बरहरूलाई अन्य अनुप्रयोगहरूसँग साझेदारी गरिन सक्छ।"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"अनुमति दिनुहोस्"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> माथि रोक लगाउने हो?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"यो नम्बरबाट सबै कलहरू रोकिनेछन् र भ्वाइसमेलहरू स्वचालित रूपमा मेटिनेछन्।"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"यो नम्बरबाट सबै कलहरू रोकिनेछन्। तर कलरले अझै तपाईँलाई भ्वाइस मेलहरू भने छोड्न सक्नेछन्।"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"तपाईँले अब उप्रान्त यस नम्बरबाट कल वा पाठ सन्देशहरू प्राप्त गर्नुहुने छैन।"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"रोक्नुहोस्"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> माथिको रोक हटाउने हो?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"रोक हटाउनुहोस्"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"द्रूत डायल"</string>
- <string name="tab_recents" msgid="929949073851377206">"हालैका"</string>
+ <string name="tab_history" msgid="2563144697322434940">"कल इतिहास"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"सम्पर्कहरू"</string>
<string name="tab_voicemail" msgid="155024725947496746">"भ्वाइसमेल"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"मनपर्नेहरूबाट हटाइयो"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"सम्पर्कमा थप्नुहोस्"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS पठाउनुहोस्"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"भिडियो कल बनाउनुहोस्"</string>
- <string name="show_call_history" msgid="1141502332266697170">"पूर्ण कल इतिहास हेर्नुहोस्"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"नम्बरलाई निषेध गर्नुहोस्"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> नयाँ छुटेका कलहरु"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"तपाईँको स्पिड डायलमा अझसम्म कोही छैन"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"एक मनपर्ने थप्नुहोस्"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"सबै संख्या हेर्न छविलाई छुनुहोस् वा पुन:क्रमबद्ध गर्न समात्नुहोस्"</string>
<string name="remove_contact" msgid="1080555335283662961">"हटाउँनुहोस्"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"भिडियो कल"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"सन्देश पठाउनुहोस्"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"सन्देश पठाउनुहोस्"</string>
<string name="call_log_action_details" msgid="701345508704970622">"कल विवरणहरु"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> कल गर्नुहोस्"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> बाट मिस्ड कल।"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> बाट कलको जवाफ दिइयो।"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> बाट पढ्न बाँकी भ्वाइस मेल।"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> बाट भ्वाइस मेल।"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> लाई कल गर्नुहोस्।"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> मा"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> मार्फत"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> मार्फत"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> मा, <xliff:g id="NUMBER">%2$s</xliff:g> मार्फत"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> मार्फत <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"कल गर्नुहोस्"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> कल गर्नुहोस्"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> भिडियो कल गर्नुहोस्।"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"द्रुत प्रतिक्रियाहरू"</string>
<string name="call_settings_label" msgid="313434211353070209">"कलहरू"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"कल रोक्दै"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"कल अवरुद्ध अस्थायी रुपमा निष्क्रिय"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"कल अवरुद्ध अस्थायी रुपमा असक्षम गरिएको छ किनभने तपाईँले अन्तिम ४८ घण्टा भित्र यस फोनबाट आपत्कालीन सेवाहरू सम्पर्क गर्नुभयो। एकपटक ४८ घण्टा अवधि समाप्त भएपछि यो स्वचालित रूपले पुनः सक्रिय हुनेछ।"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"नम्बरहरू आयात गर्नुहोस्"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"तपाईँले पहिल्यै केही कल गर्ने व्यक्तिहरूलाई अन्य अनुप्रयोगहरू मार्फत स्वत: रूपमा भ्वाइस मेल पठाउन नै चिन्ह लगाउनु भएको थियो।"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"नम्बरहरू हेर्नुहोस्"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"आयात गर्नुहोस्"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"आयात असफल भयो"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"भ्वाइस मेलको अभिलेख राख्न सकिएन।"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"नम्बरमाथिको रोक हटाउनुहोस्"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"नम्बर थप्नुहोस्"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"यी नम्बरहरूबाट सबै कलहरू रोकिनेछन् र भ्वाइसमेलहरू स्वचालित रूपमा मेटिनेछन्।"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"यो नम्बरहरूबाट सबै कलहरू रोकिनेछन्। तर तिनिहरूले अझै तपाईँलाई भ्वाइस मेलहरू भने छोड्न सक्नेछन्।"</string>
+ <string name="block_list" msgid="7760188925338078011">"रोकिएका नम्बरहरू"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> अमान्य छ।"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> पहिले नै रोकिएको छ।"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"४८ घण्टाको लागि कल निषेध असक्षम गरियो"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"आपत्कालीन कल गरिएको हुनाले असक्षम गरियो।"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"खाता कलिङ"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"सक्रिय पार्नुहोस्"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"अनुमतिहरू सेट गर्नुहोस्"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"स्पिड डायल सक्रिय गर्न, \n सम्पर्क अनुमति सक्रिय गर्नुहोस्।"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"तपाईँको कल लग हेर्न,\n फोन अनुमति सक्रिय गर्नुहोस्।"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"तपाईँका सम्पर्कहरू हेर्न,\n सम्पर्कहरू अनुमति सक्रिय गर्नुहोस्"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"तपाईँको भ्वाइसमेल पहुँच गर्न,\n फोन अनुमति सक्रिय गर्नुहोस्।"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"तीव्र डायल सक्षम गर्न, सम्पर्क अनुमति सक्षम गर्नुहोस्।"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"आफ्नो कल लग हेर्न, फोन अनुमति सक्रिय गर्नुहोस्।"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"आफ्नो सम्पर्क हेर्न सम्पर्क अनुमति सक्रिय गर्नुहोस्।"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"आफ्नो भ्वाइस मेल पहुँच गर्न, फोन अनुमति सक्रिय गर्नुहोस्"</string>
<string name="permission_no_search" msgid="84152933267902056">"तपाईँको सम्पर्कहरू खोज गर्न सम्पर्क अनुमतिहरू सक्रिय गर्नुहोस्।"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"एउटा कल गर्न,\n फोन अनुमति सक्रिय गर्नुहोस्।"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"कल गर्न फोन अनुमति सक्रिय गर्नुहोस्।"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"प्रणाली सेटिङहरूमा लेख्न फोन अनुप्रयोगसँग अनुमति छैन।"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"रोकियो"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> सक्रिय छ"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index c40e404fc..de84546fb 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefoon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefoon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefoonkiezer"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefoon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Oproepgeschiedenis"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> bellen"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Onjuist nummer melden"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Nummer bewerken voor bellen"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Toevoegen aan een contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Verwijderen uit oproepgeschiedenis"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Oproepgeschiedenis wissen"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Voicemail verwijderen"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Voicemail delen"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Je gesprekkenlijst is leeg"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Bellen"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Oproepgeschiedenis"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Onjuist nummer melden"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Nummer kopiëren"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Transcriptie kopiëren"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Nummer blokkeren"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> geblokkeerd"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Blokkeren van nummer opheffen"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Blokkering van <xliff:g id="NUMBER">%1$s</xliff:g> opgeheven"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ONGEDAAN MAKEN"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Verwijderen"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Nummer bewerken vóór bellen"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Oproepgeschiedenis wissen"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Voicemail verwijderen"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Voicemail archiveren"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Voicemail delen"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Voicemail verwijderd"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Voicemail gearchiveerd"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ONGED. MKN"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"NAAR ARCHIEF"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Oproepgeschiedenis wissen?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Hiermee worden alle oproepen uit je geschiedenis verwijderd"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Oproepgeschiedenis wissen…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefoon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Gemiste oproep"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Gemiste zakelijke oproep"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Gemiste oproepen"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> gemiste oproepen"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Terugbellen"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Bericht"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> voicemails </item>
<item quantity="one">Voicemail</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nieuwe voicemail van <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Kan voicemail niet afspelen"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"In buffer opslaan…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Voicemail laden…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Voicemail archiveren…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Kan voicemail niet laden"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Alleen oproepen met voicemail"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Alleen inkomende oproepen"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Oproepgeschiedenis"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Meer opties"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"toetsenblok"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiëren"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Alleen uitgaand weergeven"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Alleen inkomend weergeven"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Alleen gemist weergeven"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Uitgaand videogesprek"</string>
<string name="type_missed_video" msgid="954396897034220545">"Gemist videogesprek"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Voicemail"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Geweigerde oproep"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Geblokkeerde oproep"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Inkomende oproepen"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Voicemail afspelen"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Contact <xliff:g id="NAME">%1$s</xliff:g> bekijken"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> bellen"</string>
<string name="description_contact_details" msgid="51229793651342809">"Contactgegevens voor <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nieuwe voicemail."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> telefoongesprekken."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videogesprek."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Sms verzenden naar <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefooncel"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sec."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sec."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> om <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Kan dit nummer niet bellen"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Voor het instellen van voicemail, ga je naar \'Menu\' &gt; \'Instellingen\'."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Als je je voicemail wilt bellen, moet je eerst de Vliegtuigmodus uitschakelen."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Gesproken zoekopdracht niet beschikbaar"</string>
<string name="call_not_available" msgid="8941576511946492225">"Kan niet bellen omdat de Telefoon-app is uitgeschakeld."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Daarvoor is geen app beschikbaar op dit apparaat"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Geef een naam of telefoonnummer op"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Je hebt geen gemiste oproepen."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Je voicemail-inbox is leeg."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Contacten zoeken"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Voeg nummer toe of zoek contacten"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Je oproepgeschiedenis is leeg"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Bellen"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Je hebt geen gemiste oproepen."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Je voicemail-inbox is leeg."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Je voicemailarchief is leeg."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Alleen favorieten weergeven"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Geschiedenis"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Oproepgeschiedenis"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Voicemailarchief"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Alle"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Gemist"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Voicemail"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Verbeterde blokkeerfunctie"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Telefoon moet het blokkeergedrag aanpassen om je beter te beschermen. Voor je geblokkeerde nummers worden nu zowel oproepen als sms\'jes geblokkeerd. Deze instelling kan worden gedeeld met andere apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Toestaan"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> blokkeren?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Oproepen van dit nummer worden geblokkeerd en voicemails worden automatisch verwijderd."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Oproepen van dit nummer worden geblokkeerd, maar de beller kan nog wel voicemails achterlaten."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Je ontvangt geen oproepen of sms\'jes meer van dit nummer."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKKEREN"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Blokkering van <xliff:g id="NUMBER">%1$s</xliff:g> opheffen?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"BLOKKERING OPHEFFEN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Snelkeuze"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recent"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Oproepgeschiedenis"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contacten"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Voicemail"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Verwijderd uit favorieten"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Toevoegen aan een contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Sms verzenden"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Videogesprek starten"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Volledige oproepgeschiedenis bekijken"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Nummer blokkeren"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nieuwe gemiste oproepen"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Er staat nog niemand in je snelkeuzelijst"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Een favoriet toevoegen"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Tik op de afbeelding om alle nummers te bekijken of blijf de afbeelding aanraken om opnieuw te rangschikken"</string>
<string name="remove_contact" msgid="1080555335283662961">"Verwijderen"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videogesprek"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Bericht verzenden"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Een bericht verzenden"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Oproepdetails"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> bellen"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Oproep gemist van <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Oproep beantwoord van <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ongelezen voicemail van <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Voicemail van <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Oproep naar <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"in <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"via <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"op <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> via <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Bellen"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> bellen"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videogesprek <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Snelle reacties"</string>
<string name="call_settings_label" msgid="313434211353070209">"Oproepen"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Oproepen blokkeren"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Oproepblokkering tijdelijk uitgeschakeld"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Oproepblokkering is uitgeschakeld omdat je in de afgelopen 48 uur contact met de noodhulpdiensten hebt opgenomen via deze telefoon. De functie wordt automatisch weer ingeschakeld nadat de periode van 48 uur is verstreken."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Nummers importeren"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Je hebt via andere apps al aangegeven dat bepaalde bellers moeten worden doorgeschakeld naar de voicemail."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Nummers bekijken"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importeren"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importeren mislukt"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Kan voicemail niet archiveren."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Blokkeren van nummer opheffen"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Nummer toevoegen"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Oproepen van deze nummers worden geblokkeerd en voicemails worden automatisch verwijderd."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Oproepen van deze nummers worden geblokkeerd, maar de bellers kunnen nog wel voicemail achterlaten."</string>
+ <string name="block_list" msgid="7760188925338078011">"Geblokkeerde nummers"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> is ongeldig."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> is al geblokkeerd."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Oproepblokkering is 48 uur uitgeschakeld"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Uitgeschakeld omdat een noodoproep is geplaatst."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Oproepaccounts"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Inschakelen"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Toestemmingen instellen"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Als je de snelkeuzefunctie wilt inschakelen,\n schakel je de contacttoestemming in."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Als je je gesprekkenlijst wilt bekijken,\n schakel je de telefoontoestemming in."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Als je je contacten wilt bekijken,\n schakel je de contacttoestemming in."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Als je je voicemail wilt beluisteren,\n schakel je de telefoontoestemming in."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Als je de snelkeuzefunctie wilt inschakelen, schakel je de machtiging voor Contacten in."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Als je je gesprekkenlijst wilt bekijken, schakel je de machtiging voor Telefoon in."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Als je je contacten wilt bekijken, schakel je de machtiging voor Contacten in."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Als je je voicemail wilt beluisteren, schakel je de machtiging voor Telefoon in."</string>
<string name="permission_no_search" msgid="84152933267902056">"Als je naar contacten wilt zoeken, schakel je de contacttoestemming in."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Als je iemand wilt bellen,\n schakel je de telefoontoestemming in."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Als je iemand wilt bellen, schakel je de machtiging voor Telefoon in."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefoon-app heeft geen toestemming om systeeminstellingen te schrijven."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Geblokkeerd"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> is actief"</string>
</resources>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index 6b5719aa3..0b64dbe69 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ਫ਼ੋਨ"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ਫੋਨ"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ਫੋਨ ਡਾਇਲਪੈਡ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ਫੋਨ"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ਕਾਲ ਇਤਿਹਾਸ"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> ਨੂੰ ਕਾਲ ਕਰੋ"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"ਗ਼ਲਤ ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ਕਾਲ ਤੋਂ ਪਹਿਲਾਂ ਨੰਬਰ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"ਕਿਸੇ ਸੰਪਰਕ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ਕਾਲ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਓ"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ਕਾਲ ਇਤਿਹਾਸ ਹਟਾਓ"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ਵੌਇਸਮੇਲ ਮਿਟਾਓ"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"ਵੌਇਸਮੇਲ ਸਾਂਝੀ ਕਰੋ"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"ਤੁਹਾਡਾ ਕਾਲ ਲੌਗ ਖਾਲੀ ਹੈ"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ਇੱਕ ਕਾਲ ਕਰੋ"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ਕਾਲ ਇਤਿਹਾਸ"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"ਗਲਤ ਨੰਬਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"ਨੰਬਰ ਕਾਪੀ ਕਰੋ"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ਲਿਪੀ ਬਦਲਣਾ ਕਾਪੀ ਕਰੋ"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"ਨੰਬਰ ਨੂੰ ਬਲੌਕ ਕਰੋ"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ਬਲੌਕ ਕੀਤਾ"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"ਨੰਬਰ ਨੂੰ ਅਨਬਲੌਕ ਕਰੋ"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> ਅਨਬਲੌਕ ਕੀਤਾ"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ਪਹਿਲਾਂ ਵਰਗਾ ਕਰੋ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"ਹਟਾਓ"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ਕਾਲ ਤੋਂ ਪਹਿਲਾਂ ਨੰਬਰ ਸੰਪਾਦਿਤ ਕਰੋ"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"ਕਾਲ ਇਤਿਹਾਸ ਹਟਾਓ"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ਵੌਇਸਮੇਲ ਮਿਟਾਓ"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"ਵੌਇਸਮੇਲ ਪੁਰਾਲੇਖਬੱਧ ਕਰੋ"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"ਵੌਇਸਮੇਲ ਸਾਂਝੀ ਕਰੋ"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ਵੌਇਸਮੇਲ ਮਿਟਾਈ ਗਈ"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ਵੌਇਸਮੇਲ ਪੁਰਾਲੇਖਬੱਧ ਕੀਤੀ ਗਈ"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ਪਹਿਲਾਂ ਵਰਗਾ ਕਰੋ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ਪੁਰਾਲੇਖ \'ਤੇ ਜਾਓ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"ਕੀ ਕਾਲ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਹੈ?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"ਇਹ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਤੋਂ ਸਾਰੀਆਂ ਕਾਲਾਂ ਮਿਟਾ ਦੇਵੇਗਾ"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"ਕਾਲ ਇਤਿਹਾਸ ਹਟਾ ਰਿਹਾ ਹੈ…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ਫੋਨ"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"ਮਿਸ ਹੋਈ ਕਾਲ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"ਕੰਮ ਨਾਲ ਸਬੰਧਿਤ ਖੁੰਝੀ ਕਾਲ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"ਮਿਸ ਹੋਈਆਂ ਕਾਲਾਂ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ਮਿਸ ਹੋਈਆਂ ਕਾਲਾਂ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ਕਾਲ ਬੈਕ ਕਰੋ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"ਸੁਨੇਹਾ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> ਵੌਇਸਮੇਲਾਂ </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ਵੌਇਸਮੇਲਾਂ </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> ਦੀ ਨਵੀਂ ਵੌਇਸਮੇਲ"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ਵੌਇਸਮੇਲ ਪਲੇ ਨਹੀਂ ਕਰ ਸਕਿਆ"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"ਬਫਰਿੰਗ..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"ਵੌਇਸਮੇਲ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"ਵੌਇਸਮੇਲ ਪੁਰਾਲੇਖਬੱਧ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ਵੌਇਸਮੇਲ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕਿਆ"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"ਕੇਵਲ ਵੌਇਸਮੇਲ ਵਾਲੀਆਂ ਕਾਲਾਂ"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ਕੇਵਲ ਇਨਕਮਿੰਗ ਕਾਲਾਂ"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ਕਾਲ ਇਤਿਹਾਸ"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ਹੋਰ ਚੋਣਾਂ"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ਡਾਇਲ ਪੈਡ"</string>
- <string name="menu_copy" msgid="6108677035381940698">"ਕਾਪੀ ਕਰੋ"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"ਕੇਵਲ ਆਊਟਗੋਇੰਗ ਦਿਖਾਓ"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ਕੇਵਲ ਇਨਕਮਿੰਗ ਦਿਖਾਓ"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"ਕੇਵਲ ਮਿਸਡ ਦਿਖਾਓ"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"ਆਊਟਗੋਇੰਗ ਵੀਡੀਓ ਕਾਲ"</string>
<string name="type_missed_video" msgid="954396897034220545">"ਮਿਸਡ ਵੀਡੀਓ ਕਾਲ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ਵੌਇਸਮੇਲ"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ਅਸਵੀਕਾਰ ਕੀਤੀ ਕਾਲ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"ਬਲੌਕ ਕੀਤੀ ਕਾਲ"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ਇਨਕਮਿੰਗ ਕਾਲਾਂ"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"ਵੌਇਸਮੇਲ ਪਲੇ ਕਰੋ"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ਸੰਪਰਕ <xliff:g id="NAME">%1$s</xliff:g> ਦੇਖੋ"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> ਨੂੰ ਕਾਲ ਕਰੋ"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> ਲਈ ਸੰਪਰਕ ਵੇਰਵੇ"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"ਨਵੀਂ ਵੌਇਸਮੇਲ।"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ਕਾਲਾਂ।"</string>
<string name="description_video_call" msgid="2933838090743214204">"ਵੀਡੀਓ ਕਾਲ।"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> ਨੂੰ SMS ਭੇਜੋ"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"ਪੇਫੋਨ"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> ਸਕਿੰਟ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> ਮਿੰਟ <xliff:g id="SECONDS">%s</xliff:g> ਸਕਿੰਟ"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ਨੂੰ <xliff:g id="TIME">%2$s</xliff:g> ਵਜੇ"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ਇਸ ਨੰਬਰ ਤੇ ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"ਵੌਇਸਮੇਲ ਸੈਟ ਅਪ ਕਰਨ ਲਈ, ਮੀਨੂ &gt; ਸੈਟਿੰਗਾਂ ਤੇ ਜਾਓ।"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"ਵੌਇਸਮੇਲ ਕਾਲ ਕਰਨ ਲਈ, ਪਹਿਲਾਂ ਏਅਰਪਲੇਨ ਮੋਡ ਬੰਦ ਕਰੋ।"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"ਵੌਇਸ ਖੋਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="call_not_available" msgid="8941576511946492225">"ਇੱਕ ਫੋਨ ਕਾਲ ਨਹੀਂ ਕਰ ਸਕਦਾ ਕਿਉਂਕਿ ਫੋਨ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।"</string>
<string name="activity_not_available" msgid="2287665636817987623">"ਉਸ ਲਈ ਇਸ ਡੀਵਾਈਸ ਤੇ ਕੋਈ ਐਪ ਨਹੀਂ"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"ਇੱਕ ਨਾਮ ਜਾਂ ਫੋਨ ਨੰਬਰ ਦਰਜ ਕਰੋ"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਵੀ ਮਿਸਡ ਕਾਲਾਂ ਨਹੀਂ ਹਨ।"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"ਤੁਹਾਡਾ ਵੌਇਸਮੇਲ ਇਨਬਾਕਸ ਖਾਲੀ ਹੈ।"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"ਸੰਪਰਕ ਖੋਜੋ"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"ਨੰਬਰ ਜੋੜੋ ਜਾਂ ਸੰਪਰਕ ਖੋਜੋ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"ਤੁਹਾਡਾ ਕਾਲ ਇਤਿਹਾਸ ਖਾਲੀ ਹੈ"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ਇੱਕ ਕਾਲ ਕਰੋ"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਵੀ ਮਿਸਡ ਕਾਲਾਂ ਨਹੀਂ ਹਨ।"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"ਤੁਹਾਡਾ ਵੌਇਸਮੇਲ ਇਨਬੌਕਸ ਖਾਲੀ ਹੈ।"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"ਤੁਹਾਡਾ ਵੌਇਸਮੇਲ ਪੁਰਾਲੇਖ ਖ਼ਾਲੀ ਹੈ।"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ਕੇਵਲ ਮਨਪਸੰਦ ਦਿਖਾਓ"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ਇਤਿਹਾਸ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ਕਾਲ ਇਤਿਹਾਸ"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ਵੌਇਸਮੇਲ ਪੁਰਾਲੇਖ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ਸਭ"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"ਮਿਸਡ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ਵੌਇਸਮੇਲ"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"ਨਵੀਂ, ਸਰਲੀਕ੍ਰਿਤ ਬਲੌਕਿੰਗ"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"ਤੁਹਾਡੀ ਬਿਹਤਰ ਢੰਗ ਨਾਲ ਰੱਖਿਆ ਲਈ, ਫੋਨ ਨੂੰ ਬਲੌਕਿੰਗ ਦੇ ਕੰਮ ਕਰਨ ਦੇ ਢੰਗ ਨੂੰ ਬਦਲਣ ਦੀ ਲੋੜ ਹੈ। ਹੁਣ ਤੁਹਾਡੇ ਬਲੌਕ ਕੀਤੇ ਗਏ ਨੰਬਰਾਂ ਤੋਂ ਕਾਲਾਂ ਅਤੇ ਲਿਖਤ ਸੁਨੇਹਿਆਂ ਦੋਵਾਂ ਨੂੰ ਰੋਕ ਦਿੱਤਾ ਜਾਵੇਗਾ ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਹੋਰ ਐਪਾਂ ਨਾਲ ਵੀ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"ਮਨਜ਼ੂਰੀ ਦਿਓ"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"ਕੀ <xliff:g id="NUMBER">%1$s</xliff:g> ਬਲੌਕ ਕਰਨਾ ਹੈ?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ਇਸ ਨੰਬਰ ਤੋਂ ਕਾਲਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ ਅਤੇ ਵੌਇਸਮੇਲਾਂ ਆਪਣੇ ਆਪ ਮਿਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ।"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ਇਸ ਨੰਬਰ ਤੋਂ ਕਾਲਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ, ਪਰ ਕਾਲਰ ਹਾਲੇ ਵੀ ਤੁਹਾਡੇ ਲਈ ਵੌਇਸਮੇਲਾਂ ਛੱਡ ਸਕਦਾ ਹੈ।"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ਤੁਹਾਨੂੰ ਹੁਣ ਇਸ ਨੰਬਰ ਤੋਂ ਕਾਲਾਂ ਜਾਂ ਲਿਖਤ ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਨਹੀਂ ਹੋਣਗੇ।"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ਬਲੌਕ ਕਰੋ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"ਕੀ <xliff:g id="NUMBER">%1$s</xliff:g> ਅਨਲੌਕ ਕਰਨਾ ਹੈ?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ਅਨਬਲੌਕ ਕਰੋ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"ਸਪੀਡ ਡਾਇਲ"</string>
- <string name="tab_recents" msgid="929949073851377206">"ਹਾਲੀਆ"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ਕਾਲ ਇਤਿਹਾਸ"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"ਸੰਪਰਕ"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ਵੌਇਸਮੇਲ"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ਮਨਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਇਆ ਗਿਆ"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"ਕਿਸੇ ਸੰਪਰਕ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS ਭੇਜੋ"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ਵੀਡੀਓ ਕਾਲ ਕਰੋ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ਪੂਰਾ ਕਾਲ ਇਤਿਹਾਸ ਦੇਖੋ"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"ਨੰਬਰ ਨੂੰ ਬਲੌਕ ਕਰੋ"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ਨਵੀਆਂ ਮਿਸਡ ਕਾਲਾਂ"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"ਅਜੇ ਤੁਹਾਡੇ ਸਪੀਡ ਡਾਇਲ \'ਤੇ ਕੋਈ ਵੀ ਵਿਅਕਤੀ ਨਹੀਂ ਹੈ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ਕੋਈ ਮਨਪਸੰਦ ਸ਼ਾਮਲ ਕਰੋ"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"ਸਾਰੇ ਨੰਬਰ ਦੇਖਣ ਲਈ ਚਿੱਤਰ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਜਾਂ ਪੁਨਰ ਤਰਤੀਬ ਦੇਣ ਲਈ ਸਪੱਰਸ਼ ਕਰੋ &amp; ਹੋਲਡ ਕਰੋ"</string>
<string name="remove_contact" msgid="1080555335283662961">"ਹਟਾਓ"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ਵੀਡੀਓ ਕਾਲ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"ਸੁਨੇਹਾ ਭੇਜੋ"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ਕਾਲ ਵੇਰਵੇ"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ਨੂੰ ਕਾਲ ਕਰੋ"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ਦੀ ਮਿਸਡ ਕਾਲ।"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ਦੀ ਕਾਲ ਦਾ ਜਵਾਬ ਦਿੱਤਾ।"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> , <xliff:g id="TYPEORLOCATION">^2</xliff:g> , <xliff:g id="TIMEOFCALL">^3</xliff:g> , <xliff:g id="PHONEACCOUNT">^4</xliff:g> ਵੱਲੋਂ ਬਿਨਾਂ-ਪੜ੍ਹੀ ਵੌਇਸਮੇਲ।"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ਵੱਲੋਂ ਵੌਇਸਮੇਲ।"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> ਨੂੰ ਕਾਲ ਕਰੋ।"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> ਤੇ"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> ਰਾਹੀਂ"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> ਰਾਹੀਂ"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> \'ਤੇ, <xliff:g id="NUMBER">%2$s</xliff:g> ਰਾਹੀਂ"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, <xliff:g id="NUMBER">%2$s</xliff:g> ਰਾਹੀਂ"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ਕਾਲ ਕਰੋ"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ਨੂੰ ਕਾਲ ਕਰੋ"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"ਵੀਡੀਓ ਕਾਲ <xliff:g id="NAMEORNUMBER">^1</xliff:g>।"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ਤਤਕਾਲ ਜਵਾਬ"</string>
<string name="call_settings_label" msgid="313434211353070209">"ਕਾਲਾਂ"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ਕਾਲ ਬਲੌਕ ਕਰਨਾ"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ਕਾਲ ਬਲੌਕਿੰਗ ਆਰਜ਼ੀ ਤੌਰ ਤੇ ਬੰਦ ਹੈ"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ਕਾਲ ਬਲੌਕਿੰਗ ਅਸਮਰੱਥ ਕਰ ਦਿੱਤੀ ਗਈ ਹੈ ਕਿਉਂਕਿ ਤੁਸੀਂ ਇਸ ਫੋਨ ਦੁਆਰਾ ਪਿਛਲੇ 48 ਘੰਟਿਆਂ ਤੋਂ ਐਮਰਜੈਂਸੀ ਸੇਵਾਵਾਂ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ ਹੈ। ਇਹ 48 ਘੰਟਿਆਂ ਦਾ ਸਮਾਂ ਪੂਰਾ ਹੋਣ ਤੇੋਂ ਬਾਅਦ ਆਟੋਮੈਟਿਕਲੀ ਮੁੜ-ਸਮਰੱਥ ਹੋ ਜਾਵੇਗੀ।"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"ਆਯਾਤ ਨੰਬਰ"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"ਤੁਹਾਡੇ ਚਿੰਨ੍ਹਿਤ ਕੀਤੇ ਪਿਛਲੇ ਕੁਝ ਕਾਲਰ ਹੋਰ ਐਪਸ ਦੁਆਰਾ ਆਟੋਮੈਟਿਕ ਤੌਰ ਤੇ ਵੌਇਸਮੇਲ ਨੂੰ ਭੇਜੇ ਗਏ ਹਨ।"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"ਨੰਬਰ ਵਿਖਾਓ"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"ਆਯਾਤ ਕਰੋ"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"ਆਯਾਤ ਅਸਫਲ ਹੋਇਆ"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"ਵੌਇਸਮੇਲ ਨੂੰ ਪੁਰਾਲੇਖਬੱਧ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ।"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"ਨੰਬਰ ਨੂੰ ਅਨਬਲੌਕ ਕਰੋ"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"ਨੰਬਰ ਜੋੜੋ"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ਇਹਨਾਂ ਨੰਬਰਾਂ ਤੋਂ ਕਾਲਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ ਅਤੇ ਵੌਇਸਮੇਲਾਂ ਆਪਣੇ ਆਪ ਮਿਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ।"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ਇਹਨਾਂ ਨੰਬਰਾਂ ਤੋਂ ਕਾਲਾਂ ਬਲੌਕ ਕੀਤੀਆਂ ਜਾਣਗੀਆਂ, ਪਰ ਇਹ ਹਾਲੇ ਵੀ ਤੁਹਾਡੇ ਲਈ ਵੌਇਸਮੇਲਾਂ ਛੱਡ ਸਕਦੇ ਹਨ।"</string>
+ <string name="block_list" msgid="7760188925338078011">"ਬਲੌਕ ਕੀਤੇ ਨੰਬਰ"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ਅਪ੍ਰਮਾਣਿਕ ਹੈ।"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ਪਹਿਲਾਂ ਹੀ ਬਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ਕਾਲ ਬਲੋੌਕਿੰਗ 48 ਘੰਟਿਆਂ ਲਈ ਅਯੋਗ ਕੀਤੀ ਗਈ"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"ਆਯੋਗ ਕੀਤਾ ਕਿਉਂਕਿ ਇੱਕ ਸੰਕਟ ਕਾਲ ਕੀਤੀ ਗਈ ਸੀ।"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"ਕਾਲਿੰਗ ਖਾਤੇ"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ਚਾਲੂ ਕਰੋ"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ਅਨੁਮਤੀਆਂ ਸੈੱਟ ਕਰੋ"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"ਸਪੀਡ ਡਾਇਲ ਨੂੰ ਸਮਰਥਿਤ ਕਰਨ ਲਈ,\n ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"ਆਪਣੇ ਕਾਲ ਲੌਗ ਨੂੰ ਦੇਖਣ ਲਈ,\n ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"ਤੁਹਾਡੇ,\n ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"ਆਪਣੇ ਵੌਇਸਮੇਲ ਨੂੰ ਐਕਸੈਸ ਕਰਨ ਲਈ,\n ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"ਸਪੀਡ ਡਾਇਲ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਲਈ, ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ਆਪਣਾ ਕਾਲ ਲੌਗ ਵੇਖਣ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਨੂੰ ਵੇਖਣ ਲਈ, ਸੰਪਰਕ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ਆਪਣੀ ਵੌਇਸਮੇਲ ਐਕਸੈਸ ਕਰਨ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
<string name="permission_no_search" msgid="84152933267902056">"ਆਪਣੇ ਸੰਪਰਕਾਂ ਦੀ ਖੋਜ ਕਰਨ ਲਈ,, ਸੰਪਰਕ ਅਨੁਮਤੀਆਂ ਨੂੰ ਚਾਲੂ ਕਰੋ।"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ਕੋਈ ਕਾਲ ਕਰਨ ਲਈ,\n ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ਕਾਲ ਕਰਨ ਲਈ, ਫ਼ੋਨ ਅਨੁਮਤੀ ਚਾਲੂ ਕਰੋ।"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"ਫ਼ੋਨ ਐਪ ਦੇ ਕੋਲ ਸਿਸਟਮ ਸੈਟਿੰਗਜ਼ ਵਿੱਚ ਲਿੱਖਣ ਦੀ ਅਨੁਮਤੀ ਨਹੀਂ ਹੁੰਦੀ ਹੈ।"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ਬਲੌਕ ਕੀਤਾ ਗਿਆ"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ਕਿਰਿਆਸ਼ੀਲ ਹੈ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 5d3f720fc..eaca39b4c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Klawiatura telefonu"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historia połączeń"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Zadzwoń do: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Zgłoś niedokładny numer"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Edytuj numer przed nawiązaniem połączenia"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Dodaj do kontaktu"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Usuń z historii połączeń"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Wyczyść historię połączeń"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Usuń pocztę głosową"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Udostępnij pocztę głosową"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Rejestr połączeń jest pusty"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Zadzwoń"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historia połączeń"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Zgłoś niedokładny numer"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiuj numer"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiuj zapis"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Zablokuj numer"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> zablokowany"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Odblokuj numer"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> odblokowany"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"COFNIJ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Usuń"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Edytuj numer przed połączeniem"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Wyczyść historię połączeń"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Usuń pocztę głosową"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archiwizuj pocztę głosową"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Udostępnij pocztę głosową"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Poczta usunięta"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Poczta głosowa zarchiwizowana"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"COFNIJ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARCHIWUM"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Wyczyścić historię połączeń?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Spowoduje to usunięcie wszystkich połączeń z historii."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Czyszczę historię połączeń…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Nieodebrane połączenie"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Nieodebrane połączenie (praca)"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Nieodebrane połączenia"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Liczba nieodebranych połączeń: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Oddzwoń"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Wyślij SMS-a"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> wiadomości głosowe </item>
<item quantity="many"> <xliff:g id="COUNT">%1$d</xliff:g> wiadomości głosowych </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nowa poczta głosowa od: <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Nie można odtworzyć wiadomości głosowej"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buforowanie..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Wczytuję zawartość poczty głosowej…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archiwizuję pocztę głosową…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Nie można wczytać zawartości poczty głosowej"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Tylko połączenia z pocztą głosową"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Tylko połączenia przychodzące"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historia połączeń"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Więcej opcji"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"klawiatura"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiuj"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Pokaż tylko wychodzące"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Pokaż tylko przychodzące"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Pokaż tylko nieodebrane"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Wychodząca rozmowa wideo"</string>
<string name="type_missed_video" msgid="954396897034220545">"Nieodebrana rozmowa wideo"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Poczta głosowa"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Odrzucone połączenie"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Zablokowane połączenie"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Połączenia przychodzące"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Odtwórz pocztę głosową"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Wyświetl kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Połącz z: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Szczegóły kontaktu: <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nowa poczta głosowa."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Połączenia: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Rozmowa wideo."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Wyślij SMS-a do: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Automat telefoniczny"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> o <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Nie można zadzwonić pod ten numer"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Aby skonfigurować pocztę głosową, przejdź do Menu &gt; Ustawienia."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Aby połączyć się z pocztą głosową, najpierw wyłącz tryb samolotowy."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Wyszukiwanie głosowe jest niedostępne"</string>
<string name="call_not_available" msgid="8941576511946492225">"Nie można zadzwonić, ponieważ aplikacja Telefon została wyłączona."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Na urządzeniu nie ma aplikacji, która mogłaby wykonać tę czynność"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Wpisz imię i nazwisko lub numer telefonu"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nie masz nieodebranych połączeń."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Skrzynka odbiorcza poczty głosowej jest pusta."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Wyszukaj kontakty"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Dodaj numer lub wyszukaj kontakty"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Twoja historia połączeń jest pusta"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Zadzwoń"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nie masz nieodebranych połączeń."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Skrzynka odbiorcza poczty głosowej jest pusta."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Archiwum poczty głosowej jest puste."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Pokaż tylko ulubione"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historia"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historia połączeń"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archiwum poczty głosowej"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Wszystkie"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Nieodebrane"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Poczta gł."</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nowe, uproszczone blokowanie"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Aby lepiej Cię chronić, Telefon musi zmienić działanie związane z blokowaniem. Od teraz nie będziesz już otrzymywać połączeń ani SMS-ów z zablokowanych numerów. Numery te mogą też być udostępniane innym aplikacjom."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Zezwól"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Zablokować numer <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Połączenia z tego numeru będą blokowane, a wiadomości głosowe będą usuwane automatycznie."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Połączenia z tego numeru będą blokowane, ale dzwoniący wciąż będzie mógł zostawiać wiadomości głosowe."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Nie będziesz otrzymywać połączeń ani SMS-ów z tego numeru."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ZABLOKUJ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Odblokować numer <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ODBLOKUJ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Szybkie wybieranie"</string>
- <string name="tab_recents" msgid="929949073851377206">"Ostatnie"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historia połączeń"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakty"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Poczta głosowa"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Usunięto z ulubionych"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Dodaj do kontaktu"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Wyślij SMS-a"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Rozmowa wideo"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Wyświetl pełną historię połączeń"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Zablokuj numer"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Nowe nieodebrane połączenia: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Lista szybkiego wybierania jest pusta"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Dodaj do ulubionych"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Kliknij obraz, by zobaczyć wszystkie numery, lub kliknij go i przytrzymaj, by zmienić kolejność"</string>
<string name="remove_contact" msgid="1080555335283662961">"Usuń"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Rozmowa wideo"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Wyślij wiadomość"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Wyślij wiadomość"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Szczegóły połączenia"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Zadzwoń: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Nieodebrane połączenie: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Odebrane połączenie: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nieodsłuchana poczta głosowa od: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Poczta głosowa od: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Połączenie: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"na koncie <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"przez <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"przez <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"na <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, przez <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> przez <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Zadzwoń"</string>
<string name="description_call_action" msgid="4000549004089776147">"Zadzwoń: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Rozpocznij rozmowę wideo z: <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Szybkie odpowiedzi"</string>
<string name="call_settings_label" msgid="313434211353070209">"Połączenia"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokowanie połączeń"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokada połączeń tymczasowo wyłączona"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blokada połączeń została wyłączona, ponieważ w ciągu ostatnich 48 godzin dzwoniono z tego telefonu na numer alarmowy. Blokada zostanie automatycznie przywrócona po upływie 48 godzin."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Zaimportuj numery"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Oznaczyłeś wcześniej niektórych rozmówców, aby byli automatycznie przekierowywani na pocztę głosową przy użyciu innych aplikacji."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Pokaż numery"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importuj"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Nie udało się zaimportować"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Nie udało się zarchiwizować."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Odblokuj numer"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Dodaj numer"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Połączenia z tych numerów będą blokowane, a wiadomości głosowe będą usuwane automatycznie."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Połączenia z tych numerów będą blokowane, ale dzwoniący wciąż będą mogli zostawiać wiadomości głosowe."</string>
+ <string name="block_list" msgid="7760188925338078011">"Zablokowane numery"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Numer <xliff:g id="NUMBER">%1$s</xliff:g> jest nieprawidłowy."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Numer <xliff:g id="NUMBER">%1$s</xliff:g> jest już zablokowany."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokada połączeń została wyłączona na 48 godzin"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Wyłączona, ponieważ wykonano połączenie alarmowe."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Konta telefoniczne"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Włącz"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Ustaw uprawnienia"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Aby umożliwić szybkie wybieranie,\nwłącz uprawnienie Kontakty."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Aby wyświetlić rejestr połączeń,\n włącz uprawnienie Telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Aby wyświetlić kontakty,\n włącz uprawnienie Kontakty."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Aby uzyskać dostęp do poczty głosowej,\n włącz uprawnienie Telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Aby włączyć szybkie wybieranie, włącz uprawnienie Kontakty."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Aby zobaczyć swój rejestr połączeń, włącz uprawnienie Telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Aby zobaczyć swoje kontakty, włącz uprawnienie Kontakty."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Aby uzyskać dostęp do poczty głosowej, włącz uprawnienie Telefon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Aby wyszukać kontakty, włącz uprawnienia Kontakty."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Aby zadzwonić,\n włącz uprawnienie Telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Aby nawiązać połączenie, włącz uprawnienie Telefon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikacja Telefon nie ma uprawnień do zapisu w ustawieniach systemowych."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Zablokowany"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> – rozmowa aktywna"</string>
</resources>
diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml
index 5892e6a80..95317c8b4 100644
--- a/res/values-pt-rBR/strings.xml
+++ b/res/values-pt-rBR/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclado numérico do smartphone"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Histórico de chamadas"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ligar para <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Informar número incorreto"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editar número antes da chamada"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Adicionar a um contato"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Excluir do histórico de chamadas"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Limpar histórico de chamadas"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Excluir correio de voz"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Compartilhar correio de voz"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Seu registro de chamadas está vazio"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Fazer uma chamada"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Histórico de chamadas"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Informar número incorreto"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiar número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiar transcrição"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquear número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Número <xliff:g id="NUMBER">%1$s</xliff:g> bloqueado"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloquear número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Número <xliff:g id="NUMBER">%1$s</xliff:g> desbloqueado"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESFAZER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Excluir"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editar número antes de chamar"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Limpar histórico de chamadas"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Excluir mensagem de voz"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arquivar correio de voz"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Compartilhar mensagem de voz"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Correio de voz excluído"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Correio de voz arquivado"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESFAZER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARQUIVAR"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Limpar histórico de chamadas?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Esta ação excluirá todas as chamadas do seu histórico"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Limpando histórico de chamadas…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Smartphone"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Chamada perdida"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Chamada de trabalho perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Retornar chamada"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensagem"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> Correios de voz </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Correios de voz </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova mensagem de voz de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Não foi possível repr. correio de voz"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Armazenar em buffer…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Carregando correio de voz..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arquivando correio de voz..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Não foi possível carregar correio de voz"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Somente chamadas com correio de voz"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Somente chamadas recebidas"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Histórico de chamadas"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Mais opções"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclado numérico"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiar"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostrar apenas enviadas"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostrar apenas recebidas"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostrar apenas perdidas"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videochamada realizada"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videochamada perdida"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Correio de voz"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Chamada recusada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Chamada bloqueada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Chamadas recebidas"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reproduzir mensagem de voz"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualizar contato <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ligar para <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalhes de contato para <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nova mensagem de voz."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> chamadas."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videochamada."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Enviar SMS para <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefone público"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> seg"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> m <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> às <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Não é possível ligar para este número"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar o correio de voz, vá para Menu &gt; Configurações."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para ligar para o correio de voz, primeiro desative o modo avião."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"A pesquisa por voz não está disponível"</string>
<string name="call_not_available" msgid="8941576511946492225">"Não é possível fazer uma chamada porque o app Telefone foi desativado."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Nenhum app está disponível para essa ação neste dispositivo"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Inserir nome ou núm. telefone"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Você não tem chamadas perdidas."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Sua caixa de entrada de correio de voz está vazia."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Pesquisar contatos"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Adicionar número ou pesquisar contatos"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Seu histórico de chamadas está vazio"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Fazer uma chamada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Você não tem chamadas perdidas."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Sua caixa de entrada de correio de voz está vazia."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Seu correio de voz está vazio."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostrar somente favoritos"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Histórico"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Histórico de chamadas"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arquivo do correio de voz"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Todas"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perdidas"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Correio de voz"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo bloqueio simplificado"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Para aumentar sua proteção, é preciso alterar o modo como o bloqueio funciona no smartphone. Os números bloqueados agora impedirão chamadas e mensagens de texto, e será possível compartilhá-los com outros apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permitir"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Bloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Chamadas feitas a partir deste número serão bloqueadas. Correios de voz serão excluídos automaticamente."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Chamadas feitas a partir deste número serão bloqueadas, mas é possível que o autor ainda consiga deixar correios de voz para você."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Você não receberá mais chamadas ou mensagens de texto deste número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEAR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Desbloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEAR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Discagem rápida"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recentes"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Histórico de chamadas"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contatos"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Correio de voz"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Removido dos favoritos"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Adicionar a um contato"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Enviar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Fazer videochamada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ver todo o histórico de chamadas"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquear número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> novas chamadas perdidas"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Ainda não há ninguém na sua discagem rápida"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Adicionar favorito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toque na imagem para ver todos os números ou toque e segure para reordenar"</string>
<string name="remove_contact" msgid="1080555335283662961">"Remover"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videochamada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Enviar mensagem"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Enviar uma mensagem"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalhes da chamada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Ligar para <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Chamada perdida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Chamada atendida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Correio de voz não lido de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Correio de voz de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Chamada para <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"em <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"por <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"por <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"em <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, por <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> por <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Ligar"</string>
<string name="description_call_action" msgid="4000549004089776147">"Ligar para <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videochamada <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respostas rápidas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Chamadas"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueio de chamadas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bloqueio de chamadas temporiamente desativado"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"O bloqueio de chamadas foi desativado porque você entrou em contato com serviços de emergência usando este telefone nas últimas 48 horas. Ele será reativado automaticamente depois de um período de 48 horas."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importar números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Anteriormente, você marcou alguns autores de chamada para serem enviados automaticamente para o correio de voz por meio de outros apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ver números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Falha na importação"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Falha ao arquivar correio de voz."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloquear número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Adicionar número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Chamadas a partir destes números serão bloqueadas. Correios de voz serão excluídos automaticamente."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Chamadas feitas a partir destes números serão bloqueadas, mas é possível que eles ainda consigam deixar correios de voz para você."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloqueados"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"O número <xliff:g id="NUMBER">%1$s</xliff:g> é inválido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"O número <xliff:g id="NUMBER">%1$s</xliff:g> já está bloqueado."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Bloqueio de chamadas desativado por 48 horas"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Desativado porque foi feita uma chamada de emergência."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Contas de chamadas"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Ativar"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Definir permissões"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Para ativar a discagem rápida,\n ative a permissão para \"Contatos\"."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Para ver seu registro de chamadas,\n ative a permissão para \"Telefone\"."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Para ver seus contatos,\n ative a permissão para \"Contatos\"."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Para acessar seu correio de voz,\n ative a permissão para \"Telefone\"."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Para ativar a discagem rápida, ative a permissão para o app Contatos."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Para ver seu registro de chamadas, ative a permissão para o app Telefone."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Para ver seus contatos, ative a permissão para o app Contatos."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Para acessar seu correio de voz, ative a permissão para o app Telefone."</string>
<string name="permission_no_search" msgid="84152933267902056">"Para pesquisar seus contatos, ative as permissões para \"Contatos\"."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Para fazer uma chamada,\n ative a permissão para \"Telefone\"."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Para fazer uma chamada, ative a permissão para o app Telefone."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"O app Telefone não tem permissão para gravar nas configurações do sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqueado"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Chamada ativa: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 334d425c7..7ad22cab4 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telemóvel"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telemóvel"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclado do telemóvel"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Histórico de chamadas"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ligar a <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Enviar relat. de n.º incorreto"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editar número antes de ligar"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Adicionar a um contacto"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Eliminar do histórico de chamadas"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Limpar histórico de chamadas"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Eliminar correio de voz"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Partilhar correio de voz"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"O registo de chamadas está vazio"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Telefonar"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Histórico de chamadas"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Denunciar número incorreto"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiar número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiar transcrição"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquear número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> bloqueado"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloquear número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> desbloqueado"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANULAR"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Eliminar"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editar número antes de ligar"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Limpar histórico de chamadas"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Eliminar correio de voz"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arquivar msg. correio de voz"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Partilhar correio de voz"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Correio de voz elim."</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Msg. correio de voz arquivada"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANULAR"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARQUIVO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Limpar histórico de chamadas?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Todas as chamadas serão eliminadas do histórico"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"A limpar histórico de chamadas…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telemóvel"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Chamada não atendida"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Chamada de trabalho não atendida"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Chamadas não atendidas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas não atendidas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Ligar de volta"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensagem"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> mensagens de correio de voz </item>
<item quantity="one">Mensagem de correio de voz</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g> , <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova msg de correio de voz de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Não foi poss. reprod. o correio de voz"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"A colocar na memória intermédia..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"A carregar o correio de voz..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"A arquivar mensagem de correio de voz…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Não foi poss. carregar o correio de voz"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Apenas chamadas com correio de voz"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Apenas chamadas recebidas"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Histórico de chamadas"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Mais opções"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclado"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiar"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostrar apenas cham. efetuadas"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostrar apenas cham. recebidas"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostrar apenas cham. n. atend."</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videochamada efetuada"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videochamada não atendida"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Correio de voz"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Chamada recusada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Chamada bloqueada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Chamadas recebidas"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reproduzir mensagem de correio de voz"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ver o contacto <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ligar a <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalhes de contacto para <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Novo correio de voz."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> chamadas."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videochamada."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Enviar SMS para <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefone público"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> seg"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> seg."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> às <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Não é possível ligar para este número"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar o correio de voz, aceda a Menu &gt; Definições."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para efetuar uma chamada para o correio de voz, desative primeiro o Modo de avião."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Pesquisa por voz não disponível"</string>
<string name="call_not_available" msgid="8941576511946492225">"Não é possível efetuar uma chamada porque a aplicação Telefone foi desativada."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Não existe nenhuma aplicação para isso neste dispositivo"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Intr. um nome ou um n.º tel."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Não tem chamadas não atendidas."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"A caixa de entrada do correio de voz está vazia."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Pesquisar contactos"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Adic. n.º ou pesq. contactos"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"O seu histórico de chamadas está vazio"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Efetuar uma chamada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Não tem chamadas não atendidas."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"A caixa de entrada do correio de voz está vazia."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"O seu arquivo de mensagens de correio de voz está vazio."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostrar apenas os favoritos"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Histórico"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Histórico de Chamadas"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arquivo de mensagens de correio de voz"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Todas"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Não atendidas"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Corr. Voz"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo bloqueio simplificado"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Para o proteger melhor, a aplicação Telemóvel tem de alterar o modo de funcionamento do bloqueio. Deixa de receber chamadas e mensagens de texto dos números bloqueados e estes podem ser partilhados com outras aplicações."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permitir"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Pretende bloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"As chamadas a partir deste número serão bloqueadas e as mensagens de correio de voz serão automaticamente eliminadas."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"As chamadas a partir deste número serão bloqueadas, mas o autor da chamada poderá deixar-lhe mensagens de correio de voz."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Deixará de receber chamadas ou mensagens de texto deste número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEAR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Pretende desbloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEAR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Marcação rápida"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recentes"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Histórico de Chamadas"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contactos"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Correio de voz"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Removido dos favoritos"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Adicionar a um contacto"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Enviar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Fazer videochamada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ver histórico de chamadas completo"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquear número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> chamadas não atendidas novas"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Ainda não tem ninguém na marcação rápida"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Adicionar um favorito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toque na imagem para ver todos os números ou toque sem soltar para reordenar"</string>
<string name="remove_contact" msgid="1080555335283662961">"Remover"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videochamada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Enviar mensagem"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Enviar uma mensagem"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalhes da chamada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Telefonar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Chamada não atendida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Chamada atendida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Mensagem de correio de voz não lida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Mensagem de correio de voz de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Telefonar para <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"em <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"através do número <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"através do número <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"em <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, através do número <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> através do número <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Telefonar"</string>
<string name="description_call_action" msgid="4000549004089776147">"Telefonar a <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Fazer videochamada com <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respostas rápidas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Chamadas"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueio de chamadas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bloqueio de chamadas tempor. desativado"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"O bloqueio de chamadas foi desativado porque contactou os serviços de emergência a partir deste telemóvel nas últimas 48 horas. O bloqueio será automaticamente reativado assim que expirar o período de 48 horas."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importar números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Anteriormente, marcou alguns autores de chamadas para serem automaticamente enviados para o correio de voz através de outras aplicações."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ver números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Falha ao importar"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Falha ao arquivar msg. correio de voz."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloquear número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Adicionar número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"As chamadas a partir destes números serão bloqueadas e as mensagens de correio de voz serão automaticamente eliminadas."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"As chamadas a partir destes números serão bloqueadas, mas os respetivos autores poderão deixar-lhe mensagens de correio de voz."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloqueados"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> é inválido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> já está bloqueado."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Bloqueio de chamadas desativado durante 48 horas"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Desativado porque foi efetuada uma chamada de emergência."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Contas de chamadas"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Ativar"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Definir autorizações"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Para ativar a marcação rápida,\n ative a autorização Contactos."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Para ver o registo de chamadas, \native a autorização Telemóvel."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Para ver os contactos, \native a autorização Contactos."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Para aceder ao correio de voz, \native a autorização Telemóvel."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Para ativar a marcação rápida, ative a autorização Contactos."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Para ver o registo de chamadas, ative a autorização Telemóvel."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Para ver os seus contactos, ative a autorização Contactos."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Para aceder ao correio de voz, ative a autorização Telemóvel."</string>
<string name="permission_no_search" msgid="84152933267902056">"Para pesquisar os seus contactos, ative as autorizações Contactos."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Para telefonar, \native a autorização Telemóvel."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Para efetuar uma chamada, ative a autorização Telemóvel."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"A aplicação Telefone não tem autorização para gravar nas definições do sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqueado"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> está ativa"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 5892e6a80..95317c8b4 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefone"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefone"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Teclado numérico do smartphone"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefone"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Histórico de chamadas"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ligar para <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Informar número incorreto"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Editar número antes da chamada"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Adicionar a um contato"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Excluir do histórico de chamadas"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Limpar histórico de chamadas"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Excluir correio de voz"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Compartilhar correio de voz"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Seu registro de chamadas está vazio"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Fazer uma chamada"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Histórico de chamadas"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Informar número incorreto"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiar número"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiar transcrição"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Bloquear número"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Número <xliff:g id="NUMBER">%1$s</xliff:g> bloqueado"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Desbloquear número"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Número <xliff:g id="NUMBER">%1$s</xliff:g> desbloqueado"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"DESFAZER"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Excluir"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Editar número antes de chamar"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Limpar histórico de chamadas"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Excluir mensagem de voz"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arquivar correio de voz"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Compartilhar mensagem de voz"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Correio de voz excluído"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Correio de voz arquivado"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"DESFAZER"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARQUIVAR"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Limpar histórico de chamadas?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Esta ação excluirá todas as chamadas do seu histórico"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Limpando histórico de chamadas…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Smartphone"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Chamada perdida"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Chamada de trabalho perdida"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Chamadas perdidas"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> chamadas perdidas"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Retornar chamada"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensagem"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> Correios de voz </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Correios de voz </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova mensagem de voz de <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Não foi possível repr. correio de voz"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Armazenar em buffer…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Carregando correio de voz..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arquivando correio de voz..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Não foi possível carregar correio de voz"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Somente chamadas com correio de voz"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Somente chamadas recebidas"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Histórico de chamadas"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Mais opções"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"teclado numérico"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiar"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Mostrar apenas enviadas"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Mostrar apenas recebidas"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Mostrar apenas perdidas"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Videochamada realizada"</string>
<string name="type_missed_video" msgid="954396897034220545">"Videochamada perdida"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Correio de voz"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Chamada recusada"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Chamada bloqueada"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Chamadas recebidas"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Reproduzir mensagem de voz"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visualizar contato <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ligar para <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalhes de contato para <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nova mensagem de voz."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> chamadas."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videochamada."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Enviar SMS para <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefone público"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> seg"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> m <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> às <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Não é possível ligar para este número"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Para configurar o correio de voz, vá para Menu &gt; Configurações."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Para ligar para o correio de voz, primeiro desative o modo avião."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"A pesquisa por voz não está disponível"</string>
<string name="call_not_available" msgid="8941576511946492225">"Não é possível fazer uma chamada porque o app Telefone foi desativado."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Nenhum app está disponível para essa ação neste dispositivo"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Inserir nome ou núm. telefone"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Você não tem chamadas perdidas."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Sua caixa de entrada de correio de voz está vazia."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Pesquisar contatos"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Adicionar número ou pesquisar contatos"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Seu histórico de chamadas está vazio"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Fazer uma chamada"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Você não tem chamadas perdidas."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Sua caixa de entrada de correio de voz está vazia."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Seu correio de voz está vazio."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mostrar somente favoritos"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Histórico"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Histórico de chamadas"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arquivo do correio de voz"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Todas"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Perdidas"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Correio de voz"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo bloqueio simplificado"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Para aumentar sua proteção, é preciso alterar o modo como o bloqueio funciona no smartphone. Os números bloqueados agora impedirão chamadas e mensagens de texto, e será possível compartilhá-los com outros apps."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permitir"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Bloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Chamadas feitas a partir deste número serão bloqueadas. Correios de voz serão excluídos automaticamente."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Chamadas feitas a partir deste número serão bloqueadas, mas é possível que o autor ainda consiga deixar correios de voz para você."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Você não receberá mais chamadas ou mensagens de texto deste número."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOQUEAR"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Desbloquear <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DESBLOQUEAR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Discagem rápida"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recentes"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Histórico de chamadas"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Contatos"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Correio de voz"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Removido dos favoritos"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Adicionar a um contato"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Enviar SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Fazer videochamada"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Ver todo o histórico de chamadas"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Bloquear número"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> novas chamadas perdidas"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Ainda não há ninguém na sua discagem rápida"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Adicionar favorito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Toque na imagem para ver todos os números ou toque e segure para reordenar"</string>
<string name="remove_contact" msgid="1080555335283662961">"Remover"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videochamada"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Enviar mensagem"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Enviar uma mensagem"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detalhes da chamada"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Ligar para <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Chamada perdida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Chamada atendida de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Correio de voz não lido de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Correio de voz de <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Chamada para <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"em <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"por <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"por <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"em <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, por <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> por <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Ligar"</string>
<string name="description_call_action" msgid="4000549004089776147">"Ligar para <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videochamada <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Respostas rápidas"</string>
<string name="call_settings_label" msgid="313434211353070209">"Chamadas"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bloqueio de chamadas"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bloqueio de chamadas temporiamente desativado"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"O bloqueio de chamadas foi desativado porque você entrou em contato com serviços de emergência usando este telefone nas últimas 48 horas. Ele será reativado automaticamente depois de um período de 48 horas."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importar números"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Anteriormente, você marcou alguns autores de chamada para serem enviados automaticamente para o correio de voz por meio de outros apps."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ver números"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Falha na importação"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Falha ao arquivar correio de voz."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Desbloquear número"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Adicionar número"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Chamadas a partir destes números serão bloqueadas. Correios de voz serão excluídos automaticamente."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Chamadas feitas a partir destes números serão bloqueadas, mas é possível que eles ainda consigam deixar correios de voz para você."</string>
+ <string name="block_list" msgid="7760188925338078011">"Números bloqueados"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"O número <xliff:g id="NUMBER">%1$s</xliff:g> é inválido."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"O número <xliff:g id="NUMBER">%1$s</xliff:g> já está bloqueado."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Bloqueio de chamadas desativado por 48 horas"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Desativado porque foi feita uma chamada de emergência."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Contas de chamadas"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Ativar"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Definir permissões"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Para ativar a discagem rápida,\n ative a permissão para \"Contatos\"."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Para ver seu registro de chamadas,\n ative a permissão para \"Telefone\"."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Para ver seus contatos,\n ative a permissão para \"Contatos\"."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Para acessar seu correio de voz,\n ative a permissão para \"Telefone\"."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Para ativar a discagem rápida, ative a permissão para o app Contatos."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Para ver seu registro de chamadas, ative a permissão para o app Telefone."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Para ver seus contatos, ative a permissão para o app Contatos."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Para acessar seu correio de voz, ative a permissão para o app Telefone."</string>
<string name="permission_no_search" msgid="84152933267902056">"Para pesquisar seus contatos, ative as permissões para \"Contatos\"."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Para fazer uma chamada,\n ative a permissão para \"Telefone\"."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Para fazer uma chamada, ative a permissão para o app Telefone."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"O app Telefone não tem permissão para gravar nas configurações do sistema."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloqueado"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Chamada ativa: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 69dbf94ac..09f25d315 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Tastatura numerică a telefonului"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Istoricul apelurilor"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Apelați <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Raportați numărul ca incorect"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Modificați numărul înainte de apelare"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Adăugați la o persoană de contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Ștergeți din istoricul apelurilor"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Ștergeți istoricul apelurilor"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Ștergeți mesajul vocal"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Distribuiți mesajul vocal"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Jurnalul de apeluri este gol"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Apelați"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Istoricul apelurilor"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Raportați numărul ca incorect"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Copiați numărul"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Copiați transcrierea"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blocați numărul"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> a fost blocat"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Deblocați numărul"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> a fost deblocat"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ANULAȚI"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Ștergeți"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Modificați numărul înainte de apelare"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Ștergeți istoricul apelurilor"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Ștergeți mesajul vocal"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arhivați mesajul vocal"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Distribuiți mesajul vocal"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Mesaj vocal șters"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Mesajul vocal este arhivat"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ANULAȚI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARHIVĂ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Ștergeți istoricul apelurilor?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Vor fi șterse toate apelurile din istoric"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Se șterge istoricul apelurilor…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Apel nepreluat"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Apel de serviciu nepreluat"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Apeluri nepreluate"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> (de) apeluri nepreluate"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Apelați înapoi"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Trimiteți mesaj"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> mesaje vocale </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> de mesaje vocale </item>
@@ -43,8 +59,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Mesaj vocal nou de la <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Nu s-a putut reda mesageria vocală"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Se utilizează memoria tampon..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Se încarcă mesageria vocală…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Se arhivează mesajul vocal…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Nu s-a putut încărca mesageria vocală"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Numai apelurile cu mesaje vocale"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Numai apelurile primite"</string>
@@ -74,7 +90,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Istoricul apelurilor"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Mai multe opțiuni"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tastatură numerică"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Copiați"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Numai apelurile efectuate"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Numai apelurile primite"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Numai apelurile nepreluate"</string>
@@ -97,12 +112,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Apel video efectuat"</string>
<string name="type_missed_video" msgid="954396897034220545">"Apel video nepreluat"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Mesaj vocal"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Apel respins"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Apel blocat"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Apeluri de intrare"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Redați mesajul vocal"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Afișați persoana din agendă <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Apelați pe <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detalii de contact pentru <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Mesaj vocal nou."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> (de) apeluri."</string>
<string name="description_video_call" msgid="2933838090743214204">"Apel video."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Trimiteți SMS la <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -115,6 +131,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefon public"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> (de) secunde"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> sec."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> la <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Nu puteți apela acest număr"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Pentru a configura mesageria vocală, accesați Meniu &gt; Setări."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Pentru a apela mesageria vocală, mai întâi dezactivați modul Avion."</string>
@@ -127,16 +148,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Căutarea vocală nu este disponibilă"</string>
<string name="call_not_available" msgid="8941576511946492225">"Nu se poate efectua un apel telefonic, deoarece aplicația Telefon a fost dezactivată."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Pe dispozitiv nu există nicio aplicație pentru această acțiune"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Introduceți nume sau număr"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nu aveți niciun apel nepreluat."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Nu există mesaje primite în mesageria vocală."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Căutați persoane de contact"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Adăugați număr/căutați contacte"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Istoricul apelurilor este gol"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Apelați"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nu aveți niciun apel nepreluat."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Nu există mesaje primite în mesageria vocală."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arhiva de mesaje vocale este goală."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Afișați numai preferate"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Istoric"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Istoricul apelurilor"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arhivă de mesaje vocale"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Toate"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Nepreluate"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Mesagerie vocală"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Mod de blocare nou, mai simplu"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Pentru a vă proteja mai bine, aplicația Telefon trebuie să schimbe modul în care funcționează blocarea. Se vor opri apelurile și mesajele text de la numerele blocate, iar la acestea pot avea acces și alte aplicații."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Permiteți"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blocați <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Apelurile de la acest număr vor fi blocate, iar mesajele vocale vor fi șterse automat."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Apelurile de la acest număr vor fi blocate, dar apelantul va putea totuși să vă lase mesaje vocale."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Nu veți mai primi apeluri sau mesaje text de la acest număr."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCAȚI"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Deblocați <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"DEBLOCAȚI"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Apelare rapidă"</string>
- <string name="tab_recents" msgid="929949073851377206">"Recente"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Istoricul apelurilor"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Agendă"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Mesagerie vocală"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"S-a eliminat din preferate"</string>
@@ -146,7 +182,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Adăugați la o intrare"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Trimiteți SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Inițiați un apel video"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Vedeți istoricul complet al apelurilor"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blocați numărul"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> (de) apeluri nepreluate noi"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Nicio persoană de contact setată pentru apelarea rapidă"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Adăugați o persoană de contact preferată"</string>
@@ -155,13 +191,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Atingeți imaginea pentru a vedea toate numerele sau atingeți lung pentru reordonare"</string>
<string name="remove_contact" msgid="1080555335283662961">"Eliminați"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Apel video"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Trimiteți mesajul"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Trimiteți un mesaj"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detaliile apelului"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Apelați <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Apel nepreluat de la <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Apel preluat de la <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Mesaj vocal necitit de la <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Mesaj vocal de la <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Apel către <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"pe <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"prin <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"prin <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"în <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, prin <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> prin <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Apelați"</string>
<string name="description_call_action" msgid="4000549004089776147">"Apelați <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Apelați video <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -201,14 +243,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Răspunsuri rapide"</string>
<string name="call_settings_label" msgid="313434211353070209">"Apeluri"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blocarea apelurilor"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blocarea apelurilor e dezactivată temporar"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blocarea apelurilor a fost dezactivată, deoarece ați contactat serviciile de urgență de pe acest telefon în ultimele 48 de ore. Funcția va fi reactivată automat după ce perioada de 48 de ore va expira."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importați numere"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Anterior, ați marcat câțiva apelanți pentru a fi redirecționați automat spre mesageria vocală prin alte aplicații."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Vedeți numerele"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importați"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importul nu a reușit"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Mesajul vocal nu s-a arhivat."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Deblocați numărul"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Adăugați un număr"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Apelurile de la aceste numere vor fi blocate, iar mesajele vocale vor fi șterse automat."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Apelurile de la aceste numere vor fi blocate, dar apelanții vor putea totuși să vă lase mesaje vocale."</string>
+ <string name="block_list" msgid="7760188925338078011">"Numere blocate"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> nu este valid."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> este deja blocat."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blocarea apelurilor este dezactivată pentru 48 de ore"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Dezactivată din cauza efectuării unui apel de urgență."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Conturi pentru apelare"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Activați"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Setați permisiunile"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Pentru a activa apelarea rapidă,\n activați permisiunea Agendă."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Pentru a vedea jurnalul de apeluri,\n activați permisiunea Telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Pentru a vedea persoanele de contact,\n activați permisiunea Agendă."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Pentru a accesa mesageria vocală,\n activați permisiunea Telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Pentru a activa apelarea rapidă, activați permisiunea Agendă."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Pentru a vedea jurnalul de apeluri, activați permisiunea Telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Pentru a vedea persoanele de contact, activați permisiunea Agendă."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Pentru a accesa mesageria vocală, activați permisiunea Telefon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Pentru a căuta în persoanele de contact, activați permisiunea Agendă."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Pentru a efectua un apel,\n activați permisiunea Telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Pentru a apela, activați permisiunea Telefon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplicația Telefon nu are permisiunea să modifice setările de sistem."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blocat"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> este activ"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 479490094..efc0728b9 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Панель набора номера"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Кнопки"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Журнал звонков."</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Вызов: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Ошибка в номере"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Изменить номер и вызвать"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Добавить к контакту"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Удалить из журнала звонков"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Очистить журнал звонков"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Удалить голосовое сообщение"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Поделиться"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Журнал вызовов пуст"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Позвонить"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Журнал звонков"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Ошибка в номере"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Скопировать номер"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Скопировать транскрипцию"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Заблокировать номер"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> заблокирован"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Разблокировать номер"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> разблокирован"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ОТМЕНИТЬ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Удалить"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Изменить номер и позвонить"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Очистить журнал звонков"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Удалить голосовое сообщение"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Архивировать голос. сообщение"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Отправить голосовое сообщение"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Сообщение удалено"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Готово"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ОТМЕНИТЬ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"АРХИВ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Очистить журнал звонков?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Журнал звонков будет удален."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Очистка журнала звонков…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Вызов"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Пропущенный вызов"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Пропущенный звонок (работа)"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Пропущенные вызовы"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Пропущенных вызовов: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Перезвонить"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Написать SMS"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> голосовое сообщение </item>
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> голосовых сообщения </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Новое гол. сообщение: <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Не удалось воспроизвести сообщения"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Буферизация..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Загрузка сообщений…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Архивирование…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Не удалось загрузить голосовую почту"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Только звонки с голосовой почтой"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Только входящие звонки"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Журнал звонков"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Ещё"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"Панель набора номера"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Копировать"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Исходящие"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Входящие"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Пропущенные"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Исходящий видеовызов"</string>
<string name="type_missed_video" msgid="954396897034220545">"Пропущенный видеовызов"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Голосовая почта"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Отклоненный вызов"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Заблокированный вызов"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Входящие вызовы"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Прослушать голосовую почту"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Просмотреть данные: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Позвонить: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Сведения о контакте <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Новое голосовое сообщение."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Вызовов: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Видеовстреча"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Отправить SMS пользователю <xliff:g id="NAME">%1$s</xliff:g>."</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Телефон-автомат"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> мин. <xliff:g id="SECONDS">%s</xliff:g> сек."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> в <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"На этот номер нельзя позвонить."</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Чтобы настроить голосовую почту, выберите \"Меню &gt; Настройки\"."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Сначала отключите режим полета."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Голосовой поиск недоступен"</string>
<string name="call_not_available" msgid="8941576511946492225">"Нельзя совершать телефонные звонки, поскольку приложение \"Телефон\" отключено."</string>
<string name="activity_not_available" msgid="2287665636817987623">"На устройстве нет подходящего приложения"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Введите имя или номер телефона"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Нет пропущенных звонков"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Нет входящих голосовых сообщений"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Поиск в контактах"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Найдите контакт или введите номер"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"В журнале пока нет звонков"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Вызов"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Нет пропущенных звонков"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Нет входящих голосовых сообщений"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Архив пуст."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Только часто используемые"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Журнал"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Журнал звонков"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Архив голосовой почты"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Все"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Пропущенные"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Г. почта"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Простая блокировка номеров"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Для более надежной защиты приложению \"Телефон\" требуется изменить настройки блокировки. С заблокированных номеров теперь не будут приниматься звонки и сообщения, а сами номера могут быть предоставлены другим приложениям."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Разрешить"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Заблокировать <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Вызовы с этого номера будут блокироваться, а голосовые сообщения – автоматически удаляться."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Вызовы с этого номера будут блокироваться, но абонент сможет оставлять вам голосовые сообщения."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Вызовы и сообщения с этого номера будут блокироваться."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛОКИРОВАТЬ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Разблокировать <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"РАЗБЛОКИРОВАТЬ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Быстрый набор"</string>
- <string name="tab_recents" msgid="929949073851377206">"Недавние"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Журнал звонков"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Контакты"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Голосовая почта"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Контакт удален из избранных"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Добавить к контакту"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Отправить SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Начать видеовстречу"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Посмотреть весь журнал звонков"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Заблокировать номер"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Пропущенных вызовов: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Нет номеров для быстрого набора"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Настроить быстрый набор"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Коснитесь изображения, чтобы увидеть все номера, или нажмите и удерживайте, чтобы изменить порядок"</string>
<string name="remove_contact" msgid="1080555335283662961">"Удалить"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Видеовстреча"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Отправить сообщение"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Отправить сообщение"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Сведения о вызове"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Позвонить: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Пропущен вызов от контакта <xliff:g id="NAMEORNUMBER">^1</xliff:g>. <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Принят вызов от контакта <xliff:g id="NAMEORNUMBER">^1</xliff:g>. <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Непрослушанное сообщение от контакта <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Голосовая почта от контакта <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Вызов контакту <xliff:g id="NAMEORNUMBER">^1</xliff:g>. <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"Номер: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"Номер: <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>. Номер: <xliff:g id="NUMBER">%2$s</xliff:g>."</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>. Номер: <xliff:g id="NUMBER">%2$s</xliff:g>."</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Вызов"</string>
<string name="description_call_action" msgid="4000549004089776147">"Позвонить: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Видеовстреча: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Быстрые ответы"</string>
<string name="call_settings_label" msgid="313434211353070209">"Вызовы"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Блокировка вызовов"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Блокировка вызовов временно отключена"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Блокировка вызовов отключена, поскольку вы недавно набирали номер экстренной службы. Когда с момента звонка пройдет 48 часов, эта функция включится автоматически."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Импортировать номера"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Вы настроили перенаправление вызовов от некоторых абонентов в голосовую почту в других приложениях."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Просмотреть номера"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Импортировать"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Ошибка импорта"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Не удалось архивировать сообщение."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Разблокировать номер"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Добавить номер"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Вызовы с этих номеров будут блокироваться, а голосовые сообщения – автоматически удаляться."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Вызовы с этих номеров будут блокироваться, но абоненты смогут оставлять вам голосовые сообщения."</string>
+ <string name="block_list" msgid="7760188925338078011">"Заблокированные номера"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> недействителен."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> уже заблокирован."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Блокировка вызовов отключена на 48 часов"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Блокировка звонков отключена из-за экстренного вызова"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Аккаунты для звонков"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Включить"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Задать разрешения"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Чтобы настроить быстрый набор,\nвключите разрешение \"Контакты\"."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Чтобы открыть журнал вызовов,\n включите разрешение \"Телефон\"."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Чтобы перейти к списку контактов,\n включите разрешение \"Контакты\"."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Чтобы перейти к голосовым сообщениям,\n включите разрешение \"Телефон\"."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Чтобы настроить быстрый набор, предоставьте приложению разрешение \"Контакты\"."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Чтобы открыть список вызовов, предоставьте приложению разрешение \"Телефон\"."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Чтобы открыть список контактов, предоставьте приложению разрешение \"Контакты\"."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Чтобы получить доступ к голосовой почте, предоставьте приложению разрешение \"Телефон\"."</string>
<string name="permission_no_search" msgid="84152933267902056">"Для поиска контактов включите разрешение \"Контакты\"."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Чтобы позвонить,\n включите разрешение \"Телефон\"."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Чтобы позвонить, предоставьте приложению разрешение \"Телефон\"."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"У приложения \"Телефон\" нет разрешения на изменение системных настроек."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Заблокирован"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>: вызов активен"</string>
</resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index f758e6db7..c73bab537 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"දුරකථනය"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"දුරකථනය"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"දුරකථන ඩයල්පෑඩය"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"දුරකථනය"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ඇමතුම් ඉතිහාසය"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> අමතන්න"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"වැරදි අංකය වාර්තා කරන්න"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"ඇමතීමට කලින් අංකය වෙනස් කරන්න"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"සම්බන්ධතාවකට එක් කරන්න"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ඇමතුම් ඉතිහාසයෙන් මකන්න"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ඇමතුම් ඉතිහාසය හිස් කරන්න"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"හඬ තැපෑල මකන්න"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"හඬ තැපෑල බෙදාගන්න"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"ඔබගේ ඇමතුම් ලොගය හිස් ය"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ඇමතුමක් ලබාගන්න"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ඇමතුම් ඉතිහාසය"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"වැරදි අංකය වාර්තා කරන්න"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"අංකය පිටපත් කරන්න"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"පිටපත් කිරීම පිටපත් කරන්න"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"අංකය අවහිර කරන්න"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> අවහිරයි"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"අංකය අවහිර නොකරන්න"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> අවහිර නැත"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"අස් කරන්න"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"මකන්න"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"ඇමතුමට පෙර අංකය සංස්කරණය"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"ඇමතුම් ඉතිහාසය හිස් කරන්න"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"හඬ තැපෑල මකන්න"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"හඬ තැපෑල සංරක්ෂණය කරන්න"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"හඬ තැපෑල බෙදා ගන්න"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"හඬ තැපෑල මකන ලදී"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"හඬ තැපෑල සංරක්ෂණය කරන ලදී"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"අස් කරන්න"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"සංරක්ෂිතය වෙත යන්න"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"ඇමතුම් ඉතිහාසය හිස් කරන්නද?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"මෙය ඔබේ ඉතිහාසයෙන් සියලු ඇමතුම් මකනු ඇත"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"ඇමතුම් ඉතිහාසය හිස් කරමින්…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"දුරකථනය"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"මඟ හැරුණු ඇමතුම"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"මග හැරුණ කාර්යාල ඇමතුම"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"මඟ හැරුණු ඇමතුම්"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"මඟ හැරුණු ඇමතුම් <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"ආපසු අමතන්න"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"පණිවිඩය"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one">හඬ තැපැල් <xliff:g id="COUNT">%1$d</xliff:g> </item>
<item quantity="other">හඬ තැපැල් <xliff:g id="COUNT">%1$d</xliff:g> </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> වෙතින් නව හඬ තැපැලක්"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"හඬ තැපෑල වාදනය කිරීමට නොහැකි විය"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"අන්තරාචයනය වෙමින්..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"හඬ තැපෑල ප්‍රවේශනය වෙමින්…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"හඬ තැපෑල සංරක්ෂණය කරමින්…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"හඬ තැපෑල ප්‍රවේශනය කිරීමට නොහැකි විය"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"හඬ තැපෑල සහිත ඇමතුම් පමණි"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"එන ඇමතුම් පමණි"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ඇමතුම් ඉතිහාසය"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"තවත් විකල්ප"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ඩයල් පෑඩය"</string>
- <string name="menu_copy" msgid="6108677035381940698">"පිටපත්කරණය"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"පිටතට යන ඒවා පමණක් පෙන්වන්න"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"එන ඒවා පමණක් පෙන්වන්න"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"මඟ හැරුණු ඒවා පමණක් පෙන්වන්න"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"පිටවන වීඩියෝ ඇමතුම"</string>
<string name="type_missed_video" msgid="954396897034220545">"මගහැරුණු වීඩියෝ ඇමතුම"</string>
<string name="type_voicemail" msgid="5153139450668549908">"හඬ තැපෑල"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"ප්‍රතික්ෂේප කළ ඇමතුම"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"අවහිර කළ ඇමතුම"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"එන ඇමතුම්"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"හඬ තැපෑල ධාවනය කිරීම"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> සම්බන්ධතාවය බලන්න"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> අමතන්න"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> සඳහා ඇමතුම් විස්තර"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"නව හඬ තැපෑල."</string>
<string name="description_num_calls" msgid="1601505153694540074">"ඇමතුම් <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"වීඩියෝ ඇමතුම."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g> වෙත SMS යවන්න"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"පේෆෝනය"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"තත් <xliff:g id="SECONDS">%s</xliff:g>"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"මිනි <xliff:g id="MINUTES">%s</xliff:g> තත් <xliff:g id="SECONDS">%s</xliff:g>"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> දින <xliff:g id="TIME">%2$s</xliff:g>ට"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"මෙම අංකයට ඇමතිය නොහැකිය"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"හඬ තැපෑල සකස් කර ගැනීමට, මෙනු &gt; සැකසීම් වෙත යන්න."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"හඬ තැපෑල ඇමතීමට, මුලින්ම ගුවන්යානා ආකාරය වසා දමන්න."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"හඬ සෙවුම ලබාගත නොහැකිය"</string>
<string name="call_not_available" msgid="8941576511946492225">"දුරකථන යෙදුම අබල කර ඇති නිසා දුරකථන ඇමතුම ලබාගැනීම කළ නොහැක."</string>
<string name="activity_not_available" msgid="2287665636817987623">"මෙම උපාංගයෙහි ඒ සඳහා යෙදුමක් නැත"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"නමක් හෝ දුරකථන අංකයක් ඇතුළු කරන්න"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"ඔබ මඟ හැරුණු ඇමතුම් නැත."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"ඔබේ හඬ තැපැල් එන ලිපි හිස්ය."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"සම්බන්ධතා සෙවීම"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"අංකය එක් කරන්න හෝ සම්බන්ධතා සොයන්න"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"ඔබගේ ඇමතුම් ඉතිහාසය හිස්ය"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ඇමතුමක් සිදු කරන්න"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"ඔබට මඟ හැරුණු ඇමතුම් නැත."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"ඔබේ හඬ තැපැල් එන ලිපි හිස්ය."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"ඔබේ හඬ තැපැල් සංරක්ෂිතය හිස්ය."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ප්‍රියතමයන් පමණක් පෙන්වන්න"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ඉතිහාසය"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ඇමතුම් ඉතිහාසය"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"හඬ තැපෑල් සංරක්ෂිතය"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"සියලු"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"මග හැරුණේය"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"හඬ තැපෑල"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"නව, සරල අවහිර කිරීම"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"ඔබව වඩාත් හොඳින් ආරක්ෂා කිරීමට, දුරකථනයට අවහිර කිරීම ක්‍රියා කරන ආකාරය වෙනස් කිරීමට අවශ්‍යයි. ඔබේ අවහිර කළ අංක දැන් ඇමතුම් සහ පෙළ පණිවිඩ යන දෙකම නවත්වනු ඇති අතර වෙනත් යෙදුම් සමග බෙදා ගැනීමට හැකිය."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"ඉඩ දෙන්න"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> අවහිර කරන්නද?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"මෙම අංකය වෙතින් වන ඇමතුම් අවහිර කරනු ඇති අතර හඬ තැපැල් ස්වයංක්‍රියව මකනු ඇත."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"මෙම අංකය වෙතින් වන ඇමතුම් අවහිර කරනු ඇති නමුත්, අමතන්නාට තවම ඔබට හඬ තැපැල් තැබීමට හැකිය."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"ඔබට මෙම අංකයෙන් තවදුරටත් ඇමතුම් හෝ පෙළ පණිවිඩ නොලැබෙනු ඇත."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"අවහිරයි"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> අවහිර නොකරන්නද?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"අවහිර නොකරන්න"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"වේග ඩයල් කිරීම"</string>
- <string name="tab_recents" msgid="929949073851377206">"මෑත"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ඇමතුම් ඉතිහාසය"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"සම්බන්ධතා"</string>
<string name="tab_voicemail" msgid="155024725947496746">"හඬ තැපෑල"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ප්‍රියතමයන්ගෙන් ඉවත් කරන්න"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"සම්බන්ධතාවකට එක් කරන්න"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS යවන්න"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"වීඩියෝ ඇමතුමක් ලබාගන්න"</string>
- <string name="show_call_history" msgid="1141502332266697170">"සම්පූර්ණ ඇමතුම් ඉතිහාසය බලන්න"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"අංකය අවහිර කරන්න"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"නව මඟ හැරුණු ඇමතුම් <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"ඔබගේ වේග ඩයල් එකේ තවමත් කවුරුවත් නැහැ"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ප්‍රියතම ලෙස එක් කරන්න"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"සියලු අංක බැලීමට අනුරුව ස්පර්ශ කරන්න නැතහොත් &amp; යළි ඇණවුම් කිරීමට අල්ලාගෙන සිටින්න"</string>
<string name="remove_contact" msgid="1080555335283662961">"ඉවත් කරන්න"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"වීඩියෝ ඇමතුම"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"පණිවිඩය යවන්න"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"පණිවිඩයක් යවන්න"</string>
<string name="call_log_action_details" msgid="701345508704970622">"ඇමතුම් විස්තර"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> අමතන්න"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> වෙතින් ඇමතුමක් මගහැරුණා."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> වෙතින් ඇමතුමකට පිළිතුරු දුන්නා."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> වෙතින් නොකියවූ හඬ තැපෑල."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> වෙතින් හඬ තැපෑල."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g> වෙත ඇමතුමක්."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> හි"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> හරහා"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> හරහා"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> මත, <xliff:g id="NUMBER">%2$s</xliff:g> හරහා"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> හරහා <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"ඇමතුම"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> අමතන්න"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>. වීඩියෝ ඇමතුම"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"ක්ෂණික ප්‍රතිචාර"</string>
<string name="call_settings_label" msgid="313434211353070209">"ඇමතුම්"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"ඇමතුම් අවහිර කිරීම"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"ඇමතුම් අවහිර කිරීම තාවකාලිකව අක්‍රියයි"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ඔබ පසුගිය පැය 48 ඇතුළත මෙම දුරකථනයෙන් හදිසි අවස්ථා සේවා ඇමතූ බැව්න් ඇමතුම් අවහිර කිරීම අබල කර ඇත. පැය 48ක කාල සීමාව ඉකුත් වූ විට එය ස්වයංක්‍රියව යළි සබල කෙරේ."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"අංක ආයාත කරන්න"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"ඔබ පෙරදී සමහර අමතන්නන් වෙනත් යෙදුම් හරහා ස්වයංක්‍රියව හඬ තැපෑල වෙත යැවීමට ලකුණු කරන ලදී."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"අංක බලන්න"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"ආයාත කරන්න"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"අයාත කිරීම අසාර්ථක විය"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"හඬ තැපෑල සංරක්ෂනය කිරීමට අසමත් විය."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"අංකය අවහිර නොකරන්න"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"අංකයක් එක් කරන්න"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"මෙම අංක වෙතින් වන ඇමතුම් අවහිර කරනු ඇති අතර හඬ තැපැල් ස්වයංක්‍රියව මකනු ඇත."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"මෙම අංක වෙතින් වන ඇමතුම් අවහිර කරනු ඇති නමුත්, ඔවුන්ට තවම ඔබට හඬ තැපැල් තැබීමට හැකිය."</string>
+ <string name="block_list" msgid="7760188925338078011">"අවහිර කළ අංක"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> වලංගු නැත."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> දැනටමත් අවහිර කර ඇත."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"පැය 48ක් සඳහා ඇමතුම් අවහිර කිරීම අබල කරන ලදී"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"හදිසි ඇමතුමක් සිදු කළ නිසා අබල කරන ලදී."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"ගිණුම් ඇමතීම"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ක්‍රියාත්මක කරන්න"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"අවසර සකසන්න"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"වේග ඩයල් කිරීම සබල කිරීමට,\n සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"ඔබගේ ඇමතුම ලොගය බැලීමට,\n දුරකථන අවසරය ක්‍රියාත්මක කරන්න."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"ඔබේ සම්බන්ධතා බැලීමට,\n සම්බන්ධතා අවසර ක්‍රියාත්මක කරන්න."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"ඔබගේ හඬ තැපැල් වෙත ප්‍රවේශ වීම සඳහා,\n දුරකථන අවසර ක්‍රියාත්මක කරන්න."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"වේග ඩයල් කිරීම සබල කිරීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"ඔබේ ඇමතුම් ලොගය බැලීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"ඔබේ සම්බන්ධතා බැලීමට, සම්බන්ධතා අවසරය ක්‍රියාත්මක කරන්න."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"ඔබේ හඬ තැපෑල වෙත ප්‍රවේශ වීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න."</string>
<string name="permission_no_search" msgid="84152933267902056">"ඔබේ සම්බන්ධතා සෙවීමට, සම්බන්ධතා අවසර ක්‍රියාත්මක කරන්න."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"ඇමතුමක් ලබාගැනීම සඳහා,\n දුරකථන අවසර ක්‍රියාත්මක කරන්න."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"ඇමතුමක් ලබා ගැනීමට, දුරකථන අවසරය ක්‍රියාත්මක කරන්න."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"දුරකථන යෙදුමට පද්ධති සැකසීම් වෙත ලිවීමට අවසර නැත."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"අවහිර කරන ලදි"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> සක්‍රියයි"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 1e43c7689..5389f8fab 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefón"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefón"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Číselník telefónu"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefón"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"História hovorov"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Zavolať kontakt <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Nahlásiť nesprávne číslo"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Pred volaním upraviť číslo"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Pridať ku kontaktu"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Odstrániť z histórie hovorov"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Vymazať históriu hovorov"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Odstrániť hlasovú správu"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Zdieľať hlasovú správu"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Denník hovorov je prázdny"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Volať"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"História hovorov"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Nahlásiť nesprávne číslo"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopírovať číslo"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopírovať prepis"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokovať číslo"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> – blokované"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Zrušiť blokovanie čísla"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> – odblokované"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"SPÄŤ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Odstrániť"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Pred volaním upraviť číslo"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Vymazať históriu hovorov"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Odstrániť hlasovú správu"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Archivovať hlasovú správu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Zdieľať hlasovú správu"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Hlas. schránka odstránená"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Hlasová správa bola archiv."</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"SPÄŤ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARCHÍV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Chcete vymazať históriu hovorov?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Týmto z histórie odstránite všetky hovory."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Vymazáva sa história hovorov..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefón"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Zmeškaný hovor"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Zmeškaný pracovný hovor"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Zmeškané hovory"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Zmeškané hovory: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Zavolať späť"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Správa"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> odkazy v hlasovej schránke </item>
<item quantity="many"> <xliff:g id="COUNT">%1$d</xliff:g> odkazu v hlasovej schránke </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nová hlasová správa – <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Hlasovú schránku sa nepodarilo prehrať"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Ukladanie do vyrovnávacej pamäte…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Načítava sa hlasová schránka…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Archivuje sa hlasová správa…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Hlasovú schránku sa nepodarilo načítať"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Iba volania do hlasovej schránky"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Iba prichádzajúce hovory"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"História hovorov"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Ďalšie možnosti"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"číselná klávesnica"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopírovať"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Zobraziť len odchádzajúce"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Zobraziť len prichádzajúce"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Zobraziť len zmeškané"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Odchádzajúci videohovor"</string>
<string name="type_missed_video" msgid="954396897034220545">"Zmeškaný videohovor"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Hlasová schránka"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Odmietnutý hovor"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokovaný hovor"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Prichádzajúce hovory"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Prehrať hlasovú správu"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Zobraziť kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Volať kontakt <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Podrobnosti kontaktu pre <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nová hlasová správa."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Počet volaní: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videohovor"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Poslať SMS kontaktu <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefónny automat"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> o <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Na toto číslo nie je možné volať"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ak chcete nastaviť hlasovú schránku, prejdite na položku Menu &gt; Nastavenia."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Ak chcete volať hlasovú schránku, najprv vypnite režim v lietadle."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Hlasové vyhľadávanie nie je k dispozícii"</string>
<string name="call_not_available" msgid="8941576511946492225">"Nie je možné volať, pretože aplikácia Telefón bola deaktivovaná."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Na tomto zariadení nie je aplikácia na vykonanie danej akcie"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Zadajte meno alebo tel. číslo"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nemáte žiadne zmeškané hovory."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Hlasová schránka je prázdna."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Hľadať kontakty"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Pridajte číslo / vyhľadajte v kontaktoch"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"História hovorov je prázdna"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Zavolať"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nemáte žiadne zmeškané hovory."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Hlasová schránka je prázdna."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Váš archív hlasových správ je prázdny."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Zobraziť iba obľúbené"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"História"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"História hovorov"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archív hlasových správ"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Všetky"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Zmeškané"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Schránka"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Nové zjednodušené blokovanie"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"V telefóne je potrebné zmeniť spôsob fungovania blokovania. Len tak dosiahnete lepšiu ochranu. Blokované čísla budú brániť prijímaniu hovorov aj textových správ a bude ich možné zdieľať s ďalšími aplikáciami."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Povoliť"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blokovať číslo <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Hovory z tohto čísla budú blokované a hlasové správy budú automaticky odstraňované."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Hovory z tohto čísla budú zablokované, ale volajúci stále môže zanechať hlasové správy."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Z tohto čísla už nebudete prijímať hovory ani textové správy."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKOVAŤ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Odblokovať číslo <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ODBLOKOVAŤ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Rýchla voľba"</string>
- <string name="tab_recents" msgid="929949073851377206">"Nedávne"</string>
+ <string name="tab_history" msgid="2563144697322434940">"História hovorov"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakty"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Hlasová schránka"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Odstránené z obľúbených"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Pridať ku kontaktu"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Odoslať SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Uskutočniť videohovor"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Zobraziť úplnú históriu hovorov"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokovať číslo"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Počet nových zmeškaných hovorov: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"V rýchlom vytáčaní zatiaľ nemáte žiadny kontakt"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Pridať obľúbený kontakt"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Klepnutím na obrázok si môžete zobraziť všetky čísla. Ak naň klepnete a podržíte ho, môžete zmeniť ich poradie."</string>
<string name="remove_contact" msgid="1080555335283662961">"Odstrániť"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videohovor"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Odoslať správu"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Odoslať správu"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Podrobnosti hovoru"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Zavolať kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Zmeškaný hovor – kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Prijatý hovor – kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Neprečítaná správa v hlasovej schránke od <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Správa v hlasovej schránke od <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Volanie – kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"v rámci účtu <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"prostredníctvom čísla <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"prostredníctvom čísla <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"v účte <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, prostredníctvom čísla <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> prostredníctvom čísla <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Volať"</string>
<string name="description_call_action" msgid="4000549004089776147">"Zavolať kontakt <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Spustiť videohovor s kontaktom <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Rýchle odpovede"</string>
<string name="call_settings_label" msgid="313434211353070209">"Hovory"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokovanie hovorov"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokovanie hovorov je dočasne vypnuté"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Pretože ste z tohto telefónu počas posledných 48 hodín volali na tiesňovú linku, blokovanie hovorov bolo vypnuté. Po uplynutí 48 hodín sa automaticky znova zapne."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importovať čísla"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"V minulosti ste niektorých volajúcich označili, aby boli automaticky prepojení do hlasovej schránky prostredníctvom ďalších aplikácií."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Zobraziť čísla"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importovať"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import zlyhal"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Hlasovú správu nebolo možné archivovať"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Zrušiť blokovanie čísla"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Pridať číslo"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Hovory z týchto čísel budú blokované a hlasové správy budú automaticky odstraňované."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Hovory z týchto čísel budú blokované, ale volajúci vám budú stále môcť zanechať hlasové správy."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokované čísla"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Číslo <xliff:g id="NUMBER">%1$s</xliff:g> je neplatné."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Číslo <xliff:g id="NUMBER">%1$s</xliff:g> je už blokované."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokovanie hovorov je deaktivované na 48 hodín"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Deaktivované, pretože ste uskutočnili tiesňové volanie"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Telefónne účty"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Zapnúť"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Nastaviť povolenia"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Ak chcete povoliť rýchle vytáčanie,\n zapnite povolenie Kontakty."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Ak chcete zobraziť denník hovorov,\n zapnite povolenie Telefón."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Ak chcete zobraziť kontakty,\n zapnite povolenie Kontakty."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Ak chcete používať hlasovú schránku,\n zapnite povolenie Telefón."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Ak chcete aktivovať rýchle vytáčanie, zapnite povolenie Kontakty."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Ak si chcete zobraziť denník hovorov, zapnite povolenie Telefón."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Ak si chcete zobraziť kontakty, zapnite povolenie Kontakty."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Ak chcete používať hlasovú schránku, zapnite povolenie Telefón."</string>
<string name="permission_no_search" msgid="84152933267902056">"Ak chcete hľadať kontakty, zapnite povolenie Kontakty."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Ak chcete uskutočniť hovor,\n zapnite povolenie Telefón."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Ak chcete volať, zapnite povolenie Telefón."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefónna aplikácia nemá povolenie na zápis do nastavení systému."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Zablokované"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> - hovor je aktívny"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 94508a534..ad8ae83f4 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Številčnica telefona"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Zgodovina klicev"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Pokliči <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Prijavite netočno številko"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Pred klicanjem uredi številko"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Dodaj stiku"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Izbris iz zgodovine klicev"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Izbriši zgodovino klicev"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Brisanje sporočil odzivnika"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Skupna raba odzivnika"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Vaš dnevnik klicev je prazen"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Klicanje"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Zgodovina klicev"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Prijavi netočno številko"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiranje številke"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiraj prepis"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blokiranje številke"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Številka <xliff:g id="NUMBER">%1$s</xliff:g> je blokirana"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Odblokiranje telefonske številke"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Številka <xliff:g id="NUMBER">%1$s</xliff:g> je odblokirana"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"RAZVELJAVI"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Izbriši"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Urejanje številke pred klicem"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Izbriši zgodovino klicev"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Brisanje sporočil iz odzivnika"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arhiviraj sporoč. v odzivniku"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Skupna raba spor. v odzivniku"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Spor. v odziv. izbr."</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Sporoč. v odzivniku arhivirano"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"RAZVELJAVI"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"V ARHIV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Želite izbrisati zgodovino klicev?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"S tem boste iz zgodovine izbrisali vse klice"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Izbris zgodovine klicev …"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefoniranje"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Neodgovorjeni klic"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Neodgovorjen delovni klic"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Neodgovorjeni klici"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Št. neodgovorjenih klicev: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Povratni klic"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"SMS"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> sporočilo v odzivniku </item>
<item quantity="two"> <xliff:g id="COUNT">%1$d</xliff:g> sporočili v odzivniku </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g> , <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nova glasovna pošta od <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Sporočil v odzivniku ni mogoče predv."</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Medpomnjenje…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Nalaganje sporočil v odzivniku …"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arhiviranje sporočila v odzivniku …"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Sporočil v odzivniku ni mogoče naložiti"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Samo klici z odzivnikom"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Samo dohodni klici"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Zgodovina klicev"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Več možnosti"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"številčnica"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiraj"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Pokaži samo odhodne"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Pokaži samo dohodne"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Pokaži samo neodgovorjene"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Odhodni videoklic"</string>
<string name="type_missed_video" msgid="954396897034220545">"Zamudili ste videoklic"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Odzivnik"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Zavrnjen klic"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blokiran klic"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Dohodni klici"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Predvajanje sporočil glasovne pošte"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Ogled stika <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Klicanje osebe <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Podrobnosti stika za <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Novo sporočilo v odzivniku."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Št. klicev: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videoklic."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Pošlji SMS prejemniku <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefonska govorilnica"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> s"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> s"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ob <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Te številke ni mogoče klicati"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Če želite nastaviti odzivnik, odprite Meni &gt; Nastavitve."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Če želite poklicati odzivnik, najprej izklopite način za letalo."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Glasovno iskanje ni na voljo"</string>
<string name="call_not_available" msgid="8941576511946492225">"Ni mogoče opraviti telefonskega klica, ker je aplikacija Telefon onemogočena."</string>
<string name="activity_not_available" msgid="2287665636817987623">"V tej napravi ni aplikacije za to"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Vnesite ime ali telefonsko številko"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nimate zgrešenih klicev."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Vaša mapa s sporočili v odzivniku je prazna."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Iskanje stikov"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Dodajte št. ali iščite med st."</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Zgodovina klicev je prazna"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Klicanje"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nimate neodgovorjenih klicev."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Vaš nabiralnik s sporočili v odzivniku je prazen."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arhiv s sporočili v odzivniku je prazen."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Pokaži samo priljubljene"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Zgodovina"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Zgodovina klicev"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arhiv s sporočili v odzivniku"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Vsi"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Neodgovorjeni"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Odzivnik"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Novo poenostavljeno blokiranje"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Za večjo varnost je treba v aplikaciji Telefon spremeniti nastavitev načina blokiranja. Tako z blokiranih številk ne boste več prejemali klicev in sporočil, poleg tega pa lahko take številke posredujete tudi v druge aplikacije."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Dovoli"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Želite blokirati številko <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Klici s te številke bodo blokirani in sporočila v odzivniku bodo samodejno izbrisana."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Klici s te številke bodo blokirani, klicatelj pa bo morda še vedno lahko pustil sporočila v odzivniku."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"S te številke ne boste več prejemali klicev ali sporočil SMS."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKIRAJ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Želite odblokirati številko <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ODBLOKIRAJ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Hitro izbiranje"</string>
- <string name="tab_recents" msgid="929949073851377206">"Nedavni"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Zgodovina klicev"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Stiki"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Odzivnik"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Odstranjeno iz priljubljenih"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Dodaj stiku"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Pošlji SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Opravi videoklic"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Prikaz celotne zgodovine klicev"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blokiraj številko"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Št. novih zgrešenih klicev: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Na seznamu za hitro klicanje nimate še nikogar"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Dodajte priljubljenega"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Dotaknite se slike, če želite videti vse številke, ali pa se je dotaknite in pridržite, če želite spremeniti vrstni red."</string>
<string name="remove_contact" msgid="1080555335283662961">"Odstrani"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videoklic"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Pošlji sporočilo"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Pošljite sporočilo"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Podrobnosti klica"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Kliči osebo/številko <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Neodgovorjen klic od: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Odgovorjen klic od: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Neprebrano sporočilo v odzivniku za račun <xliff:g id="PHONEACCOUNT">^4</xliff:g> ob <xliff:g id="TIMEOFCALL">^3</xliff:g> od: <xliff:g id="NAMEORNUMBER">^1</xliff:g> – <xliff:g id="TYPEORLOCATION">^2</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Sporočilo v odzivniku za račun <xliff:g id="PHONEACCOUNT">^4</xliff:g> ob <xliff:g id="TIMEOFCALL">^3</xliff:g> od: <xliff:g id="NAMEORNUMBER">^1</xliff:g> – <xliff:g id="TYPEORLOCATION">^2</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Klic za: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"z računom: <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"prek številke <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"prek številke <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"v računu <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, prek številke <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> prek številke <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Klic"</string>
<string name="description_call_action" msgid="4000549004089776147">"Klicanje: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Videoklic: <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Hitri odgovori"</string>
<string name="call_settings_label" msgid="313434211353070209">"Klici"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Blokiranje klicev"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blokiranje klicev je začasno izklopljeno"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Blokiranje klicev je onemogočeno, ker ste se v zadnjih 48 urah s tem telefonom obrnili na nujno pomoč. Ko 48-urno obdobje poteče, bo blokiranje klicev samodejno znova omogočeno."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Uvoz številk"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Označili ste, naj nekatere klicatelje druge aplikacije samodejno preusmerijo v odzivnik."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Ogled številk"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Uvozi"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Uvoz ni uspel"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Arhiviranje spor. v odzivniku ni uspelo."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Odblokiranje telefonske številke"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Dodaj telefonsko številko"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Klici s teh številk bodo blokirani in sporočila v odzivniku bodo samodejno izbrisana."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Klici s teh številk bodo blokirani, klicatelji pa bodo morda še vedno lahko pustil sporočila v odzivniku."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blokirane številke"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Telefonska številka <xliff:g id="NUMBER">%1$s</xliff:g> je neveljavna."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Telefonska številka <xliff:g id="NUMBER">%1$s</xliff:g> je že blokirana."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Blokiranje klicev je onemogočeno za 48 ur"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Onemogočeno zaradi opravljenega klica v sili"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Računi za klicanje"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Vklop"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Nastavi dovoljenja"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Če želite omogočiti hitro klicanje,\n vklopite dovoljenje za stike."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Če si želite ogledati dnevnik klicev,\n vklopite dovoljenje za telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Če si želite ogledati stike,\n vklopite dovoljenje za stike."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Če želite dostopati do sporočil v odzivniku,\n vklopite dovoljenje za telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Če želite omogočiti hitro klicanje, vklopite dovoljenje za stike."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Če si želite ogledati dnevnik klicev, vklopite dovoljenje za telefon."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Če si želite ogledati stike, vklopite dovoljenje za stike."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Če želite dostopati do sporočil v odzivniku, vklopite dovoljenje za telefon."</string>
<string name="permission_no_search" msgid="84152933267902056">"Če želite iskati po stikih, vklopite dovoljenje za stike."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Če želite klicati,\n vklopite dovoljenje za telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Če želite klicati, vklopite dovoljenje za telefon."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikacija Telefon nima dovoljenja za pisanje v sistemske nastavitve."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blokirano"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Oseba/številka <xliff:g id="NAMEORNUMBER">^1</xliff:g> je aktivna"</string>
</resources>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index 204274b7b..d3c357b0e 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefoni"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefoni"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Blloku i formimit të numrave i telefonit"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefoni"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Historiku i telefonatave"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Telefono <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Raporto numrin e pasaktë"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Redakto numrin para telefonatës"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Shto te një kontakt"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Fshi nga historiku i telefonatave"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Pastro historikun e telefonatave"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Fshije postën zanore"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Shpërndaje postën zanore"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Ditari i telefonatave është bosh"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Bëj një telefonatë"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Historiku i telefonatave"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Raporto numrin e pasaktë"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopjo numrin"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopjo transkriptimin"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blloko numrin"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> u bllokua"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Zhblloko numrin"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> u zhbllokua"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ZHBËJ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Fshi"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Redakto numrin para telefonatës"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Pastro historikun e telefonatave"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Fshije postën zanore"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arkivo postën zanore"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Shpërndaje postën zanore"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"U zbulua posta zanore"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Posta zanore u arkivua"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ZHBËJ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"SHKO TEK ARKIVI"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Të pastrohet historiku i telefonatave?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Kjo do të fshijë të gjitha telefonatat nga historiku yt"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Po pastron historikun e telefonatave…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefoni"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Telefonatë e humbur"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Telefonatë pune e humbur"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Telefonata të humbura"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> telefonata të humbura"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Ri-telefono"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mesazh"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> posta zanore </item>
<item quantity="one"> postë zanore</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Postë e re zanore nga <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Posta zanore nuk mund të luhej"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Po ruan në memorien e përkohshme…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Po ngarkon postën zanore…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Po arkivon postën zanore..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Posta zanore nuk mund të ngarkohej"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Vetëm telefonatat me mesazhe zanore"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Vetëm telefonatat hyrëse"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historiku i telefonatave"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Opsione të tjera"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"blloku i tasteve"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopjo"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Shfaq vetëm dalëset"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Shfaq vetëm hyrëset"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Shfaq vetëm të humburat"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Telefonatë dalëse me video"</string>
<string name="type_missed_video" msgid="954396897034220545">"Telefonatë e humbur me video"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Posta zanore"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Telefonatë e refuzuar"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Telefonatë e bllokuar"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Telefonatat hyrëse"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Luaj postën zanore"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Shiko kontaktin <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Telefono <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Detajet e kontaktit për <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Postë e re zanore."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> telefonata."</string>
<string name="description_video_call" msgid="2933838090743214204">"Telefonatë me video."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Dërgo SMS te <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefon me pagesë"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sekonda"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min. e <xliff:g id="SECONDS">%s</xliff:g> sek."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> në <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Ky numër nuk mund të telefonohet"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Për të konfiguruar postën zanore, shko te \"Menyja\" &gt; \"Cilësimet\"."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Për të shtuar një postë zanore, në fillim çaktivizo modalitetin \"në aeroplan\"."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Kërkimi me zë nuk mundësohet"</string>
<string name="call_not_available" msgid="8941576511946492225">"Telefonata nuk mund të bëhet sepse aplikacioni \"Telefoni\" është i çaktivizuar."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Nuk ka aplikacion për atë në këtë pajisje"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Fut një emër ose një numër telefoni"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Nuk ke thirrje të humbura."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Kutia hyrëse e postës tënde zanore është bosh."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Kërko kontakte"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Shto një numër ose kërko te kontaktet"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Historiku i telefonatave është bosh"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Bëj një telefonatë"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Nuk ke thirrje të humbura."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Kutia hyrëse e postës tënde zanore është bosh."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arkivi i postës tënde zanore është bosh."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Shfaq vetëm të preferuarat"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historiku"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Historiku i telefonatave"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arkivi i postës zanore"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Të gjitha"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Të humbura"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Posta zanore"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Bllokim i ri i thjeshtëzuar"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Për të të mbrojtur më mirë, Telefoni ka nevojë të ndryshojë mënyrën se si funksionon bllokimi. Numrat e bllokuar tani do të ndalojnë si telefonatat ashtu edhe mesazhet me tekst dhe mund të ndahen me aplikacione të tjera."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Lejo"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Blloko <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Telefonatat nga ky numër do të bllokohen dhe mesazhet zanore do të fshihen automatikisht."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Telefonatat nga ky numër do të bllokohen, por telefonuesi mund të jetë ende në gjendje të lërë mesazhe zanore."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Nuk do të marrësh më telefonata apo mesazhe me tekst nga ky numër."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLLOKO"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Zhblloko <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ZHBLLOKO"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Telefonatë e shpejtë"</string>
- <string name="tab_recents" msgid="929949073851377206">"Të fundit"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Historiku i telefonatave"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktet"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Posta zanore"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"U hoq nga të preferuarat"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Shto te një kontakt"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Dërgo SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Bëj një telefonatë me video"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Shiko historikun e plotë të telefonatave"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blloko numrin"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> telefonata të reja të humbura"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Askush nuk është ende në thirrjen tënde të shpejtuar"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Shto një të preferuar"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Prek imazhin për të parë të gjithë numrat ose mbaje të shtypur për ta pozicionuar përsëri"</string>
<string name="remove_contact" msgid="1080555335283662961">"Hiq"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Telefonatë me video"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Dërgo mesazh"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Dërgo një mesazh"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Detajet e telefonatës"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Telefono <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Telefonatë e humbur nga <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Telefonatë e përgjigjur nga <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Postë zanore e palexuar nga <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Postë zanore nga <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Telefonatë për <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"në <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"nëpërmjet <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"nëpërmjet <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"në <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, nëpërmjet <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> nëpërmjet <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Telefono"</string>
<string name="description_call_action" msgid="4000549004089776147">"Telefono <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Telefono me video <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Përgjigjet e shpejta"</string>
<string name="call_settings_label" msgid="313434211353070209">"Telefonatat"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Bllokimi i telefonatave"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Bllokimi i telefonatave është përkohësisht joaktiv"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Bllokimi i telefonatave është çaktivizuar sepse kontaktove me shërbimet e urgjencës nga ky telefon brenda 48 orëve të fundit. Ai do të riaktivizohet automatikisht pas skadimit të periudhës prej 48 orë."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importo numrat"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Disa telefonues i ke shënuar më parë që të dërgohen automatikisht drejt postës zanore përmes aplikacioneve të tjera."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Shiko numrat"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importo"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Importimi dështoi"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Gabim në arkivimin e postës zanore."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Zhblloko numrin"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Shto një numër"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Telefonatat nga këta numra do të bllokohen dhe mesazhet zanore do të fshihen automatikisht."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Telefonatat nga këta numra do të bllokohen, por mund të jenë ende në gjendje të lënë mesazhe zanore."</string>
+ <string name="block_list" msgid="7760188925338078011">"Numrat e bllokuar"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> është i pavlefshëm."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> është i bllokuar tashmë."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Bllokimi i thirrjeve është çaktivizuar për 48 orë"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Është e çaktivizuar për shkak se është kryer një telefonatë urgjence."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Llogaritë e telefonatave"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktivizo"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Cakto lejet"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Për të aktivizuar thirrjen e shpejtuar,\n aktivizo lejen e Kontakteve."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Për të parë ditarin tënd të telefonatave,\n aktivizo lejen e Telefonit."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Për të parë kontaktet,\n aktivizo lejen e Kontakteve."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Për të hyrë në postën tënde zanore, \n aktivizo lejen e Telefonit."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Për të aktivizuar thirrjen e shpejtuar, aktivizo lejen e Kontakteve."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Për të parë evidencën e telefonatave, aktivizo lejen e Telefonit."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Për të parë kontaktet, aktivizo lejen e Kontakteve."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Për të pasur qasje në postën zanore, aktivizo lejen e Telefonit."</string>
<string name="permission_no_search" msgid="84152933267902056">"Për të kërkuar kontaktet, aktivizo lejet e Kontakteve"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Për të kryer një telefonatë,\n aktivizo lejen e Telefonit."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Për të kryer një telefonatë, aktivizo lejen e Telefonit."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Aplikacionet e telefonit nuk kanë leje të shkruajnë në cilësimet e sistemit."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"I bllokuar"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> është aktive"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index c6107d8ff..d58c60de7 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Нумеричка тастатура телефона"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Телефон"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Историја позива"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Позови <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Пријави нетачан број"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Измените број пре позива"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Додај у контакт"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Избриши из историје позива"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Обриши историју позива"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Избриши говорну поруку"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Дели говорну поруку"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Евиденција позива је празна"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Позови"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Историја позива"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Пријави нетачан број"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Копирај број"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Копирај транскрипцију"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Блокирај број"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> је блокиран"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Деблокирај број"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> је деблокиран"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ОПОЗОВИ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Избриши"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Измени број пре позива"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Обриши историју позива"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Избриши говорну поруку"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Архивирај говорну пошту"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Дели говорну поруку"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Гов. пошта је избрисана"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Говорна пошта је архивирана"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ОПОЗОВИ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"АРХИВА"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Желите да обришете историју позива?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Ово ће избрисати све позиве из историје"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Брише се историја позива…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Телефон"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Пропуштен позив"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Пропуштен позив за Work"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Пропуштени позиви"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Број пропуштених позива: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Узврати позив"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Пошаљи SMS"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> говорна порука </item>
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> говорне поруке </item>
@@ -43,8 +59,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Нова говорна порука од <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Пуштање говорне поште није успело"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Баферовање..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Говорна пошта се учитава…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Говорна пошта се архивира…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Учитавање говорне поште није успело"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Само позиви са говорном поштом"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Само долазни позиви"</string>
@@ -74,7 +90,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Историја позива"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Још опција"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"нумеричка тастатура"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Копирај"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Прикажи само одлазне"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Прикажи само долазне"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Прикажи само пропуштене"</string>
@@ -97,12 +112,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Одлазни видео позив"</string>
<string name="type_missed_video" msgid="954396897034220545">"Пропуштен видео позив"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Говорна пошта"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Одбијен позив"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Блокиран позив"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Долазни позиви"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Пуштање говорне поште"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Прикажи контакт <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Позови корисника <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Детаљи о контакту за <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Нова говорна порука."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> позива."</string>
<string name="description_video_call" msgid="2933838090743214204">"Видео позив."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Слање SMS-а за <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -115,6 +131,11 @@
<string name="payphone" msgid="7726415831153618726">"Телефонска говорница"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> сек"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> мин <xliff:g id="SECONDS">%s</xliff:g> сек"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> у <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Није могуће позвати овај број"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Да бисте подесили говорну пошту, идите у Мени &gt; Подешавања."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Да бисте позвали говорну пошту, прво искључите режим авионa."</string>
@@ -127,16 +148,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Гласовна претрага није доступна"</string>
<string name="call_not_available" msgid="8941576511946492225">"Није могуће упутити телефонски позив јер је апликација Телефон онемогућена."</string>
<string name="activity_not_available" msgid="2287665636817987623">"На овом уређају нема апликација за то"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Унесите име или број телефона"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Немате ниједан пропуштен позив."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Пријемно сандуче говорне поште је празно."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Претражите контакте"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Додајте број или претражите контакте"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Историја позива је празна"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Позови"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Немате ниједан пропуштен позив."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Пријемно сандуче говорне поште је празно."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Архива говорне поште је празна."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Прикажи само омиљене"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Историја"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Историја позива"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Архива говорне поште"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Сви"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Пропуштени"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Говорна пошта"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Ново, једноставније блокирање"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Телефон треба да промени начин на који блокирање функционише да би вам пружио бољу заштиту. Са блокираних бројева више нећете примати ни позиве ни SMS-ове, али можете да их делите са другим апликацијама."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Дозволи"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Желите ли да блокирате <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Позиви са овог броја ће бити блокирани и поруке говорне поште ће се аутоматски брисати."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Позиви са овог броја ће бити блокирани, али позивалац и даље може да вам оставља поруке говорне поште."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Више нећете примати позиве ни SMS-ове са овог броја."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛОКИРАЈ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Желите ли да деблокирате <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ДЕБЛОКИРАЈ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Брзо бирање"</string>
- <string name="tab_recents" msgid="929949073851377206">"Недавни контакти"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Историја позива"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Контакти"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Говорна пошта"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Уклоњено је из омиљених"</string>
@@ -146,7 +182,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Додај у контакт"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Пошаљи SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Упути видео позив"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Прикажи целу историју позива"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Блокирај број"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Нових пропуштених позива: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Немате ниједан контакт на брзом бирању"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Додај омиљен контакт"</string>
@@ -155,13 +191,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Додирните слику да бисте видели све бројеве или додирните и задржите да бисте променили распоред"</string>
<string name="remove_contact" msgid="1080555335283662961">"Уклони"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Видео позив"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Пошаљи поруку"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Пошаљи поруку"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Детаљи позива"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Позови <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Пропуштени позив: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Примљени позив: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Непрочитана говорна порука од <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Говорна порука од <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Позвали сте: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"на налогу <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"преко <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"преко <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"на <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, преко <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> преко <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Позови"</string>
<string name="description_call_action" msgid="4000549004089776147">"Позови <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Упутите видео позив контакту <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -201,14 +243,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Брзи одговори"</string>
<string name="call_settings_label" msgid="313434211353070209">"Позиви"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Блокирање позива"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Блокирање позива је привремено искључено"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Блокирање позива је онемогућено зато што сте контактирали службе за помоћ у хитним случајевима са овог телефона у последњих 48 сати. Аутоматски ће бити поново омогућено када истекне период од 48 сати."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Увези бројеве"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Раније сте означили неке позиваоце које аутоматски треба преусмерити на говорну пошту преко других апликација."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Прикажи бројеве"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Увeзи"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Увоз није успео"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Архивирање говорне поште није успело."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Деблокирај број"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Додај број"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Позиви са ових бројева ће бити блокирани и поруке говорне поште ће се аутоматски брисати."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Позиви са ових бројева ће бити блокирани, али позиваоци са ових бројева ће и даље моћи да вам остављају поруке говорне поште."</string>
+ <string name="block_list" msgid="7760188925338078011">"Блокирани бројеви"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> је неважећи."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> је већ блокиран."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Блокирање позива је онемогућено на 48 сати"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Онемогућено је зато што је упућен хитан позив."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Налози за позивање"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Укључи"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Подеси дозволе"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Да бисте омогућили брзо бирање,\n укључите дозволу за Контакте."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Да бисте видели евиденцију позива,\n укључите дозволу за Телефон."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Да бисте видели контакте,\n укључите дозволу за Контакте."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Да бисте приступили говорној пошти,\n укључите дозволу за Телефон."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Да бисте омогућили брзо бирање, укључите дозволу за Контакте."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Да бисте видели евиденцију позива, укључите дозволу за Телефон."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Да бисте видели контакте, укључите дозволу за Контакте."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Да бисте приступили говорној пошти, укључите дозволу за Телефон."</string>
<string name="permission_no_search" msgid="84152933267902056">"Да бисте претражили контакте, укључите дозволе за Контакте."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Да бисте упутили позив,\n укључите дозволу за Телефон."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Да бисте упутили позив, укључите дозволу за Телефон."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Апликација Телефон нема дозволу за уписивање у системска подешавања."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Блокиран"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> је активан"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 3a89b81ca..d46519963 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefonens knappsats"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Samtalshistorik"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ring <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Rapportera fel nummer"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Redigera nummer före samtal"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Lägg till som kontakt"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Radera från samtalshistoriken"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Rensa samtalshistorik"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Ta bort röstmeddelande"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Dela röstmeddelande"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Samtalsloggen är tom"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Ring ett samtal"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Samtalshistorik"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Rapportera fel nummer"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopiera nummer"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopiera transkription"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Blockera nummer"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> har blockerats"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Häv blockeringen av numret"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Blockeringen av <xliff:g id="NUMBER">%1$s</xliff:g> har hävts"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ÅNGRA"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Radera"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Redigera nummer före samtal"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Rensa samtalshistorik"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Radera röstmeddelande"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Arkivera röstmeddelande"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Dela röstmeddelande"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Röstbrevlåda raderad"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Röstmeddelandet har arkiverats"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ÅNGRA"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ÖPPNA ARKIV"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Vill du rensa samtalshistoriken?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Alla samtal raderas från historiken"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Rensar samtalshistoriken ..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Ringa"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Missat samtal"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Missat jobbsamtal"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Missade samtal"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> missade samtal"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Ring upp"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Meddelande"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> röstmeddelanden </item>
<item quantity="one">röstmeddelande</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Nytt röstmeddelande från <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Det gick inte att spela upp röstmeddelandet"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buffrar…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Läser in röstmeddelande ..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Arkiverar röstmeddelande ..."</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Det gick inte att läsa in röstmeddelandet"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Endast samtal med röstmeddelande"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Endast inkommande samtal"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Samtalshistorik"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Fler alternativ"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"knappsats"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopiera"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Visa endast utgående samtal"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Visa endast inkommande samtal"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Visa endast missade samtal"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Utgående videosamtal"</string>
<string name="type_missed_video" msgid="954396897034220545">"Missat videosamtal"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Röstmeddelande"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Avvisat samtal"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Blockerat samtal"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Inkommande samtal"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Spela upp röstmeddelande"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Visa kontakten <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Ring <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Kontaktuppgifter för <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Nytt röstmeddelande"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> samtal."</string>
<string name="description_video_call" msgid="2933838090743214204">"Videosamtal."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Skicka sms till <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Telefonautomat"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sekund"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sek"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> kl. <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Det går inte att ringa det här numret"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Välj Meny &gt; Inställningar om du vill konfigurera röstbrevlådan."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Om du vill ringa röstbrevlådan måste du först inaktivera flygplansläget."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Röstsökning är inte tillgänglig"</string>
<string name="call_not_available" msgid="8941576511946492225">"Det går inte att ringa eftersom appen Telefon har inaktiverats."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Det finns ingen app för detta på enheten"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Ange ett namn eller telefonnummer"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Du har inga missade samtal."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Din röstbrevlåda är tom."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Sök efter kontakter"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Ange nummer eller kontakt"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Samtalshistoriken är tom"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Ring ett samtal"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Du har inga missade samtal."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Din röstbrevlåda är tom."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Arkivet för din röstbrevlåda är tomt."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Visa endast favoriter"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historik"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Samtalshistorik"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Arkiv för röstmeddelanden"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Alla"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Missade"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Röstbrevlåda"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"En ny, enklare blockering"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"För bättre skydd måste mobilen ändra blockeringsfunktionen. Samtal eller sms från blockerade nummer stoppas och inställningarna går att dela med andra appar."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Tillåt"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Vill du blockera <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Samtal från det här numret blockeras och röstmeddelanden raderas automatiskt."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Samtal från det här numret blockeras, men det kan fortfarande gå att lämna ett röstmeddelande."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Du får inte längre samtal eller sms från det här numret."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOCKERA"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Vill du häva blockeringen av <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"HÄV BLOCKERINGEN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Kortnummer"</string>
- <string name="tab_recents" msgid="929949073851377206">"Senaste"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Samtalshistorik"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontakter"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Röstbrevlåda"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Borttagen från favoriter"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Lägg till i kontakt"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Skicka sms"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Ring videosamtal"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Visa hela samtalshistoriken"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Blockera nummer"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> nya missade samtal"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Du har ingen kontakt som snabbval ännu"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Lägg till en favorit"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Tryck på bilden och visa alla nummer eller tryck länge om du vill ändra ordningen"</string>
<string name="remove_contact" msgid="1080555335283662961">"Ta bort"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Videosamtal"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Skicka meddelande"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Skicka ett meddelande"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Samtalsinfo"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Ring <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Missat samtal från <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Besvarat samtal från <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Nytt röstmeddelande från <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Röstmeddelande från <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Ring till <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"på <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"med <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"med <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"på <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, med <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> med <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Samtal"</string>
<string name="description_call_action" msgid="4000549004089776147">"Ring <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Ring videosamtal till <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Snabbsvar"</string>
<string name="call_settings_label" msgid="313434211353070209">"Samtal"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Samtalsblockering"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Blockeringen har inaktiverats tillfälligt"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Samtalsblockering har inaktiverats eftersom du ringde ett larmnummer från den här mobilen under de senaste 48 timmarna. Blockeringen aktiveras igen när 48 timmar har gått."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Importera nummer"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Du har tidigare angett via andra appar att vissa inkommande samtal ska skickas till röstbrevlådan automatiskt."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Visa telefonnummer"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Importera"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Det gick inte att importera"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Kunde inte arkivera röstmeddelande."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Häv blockeringen av numret"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Lägg till telefonnummer"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Samtal från de här numren blockeras och röstmeddelanden raderas automatiskt."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Samtal från de här numren blockeras, men det kan fortfarande gå att lämna ett röstmeddelande."</string>
+ <string name="block_list" msgid="7760188925338078011">"Blockerade nummer"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> är inte giltigt."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> är redan blockerat."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Samtalsblockeringen har inaktiverats i 48 timmar"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Inaktiverades därför att enheten har använts för ett nödsamtal."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Konton för samtal"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aktivera"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Ange behörigheter"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Om du vill aktivera snabbval\n aktiverar du behörigheten för Kontakter."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Om du vill visa samtalsloggen\n aktiverar du behörigheten för Telefon."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Om du vill visa kontakter\n aktiverar du behörigheten för Kontakter."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Om du vill komma åt röstbrevlådan\n aktiverar du behörigheten för Telefon."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Du måste aktivera behörigheten Kontakter för att kunna använda snabbuppringning."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Du måste aktivera behörigheten Telefon för att kunna visa samtalsloggen."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Du måste aktivera behörigheten Kontakter för att kunna visa kontakterna."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Du måste aktivera behörigheten Telefon för att kunna komma åt röstmeddelanden."</string>
<string name="permission_no_search" msgid="84152933267902056">"Aktivera behörigheter för Kontakter om du vill söka bland kontakterna."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Om du vill ringa ett samtal\n aktiverar du behörigheten för Telefon."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Du måste aktivera behörigheten Telefon för att kunna ringa."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefonappen har inte skrivbehörighet i systeminställningarna."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Blockerad"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> är aktiv"</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index d0639f242..8256eb57d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Simu"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Nambari ya simu"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Vitufe vya Kupiga Simu"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Simu"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Rekodi ya simu zilizopigwa"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Pigia <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Ripoti nambari isiyosahihi"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Hariri nambari kabla ya kupiga"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Ongeza kwenye anwani iliyopo"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Futa kutoka rekodi ya simu zilizopigwa"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Futa rekodi ya simu zilizopigwa"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Futa ujumbe wa sauti"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Shiriki ujumbe wa sauti"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Rekodi yako ya nambari za simu haina rekodi"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Piga simu"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Rekodi ya simu zilizopigwa"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Ripoti nambari isiyo sahihi"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Nakili nambari"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Nakili unukuzi"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Zuia nambari"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> imezuiwa"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Ondolea nambari kizuizi"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> imeacha kuzuiwa"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"TENDUA"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Futa"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Badilisha nambari kabla ya kupiga simu"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Futa rekodi ya simu zilizopigwa"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Futa ujumbe wa sauti"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Weka kwenye kumbukumbu"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Shiriki ujumbe wa sauti"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Ujumbe wa sauti umefutwa"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Umewekwa kwenye kumbukumbu"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"TENDUA"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"KUMBUKUMBU"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Rekodi ya simu zilizopigwa ifutwe?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Hatua hii itafuta rekodi yote ya simu"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Inafuta rekodi ya simu zilizopigwa..."</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Simu"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Simu ambayo haikujibiwa"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Simu ya kazini ambayo hukujibu"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Simu zisizojibiwa"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Simu <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ambazo hazikujibiwa"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Mpigie"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Ujumbe"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other">Ujumbe <xliff:g id="COUNT">%1$d</xliff:g> wa sauti </item>
<item quantity="one">Ujumbe wa sauti</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Barua mpya ya sauti kutoka <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Haikuweza kucheza ujumbe wa sauti"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Inaakibisha..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Inapakia ujumbe wa sauti..."</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Ujumbe unawekwa kwenye kumbukumbu…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Haikuweza kupakia ujumbe wa sauti"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Simu zilizo na ujumbe wa sauti tu"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Simu zinazoingia tu"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Historia ya Simu"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Chaguo zaidi"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"kitufe cha kupiga"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Nakili"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Onyesha zinazotoka pekee"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Onyesha zinazoingia pekee"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Onyesha zilizokosa kupokewa pekee"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Hangout ya Video inayotoka"</string>
<string name="type_missed_video" msgid="954396897034220545">"Hangout ya Video ambayo haikupokewa"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Barua za sauti"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Simu iliyokataliwa"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Simu iliyozuiwa"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Simu zinazoingia"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Sikiliza ujumbe wa sauti"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Angalia anwani <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Piga <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Maelezo ya <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Ujumbe mpya wa sauti."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Simu <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Hangout ya video."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Tuma SMS kwa <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Simu ya kulipia"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"Sekunde <xliff:g id="SECONDS">%s</xliff:g>"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"Dak <xliff:g id="MINUTES">%s</xliff:g> sek <xliff:g id="SECONDS">%s</xliff:g>"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> saa <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Haiwezi kupiga simu kwa nambari hii"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ili kusanidi ujumbe wa sauti, nenda kwa Menyu &gt; Mipangilio."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Kupigia simu ujumbe wa sauti, kwanza zima hali ya ndege."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Kutafuta kwa kutamka hakupatikani"</string>
<string name="call_not_available" msgid="8941576511946492225">"Haiwezi kupiga simu kwa sababu programu ya Simu imezimwa."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Hakuna programu kwa ajili ya hiyo kwenye kifaa hiki"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Andika jina au nambari ya simu"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Huna simu ulizokosa."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Kikasha chako cha ujumbe wa sauti hakina ujumbe."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Tafuta anwani"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Ongeza nambari au utafute anwani"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Rekodi yako ya simu zilizopigwa haina chochote"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Piga simu"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Huna simu ulizokosa kupokea"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Kikasha chako cha ujumbe wa sauti hakina ujumbe."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Kumbukumbu yako ya ujumbe wa sauti haina kitu."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Onyesha zinazopendwa tu"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Historia"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Rekodi ya Simu Zilizopigwa"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Kumbukumbu ya Ujumbe wa Sauti"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Zote"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Ambazo hazikupokewa"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Ujumbe wa sauti"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Njia mpya na rahisi ya kuzuia"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Ili kukulinda vizuri zaidi, Simu inahitaji kubadilisha mipangilio ya kipengele cha kuzuia. Hutapokea simu wala SMS kutoka nambari ulizozizuia na nambari hizo huenda zikashirikiwa na programu zingine."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Ruhusu"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Ungependa kuzuia <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Simu zinazopigwa kutoka nambari hii zitazuiwa na ujumbe wa sauti utafutwa kiotomatiki."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Simu zinazopigwa kutoka nambari hii zitazuiwa, lakini mpigaji bado anaweza kukutumia ujumbe wa sauti."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Hutapokea simu wala SMS kutoka kwa nambari hii tena."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ZUIA"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Ungependa kuacha kuzuia <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ACHA KUZUIA"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Unaowasiliana nao zaidi"</string>
- <string name="tab_recents" msgid="929949073851377206">"Zilizotumika majuzi"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Rekodi ya Simu Zilizopigwa"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Anwani zote"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Ujumbe wa sauti"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Imeondolowa kwenye vipendwa"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Ongeza kwenye anwani"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Tuma SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Piga Hangout ya video"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Tazama historia kamili ya simu"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Zuia nambari"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Simu <xliff:g id="NUMBER">%s</xliff:g> za karibuni ambazo hazikujibiwa"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Hakuna mtu aliye katika orodha yako ya watu unaowasiliana nao zaidi"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Ongeza anwani unazopenda zaidi"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Gusa picha ili uone nambari zote au gusa na ushikilie ili upange upya"</string>
<string name="remove_contact" msgid="1080555335283662961">"Ondoa"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Hangout ya Video"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Tuma Ujumbe"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Tuma SMS"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Maelezo ya simu"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Piga simu kwa <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Simu ambayo haikupokelewa kutoka kwa <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Simu iliyopokelewa kutoka kwa <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ujumb wa sauti ambao haujasikilizwa kutoka <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Ujumbe wa sauti kutoka <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Simu iliyopigwa kwa <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"kwenye <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"kupitia <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"kupitia <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"kwenye <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, kupitia <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> kupitia <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Piga simu"</string>
<string name="description_call_action" msgid="4000549004089776147">"Piga simu kwa <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Hangout ya video <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Majibu ya haraka"</string>
<string name="call_settings_label" msgid="313434211353070209">"Simu zilizopigwa"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Kuzuia simu"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Kuzuia simu kumezimwa kwa muda"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Kipengele cha kuzuia simu kimezimwa kwa sababu uliwasiliana na huduma za dharura kwenye simu hii ndani ya saa 48 zilizopita. Kipengele hiki kitawashwa kiotomatiki baada ya kipindi cha saa 48 kumalizika."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Leta nambari"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Hapo awali uliwekea alama baadhi ya wanaopiga ili simu zao ziingie kwenye ujumbe wa sauti kiotomatiki kupitia programu nyingine."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Angalia Nambari"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Leta"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Imeshindwa kuingiza"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Imeshindwa kuuweka kwenye kumbukumbu."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Ondolea nambari kizuizi"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Ongeza nambari"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Simu zinazopigwa kutoka nambari hizi zitazuiwa na ujumbe wa sauti utafutwa kiotomatiki."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Simu zinazopigwa kutoka nambari hizi zitazuiwa, lakini wapigaji bado wanaweza kukutumia ujumbe wa sauti."</string>
+ <string name="block_list" msgid="7760188925338078011">"Nambari zilizozuiwa"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> si sahihi."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> tayari imezuiwa."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Huduma ya kuzuia simu imezimwa kwa saa 48"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Imezimwa kwa sababu simu ya dharura imepigwa."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Akaunti za simu"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Washa"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Weka ruhusa"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Ili kuwasha kipengele cha unaowasiliana nao zaidi,\n washa ruhusa za Anwani."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Ili uweze kuona rekodi yako ya nambari za simu, \n washa ruhusa ya Simu."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Ili uweze kuona anwani zako, \n washa ruhusa ya Anwani."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Ili ufikie ujumbe wako wa sauti, \n washa ruhusa ya Simu."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Ili kuwasha kipengele cha unaowasiliana nao zaidi, washa ruhusa ya Anwani."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Ili uone rekodi yako ya nambari za simu, washa ruhusa ya Simu."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Ili uone anwani zako, washa ruhusa ya Anwani."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Ili ufikie ujumbe wako wa sauti, washa ruhusa ya Simu."</string>
<string name="permission_no_search" msgid="84152933267902056">"Ili utafute anwani zako, washa ruhusa za Anwani."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Ili upige simu, \n washa ruhusa ya Simu."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Ili upige simu, washa ruhusa ya Simu."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Programu ya simu haina ruhusa ya kuandika kwenye mipangilio ya mfumo."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Imezuiwa"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> yupo"</string>
</resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index c2d1f6ded..1c137ce1b 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ஃபோன்"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ஃபோன்"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ஃபோன் டயல்பேடு"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ஃபோன்"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"அழைப்பு பதிவு"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> ஐ அழை"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"தவறான எண் எனப் புகாரளி"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"அழைக்கும் முன் எண்ணை மாற்று"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"தொடர்பில் சேர்"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"அழைப்பு வரலாற்றில் இருந்து நீக்கு"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"அழைப்பு வரலாற்றை அழி"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"குரலஞ்சலை நீக்கு"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"குரலஞ்சலைப் பகிர்"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"அழைப்புப் பதிவு காலியாக உள்ளது"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"அழை"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"அழைப்பு வரலாறு"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"தவறான எண் எனப் புகாரளி"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"எண்ணை நகலெடு"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"டிரான்ஸ்கிரிப்ஷனை நகலெடு"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"எண்ணைத் தடு"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> தடுக்கப்பட்டது"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"எண்ணை அனுமதி"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> அனுமதிக்கப்பட்டது"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"செயல்தவிர்"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"நீக்கு"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"அழைக்கும் முன் எண்ணை மாற்று"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"அழைப்பு வரலாற்றை அழி"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"குரலஞ்சலை நீக்கு"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"குரலஞ்சலைக் காப்பகப்படுத்து"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"குரலஞ்சலைப் பகிர்"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"குரலஞ்சல் நீக்கப்பட்டது"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"குரலஞ்சல் காப்பகப்படுத்தப்பட்டது"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"செயல்தவிர்"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"காப்பகம் செல்"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"அழைப்பு பதிவை அழிக்கவா?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"பதிவிலிருந்து எல்லா அழைப்புகளும் நீக்கப்படும்"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"அழைப்பு வரலாற்றை அழிக்கிறது…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ஃபோன்"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"தவறிய அழைப்பு"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"தவறிய அழைப்பு (பணி)"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"தவறிய அழைப்புகள்"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> தவறிய அழைப்புகள்"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"திரும்ப அழை"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"செய்தி அனுப்பு"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> குரலஞ்சல்கள் </item>
<item quantity="one">குரலஞ்சல்</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> இன் புதிய குரலஞ்சல்"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"குரலஞ்சலை இயக்க முடியவில்லை"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"இடையகப்படுத்துகிறது..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"குரலஞ்சலை ஏற்றுகிறது…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"குரலஞ்சலைக் காப்பகப்படுத்துகிறது…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"குரலஞ்சலை ஏற்ற முடியவில்லை"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"குரலஞ்சலுடனான அழைப்புகள் மட்டும்"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"உள்வரும் அழைப்புகள் மட்டும்"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"அழைப்பு பட்டியல்"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"மேலும் விருப்பங்கள்"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"டயல்பேடு"</string>
- <string name="menu_copy" msgid="6108677035381940698">"நகலெடு"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"வெளிச்செல்லுவதை மட்டும் காட்டு"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"உள்வருவதை மட்டும் காட்டு"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"தவறியதை மட்டும் காட்டு"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"வெளிச்செல்லும் வீடியோ அழைப்பு"</string>
<string name="type_missed_video" msgid="954396897034220545">"தவறிய வீடியோ அழைப்பு"</string>
<string name="type_voicemail" msgid="5153139450668549908">"குரலஞ்சல்"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"நிராகரிக்கப்பட்ட அழைப்பு"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"தடுக்கப்பட்ட அழைப்பு"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"உள்வரும் அழைப்புகள்"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"குரலஞ்சலை இயக்கு"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> தொடர்பைக் காட்டு"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> ஐ அழை"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> க்கான தொடர்பு விவரங்கள்"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"புதிய குரலஞ்சல்."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> அழைப்புகள்."</string>
<string name="description_video_call" msgid="2933838090743214204">"வீடியோ அழைப்பு."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>க்கு SMS அனுப்பு"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"கட்டணத் தொலைபேசி"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> வி"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> நிமிடம் <xliff:g id="SECONDS">%s</xliff:g> வினாடி"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> அன்று <xliff:g id="TIME">%2$s</xliff:g> மணிக்கு"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"இந்த எண்ணை அழைக்க முடியாது"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"குரலஞ்சலை அமைக்க, செல்க மெனு &gt; அமைப்பு."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"குரலஞ்சலை அழைப்பதற்கு, முதலில் விமானப் பயன்முறையை முடக்கவும்."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"குரல் தேடல் இல்லை"</string>
<string name="call_not_available" msgid="8941576511946492225">"Phone பயன்பாடு முடக்கப்பட்டுள்ளதால், ஃபோன் அழைப்பைச் செய்ய முடியாது."</string>
<string name="activity_not_available" msgid="2287665636817987623">"சாதனத்தில் இந்தச் செயலைச் செய்வதற்கான பயன்பாடு எதுவும் இல்லை"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"பெயர் (அ) ஃபோன் எண்ணை உள்ளிடுக"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"தவறிய அழைப்புகள் இல்லை."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"குரலஞ்சல் இன்பாக்ஸ் காலியாக உள்ளது."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"தொடர்புகளைத் தேடுக"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"எண்ணைச் சேர்க்கவும் அல்லது தொடர்புகளில் தேடவும்"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"அழைப்பு வரலாறு காலியாக உள்ளது"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"அழை"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"தவறிய அழைப்புகள் இல்லை."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"குரலஞ்சல் இன்பாக்ஸ் காலியாக உள்ளது."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"குரலஞ்சல் காப்பகம் காலியாக உள்ளது."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"பிடித்தவற்றை மட்டும் காட்டு"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"வரலாறு"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"அழைப்பு வரலாறு"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"குரலஞ்சல் காப்பகம்"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"எல்லாம்"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"தவறியவை"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"குரலஞ்சல்"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"புதிய, எளிதாக்கப்பட்ட தடுத்தல்"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"சிறப்பான பாதுகாப்பை வழங்குவதற்காக, ஃபோனில் தடுத்தல் செயல்படும் விதத்தை மாற்ற வேண்டும். இப்போது தடுத்த எண்களிலிருந்து வரும் அழைப்புகளும் உரைச் செய்திகளும் நிறுத்தப்படுவதோடு, பிற பயன்பாடுகளுடன் பகிரப்பட்டு அவற்றிலும் தடுக்கப்படக்கூடும்."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"அனுமதி"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g>ஐத் தடுக்கவா?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"இந்த எண்ணின் அழைப்புகள் தடுக்கப்படுவதுடன், அதன் குரலஞ்சல்களும் தானாகவே நீக்கப்படும்."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"இந்த எண்ணின் அழைப்புகள் தடுக்கப்படும், ஆனால் அழைப்பாளரால் இன்னமும் உங்களுக்குக் குரலஞ்சல்களை அனுப்ப முடியும்."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"இந்த எண்ணிலிருந்து இனி அழைப்புகளையோ உரைச் செய்திகளையோ பெறமாட்டீர்கள்."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"தடு"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g>ஐ அனுமதிக்கவா?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"அனுமதி"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"விரைவு டயல்"</string>
- <string name="tab_recents" msgid="929949073851377206">"சமீபத்தியவை"</string>
+ <string name="tab_history" msgid="2563144697322434940">"அழைப்பு வரலாறு"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"தொடர்புகள்"</string>
<string name="tab_voicemail" msgid="155024725947496746">"குரலஞ்சல்"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"பிடித்தவற்றிலிருந்து அகற்றப்பட்டது"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"தொடர்பில் சேர்"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS அனுப்பு"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"வீடியோவில் அழை"</string>
- <string name="show_call_history" msgid="1141502332266697170">"அழைப்பு பதிவு முழுவதையும் காட்டு"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"எண்ணைத் தடு"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> புதிய தவறிய அழைப்புகள்"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"இன்னும் விரைவு டயலில் யாரையும் சேர்க்கவில்லை"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"முக்கியமானவர்களைச் சேர்"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"எல்லா எண்களையும் பார்க்க, படத்தைத் தொடவும் அல்லது மறுவரிசைப்படுத்த தொட்டுப் பிடித்திருக்கவும்"</string>
<string name="remove_contact" msgid="1080555335283662961">"அகற்று"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"வீடியோ அழைப்பு"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"செய்தி அனுப்பு"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"செய்தி அனுப்பவும்"</string>
<string name="call_log_action_details" msgid="701345508704970622">"அழைப்பு விவரங்கள்"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>ஐ அழை"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"தவறிய அழைப்பு: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"பேசிய அழைப்பு: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"படிக்காத குரலஞ்சல்: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"குரலஞ்சல்: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"அழைத்த அழைப்பு: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> இல்"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> மூலமாக"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> மூலமாக"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="NUMBER">%2$s</xliff:g> மூலமாக <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> இல்"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> மூலமாக <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> இல்"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"அழை"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>ஐ அழை"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>ஐ வீடியோவில் அழைக்கும்."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"விரைவு பதில்கள்"</string>
<string name="call_settings_label" msgid="313434211353070209">"அழைப்புகள்"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"அழைப்புத் தடுப்பு"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"அழைப்புத் தடுப்பு அம்சம் தற்காலிகமாக முடக்கப்பட்டுள்ளது"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"கடந்த 48 மணிநேரத்தில், இந்த ஃபோனிலிருந்து அவசர அழைப்பு எண்ணைத் தொடர்புகொண்டதால் அழைப்புத் தடுப்பு அம்சம் முடக்கப்பட்டுள்ளது. 48 மணிநேரம் கழித்து, இந்த அம்சம் தானாகவே மீண்டும் இயக்கப்படும்."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"எண்களை இறக்கு"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"பிற பயன்பாடுகளின் மூலம் சில அழைப்பாளர்களின் அழைப்புகளை தானாகவே குரலஞ்சலுக்கு அனுப்புமாறு ஏற்கனவே குறித்துள்ளீர்கள்."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"எண்களைக் காட்டு"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"இறக்கு"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"இறக்குவதில் தோல்வி"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"குரலஞ்சலைக் காப்பகப்படுத்த முடியவில்லை."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"எண்ணை அனுமதி"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"எண்ணைச் சேர்"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"இந்த எண்களின் அழைப்புகள் தடுக்கப்படுவதுடன், அவற்றின் குரலஞ்சல்களும் தானாகவே நீக்கப்படும்."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"இந்த எண்களின் அழைப்புகள் தடுக்கப்படும், ஆனால் அழைப்பாளர்களால் இன்னமும் உங்களுக்குக் குரலஞ்சல்களை அனுப்ப முடியும்."</string>
+ <string name="block_list" msgid="7760188925338078011">"தடுக்கப்பட்ட எண்கள்"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> தவறானது."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ஏற்கனவே தடுக்கப்பட்டுள்ளது."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"அழைப்புத் தடுப்பு 48 மணிநேரத்திற்கு முடக்கப்பட்டுள்ளது"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"அவசர அழைப்பு செய்திருப்பதால், அழைப்புத் தடுப்பு முடக்கப்பட்டது."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"அழைப்பு கணக்குகள்"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"இயக்கு"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"அனுமதிகளை அமை"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"விரைவு டயலை இயக்க,\n தொடர்புகள் அனுமதியை இயக்கவும்."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"அழைப்புப் பதிவைப் பார்க்க,\n ஃபோன் அனுமதியை இயக்கவும்."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"தொடர்புகளைப் பார்க்க,\n தொடர்புகள் அனுமதியை இயக்கவும்."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"குரலஞ்சலை அணுக,\n ஃபோன் அனுமதியை இயக்கவும்."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"விரைவு டயலை இயக்க, தொடர்புகள் அனுமதியை இயக்கவும்."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"அழைப்புப் பதிவைப் பார்க்க, ஃபோன் அனுமதியை இயக்கவும்."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"தொடர்புகளைப் பார்க்க, தொடர்புகள் அனுமதியை இயக்கவும்."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"குரலஞ்சலை அணுக, ஃபோன் அனுமதியை இயக்கவும்."</string>
<string name="permission_no_search" msgid="84152933267902056">"தொடர்புகளைத் தேட, தொடர்புகள் அனுமதிகளை இயக்கவும்."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"அழைக்க,\n ஃபோன் அனுமதியை இயக்கவும்."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"அழைக்க, ஃபோன் அனுமதியை இயக்கவும்."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"முறைமை அமைப்புகளில் எழுதுவதற்கான அனுமதி ஃபோன் பயன்பாட்டுக்கு இல்லை."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"தடுக்கப்பட்டது"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> அழைப்பு செயலில் உள்ளது"</string>
</resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index fbbe3cf8c..45305539c 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"ఫోన్"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"ఫోన్"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"ఫోన్ డయల్‌ప్యాడ్"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"ఫోన్"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"కాల్ చరిత్ర"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g>కు కాల్ చేయి"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"సరికాని నంబర్‌ను నివేదించు"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"కాల్ చేయడానికి ముందు నంబర్‌ను సవరించు"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"పరిచయానికి జోడించు"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"కాల్ చరిత్ర నుండి తొలగించు"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"కాల్ చరిత్రను క్లియర్ చేయి"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"వాయిస్ మెయిల్‌ను తొలగించు"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"వాయిస్ మెయిల్‌ను భాగస్వామ్యం చేయి"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"మీ కాల్ లాగ్ ఖాళీగా ఉంది"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"కాల్ చేయి"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"కాల్ చరిత్ర"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"సరికాని నంబర్‌ను నివేదించు"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"నంబర్‌ను కాపీ చేయి"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"లిప్యంతరీకరణను కాపీ చేయి"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"నంబర్‌ను బ్లాక్ చేయి"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> బ్లాక్ చేయబడింది"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"నంబర్‌ను అన్‌బ్లాక్ చేయి"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> అన్‌బ్లాక్ చేయబడింది"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"రద్దు చేయి"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"తొలగించు"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"కాల్ చేయడానికి ముందు నంబర్‌ను సవరించు"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"కాల్ చరిత్రను తీసివేయి"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"వాయిస్ మెయిల్‌ను తొలగించు"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"వాయిస్ మెయిల్‌ను ఆర్కైవ్ చేయి"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"వాయిస్ మెయిల్ భాగస్వామ్యం చేయి"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"వాయిస్‌‍మెయిల్ తొలగించింది"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"వాయిస్ మెయిల్ ఆర్కైవ్ అయింది"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"చర్యరద్దు"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ఆర్కైవ్‌కి వెళ్లు"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"కాల్ చరిత్రను తీసివేయాలా?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"దీని వలన మీ చరిత్ర నుండి అన్ని కాల్‌లు తొలగించబడతాయి"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"కాల్ చరిత్రను క్లియర్ చేస్తోంది…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"ఫోన్"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"మిస్డ్ కాల్"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"సమాధానమివ్వని కార్యాలయ కాల్"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"మిస్డ్ కాల్‌లు"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> మిస్డ్ కాల్‌లు"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"తిరిగి కాల్ చేయి"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"సందేశం పంపు"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> వాయిస్ మెయిల్‌లు </item>
<item quantity="one">వాయిస్ మెయిల్</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> నుండి కొత్త వాయిస్ మెయిల్"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"వాయిస్ మెయిల్‌ను ప్లే చేయడం సాధ్యపడలేదు"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"బఫర్ చేస్తోంది..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"వాయిస్ మెయిల్‌ను లోడ్ చేస్తోంది…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"వాయిస్ మెయిల్‌ను ఆర్కైవ్ చేస్తోంది…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"వాయిస్ మెయిల్‌ను లోడ్ చేయడం సాధ్యపడలేదు"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"వాయిస్ మెయిల్ కాల్‌లు మాత్రమే"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"ఇన్‌కమింగ్ కాల్‌లు మాత్రమే"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"కాల్ చరిత్ర"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"మరిన్ని ఎంపికలు"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"డయల్ ప్యాడ్"</string>
- <string name="menu_copy" msgid="6108677035381940698">"కాపీ చేయి"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"అవుట్‌గోయింగ్ మాత్రమే చూపు"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"ఇన్‌కమింగ్ మాత్రమే చూపు"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"సమాధానం ఇవ్వనివి మాత్రమే చూపు"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"అవుట్‌గోయింగ్ వీడియో కాల్"</string>
<string name="type_missed_video" msgid="954396897034220545">"సమాధానమివ్వని వీడియో కాల్‌"</string>
<string name="type_voicemail" msgid="5153139450668549908">"వాయిస్ మెయిల్"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"నిరాకరించిన కాల్"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"బ్లాక్ చేసిన కాల్"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"ఇన్‌కమింగ్ కాల్‌లు"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"వాయిస్ మెయిల్ ప్లే చేయండి"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> పరిచయాన్ని వీక్షించండి"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g>కు కాల్ చేయండి"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> యొక్క సంప్రదింపు వివరాలు"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"కొత్త వాయిస్ మెయిల్."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> కాల్‌లు."</string>
<string name="description_video_call" msgid="2933838090743214204">"వీడియో కాల్."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>కి SMS పంపు"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"పే ఫోన్"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> సెక"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> నిమి <xliff:g id="SECONDS">%s</xliff:g> సెక"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g>కి"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ఈ నంబర్‌కు కాల్ చేయలేరు"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"వాయిస్ మెయిల్ సెటప్ చేయడానికి, మెను &gt; సెట్టింగ్‌లకు వెళ్లండి."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"వాయిస్ మెయిల్ కాల్ చేయడానికి, మొదట ఎయిర్‌ప్లైన్ మోడ్‌ను ఆపివేయండి."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"వాయిస్ శోధన అందుబాటులో లేదు"</string>
<string name="call_not_available" msgid="8941576511946492225">"ఫోన్ అనువర్తనం నిలిపివేయబడినందున ఫోన్ కాల్ చేయలేరు."</string>
<string name="activity_not_available" msgid="2287665636817987623">"ఈ పరికరంలో దాని కోసం అనువర్తనం ఏదీ లేదు"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"పేరు లేదా ఫోన్ నం. నమోదు చేయం."</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"మీకు సమాధానమివ్వని కాల్‌లు ఏవీ లేవు."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"మీ వాయిస్‌మెయిల్ ఇన్‌బాక్స్ ఖాళీగా ఉంది."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"పరిచయాలను శోధించండి"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"నంబర్ జోడించండి లేదా పరిచయాల్లో శోధించండి"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"మీ కాల్ చరిత్ర ఖాళీగా ఉంది"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"కాల్ చేయి"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"మీకు సమాధానమివ్వని కాల్‌లు ఏవీ లేవు."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"మీ వాయిస్ మెయిల్ ఇన్‌బాక్స్ ఖాళీగా ఉంది."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"మీ వాయిస్ మెయిల్ ఆర్కైవ్ ఖాళీగా ఉంది."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"ఇష్టమైనవాటిని మాత్రమే చూపు"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"చరిత్ర"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"కాల్ చరిత్ర"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"వాయిస్ మెయిల్ ఆర్కైవ్"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"అన్నీ"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"సమాధానం ఇవ్వనవి"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"వాయిస్ మెయిల్"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"కొత్త, సరళీకృత బ్లాకింగ్"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"మిమ్మల్ని మెరుగైన రీతిలో సంరక్షించడానికి, ఫోన్ బ్లాకింగ్ పని చేసే విధానాన్ని మార్చాలి. అప్పుడు మీరు బ్లాక్ చేసిన నంబర్‌ల నుండి కాల్‌లు మరియు వచన సందేశాలు ఆపివేయబడతాయి మరియు ఆ బ్లాక్ చేయబడిన నంబర్‌లను ఇతర అనువర్తనాలకు కూడా భాగస్వామ్యం చేయవచ్చు."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"అనుమతించు"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g>ని బ్లాక్ చేయాలా?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ఈ నంబర్ నుండి కాల్‌లు బ్లాక్ చేయబడతాయి మరియు వాయిస్‌మెయిల్‌లు స్వయంచాలకంగా తొలగించబడతాయి."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ఈ నంబర్ నుండి కాల్‌లు బ్లాక్ చేయబడతాయి, కానీ కాలర్ ఇప్పటికీ మీకు వాయిస్‌మెయిల్‌లు పంపగలరు."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"మీరు ఇకపై ఈ నంబర్ నుండి కాల్‌లు లేదా వచన సందేశాలను స్వీకరించరు."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"బ్లాక్ చేయి"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g>ని అన్‌బ్లాక్ చేయాలా?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"అన్‌బ్లాక్ చేయి"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"స్పీడ్ డయల్"</string>
- <string name="tab_recents" msgid="929949073851377206">"ఇటీవలివి"</string>
+ <string name="tab_history" msgid="2563144697322434940">"కాల్ చరిత్ర"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"పరిచయాలు"</string>
<string name="tab_voicemail" msgid="155024725947496746">"వాయిస్ మెయిల్"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ఇష్టమైనవాటి నుండి తీసివేయబడింది"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"పరిచయానికి జోడించు"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS పంపు"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"వీడియో కాల్ చేయండి"</string>
- <string name="show_call_history" msgid="1141502332266697170">"పూర్తి కాల్ చరిత్రను వీక్షించండి"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"నంబర్‌ను బ్లాక్ చేయి"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> కొత్త సమాధానం ఇవ్వని కాల్‌లు"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"మీ స్పీడ్ డయల్‌లో ఇంకా ఎవరూ లేరు"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ఇష్టమైనదాన్ని జోడించండి"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"అన్ని నంబర్‌లను చూడటానికి చిత్రాన్ని తాకండి లేదా మళ్లీ క్రమం చేయడానికి తాకి, ఉంచండి"</string>
<string name="remove_contact" msgid="1080555335283662961">"తీసివేయి"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"వీడియో కాల్"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"సందేశం పంపు"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"సందేశాన్ని పంపు"</string>
<string name="call_log_action_details" msgid="701345508704970622">"కాల్ వివరాలు"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>కి కాల్ చేయి"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g> నుండి <xliff:g id="TIMEOFCALL">^3</xliff:g> <xliff:g id="PHONEACCOUNT">^4</xliff:g>కి మిస్డ్ కాల్ ఇచ్చారు."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g> నుండి <xliff:g id="TIMEOFCALL">^3</xliff:g> <xliff:g id="PHONEACCOUNT">^4</xliff:g>కి చేసిన కాల్‌కి సమాధానం ఇచ్చారు."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> నుండి చదవని వాయిస్ మెయిల్, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> నుండి వాయిస్ మెయిల్, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>కి <xliff:g id="TIMEOFCALL">^3</xliff:g> <xliff:g id="PHONEACCOUNT">^4</xliff:g> నుండి కాల్ చేసారు."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g>లో"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> ద్వారా"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> ద్వారా"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>లో, <xliff:g id="NUMBER">%2$s</xliff:g> ద్వారా"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> ద్వారా <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"కాల్ చేయి"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>కి కాల్ చేయి"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>కి వీడియో కాల్."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"శీఘ్ర ప్రతిస్పందనలు"</string>
<string name="call_settings_label" msgid="313434211353070209">"కాల్‌లు"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"కాల్ బ్లాక్ చేయడం"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"కాల్ బ్లాకింగ్ తాత్కాలికంగా ఆఫ్ అయ్యింది"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"మీరు గత 48 గంటల వ్యవధిలో ఈ ఫోన్ నుండి అత్యవసర సేవలను సంప్రదించినందున కాల్ బ్లాకింగ్ నిలిపివేయబడింది. 48 గంటల వ్యవధి ముగిసిన తర్వాత ఇది స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"నంబర్‌లను దిగుమతి చేయి"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"మీరు ఇంతకుముందే కొంతమంది కాలర్‌లను స్వయంచాలకంగా ఇతర అనువర్తనాల ద్వారా వాయిస్ మెయిల్‌కి పంపేందుకు గుర్తు పెట్టారు."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"నంబర్‌లను వీక్షించండి"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"దిగుమతి చేయి"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"దిగుమతి విఫలమైంది"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"వాయిస్ మెయిల్‌ను ఆర్కైవ్ చేయడం విఫలం."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"నంబర్‌ను అన్‌బ్లాక్ చేయి"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"నంబర్‌ను జోడించు"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ఈ నంబర్‌ల నుండి కాల్‌లు బ్లాక్ చేయబడతాయి మరియు వాయిస్‌మెయిల్‌లు స్వయంచాలకంగా తొలగించబడతాయి."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ఈ నంబర్‌ల నుండి కాల్‌లు బ్లాక్ చేయబడతాయి, కానీ వాటి నుండి ఇప్పటికీ వాయిస్‌మెయిల్‌లు పంపబడవచ్చు."</string>
+ <string name="block_list" msgid="7760188925338078011">"బ్లాక్ చేయబడిన నంబర్‌లు"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> చెల్లదు."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ఇప్పటికే బ్లాక్ చేయబడింది."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"48 గంటల పాటు కాల్ బ్లాకింగ్ నిలిపివేయబడింది"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"అత్యవసర కాల్ చేసినందున నిలిపివేయబడింది."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"కాల్ చేసే ఖాతాలు"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"ఆన్ చేయి"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"అనుమతులను సెట్ చేయి"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"స్పీడ్ డయల్‌ను ప్రారంభించడానికి,\n పరిచయాల అనుమతిని ఆన్ చేయండి."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"మీ కాల్ లాగ్‌ను చూడటానికి,\n ఫోన్ అనుమతిని ఆన్ చేయండి."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"మీ పరిచయాలను చూడటానికి,\n పరిచయాల అనుమతిని ఆన్ చేయండి."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"మీ వాయిస్‌మెయిల్‌ను ప్రాప్యత చేయడానికి,\n ఫోన్ అనుమతిని ఆన్ చేయండి."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"స్పీడ్ డయల్‌ను ప్రారంభించడానికి, పరిచయాల అనుమతిని ఆన్ చేయండి."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"మీ కాల్ లాగ్‌ను చూడటానికి, ఫోన్ అనుమతిని ఆన్ చేయండి."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"మీ పరిచయాలను చూడటానికి, పరిచయాల అనుమతిని ఆన్ చేయండి."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"మీ వాయిస్ మెయిల్‌ను ప్రాప్యత చేయడానికి, ఫోన్ అనుమతిని ఆన్ చేయండి."</string>
<string name="permission_no_search" msgid="84152933267902056">"మీ పరిచయాలను శోధించడానికి, పరిచయాల అనుమతులను ఆన్ చేయండి."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"కాల్ చేయడానికి,\n ఫోన్ అనుమతిని ఆన్ చేయండి."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"కాల్ చేయడానికి, ఫోన్ అనుమతిని ఆన్ చేయండి."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"సిస్టమ్ సెట్టింగ్‌లకు వ్రాయడం కోసం ఫోన్ అనువర్తనానికి అనుమతి లేదు."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"బ్లాక్ అయ్యారు"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> కాల్ సక్రియంగా ఉంది"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index e2c5ffa44..e38fb609a 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"โทรศัพท์"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"โทรศัพท์"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"แป้นกดหมายเลขโทรศัพท์"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"โทรศัพท์"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"ประวัติการโทร"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"โทรหา <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"รายงานหมายเลขที่ไม่ถูกต้อง"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"แก้ไขหมายเลขก่อนโทร"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"เพิ่มในรายชื่อติดต่อ"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"ลบออกจากประวัติการโทร"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"ล้างประวัติการโทร"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"ลบข้อความเสียง"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"แชร์ข้อความเสียง"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"ประวัติการโทรว่างเปล่า"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"โทรออก"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"ประวัติการโทร"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"รายงานหมายเลขที่ไม่ถูกต้อง"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"คัดลอกหมายเลข"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"คัดลอกการถอดเสียงเป็นคำ"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"บล็อกหมายเลข"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"บล็อก <xliff:g id="NUMBER">%1$s</xliff:g> แล้ว"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"เลิกบล็อกหมายเลข"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"เลิกบล็อก <xliff:g id="NUMBER">%1$s</xliff:g> แล้ว"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"เลิกทำ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"ลบ"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"แก้ไขหมายเลขก่อนโทร"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"ล้างประวัติการโทร"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"ลบข้อความเสียง"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"เก็บข้อความเสียง"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"แชร์ข้อความเสียง"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"ลบข้อความเสียงแล้ว"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"ข้อความเสียงที่เก็บไว้"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"เลิกทำ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ไปที่เก็บ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"ล้างประวัติการโทรไหม"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"การดำเนินการนี้จะลบการโทรทั้งหมดออกจากประวัติของคุณ"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"กำลังล้างประวัติการโทร…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"โทรศัพท์"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"สายที่ไม่ได้รับ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"มีสายจากที่ทำงานที่ไม่ได้รับ"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"สายที่ไม่ได้รับ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"ไม่ได้รับ <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> สาย"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"โทรกลับ"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"ข้อความ"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ข้อความเสียง </item>
<item quantity="one">ข้อความเสียง</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"ข้อความเสียงใหม่จาก <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"ไม่สามารถเล่นข้อความเสียงได้"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"กำลังเก็บบัฟเฟอร์…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"กำลังโหลดข้อความเสียง…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"กำลังเก็บข้อความเสียง…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"ไม่สามารถโหลดข้อความเสียงได้"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"เฉพาะสายที่มีข้อความเสียง"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"เฉพาะสายเรียกเข้า"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"ประวัติการโทร"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"ตัวเลือกเพิ่มเติม"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"แป้นหมายเลข"</string>
- <string name="menu_copy" msgid="6108677035381940698">"คัดลอก"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"แสดงสายที่โทรออกเท่านั้น"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"แสดงสายโทรเข้าเท่านั้น"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"แสดงสายที่ไม่ได้รับเท่านั้น"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"สายโทรออกแฮงเอาท์วิดีโอ"</string>
<string name="type_missed_video" msgid="954396897034220545">"ไม่ได้รับแฮงเอาท์วิดีโอ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"ข้อความเสียง"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"สายที่ปฏิเสธ"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"สายที่บล็อก"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"สายโทรเข้า"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"เล่นข้อความเสียง"</string>
<string name="description_view_contact" msgid="5205669345700598415">"ดูรายชื่อติดต่อ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"โทรหา <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"รายละเอียดรายชื่อติดต่อสำหรับ <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"ข้อความเสียงใหม่"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> สาย"</string>
<string name="description_video_call" msgid="2933838090743214204">"แฮงเอาท์วิดีโอ"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"ส่ง SMS ไปยัง <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"โทรศัพท์สาธารณะ"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> วินาที"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> นาที <xliff:g id="SECONDS">%s</xliff:g> วินาที"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"วันที่ <xliff:g id="DATE">%1$s</xliff:g> เวลา <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"ไม่สามารถโทรไปยังหมายเลขนี้"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"หากต้องการตั้งค่าข้อความเสียง ให้ไปที่เมนู &gt; การตั้งค่า"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"หากต้องการฟังข้อความเสียง ให้ปิดโหมดใช้งานบนเครื่องบินก่อน"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"การค้นหาด้วยเสียงไม่พร้อมใช้งาน"</string>
<string name="call_not_available" msgid="8941576511946492225">"ไม่สามารถโทรศัพท์ได้เนื่องจากแอปพลิเคชันโทรศัพท์ถูกปิดใช้งาน"</string>
<string name="activity_not_available" msgid="2287665636817987623">"ไม่มีแอปสำหรับการทำงานนั้นบนอุปกรณ์นี้"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"ป้อนชื่อหรือหมายเลขโทรศัพท์"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"คุณไม่มีสายที่ไม่ได้รับ"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"กล่องข้อความเสียงว่างเปล่า"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"ค้นหารายชื่อติดต่อ"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"เพิ่มหมายเลขหรือค้นหาผู้ติดต่อ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"ประวัติการโทรว่างเปล่า"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"โทรออก"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"คุณไม่มีสายที่ไม่ได้รับ"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"กล่องข้อความเสียงว่างเปล่า"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"ที่เก็บข้อความเสียงว่างเปล่า"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"แสดงเฉพาะรายชื่อที่ชื่นชอบ"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"ประวัติ"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"ประวัติการโทร"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"ที่เก็บข้อความเสียง"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"ทั้งหมด"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"ไม่ได้รับ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"ข้อความเสียง"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"การบล็อกแบบใหม่ที่ใช้งานง่าย"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"เพื่อปกป้องคุณได้ดียิ่งขึ้น โทรศัพท์ฺจำเป็นต้องเปลี่ยนลักษณะการทำงานของการบล็อก ขณะนี้คุณจะไม่ได้รับสายเรียกเข้าหรือข้อความจากหมายเลขที่ถูกบล็อกอีกและอาจมีการแชร์หมายเลขนั้นกับแอปอื่น"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"อนุญาต"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"บล็อก <xliff:g id="NUMBER">%1$s</xliff:g> ไหม"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"ระบบจะบล็อกสายเรียกเข้าจากหมายเลขนี้และลบข้อความเสียงโดยอัตโนมัติ"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"ระบบจะบล็อกสายเรียกเข้าจากหมายเลขนี้ แต่ผู้โทรอาจยังฝากข้อความเสียงถึงคุณได้อยู่"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"คุณจะไม่ได้รับสายเรียกเข้าหรือข้อความจากหมายเลขนี้อีก"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"บล็อก"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"เลิกบล็อก <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"เลิกบล็อก"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"การโทรด่วน"</string>
- <string name="tab_recents" msgid="929949073851377206">"ล่าสุด"</string>
+ <string name="tab_history" msgid="2563144697322434940">"ประวัติการโทร"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"รายชื่อติดต่อ"</string>
<string name="tab_voicemail" msgid="155024725947496746">"ข้อความเสียง"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"ลบจากรายการโปรด"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"เพิ่มในรายชื่อติดต่อ"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"ส่ง SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ใช้แฮงเอาท์วิดีโอ"</string>
- <string name="show_call_history" msgid="1141502332266697170">"ดูประวัติการโทรแบบเต็ม"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"บล็อกหมายเลข"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"สายที่ไม่ได้รับใหม่ <xliff:g id="NUMBER">%s</xliff:g> สาย"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"ยังไม่ได้กำหนดผู้ใดในการโทรด่วน"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"เพิ่มรายการโปรด"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"แตะรูปภาพเพื่อดูหมายเลขทั้งหมด หรือแตะค้างไว้เพื่อเรียงลำดับใหม่"</string>
<string name="remove_contact" msgid="1080555335283662961">"ลบ"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"แฮงเอาท์วิดีโอ"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"ส่งข้อความ"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"ส่งข้อความ"</string>
<string name="call_log_action_details" msgid="701345508704970622">"รายละเอียดการโทร"</string>
<string name="call_log_action_call" msgid="463690849042459842">"โทรไปที่ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"ไม่ได้รับสายจาก <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"รับสายจาก <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"ข้อความเสียงที่ยังไม่ได้อ่านจาก <xliff:g id="NAMEORNUMBER">^1</xliff:g> ผ่านทาง<xliff:g id="TYPEORLOCATION">^2</xliff:g> เมื่อ <xliff:g id="TIMEOFCALL">^3</xliff:g> <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"ข้อความเสียงจาก <xliff:g id="NAMEORNUMBER">^1</xliff:g> ผ่านทาง<xliff:g id="TYPEORLOCATION">^2</xliff:g> เมื่อ <xliff:g id="TIMEOFCALL">^3</xliff:g> <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"โทรหา <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_phone_account" msgid="1767072759541443861">"บน <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"ผ่าน <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"ผ่าน <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"ใน <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> ผ่าน <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> ผ่าน <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"โทร"</string>
<string name="description_call_action" msgid="4000549004089776147">"โทรไปที่ <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"เรียกแฮงเอาท์วิดีโอไปยัง <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"คำตอบด่วน"</string>
<string name="call_settings_label" msgid="313434211353070209">"การโทร"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"การบล็อกสายเรียกเข้า"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"การบล็อกสายเรียกเข้าปิดชั่วคราว"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"ระบบปิดใช้การบล็อกสายเรียกเข้าเนื่องจากคุณติดต่อบริการฉุกเฉินจากโทรศัพท์เครื่องนี้ภายใน 48 ชั่วโมงที่ผ่านมา ระบบจะเปิดใช้คุณลักษณะนี้อีกครั้งโดยอัตโนมัติเมื่อครบ 48 ชั่วโมง"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"นำเข้าหมายเลข"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"ก่อนหน้านี้คุณได้ทำเครื่องหมายว่าให้ส่งผู้โทรบางคนไปยังข้อความเสียงโดยอัตโนมัติผ่านแอปอื่นๆ"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"ดูหมายเลข"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"นำเข้า"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"การนำเข้าล้มเหลว"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"เก็บข้อความเสียงไม่สำเร็จ"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"เลิกบล็อกหมายเลข"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"เพิ่มหมายเลข"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ระบบจะบล็อกสายเรียกเข้าจากหมายเลขเหล่านี้และลบข้อความเสียงโดยอัตโนมัติ"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ระบบจะบล็อกสายเรียกเข้าจากหมายเลขเหล่านี้ แต่ผู้โทรอาจยังฝากข้อความเสียงถึงคุณได้อยู่"</string>
+ <string name="block_list" msgid="7760188925338078011">"หมายเลขที่ถูกบล็อก"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ไม่ถูกต้อง"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> ถูกบล็อกอยู่แล้ว"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"ปิดการบล็อกสายเรียกเข้า 48 ชั่วโมง"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"ปิดใช้งานเนื่องจากมีการโทรเข้าหมายเลขฉุกเฉิน"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"บัญชีการโทร"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"เปิด"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"ตั้งค่าสิทธิ์"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"หากต้องการเปิดใช้การโทรด่วน\nให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"หากต้องการดูประวัติการโทร\n ให้เปิดสิทธิ์เข้าถึงโทรศัพท์"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"หากต้องการดูรายชื่อติดต่อ\n ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"หากต้องการเข้าถึงข้อความเสียง\n ให้เปิดสิทธิ์เข้าถึงโทรศัพท์"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"หากต้องการเปิดใช้การโทรด่วน ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"หากต้องการดูประวัติการโทร ให้เปิดสิทธิ์เข้าถึงโทรศัพท์"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"หากต้องการดูรายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"หากต้องการเข้าถึงข้อความเสียง ให้เปิดสิทธิ์เข้าถึงโทรศัพท์"</string>
<string name="permission_no_search" msgid="84152933267902056">"หากต้องการค้นหารายชื่อติดต่อ ให้เปิดสิทธิ์เข้าถึงรายชื่อติดต่อ"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"หากต้องการโทรออก\n ให้เปิดสิทธิ์เข้าถึงโทรศัพท์"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"หากต้องการโทรออก ให้เปิดสิทธิ์เข้าถึงโทรศัพท์"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"แอปโทรศัพท์ไม่ได้รับอนุญาตให้เขียนไปยังการตั้งค่าระบบ"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"ถูกบล็อก"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ต่อสายอยู่"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 8e6cdc103..85c44511c 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telepono"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telepono"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Dialpad ng Telepono"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telepono"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"History ng tawag"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Tawagan si <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Iulat ang hindi wastong numero"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"I-edit ang numero bago tumawag"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Idagdag sa isang contact"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"I-delete mula sa history ng tawag"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"I-clear ang history ng tawag"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Tanggalin ang voicemail"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Ibahagi ang voicemail"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Walang laman ang iyong log ng tawag"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Tumawag"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"History ng tawag"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Iulat ang hindi wastong numero"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopyahin ang numero"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopyahin ang transkripsyon"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"I-block ang numero"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Na-block ang <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Alisin sa pagkaka-block ang numero"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Naalis sa pagkaka-block ang <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"I-UNDO"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"I-delete"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"I-edit ang numero bago tumawag"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"I-clear ang history ng tawag"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"I-delete ang voicemail"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"I-archive ang voicemail"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Ibahagi ang voicemail"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Na-delete voicemail"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Na-archive ang voicemail"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"I-UNDO"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"PUMUNTA SA ARCHIVE"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"I-clear ang history ng tawag?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Idi-delete nito ang lahat ng tawag mula sa iyong history"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Kini-clear ang history ng tawag…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telepono"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Hindi nasagot na tawag"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Hindi nasagot na tawag sa trabaho"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Mga hindi nasagot na tawag"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> (na) hindi nasagot na tawag"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Tawagan"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Mensahe"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> Voicemail </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> na Voicemail </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Bagong voicemail mula kay <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Hindi ma-play ang voicemail"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Nagba-buffer…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Nilo-load ang voicemail…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Ina-archive ang voicemail…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Hindi ma-load ang voicemail"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Mga tawag lang na may voicemail"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Mga papasok na tawag lang"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"History ng Tawag"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Higit pang mga pagpipilian"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"dial pad"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopyahin"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Ipakita lang ang papalabas"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Ipakita lang ang paparating"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Ipakita lang ang hindi nasagot"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Papalabas na video call"</string>
<string name="type_missed_video" msgid="954396897034220545">"Hindi nasagot na video call"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Voicemail"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Tinanggihang tawag"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Naka-block na tawag"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Mga paparating na tawag"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"I-play ang voicemail"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Tingnan ang contact na si <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Tawagan si <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Mga detalye sa pakikipag-ugnayan para kay/sa <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Bagong voicemail."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> (na) tawag."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video call."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Magpadala ng SMS kay <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Payphone"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sec"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> min <xliff:g id="SECONDS">%s</xliff:g> sec"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ng <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Hindi matawagan ang numerong ito"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Upang mag-set up ng voicemail, pumunta sa Menu &gt; Mga Setting."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Upang tumawag sa voicemail, i-off muna ang Airplane mode."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Hindi available ang paghahanap gamit ang boses"</string>
<string name="call_not_available" msgid="8941576511946492225">"Hindi makagawa ng tawag sa telepono dahil naka-disable ang application na Telepono."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Walang app para doon sa device na ito"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Maglagay ng pangalan o numero ng telepono"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Wala kang mga hindi nasagot na tawag."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Walang laman ang iyong voicemail inbox."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Maghanap ng mga contact"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Magdagdag ng numero, maghanap sa contact"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Walang laman ang iyong history ng tawag"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Tumawag"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Wala kang mga hindi nasagot na tawag."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Walang laman ang iyong voicemail inbox."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Walang laman ang archive ng voicemail."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Mga paborito lang ang ipakita"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"History"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"History ng Tawag"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Archive ng Voicemail"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Lahat"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Di nasagot"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Voicemail"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Bago at pinasimpleng pag-block"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Upang mas maprotektahan ka, kailangang baguhin ng Telepono ang paggana ng pag-block. Pipigilan na ngayon ng iyong mga naka-block na numero ang mga tawag at text, at maaaring ibahagi ang mga ito sa iba pang mga app."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Payagan"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Gusto mo bang i-block ang <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Iba-block ang mga tawag mula sa numerong ito at awtomatikong ide-delete ang mga voicemail."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Iba-block ang mga tawag mula sa numerong ito, ngunit makakapag-iwan pa rin sa iyo ng mga voicemail ang tumatawag."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Hindi ka na makakatanggap ng mga tawag o text mula sa numerong ito."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"I-BLOCK"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Gusto mo bang alisin sa pagkaka-block ang <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ALISIN SA PAGKAKA-BLOCK"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Speed dial"</string>
- <string name="tab_recents" msgid="929949073851377206">"Mga Kamakailan"</string>
+ <string name="tab_history" msgid="2563144697322434940">"History ng Tawag"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Mga Contact"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Voicemail"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Inalis sa mga paborito"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Idagdag sa isang contact"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Magpadala ng SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Gumawa ng video call"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Tingnan ang buong history ng tawag"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"I-block ang numero"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> (na) bagong hindi nasagot na tawag"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Wala pang tao sa iyong speed dial"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Magdagdag ng paborito"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Pindutin ang larawan upang makita ang lahat ng numero o pindutin nang matagal upang ayusing muli"</string>
<string name="remove_contact" msgid="1080555335283662961">"Alisin"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Mag-video call"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Magpadala ng Mensahe"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Magpadala ng mensahe"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Mga detalye ng tawag"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Tawagan ang/si <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Hindi nasagot na tawag mula kay/sa <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Nasagot na tawag mula kay/sa <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Hindi pa nababasang voicemail mula sa/kay <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Voicemail mula sa/kay <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Tawag kay/sa <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"sa <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"sa pamamagitan ng <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"sa pamamagitan ng <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"sa <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, sa pamamagitan ng <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> sa pamamagitan ng <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Tumawag"</string>
<string name="description_call_action" msgid="4000549004089776147">"Tawagan ang/si <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"I-video call si/ang <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Mga mabilisang tugon"</string>
<string name="call_settings_label" msgid="313434211353070209">"Mga Tawag"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Pagba-block ng tawag"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Pansamantalang na-off ang call blocking"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Na-disable ang pagba-block ng tawag dahil nakipag-ugnayan ka sa mga pang-emergency na serbisyo mula sa teleponong ito sa nakalipas na 48 oras. Awtomatiko itong muling i-enable kapag nag-expire na ang 48 oras."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"I-import ang mga numero"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Minarkahan mo na dati ang ilang tumatawag na awtomatikong ipadala sa voicemail sa pamamagitan ng iba pang mga app."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Tingnan ang Numero"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"I-import"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Hindi nakapag-import"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Nabigong i-archive ang voicemail."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Alisin sa pagkaka-block ang numero"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Magdagdag ng numero"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Iba-block ang mga tawag mula sa mga numerong ito at awtomatikong ide-delete ang mga voicemail."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Iba-block ang mga tawag mula sa numerong ito, ngunit makakapag-iwan pa rin sila sa iyo ng mga voicemail."</string>
+ <string name="block_list" msgid="7760188925338078011">"Mga naka-block na numero"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Hindi wasto ang <xliff:g id="NUMBER">%1$s</xliff:g>."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Naka-block na ang <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Na-disable ang pagba-block ng tawag sa loob ng 48 oras"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Na-disable dahil tumawag para sa emergency."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Account sa pagtawag"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"I-on"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Magtakda ng mga pahintulot"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Upang i-enable ang speed dial,\n i-on ang pahintulot sa Mga Contact."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Upang tingnan ang iyong log ng tawag,\n i-on ang pahintulot sa Telepono."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Upang tingnan ang iyong mga contact,\n i-on ang pahintulot sa Mga Contact."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Upang i-access ang iyong voicemail,\n i-on ang pahintulot sa Telepono."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Upang i-enable ang speed dial, i-on ang pahintulot ng Mga Contact."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Upang makita ang iyong log ng tawag, i-on ang pahintulot ng Telepono."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Upang makita ang iyong mga contact, i-on ang pahintulot ng Mga Contact."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Upang ma-access ang iyong voicemail, i-on ang pahintulot ng Telepono."</string>
<string name="permission_no_search" msgid="84152933267902056">"Upang hanapin ang iyong mga contact, i-on ang mga pahintulot sa Mga Contact."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Upang tumawag,\n i-on ang pahintulot sa Telepono."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Upang tumawag, i-on ang pahintulot ng Telepono."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Walang pahintulot ang app ng Telepono na mag-write sa mga setting ng system."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Naka-block"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"Aktibo si/ang <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 097aadd66..70f03b303 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefon Tuş Takımı"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Telefon"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Çağrı geçmişi"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Ara: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Hatalı numarayı bildir"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Önce numarayı düzenle"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Bir kişiye ekle"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Çağrı geçmişinden sil"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Çağrı geçmişini temizle"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Sesli mesajı sil"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Sesli mesajı paylaş"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Çağrı kaydınız boş"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Telefon et"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Çağrı geçmişi"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Hatalı numarayı bildir"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Numarayı kopyala"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Çeviri yazıyı kopyala"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Numarayı engelle"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> numaralı telefon engellendi"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Numaranın engellemesini kaldır"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> numaralı telefonun engellemesi kaldırıldı"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"GERİ AL"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Sil"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Telefon etmeden önce numarayı düzenle"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Çağrı geçmişini temizle"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Sesli mesajı sil"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Sesli mesajı arşivle"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Sesli mesaj paylaş"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Sesli mesaj silindi"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Sesli mesaj arşivlendi"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"GERİ AL"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARŞİVE GİT"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Çağrı geçmişi temizlensin mi?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Bu işlem, geçmişinizdeki tüm çağrıları silecek"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Çağrı geçmişi temizleniyor…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Telefon"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Cevapsız çağrı"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"İşle ilgili cevapsız çağrı"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Cevapsız çağrılar"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cevapsız çağrı"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Geri ara"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"İleti"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Sesli Mesaj </item>
<item quantity="one">Sesli Mesaj</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Yeni sesli mesj gönderen: <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Sesli mesaj oynatılamadı"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Arabelleğe alınıyor..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Sesli mesaj yükleniyor…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Sesli mesaj arşivleniyor…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Sesli mesaj yüklenemedi"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Yalnızca sesli mesaj içeren çağrılar"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Yalnızca gelen çağrılar"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Çağrı Geçmişi"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Diğer seçenekler"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"tuş takımı"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopyala"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Yalnızca gidenleri göster"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Yalnızca gelenleri göster"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Yalnızca cevapsızları göster"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Giden video görüşmesi isteği"</string>
<string name="type_missed_video" msgid="954396897034220545">"Cevapsız video görüşmesi isteği"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Sesli mesaj"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Reddedilen çağrı"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Engellenen çağrı"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Gelen çağrılar"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Sesli mesajı oynat"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Kişiyi görüntüle: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Sesli arama yap: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> için kişi ayrıntıları"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Yeni sesli mesaj."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> çağrı."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video görüşmesi."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Şuraya SMS gönder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Ankesörlü telefon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> sn."</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> dk. <xliff:g id="SECONDS">%s</xliff:g> sn."</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Bu numara aranamaz"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Sesli mesajı yapılandırmak için Menü &gt; Ayarlar\'a gidin."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Sesli mesaja çağrı yapmak için öncelikle Uçak modunu kapatın."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Sesli arama kullanılamaz"</string>
<string name="call_not_available" msgid="8941576511946492225">"Telefon uygulaması devre dışı bırakıldığından telefon edilemiyor."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Bu cihazda bu işlem için uygun uygulama yok"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Bir ad veya telefon numarası girin"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Cevapsız çağrınız yok."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Sesli mesaj gelen kutunuz boş."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Kişilerde ara"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Numara ekleyin veya kişi arayın"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Çağrı geçmişiniz boş"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Telefon et"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Cevapsız çağirınız yok."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Sesli mesaj gelen kutunuz boş."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Sesli mesaj arşiviniz boş."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Yalnızca favori kişileri göster"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Geçmiş"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Çağrı Geçmişi"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Sesli Mesaj Arşivi"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Tümü"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Cevapsız"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Sesli Mesaj"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Yeni, basitleştirlmş engelleme"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Daha iyi korunmanız için engelleme işlevinin çalışma biçiminin Telefon tarafından değiştirilmesi gerekmektedir. Engellediğiniz numaralardan artık çağrı ve kısa mesaj almayacaksınız. Ayrıca bu numaralar başka uygulamalarla paylaşılabilir."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"İzin ver"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> numaralı telefon engellensin mi?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Bu numaradan gelen çağrılar engellenecek ve sesli mesajlar otomatik olarak silinecektir."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Bu numaradan gelen çağrılar engellenecek, ancak arayan kişi yine de size sesli mesaj bırakabilecektir."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Artık bu numaradan sesli arama veya kısa mesaj almayacaksınız."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"ENGELLE"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> numaralı telefonun engellemesi kaldırılsın mı?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"ENGELLEMEYİ KALDIR"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Hızlı arama"</string>
- <string name="tab_recents" msgid="929949073851377206">"Son Kişiler"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Çağrı Geçmişi"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kişiler"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Sesli mesaj"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Favorilerden kaldırıldı"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Bir kişiye ekle"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS gönder"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Video görüşmesi yap"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Tüm çağrı geçmişini görüntüle"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Numarayı engelle"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> yeni cevapsız çağrı"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Hızlı arama listenizde henüz kimse yok"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Favori ekle"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Tüm numaraları görmek için resme dokunun veya yeniden sıralamak için dokunup basılı tutun"</string>
<string name="remove_contact" msgid="1080555335283662961">"Kaldır"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video görüşmesi"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"İleti Gönder"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"İleti gönder"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Çağrı ayrıntıları"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Telefon et: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Cevapsız çağrı: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Cevaplanan çağrı: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Dinlenmemiş sesli posta: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Sesli posta: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Yapılan çağrı: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> üzerinde"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> kullanılarak"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> kullanılarak"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="NUMBER">%2$s</xliff:g> kullanılarak <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> hesabında"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="NUMBER">%2$s</xliff:g> kullanılarak <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Telefon et"</string>
<string name="description_call_action" msgid="4000549004089776147">"Telefon et: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> ile video görüşmesi yap."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Hızlı yanıtlar"</string>
<string name="call_settings_label" msgid="313434211353070209">"Çağrılar"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Çağrı engelleme"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Çağrı engelleme geçici olarak kapalı"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Son 48 saat içinde bu telefondan acil servislerle iletişimde bulunduğunuz için çağrı engelleme modu devre dışı bırakıldı. 48 saatlik süre dolduktan sonra çağrı engelleme modu otomatik olarak tekrar etkinleştirilecektir."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Numaraları içe aktar"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Bazı arayanları, diğer uygulamalar aracılığıyla otomatik olarak sesli mesaj gönderilmesi için önceden işaretlediniz."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Numaraları Görüntüle"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"İçe aktar"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"İçe aktarma başarısız oldu"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Sesli mesaj arşivlenemedi."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Numaranın engellemesini kaldır"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Numara ekle"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Bu numaralardan gelen çağrılar engellenecek ve sesli mesajlar otomatik olarak silinecektir."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Bu numaralardan gelen çağrılar engellenecek, ancak arayan kişiler yine de size sesli mesaj bırakabileceklerdir."</string>
+ <string name="block_list" msgid="7760188925338078011">"Engellenen numaralar"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> numaralı telefon geçersiz."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> numaralı telefon zaten engellendi."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Çağrı engelleme 48 saat süreyle devre dışı bırakıldı"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Acil durum çağrısı yapıldığından devre dışı bırakıldı."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Çağrı hesapları"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Aç"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"İzinleri ayarla"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Hızlı aramayı etkinleştirmek için\n Kişiler iznini açın."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Çağrı kaydınızı görmek için\n Telefon iznini açın."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Kişilerinizi görmek için\n Kişiler iznini açın."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Sesli mesajınıza erişmek için\n Telefon iznini açın."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Hızlı aramayı etkinleştirmek için Kişiler iznini açın."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Çağrı günlüğünüzü görmek için Telefon iznini açın."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Kişilerinizi görmek için Kişiler iznini açın."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Sesli mesajınıza erişmek için Telefon iznini açın."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kişilerinizde arama yapmak için Kişiler izinlerini açın."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Telefon etmek için\n Telefon iznini açın."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Telefon etmek için Telefon iznini açın."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefon uygulamasının sistem ayarlarına yazma izni yok."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Engellendi"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> etkin durumda"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 923bef5ac..03c5f707a 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Телефон"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Телефон"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Цифрова клавіатура"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Тел."</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Історія дзвінків"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Набрати <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Повідомити про невірний номер"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Редаг. номер перед викл."</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Додати в контакти"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Видалити з історії дзвінків"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Очистити історію дзвінків"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Видалити голосову пошту"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Надіслати голос. повідомлення"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Журнал дзвінків порожній"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Зателефонувати"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Історія дзвінків"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Повідомити про неправильний номер"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Копіювати номер"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Копіювати транскрипцію"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Заблокувати номер"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> заблоковано"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Розблокувати номер"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> розблоковано"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"ВІДМІНИТИ"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Видалити"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Редагувати номер перед викликом"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Очистити історію дзвінків"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Видалити голосову пошту"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Архівувати голосову пошту"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Надіслати голосову пошту"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Видалено"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Голосову пошту заархівовано"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"ВІДМІНИТИ"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ДО АРХІВУ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Очистити історію дзвінків?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"З історії буде видалено всі дзвінки"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Очищення історії дзвінків…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Номер телефону"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Пропущений виклик"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Пропущений дзвінок на робочий телефон"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Пропущені виклики"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"Пропущено викликів: <xliff:g id="NUM_MISSED_CALLS">%s</xliff:g>"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Передзвонити"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Повідомлення"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> голосове повідомлення </item>
<item quantity="few"> <xliff:g id="COUNT">%1$d</xliff:g> голосові повідомлення </item>
@@ -44,8 +60,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Нова голосова пошта від <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Не вдалося відтворити голосову пошту"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Буферизація..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Завантаження голосової пошти…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Архівування голосової пошти…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Не вдалося завантажити голосову пошту"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Лише виклики з голосовою поштою"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Лише вхідні виклики"</string>
@@ -75,7 +91,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Історія викликів"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Інші варіанти"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"цифрова клавіатура"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Копіювати"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Показувати лише вихідні"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Показувати лише вхідні"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Показувати лише пропущені"</string>
@@ -98,12 +113,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Вихідний відеодзвінок"</string>
<string name="type_missed_video" msgid="954396897034220545">"Пропущений відеодзвінок"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Голосова пошта"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Відхилений виклик"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Заблокований виклик"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Вхідні виклики"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Відтворити голосову пошту"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Переглянути контакт <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Дзвонити: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Відомості про контакт <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Нова голосове повідомлення."</string>
<string name="description_num_calls" msgid="1601505153694540074">"Викликів: <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>."</string>
<string name="description_video_call" msgid="2933838090743214204">"Відеодзвінок."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Надіслати SMS контакту <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -116,6 +132,11 @@
<string name="payphone" msgid="7726415831153618726">"Таксофон"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> с"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> хв <xliff:g id="SECONDS">%s</xliff:g> с"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> о <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Не можна телефонувати на цей номер"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Щоб налаштувати голосову пошту, перейдіть у Меню &gt; Налаштування."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Щоб перевірити голосову пошту, спочатку вимкніть режим польоту."</string>
@@ -128,16 +149,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Голосовий пошук недоступний"</string>
<string name="call_not_available" msgid="8941576511946492225">"Не вдається здійснити дзвінок, оскільки додаток Телефон вимкнено."</string>
<string name="activity_not_available" msgid="2287665636817987623">"На цьому пристрої немає додатка, який може виконати цю дію"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Введіть ім’я чи номер телефону"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Немає пропущених дзвінків."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Немає голосової пошти."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Пошук серед контактів"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Введіть або знайдіть номер"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Немає історії дзвінків"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Телефонувати"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Немає пропущених дзвінків."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Немає голосової пошти."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Архів голосової пошти порожній."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Показати лише вибрані"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Історія"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Історія дзвінків"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Архів голосової пошти"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Усі"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Пропущені"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Голосова пошта"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Нове простіше блокування"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Задля кращого захисту додаток Телефон має змінити параметри блокування. Із заблокованих номерів не надходитимуть виклики й SMS. Інші додатки також можуть мати доступ до списку цих номерів."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Дозволити"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Заблокувати номер <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Виклики з цього номера блокуватимуться, а голосові повідомлення автоматично видалятимуться."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Виклики з цього номера блокуватимуться, але абонент зможе залишати голосові повідомлення."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Ви більше не отримуватиме виклики й SMS із цього номера."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"БЛОКУВАТИ"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Розблокувати номер <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"РОЗБЛОКУВАТИ"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Швидкий набір"</string>
- <string name="tab_recents" msgid="929949073851377206">"Останні"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Історія дзвінків"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Контакти"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Голосова пошта"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Вилучено з вибраного"</string>
@@ -147,7 +183,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Додати в контакти"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Надіслати SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Здійснити відеодзвінок"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Переглянути всю історію дзвінків"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Заблокувати номер"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"Нових пропущених дзвінків: <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Немає номерів для швидкого набору"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Додати номер"</string>
@@ -156,13 +192,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Торкніться зображення, щоб побачити всі номери, або натисніть і утримуйте, щоб змінити порядок"</string>
<string name="remove_contact" msgid="1080555335283662961">"Видалити"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Відеодзвінок"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Надіслати повідомлення"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Надіслати повідомлення"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Деталі виклику"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>: телефонувати"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Пропущений дзвінок: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Прийнятий дзвінок: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Непрочитане голосове повідомлення: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Голосове повідомлення: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Вихідний дзвінок: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"Обліковий запис: <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"на номер <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"на номер <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"в обліковому записі <xliff:g id="PHONEACCOUNT">%1$s</xliff:g> на номер <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> на номер <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Виклик"</string>
<string name="description_call_action" msgid="4000549004089776147">"Телефонувати: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Запросити контакт <xliff:g id="NAMEORNUMBER">^1</xliff:g> на відеодзвінок."</string>
@@ -203,14 +245,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Швидкі відповіді"</string>
<string name="call_settings_label" msgid="313434211353070209">"Дзвінки"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Блокування викликів"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Блокування дзвінків тимчасово вимкнено"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Блокування дзвінків вимкнено, оскільки ви зверталися з цього телефона в екстрені служби протягом останніх 48 годин. Ця функція автоматично ввімкнеться, коли мине 48 годин."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Імпортувати номери"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ви позначили абонентів, чиї дзвінки мають автоматично спрямовуватися на голосову пошту через інші додатки."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Переглянути номери"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Імпортувати"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Не вдалось імпортувати"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Не вдалося заархівувати голосову пошту."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Розблокувати номер"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Додати номер"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Виклики з цих номерів блокуватимуться, а голосові повідомлення автоматично видалятимуться."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Виклики з цих номерів блокуватимуться, але абоненти зможуть залишати голосові повідомлення."</string>
+ <string name="block_list" msgid="7760188925338078011">"Заблоковані номери"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> недісний."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"Номер <xliff:g id="NUMBER">%1$s</xliff:g> уже заблоковано."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Блокування викликів вимкнено на 48 годин"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Блокування вимкнено, оскільки ви зробили екстрений виклик."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Обл. записи для дзвінків"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Увімкнути"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Налаштувати дозволи"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Щоб активувати швидкий набір,\n увімкніть дозвіл \"Контакти\"."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Щоб переглянути журнал дзвінків,\n увімкніть дозвіл \"Телефон\"."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Щоб переглянути контакти,\n увімкніть дозвіл \"Контакти\"."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Щоб користуватися голосовою поштою,\n увімкніть дозвіл \"Телефон\"."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Щоб активувати швидкий набір, увімкніть дозвіл \"Контакти\"."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Щоб переглянути журнал викликів, увімкніть дозвіл \"Телефон\"."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Щоб переглянути контакти, увімкніть дозвіл \"Контакти\"."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Щоб користуватися голосовою поштою, увімкніть дозвіл \"Телефон\"."</string>
<string name="permission_no_search" msgid="84152933267902056">"Щоб шукати контакти, увімкніть дозвіл \"Контакти\"."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Щоб телефонувати,\n увімкніть дозвіл \"Телефон\"."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Щоб зателефонувати, увімкніть дозвіл \"Телефон\"."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Додаток Телефон не має дозволу змінювати системні налаштування."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Заблоковано"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>: дзвінок активний"</string>
</resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index 6badc28f7..4cbd69793 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"فون"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"فون"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"فون ڈائل پیڈ"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"فون"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"کال کی سرگزشت"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"<xliff:g id="NAME">%s</xliff:g> کو کال کریں"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"غلط نمبر کی رپورٹ کریں"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"کال کرنے سے پہلے نمبر میں ترمیم کریں"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"رابطے میں شامل کریں"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"کال کی سرگزشت سے حذف کریں"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"کال کی سرگزشت صاف کریں"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"صوتی میل حذف کریں"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"صوتی میل کا اشتراک کریں"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"آپ کا کال لاگ خالی ہے"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"ایک کال کریں"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"کال کی سرگزشت"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"غلط نمبر کی رپورٹ کریں"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"نمبر کاپی کریں"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"ٹرانسکرپشن کاپی کریں"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"نمبر مسدود کریں"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> مسدود ہو گیا"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"نمبر غیر مسدود کریں"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> غیر مسدود ہو گیا"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"کالعدم کریں"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"حذف کریں"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"کال کرنے سے پہلے نمبر میں ترمیم کریں"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"کال کی سرگزشت صاف کریں"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"صوتی میل حذف کریں"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"صوتی میل کو آرکائیو کریں"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"صوتی میل کا اشتراک کریں"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"صوتی میل حذف ہو گئی"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"صوتی میل آرکائیو ہو گئی"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"کالعدم کریں"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"آرکائیو پر جائیں"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"کال کی سرگزشت صاف کریں؟"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"یہ آپ کی سرگزشت سے سبھی کالز کو حذف کر دے گا"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"کال کی سرگزشت صاف کی جا رہی ہے…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"فون"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"چھوٹی ہوئی کال"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"کام سے متعلق چھوٹی ہوئی کال"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"چھوٹی ہوئی کالیں"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> چھوٹی ہوئی کالیں"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"واپس کال کریں"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"پیغام"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> صوتی میلز </item>
<item quantity="one">صوتی میل</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>، <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g> کی جانب سے نیا صوتی میل"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"صوتی میل نہیں چلا سکا"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"بفر کر رہا ہے…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"صوتی میل لوڈ ہو رہا ہے…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"صوتی میل آرکائیو ہو رہی ہے…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"صوتی میل لوڈ نہیں کیا جا سکا"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"صرف صوتی میل والی کالیں"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"صرف آنے والی کالیں"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"کال کی سرگزشت"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"مزید اختیارات"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"ڈائل پیڈ"</string>
- <string name="menu_copy" msgid="6108677035381940698">"کاپی کریں"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"صرف باہر جانے والی دکھائیں"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"صرف آنے والی دکھائیں"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"صرف چھوٹی ہوئی دکھائیں"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"کی جانے والی ویڈیو کال"</string>
<string name="type_missed_video" msgid="954396897034220545">"چھوٹی ہوئی ویڈیو کال"</string>
<string name="type_voicemail" msgid="5153139450668549908">"صوتی میل"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"مسترد شدہ کال"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"مسدود شدہ کال"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"آنے والی کالیں"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"صوتی میل چلائیں"</string>
<string name="description_view_contact" msgid="5205669345700598415">"رابطہ <xliff:g id="NAME">%1$s</xliff:g> دیکھیں"</string>
<string name="description_call" msgid="3443678121983852666">"<xliff:g id="NAME">%1$s</xliff:g> کو کال کریں"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> کیلئے رابطہ کی تفصیلات"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"نیا صوتی میل۔"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> کالیں۔"</string>
<string name="description_video_call" msgid="2933838090743214204">"ویڈیو کال۔"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"‏<xliff:g id="NAME">%1$s</xliff:g> پر SMS بھیجیں"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"بامعاوضہ فون"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> سیکنڈ"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> منٹ <xliff:g id="SECONDS">%s</xliff:g> سیکنڈ"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> بوقت <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"اس نمبر پر کال نہیں کر سکتے ہیں"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"صوتی میل تشکیل دینے کیلئے، مینو &gt; ترتیبات پر جائیں۔"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"صوتی میل کو کال کرنے کیلئے، پہلے ہوائی جہاز طرز آف کریں۔"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"صوتی تلاش دستیاب نہیں ہے"</string>
<string name="call_not_available" msgid="8941576511946492225">"فون کال نہیں کی جا سکتی ہے کیونکہ فون ایپلیکیشن کو غیر فعال کر دیا گیا ہے۔"</string>
<string name="activity_not_available" msgid="2287665636817987623">"اس آلہ پر اس کیلئے کوئی ایپ نہیں ہے"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"نام یا فون نمبر درج کریں"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"آپ کے پاس کوئی چھوٹی ہوئی کالز نہیں ہیں۔"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"آپ کا صوتی میل ان باکس خالی ہے۔"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"رابطے تلاش کریں"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"نمبر شامل کریں یا رابطے تلاش کریں"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"آپ کی کال کی سرگزشت خالی ہے"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"ایک کال کریں"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"آپ کے پاس کوئی چھوٹی ہوئی کالز نہیں ہیں۔"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"آپ کا صوتی میل ان باکس خالی ہے۔"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"آپ کی صوتی میل آرکائیو خالی ہے۔"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"صرف پسندیدہ دکھائیں"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"سرگزشت"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"کال کی سرگزشت"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"صوتی میل کی آرکائیو"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"سبھی"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"چھوٹی ہوئی"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"صوتی میل"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"نئی، آسان انسداد"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"آپ کو بہتر طریقے سے حفاظت فراہم کرنے کیلئے فون کو انسداد کے کام کرنے کا طریقہ تبدیل کرنا ہوگا۔ آپ کے مسدود کردہ نمبروں سے کالیں اور متنی پیغامات دونوں مسدود کر دیے جائیں گے اور ممکن ہے ان کا اشتراک دیگر ایپس کے ساتھ کیا جائے۔"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"اجازت دیں"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> مسدود کریں؟"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"اس نمبر سے کالز مسدود ہوجائیں گی اور صوتی میلز خودبخزد جذف ہو جائیں گی۔"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"اس نمبر سے کالز مسدود ہو جائیں گی گی لیکن ممکن ہے کالر پھر بھی آپ کیلئے صوتی میلز چھوڑ پائے۔"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"آپ کو اب اس نمبر سے مزید کالز یا متنی پیغامات موصول نہیں ہوں گے۔"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"مسدود کریں"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> غیر مسدود کریں؟"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"غیر مسدود کریں"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"اسپیڈ ڈائل"</string>
- <string name="tab_recents" msgid="929949073851377206">"حالیہ"</string>
+ <string name="tab_history" msgid="2563144697322434940">"کال کی سرگزشت"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"رابطے"</string>
<string name="tab_voicemail" msgid="155024725947496746">"صوتی میل"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"پسندیدہ سے ہٹا دیا گیا"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"رابطے میں شامل کریں"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"‏SMS بھیجیں"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"ویڈیو کال کریں"</string>
- <string name="show_call_history" msgid="1141502332266697170">"کال کی مکمل سرگزشت دیکھیں"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"نمبر مسدود کریں"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> نئی چھوٹی ہوئی کالیں"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"آپ کے اسپیڈ ڈائل پر ابھی تک کوئی نہیں ہے"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"ایک پسندیدہ شامل کریں"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"سبھی نمبرز دیھکنے کیلئے تصویر ٹچ کریں یا دوبارہ ترتیب دینے کیلئے ٹچ کریں اور دبائے رکھیں"</string>
<string name="remove_contact" msgid="1080555335283662961">"ہٹائیں"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"ویڈیو کال"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"پیغام بھیجیں"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"پیغام بھیجیں"</string>
<string name="call_log_action_details" msgid="701345508704970622">"کال کی تفصیلات"</string>
<string name="call_log_action_call" msgid="463690849042459842">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> کو کال کریں"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g> کی جانب سے چھوٹی ہوئی کال۔"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g> کی جانب سے جواب دی گئی کال۔"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"بغیر پڑھی گئی صوتی میل منجانب <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>۔"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"صوتی میل منجانب <xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g>۔"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>، <xliff:g id="TYPEORLOCATION">^2</xliff:g>، <xliff:g id="TIMEOFCALL">^3</xliff:g>، <xliff:g id="PHONEACCOUNT">^4</xliff:g> پر کال کریں۔"</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> پر"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"بذریعہ <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"بذریعہ <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> پر، بذریعہ <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> بذریعہ <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"کال کریں"</string>
<string name="description_call_action" msgid="4000549004089776147">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> کو کال کریں"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> کو ویڈیو کال کریں۔"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"فوری جوابات"</string>
<string name="call_settings_label" msgid="313434211353070209">"کالز"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"کال مسدود کرنا"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"کال مسدود کرنا عارضی طور پر آف ہے"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"کال مسدود کرنا غیر فعال کر دیا گیا ہے کیونکہ آپ نے پچھلے 48 گھنٹوں میں اس فون سے ہنگامی سروسز کے ساتھ رابطہ کیا تھا۔ جب 48 گھنٹے کا دورانیہ ختم ہوگا تو یہ خودکار طور پر دوبارہ فعال ہو جائے گا۔"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"نمبرز درآمد کریں"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"آپ نے پہلے کچھ کالرز کو خودکار طور پر بذریعہ دیگر ایپس صوتی میل کو بھیجنا نشان زد کیا تھا۔"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"نمبرز دیکھیں"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"درآمد کریں"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"درآمد کرنا ناکام ہوگیا"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"صوتی میل کو آرکائیو کرنے میں ناکام۔"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"نمبر غیر مسدود کریں"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"نمبر شامل کریں"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"ان نمبرز سے کالز مسدود ہوجائیں گی اور صوتی میلز خودبخود جذف ہو جائیں گی۔"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"ان نمبرز سے کالز مسدود ہو جائیں گی گی لیکن ممکن ہے وہ پھر بھی آپ کیلئے صوتی میلز چھوڑ پائیں۔"</string>
+ <string name="block_list" msgid="7760188925338078011">"مسدود کردہ نمبرز"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> غلط ہے۔"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> پہلے ہی مسدود ہے۔"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"کال مسدود کرنا 48 گھنٹے کیلئے غیر فعال ہو گیا"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"غیر فعال ہو گیا کیونکہ ایک ہنگامی کال کی گئی تھی۔"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"کالنگ اکاؤنٹس"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"آن کریں"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"اجازتیں طے کریں"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"اسپیڈ ڈائل کو فعال کرنے کیلئے،\n رابطوں کی اجازت آن کریں۔"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"اپنا کال لاگ دیکھنے کیلئے،\n فون کی اجازت آن کریں۔"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"اپنے رابطے دیکھنے کیلئے،\n رابطوں کی اجازت آن کریں۔"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"اپنی صوتی میل پر رسائی کیلئے،\n فون کی اجازت آن کریں۔"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"اسپیڈ ڈائل کو فعال کرنے کیلئے رابطوں کی اجازت آن کریں۔"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"اپنا کال لاگ دیکھنے کیلئے فون کی اجازت آن کریں۔"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"اپنے رابطے دیکھنے کیلئے رابطوں کی اجازت آن کریں۔"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"اپنی صوتی میل تک رسائی کیلئے فون کی اجازت آن کریں۔"</string>
<string name="permission_no_search" msgid="84152933267902056">"اپنے رابطوں کو تلاش کرنے کیلئے رابطوں کی اجازتیں آن کریں۔"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"کال کرنے کے لیے،\n فون کی اجازت آن کریں۔"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"کال کرنے کیلئے فون کی اجازت آن کریں۔"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"فون ایپ کے پاس سسٹم ترتیبات کو لکھنے کی اجازت نہیں ہے۔"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"مسدود کردہ"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> فعال ہے"</string>
</resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index f2c9f9e7c..fde6c9bb1 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Telefon"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Telefon"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Telefon raqam terish paneli"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Raqam tergich"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Qo‘ng‘iroqlar tarixi"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Qo‘ng‘iroq: <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Raqam noto‘g‘ri aniqlandi"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Tahrirlash va telefon qilish"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Mavjud kontaktga qo‘shish"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Qo‘ng‘iroqlar tarixidan o‘chirish"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Qo‘ng‘iroqlar tarixini tozalash"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Ovozli xabarni o‘chirish"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Baham ko‘rish"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Qo‘ng‘iroqlar jurnali bo‘m-bo‘sh"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Qo‘ng‘iroq qilish"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Qo‘ng‘iroqlar tarixi"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Raqam noto‘g‘ri aniqlandi"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Raqamdan nusxa olish"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Transkripsiyadan nusxa olish"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Raqamni bloklash"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami bloklandi"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Raqamni blokdan chiqarish"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami blokdan chiqarildi"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"QAYTARISH"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"O‘chirish"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Tahrirlash va telefon qilish"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Qo‘ng‘iroqlar tarixini tozalash"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Ovozli xabarni o‘chirish"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Ovozli pochtani arxivlash"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Ovozli xabarni yuborish"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Ovozli pochta o‘chirildi"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Ovozli pochta arxivlandi"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"QAYTARISH"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"ARXIVGA O‘TISH"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Qo‘ng‘iroqlar tarixi tozalansinmi?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Barcha qo‘ng‘iroqlar tarixi o‘chib ketadi."</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Qo‘ng‘iroqlar tarixi tozalanmoqda…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Chaqiruv"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Javobsiz qo‘ng‘iroq"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Javobsiz ishchi qo‘ng‘irog‘i"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Javobsiz qo‘ng‘iroqlar"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> ta javobsiz qo‘ng‘iroq"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Telefon qilish"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"SMS yuborish"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> ta ovozli xabar </item>
<item quantity="one">Ovozli xabar</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"<xliff:g id="CALLER">%1$s</xliff:g>dan yangi ovozli xabar"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Ovozli xabarni eshitib bo‘lmadi"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Buferga yuklanmoqda…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Ovozli xabar yuklanmoqda…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Ovozli pochta arxivlanmoqda…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Ovozli xabarni yuklab bo‘lmadi"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Faqat ovozli xabar qo‘ng‘iroqlari"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Faqat kiruvchi qo‘ng‘iroqlar"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Qo‘ng‘iroqlar tarixi"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Boshqa parametrlar"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"terish paneli"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Nusxalash"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Chiquvchi qo‘ng‘-ni ko‘rsatish"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Kiruvchi qo‘n-larni ko‘rsatish"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Javobsiz qo‘n-larni ko‘rsatish"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Chiquvchi videoqo‘ng‘iroq"</string>
<string name="type_missed_video" msgid="954396897034220545">"Javobsiz videoqo‘ng‘iroq"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Ovozli pochta"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Rad qilingan qo‘ng‘iroq"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Bloklangan qo‘ng‘iroq"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Kiruvchi qo‘ng‘iroqlar"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Ovozli xabarni eshitish"</string>
<string name="description_view_contact" msgid="5205669345700598415">"<xliff:g id="NAME">%1$s</xliff:g> kontaktini ko‘rish"</string>
<string name="description_call" msgid="3443678121983852666">"Qo‘ng‘iroq: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g> uchun kontakt ma’lumotlari"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Yangi ovozli xabar."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> ta qo‘ng‘iroq."</string>
<string name="description_video_call" msgid="2933838090743214204">"Video qo‘ng‘iroq."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"<xliff:g id="NAME">%1$s</xliff:g>ga SMS yuborish"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Taksofon"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> soniya"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> daq <xliff:g id="SECONDS">%s</xliff:g> son"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g>, <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Bu raqamga qo‘ng‘iroq qilib bo‘lmaydi"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ovozli xabarni sozlash uchun \"Menyu\" &gt; \"Sozlamalar\"ga o‘ting."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Ovozli xabar jo‘natish uchun, avval \"Parvoz rejimi\"ni o‘chiring."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Ovozli qidiruv mavjud emas"</string>
<string name="call_not_available" msgid="8941576511946492225">"Telefon ilovasi o‘chirib qo‘yilgani sababli telefon qo‘ng‘iroqlarini amalga oshirib bo‘lmaydi."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Qurilmada buni bajaradigan ilova yo‘q"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Ismi yoki telefon raqami"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Sizda hech qanday javobsiz qo‘ng‘iroq yo‘q."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Sizning ovozli pochta qutingiz bo‘m-bo‘sh."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Kontakt qidirish"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Raqam qo‘shish yoki kontaktlardan qidirish"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Qo‘ng‘iroqlar tarixi bo‘m-bo‘sh"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Qo‘ng‘iroq qilish"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Sizda hech qanday javobsiz qo‘ng‘iroq yo‘q."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Ovozli pochta qutisi bo‘m-bo‘sh."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Ovozli pochta arxivingiz bo‘sh."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Faqat saralar ko‘rsatilsin"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Jurnal"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Qo‘ng‘iroqlar tarixi"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Ovozli pochta arxivi"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Hammasi"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Javobsiz"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Ovozli pochta"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Raqamlarni bloklashning sodda usuli"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Sizni yanada yaxshiroq himoya qilish uchun “Telefon” ilovasi bloklash tartibini o‘zgartirishi lozim. Bloklangan raqamlardan keladigan qo‘ng‘iroqlar ham, SMS xabarIar ham qabul qilinmaydi. Boshqa ilovalarga ham bunday raqamlardan foydalanishga ruxsat bering."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Ruxsat berish"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami bloklanilsinmi?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Bu raqamdan kelgan qo‘ng‘iroqlar bloklanadi va ovozli xabari avtomatik o‘chiriladi."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Bu raqamdan kelgan qo‘ng‘iroqlar bloklanadi, lekin raqam egasi sizga ovozli xabar qoldira oladi."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Siz endi bu raqamdan qo‘ng‘iroq va SMS qabul qilmaysiz."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"BLOKLASH"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami blokdan chiqarilsinmi?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"BLOKDAN CHIQARISH"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Tezkor terish"</string>
- <string name="tab_recents" msgid="929949073851377206">"So‘nggi"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Qo‘ng‘iroqlar tarixi"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Kontaktlar"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Ovozli pochta"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Tanlanganlardan o‘chirilgan"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Mavjud kontaktga qo‘shish"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"SMS yuborish"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Videoqo‘ng‘iroq qilish"</string>
- <string name="show_call_history" msgid="1141502332266697170">"To‘liq qo‘ng‘iroqlar tarixini ko‘rish"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Raqamni bloklash"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> ta javobsiz qo‘ng‘iroq"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Tezkor raqam terish ro‘yxatida hech kim yo‘q"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Tezkor raqam terishni sozlang"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Barcha raqamlarni ko‘rish uchun rasm ustiga bosing. Joyini o‘zgartirish uchun uni bosib turing."</string>
<string name="remove_contact" msgid="1080555335283662961">"O‘chirish"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Video qo‘ng‘iroq"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Xabar yuborish"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"SMS yuborish"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Chaqiruv tafsilotlari"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Qo‘ng‘iroq qilish: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Qo‘ng‘iroq javobsiz qoldirildi: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Qo‘ng‘iroqqa javob berildi: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"O‘qilmagan ovozli xabar (<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Ovozli xabar (<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>)."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Qo‘ng‘iroq qilindi: <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"<xliff:g id="PHONEACCOUNT">^1</xliff:g> orqali"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami orqali"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami orqali"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> da, <xliff:g id="NUMBER">%2$s</xliff:g> raqami orqali"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, <xliff:g id="NUMBER">%2$s</xliff:g> raqami orqali"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Qo‘ng‘iroq qilish"</string>
<string name="description_call_action" msgid="4000549004089776147">"Qo‘ng‘iroq qilish: <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Video qo‘ng‘iroq qilish: <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Tezkor javoblar"</string>
<string name="call_settings_label" msgid="313434211353070209">"Qo‘ng‘iroqlar"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Chaqiruvlarni bloklash"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Qo‘ng‘iroqlarni bloklash o‘chirilgan"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Oxirgi 48 soat ichida ushbu telefon orqali favqulodda xizmatlar bilan bog‘lanilganligi uchun qo‘ng‘iroqlarni bloklash o‘chirib qo‘yildi. 48 soatlik muddat tugagandan so‘ng bu avtomatik qayta yoqiladi."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Raqamlarni import qilish"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ba’zi kiruvchi kontaktlaringiz boshqa ilovalar orqali avtomatik ovozli xabar yo‘llaydigan qilib belgilagansiz."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Sonini ko‘rish"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Import qilish"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Import qilib bo‘lmadi"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Ovozli pochtani arxivlashda xatolik yuz berdi."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Raqamni blokdan chiqarish"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Raqam qo‘shish"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Bu raqamlardan kelgan qo‘ng‘iroqlar bloklanadi va ovozli xabarlari avtomatik o‘chiriladi."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Bu raqamlardan kelgan qo‘ng‘iroqlar bloklanadi, lekin raqam egalari sizga ovozli xabar qoldira olishadi."</string>
+ <string name="block_list" msgid="7760188925338078011">"Bloklangan raqamlar"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"Noto‘g‘ri raqam: <xliff:g id="NUMBER">%1$s</xliff:g>."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> raqami allaqachon bloklangan."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Qo‘ng‘iroqlarni bloklash 48 soat muddatga o‘chirildi"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Favqulodda qo‘ng‘iroq amalga oshirilgani uchun o‘chirildi."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Qo‘ng‘iroq uchun hisoblar"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Yoqish"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Ruxsatnomalarni sozlash"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Tezkor raqam terish uchun\n “Kontaktlar” ruxsatnomasini yoqing."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Qo‘ng‘iroqlar jurnalini ko‘rish uchun\n “Telefon” ruxsatnomasini yoqing."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Kontaktlarni ko‘rish uchun\n “Kontaktlar” ruxsatnomasini yoqing."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Ovozli pochtaga kirish uchun\n “Telefon” ruxsatnomasini yoqing."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Tezkor raqam terish uchun “Kontaktlar” ruxsatnomasini yoqing."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Qo‘ng‘iroqlaringiz ro‘yxatini ko‘rish uchun “Telefon” ruxsatnomasini yoqing."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Kontaktlaringizni ko‘rish uchun “Kontaktlar” ruxsatnomasini yoqing."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Ovozli pochtaga kirish uchun “Telefon” ruxsatnomasini yoqing."</string>
<string name="permission_no_search" msgid="84152933267902056">"Kontaktlarni qidirish uchun “Kontaktlar” ruxsatnomasini yoqing."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Qo‘ng‘iroq qilish uchun\n “Telefon” ruxsatnomasini yoqing."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Qo‘ng‘iroq qilish uchun “Telefon” ruxsatnomasini yoqing."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Telefon ilovasida tizim sozlamalarini o‘zgartirish uchun ruxsat yo‘q."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bloklangan"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> faol"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 602a4ff44..3b0cdc3a8 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Điện thoại"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Điện thoại"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Bàn phím số điện thoại"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Điện thoại"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Nhật ký cuộc gọi"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Gọi <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Báo cáo số không chính xác"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Chỉnh sửa số trước khi gọi"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Thêm vào liên hệ"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Xóa khỏi nhật ký cuộc gọi"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Xóa nhật ký cuộc gọi"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Xóa thư thoại"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Hiển thị thư thoại"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Nhật ký cuộc gọi của bạn trống"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Gọi điện"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Nhật ký cuộc gọi"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Báo cáo số không chính xác"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Sao chép số"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Sao chép bản ghi âm"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Chặn số"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"Đã chặn <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Bỏ chặn số"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"Đã bỏ chặn <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"HOÀN TÁC"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Xóa"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Chỉnh sửa số trước khi gọi"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Xóa nhật ký cuộc gọi"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Xóa thư thoại"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Lưu trữ thư thoại"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Chia sẻ thư thoại"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Đã xóa thư thoại"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Đã lưu trữ thư thoại"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"HOÀN TÁC"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"CHUYỂN ĐẾN LƯU TRỮ"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Xóa nhật ký cuộc gọi?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Thao tác này sẽ xóa tất cả cuộc gọi khỏi nhật ký của bạn"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Đang xóa nhật ký cuộc gọi…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Điện thoại"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Cuộc gọi nhỡ"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Cuộc gọi nhỡ về công việc"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Cuộc gọi nhỡ"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> cuộc gọi nhỡ"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Gọi lại"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Tin nhắn"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Thư thoại </item>
<item quantity="one">Thư thoại</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"Thư thoại mới từ <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Không thể phát thư thoại"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Đang lưu tạm vào bộ đệm…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Đang tải thư thoại…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Đang lưu trữ thư thoại…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Không thể tải thư thoại"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Chỉ cuộc gọi có thư thoại"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Chỉ cuộc gọi đến"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Nhật ký cuộc gọi"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Tùy chọn khác"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"bàn phím số"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Sao chép"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Chỉ hiển thị cuộc gọi đi"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Chỉ hiển thị cuộc gọi đến"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Chỉ hiển thị cuộc gọi nhỡ"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Cuộc gọi điện video đi"</string>
<string name="type_missed_video" msgid="954396897034220545">"Cuộc gọi điện video bị nhỡ"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Thư thoại"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Cuộc gọi bị từ chối"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Cuộc gọi bị chặn"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Cuộc gọi đến"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Phát thư thoại"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Xem thông tin liên hệ của <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Gọi <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Chi tiết liên lạc cho <xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Thư thoại mới."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> cuộc gọi."</string>
<string name="description_video_call" msgid="2933838090743214204">"Gọi điện video."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Gửi SMS cho <xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Điện thoại công cộng"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> giây"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> phút <xliff:g id="SECONDS">%s</xliff:g> giây"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> lúc <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Không thể gọi số này"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Để thiết lập thư thoại, đi tới Menu &gt; Cài đặt."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Để gọi thư thoại, trước tiên hãy tắt chế độ trên Máy bay."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Không có tính năng tìm kiếm bằng giọng nói"</string>
<string name="call_not_available" msgid="8941576511946492225">"Không thể thực hiện cuộc gọi điện thoại vì ứng dụng Điện thoại đã bị tắt."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Không có ứng dụng nào cho thao tác đó trên thiết bị này"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Nhập tên hoặc số điện thoại"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Bạn không có cuộc gọi nhỡ nào."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Hộp thư thoại đến của bạn trống."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Tìm kiếm liên hệ"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Thêm số hoặc tìm kiếm danh bạ"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Nhật ký cuộc gọi của bạn trống"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Gọi điện"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Bạn không có cuộc gọi nhỡ nào."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Hộp thư thoại đến của bạn trống."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Danh sách thư thoại được lưu trữ của bạn trống."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Chỉ hiển thị liên hệ ưa thích"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Nhật ký"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Nhật ký cuộc gọi"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Lưu trữ thư thoại"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Tất cả"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Bị nhỡ"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Thư thoại"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Tính năng chặn mới, được đơn giản hóa"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Để bảo vệ bạn tốt hơn, Điện thoại cần thay đổi cách hoạt động của tính năng chặn. Giờ đây, các số đã chặn của bạn sẽ bị chặn cả cuộc gọi và tin nhắn, đồng thời có thể được chia sẻ với các ứng dụng khác."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Cho phép"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Chặn <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Các cuộc gọi từ số này sẽ bị chặn và thư thoại sẽ tự động bị xóa."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Các cuộc gọi từ số này sẽ bị chặn nhưng người gọi vẫn có thể để lại thư thoại cho bạn."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Bạn sẽ không nhận được các cuộc gọi hoặc tin nhắn từ số này nữa."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"CHẶN"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Bỏ chặn <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"BỎ CHẶN"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Quay số nhanh"</string>
- <string name="tab_recents" msgid="929949073851377206">"Gần đây"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Nhật ký cuộc gọi"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Danh bạ"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Thư thoại"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Đã xóa khỏi liên hệ yêu thích"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Thêm vào liên hệ"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Gửi SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Gọi điện video"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Xem toàn bộ nhật ký cuộc gọi"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Chặn số"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> cuộc gọi nhỡ mới"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Chưa có ai trong danh bạ quay số nhanh của bạn"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Thêm liên hệ yêu thích"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Chạm vào hình ảnh để xem tất cả các số hoặc chạm và giữ để sắp xếp lại"</string>
<string name="remove_contact" msgid="1080555335283662961">"Xóa"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Cuộc gọi điện video"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Gửi tin nhắn"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Gửi tin nhắn"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Chi tiết cuộc gọi"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Gọi <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Cuộc gọi nhỡ từ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Cuộc gọi đã trả lời từ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Thư thoại chưa đọc từ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Thư thoại từ <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Gọi tới <xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"trên <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"qua <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"qua <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"trên <xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, qua <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> qua <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Gọi"</string>
<string name="description_call_action" msgid="4000549004089776147">"Gọi <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Gọi điện video cho <xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Trả lời nhanh"</string>
<string name="call_settings_label" msgid="313434211353070209">"Cuộc gọi"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Chặn cuộc gọi"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Tạm thời tắt chặn cuộc gọi"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Tính năng chặn cuộc gọi đã bị tắt vì bạn đã liên hệ với dịch vụ khẩn cấp từ điện thoại này trong vòng 48 giờ qua. Tính năng này sẽ được bật lại tự động sau khi khoảng thời gian 48 giờ kết thúc."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Nhập số"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Trước đây bạn đã đánh dấu một số người gọi sẽ được tự động gửi tới thư thoại qua các ứng dụng khác."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Xem số"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Nhập"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Nhập không thành công"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Không lưu trữ được thư thoại."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Bỏ chặn số"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Thêm số"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Cuộc gọi từ các số này sẽ bị chặn và thư thoại sẽ tự động bị xóa."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Cuộc gọi từ các số này sẽ bị chặn nhưng họ vẫn có thể để lại thư thoại cho bạn."</string>
+ <string name="block_list" msgid="7760188925338078011">"Số bị chặn"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> không hợp lệ."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> đã bị chặn."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Đã tắt tính năng chặn cuộc gọi trong 48 giờ"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Bị tắt vì bạn đã thực hiện cuộc gọi khẩn cấp."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Tài khoản gọi"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Bật"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Đặt quyền"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Để bật quay số nhanh,\n hãy bật quyền đối với Danh bạ."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Để xem nhật ký cuộc gọi của bạn,\n bật quyền đối với Điện thoại."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Để xem danh bạ của bạn,\n bật quyền đối với Danh bạ."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Để truy cập thư thoại của bạn,\n bật quyền đối với Điện thoại."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Để bật quay số nhanh, bật quyền đối với Danh bạ."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Để xem nhật ký cuộc gọi của bạn, bật quyền đối với Điện thoại."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Để xem danh bạ của bạn, bật quyền đối với Danh bạ."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Để truy cập thư thoại của bạn, bật quyền đối với Điện thoại."</string>
<string name="permission_no_search" msgid="84152933267902056">"Để tìm kiếm liên hệ của bạn, hãy bật quyền đối với Danh bạ."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Để thực hiện cuộc gọi,\n bật quyền đối với Điện thoại."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Để thực hiện cuộc gọi, bật quyền đối với Điện thoại."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Ứng dụng Điện thoại không có quyền ghi vào cài đặt hệ thống."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Bị chặn"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> đang hiện hoạt"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9c65ebde6..200b6fe24 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"电话"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"电话"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"电话拨号键盘"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"拨号"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"通话记录"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"呼叫<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"报告错误的号码"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"呼叫之前编辑号码"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"添加到联系人"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"从通话记录中删除"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"清除通话记录"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"删除语音邮件"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"分享语音邮件"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"您没有任何通话记录"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"拨打电话"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"通话记录"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"报告错误的号码"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"复制号码"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"复制转录内容"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"屏蔽号码"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"已屏蔽 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"取消屏蔽号码"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"已取消屏蔽 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"撤消"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"删除"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"拨打之前修改号码"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"清除通话记录"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"删除语音邮件"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"归档语音邮件"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"分享语音邮件"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"语音邮件已删除"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"已归档的语音邮件"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"撤消"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"转至归档"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"要清除通话记录吗?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"这会删除您的所有通话记录"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"正在清除通话记录…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"打电话"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"未接电话"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"未接工作来电"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"未接电话"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 个未接电话"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"回电"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"发短信"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> 封语音邮件</item>
<item quantity="one">1 封语音邮件</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>,<xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"来自<xliff:g id="CALLER">%1$s</xliff:g>的新语音邮件"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"无法播放语音邮件"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"正在缓冲…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"正在加载语音邮件…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"正在归档语音邮件…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"无法加载语音邮件"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"只显示语音信箱留言"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"只显示来电"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"通话记录"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"更多选项"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"拨号键盘"</string>
- <string name="menu_copy" msgid="6108677035381940698">"复制"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"仅显示外拨电话"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"只显示来电"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"只显示未接来电"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"拨出的视频通话"</string>
<string name="type_missed_video" msgid="954396897034220545">"错过的视频通话"</string>
<string name="type_voicemail" msgid="5153139450668549908">"语音信箱"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"拒接的来电"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"屏蔽的来电"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"来电"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"播放语音邮件"</string>
<string name="description_view_contact" msgid="5205669345700598415">"查看联系人<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"呼叫<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>的详细联系信息"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"有新的语音邮件。"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g>次通话。"</string>
<string name="description_video_call" msgid="2933838090743214204">"视频通话。"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"向<xliff:g id="NAME">%1$s</xliff:g>发送短信"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"公用电话"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> 分钟 <xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"无法拨打此号码"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"要设置语音信箱,请转到“菜单”&gt;“设置”。"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"要呼叫语音信箱,请先关闭飞行模式。"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"无法使用语音搜索"</string>
<string name="call_not_available" msgid="8941576511946492225">"“电话”应用已被停用,因此无法拨打电话。"</string>
<string name="activity_not_available" msgid="2287665636817987623">"此设备上没有可执行此操作的应用"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"输入姓名或电话号码"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"您没有任何未接电话。"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"您未收到任何语音邮件。"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"搜索联系人"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"添加号码或搜索联系人"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"您没有任何通话记录"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"拨打电话"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"您没有任何未接电话。"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"您未收到任何语音邮件。"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"没有已归档的语音邮件。"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"仅显示收藏的联系人"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"通话记录"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"通话记录"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"语音邮件归档"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"全部"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"未接电话"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"语音邮件"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"简单易用的全新屏蔽功能"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"为了向您提供更好的安全保护,“电话”应用需要升级屏蔽方式。您将不会再收到已屏蔽号码的来电和短信,而且系统还可能会将屏蔽号码列表共享给其他应用。"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"允许"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"要屏蔽 <xliff:g id="NUMBER">%1$s</xliff:g> 吗?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"系统将屏蔽该号码的来电,并将自动删除来电者发送的语音邮件。"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"系统将屏蔽该号码的来电,但来电者可能仍然能够给您发送语音邮件。"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"您将不会再收到此号码的来电或短信。"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"屏蔽"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"要取消屏蔽 <xliff:g id="NUMBER">%1$s</xliff:g> 吗?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"取消屏蔽"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"快速拨号"</string>
- <string name="tab_recents" msgid="929949073851377206">"最近"</string>
+ <string name="tab_history" msgid="2563144697322434940">"通话记录"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"通讯录"</string>
<string name="tab_voicemail" msgid="155024725947496746">"语音邮件"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"已从收藏中移除"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"添加到联系人"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"发送短信"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"发起视频通话"</string>
- <string name="show_call_history" msgid="1141502332266697170">"查看全部通话记录"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"屏蔽号码"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g>个新的未接电话"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"尚未给任何联系人设定快速拨号"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"收藏联系人"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"触摸图片可查看所有号码,触摸并按住可重新排序"</string>
<string name="remove_contact" msgid="1080555335283662961">"移除"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"视频通话"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"发送短信"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"发送短信"</string>
<string name="call_log_action_details" msgid="701345508704970622">"通话详情"</string>
<string name="call_log_action_call" msgid="463690849042459842">"与<xliff:g id="NAMEORNUMBER">^1</xliff:g>通话"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"<xliff:g id="PHONEACCOUNT">^4</xliff:g> 上 <xliff:g id="TIMEOFCALL">^3</xliff:g>来自<xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="TYPEORLOCATION">^2</xliff:g>)的未接电话。"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"<xliff:g id="PHONEACCOUNT">^4</xliff:g> 上 <xliff:g id="TIMEOFCALL">^3</xliff:g>来自<xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="TYPEORLOCATION">^2</xliff:g>)的已接电话。"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"<xliff:g id="PHONEACCOUNT">^4</xliff:g> 上 <xliff:g id="TIMEOFCALL">^3</xliff:g>来自<xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="TYPEORLOCATION">^2</xliff:g>)的未读语音邮件。"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"<xliff:g id="PHONEACCOUNT">^4</xliff:g> 上 <xliff:g id="TIMEOFCALL">^3</xliff:g>来自<xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="TYPEORLOCATION">^2</xliff:g>)的语音邮件。"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"<xliff:g id="TIMEOFCALL">^3</xliff:g>通过 <xliff:g id="PHONEACCOUNT">^4</xliff:g> 拨打给<xliff:g id="NAMEORNUMBER">^1</xliff:g>(<xliff:g id="TYPEORLOCATION">^2</xliff:g>)的电话。"</string>
<string name="description_phone_account" msgid="1767072759541443861">"通过 <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"通过 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"通过 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"帐户:<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>,通过 <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"帐户:<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>,通过 <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"拨打电话"</string>
<string name="description_call_action" msgid="4000549004089776147">"呼叫<xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"与<xliff:g id="NAMEORNUMBER">^1</xliff:g>进行视频通话。"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"快速回复"</string>
<string name="call_settings_label" msgid="313434211353070209">"通话"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"来电屏蔽"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"来电拦截功能已暂时关闭"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"来电拦截功能已停用,因为您在过去 48 小时内使用该手机拨打了紧急服务电话。系统会在 48 小时的期限结束后自动重新启用该功能。"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"导入号码"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"您曾通过其他应用将某些来电者设为自动转到语音信箱。"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"查看号码"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"导入"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"导入失败"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"无法归档语音邮件。"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"取消屏蔽号码"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"添加号码"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"系统将屏蔽这些号码的来电,并将自动删除这些来电者发送的语音邮件。"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"系统将屏蔽这些号码的来电,但这些来电者可能仍然能够给您发送语音邮件。"</string>
+ <string name="block_list" msgid="7760188925338078011">"已屏蔽的号码"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> 无效。"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> 已被屏蔽。"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"来电拦截功能将停用 48 小时"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"此功能已停用,因为您拨打了紧急呼救电话。"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"通话帐号"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"开启"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"设置权限"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"要启用快速拨号功能,\n请开启“通讯录”权限。"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"要查看您的通话记录,\n请开启“电话”权限。"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"要查看您的联系人,\n请开启“通讯录”权限。"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"要使用您的语音信箱,\n请开启“电话”权限。"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"要启用快速拨号功能,请开启“通讯录”权限。"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"要查看您的通话记录,请开启“电话”权限。"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"要查看您的联系人,请开启“通讯录”权限。"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"要使用您的语音信箱,请开启“电话”权限。"</string>
<string name="permission_no_search" msgid="84152933267902056">"要搜索您的联系人,请开启“通讯录”权限。"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"要拨打电话,\n请开启“电话”权限。"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"要拨打电话,请开启“电话”权限。"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"电话应用不具备写入系统设置的权限。"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"已屏蔽"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"正在与<xliff:g id="NAMEORNUMBER">^1</xliff:g>通话"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 0eff16720..99911e909 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"電話"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"電話"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"手機撥號盤"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"電話"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"通話記錄"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"打電話給<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"報告不準確的數目"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"致電前編輯號碼"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"加至現有聯絡人資料"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"從通話記錄中刪除"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"清除通話記錄"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"刪除留言"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"分享留言信箱"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"沒有通話記錄"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"撥號"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"通話記錄"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"報告錯誤號碼"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"複製號碼"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"複製內容轉錄"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"封鎖號碼"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"已封鎖 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"解除封鎖號碼"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"已解除封鎖 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"復原"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"刪除"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"致電前編輯號碼"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"清除通話記錄"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"刪除留言"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"封存留言"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"分享留言"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"已刪除留言信箱"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"已封存留言"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"復原"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"前往封存庫"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"要清除通話記錄嗎?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"此操作將刪除所有通話記錄"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"正在清除通話記錄…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"撥打電話"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"未接來電"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"未接工作來電"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"未接來電"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 個未接來電"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"回電"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"短訊"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"><xliff:g id="COUNT">%1$d</xliff:g> 個留言</item>
<item quantity="one">留言</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g> , <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"來自<xliff:g id="CALLER">%1$s</xliff:g>的新語音留言"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"無法播放留言"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"正在緩衝..."</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"正在載入留言…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"正在封存留言…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"無法載入留言"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"只顯示有留言的來電"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"只顯示來電"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"通話記錄"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"更多選項"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"撥號鍵盤"</string>
- <string name="menu_copy" msgid="6108677035381940698">"複製"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"只顯示撥出電話"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"只顯示來電"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"只顯示未接來電"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"撥出的視像通話"</string>
<string name="type_missed_video" msgid="954396897034220545">"未接視像通話"</string>
<string name="type_voicemail" msgid="5153139450668549908">"留言信箱"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"拒絕來電"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"封鎖來電"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"來電"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"播放語音留言"</string>
<string name="description_view_contact" msgid="5205669345700598415">"查看聯絡人<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"致電<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"「<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>」的聯絡人詳細資料"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"新留言。"</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> 次通話次數。"</string>
<string name="description_video_call" msgid="2933838090743214204">"視像通話。"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"向 <xliff:g id="NAME">%1$s</xliff:g> 傳送短訊"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"公共電話"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> 分 <xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"無法撥打這個電話號碼"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"如要設定留言信箱,請移至 [選單] &gt; [設定]。"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"如要致電留言信箱,請先關閉飛行模式。"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"無法使用語音搜尋"</string>
<string name="call_not_available" msgid="8941576511946492225">"由於「電話」應用程式已停用,因此無法打電話。"</string>
<string name="activity_not_available" msgid="2287665636817987623">"這部裝置上沒有可用的應用程式"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"請輸入姓名或電話號碼"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"您沒有未接來電。"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"您的留言信箱沒有留言。"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"搜尋聯絡人"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"新增號碼或搜尋聯絡人"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"沒有通話記錄"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"撥號"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"您沒有未接來電。"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"您的留言信箱沒有留言。"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"您的留言封存是空的。"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"只顯示我的最愛"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"記錄"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"通話記錄"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"留言封存"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"全部"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"未接來電"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"留言信箱"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"全新、簡單的封鎖功能"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"為更有效保護您的安全,Phone 需要變更封鎖功能的運作方式。系統現在會拒絕已封鎖號碼的來電和短訊,並可能將這些號碼提供給其他應用程式使用。"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"允許"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"要封鎖 <xliff:g id="NUMBER">%1$s</xliff:g> 嗎?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"將會封鎖這個號碼的來電,而留言將會自動刪除。"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"將會封鎖這個號碼的來電,但來電可能會轉駁至留言信箱。"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"您不會再收到這個號碼的來電和短訊。"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"封鎖"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"要解除封鎖 <xliff:g id="NUMBER">%1$s</xliff:g> 嗎?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"解除封鎖"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"快速撥號"</string>
- <string name="tab_recents" msgid="929949073851377206">"最近存取的聯絡人"</string>
+ <string name="tab_history" msgid="2563144697322434940">"通話記錄"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"聯絡人"</string>
<string name="tab_voicemail" msgid="155024725947496746">"留言信箱"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"已從「我的最愛」中移除"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"加至現有聯絡人資料"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"傳送短訊"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"進行視像通話"</string>
- <string name="show_call_history" msgid="1141502332266697170">"查看完整通話記錄"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"封鎖號碼"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> 個新的未接來電"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"快速撥號清單中沒有聯絡人"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"新增常用聯絡人"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"輕觸圖像以查看所有電話號碼,或輕觸並按住圖像以重新排序"</string>
<string name="remove_contact" msgid="1080555335283662961">"移除"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"視像通話"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"傳送訊息"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"傳送訊息"</string>
<string name="call_log_action_details" msgid="701345508704970622">"通話詳情"</string>
<string name="call_log_action_call" msgid="463690849042459842">"致電 <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"未接聽來電:<xliff:g id="NAMEORNUMBER">^1</xliff:g> (<xliff:g id="TIMEOFCALL">^3</xliff:g>,<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="PHONEACCOUNT">^4</xliff:g>)。"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"已接聽來電:<xliff:g id="NAMEORNUMBER">^1</xliff:g> (<xliff:g id="TIMEOFCALL">^3</xliff:g>,<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="PHONEACCOUNT">^4</xliff:g>)。"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"未收聽的留言來自 <xliff:g id="NAMEORNUMBER">^1</xliff:g> (<xliff:g id="TYPEORLOCATION">^2</xliff:g>),來電時間:<xliff:g id="TIMEOFCALL">^3</xliff:g>,撥打至 <xliff:g id="PHONEACCOUNT">^4</xliff:g>。"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"留言來自 <xliff:g id="NAMEORNUMBER">^1</xliff:g> (<xliff:g id="TYPEORLOCATION">^2</xliff:g>),來電時間:<xliff:g id="TIMEOFCALL">^3</xliff:g>,撥打至 <xliff:g id="PHONEACCOUNT">^4</xliff:g>。"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"致電:<xliff:g id="NAMEORNUMBER">^1</xliff:g> (<xliff:g id="TIMEOFCALL">^3</xliff:g>,<xliff:g id="TYPEORLOCATION">^2</xliff:g><xliff:g id="PHONEACCOUNT">^4</xliff:g>)。"</string>
<string name="description_phone_account" msgid="1767072759541443861">"使用 <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"透過 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"透過 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"上<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>通過<xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>,透過 <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"撥號"</string>
<string name="description_call_action" msgid="4000549004089776147">"致電 <xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"與<xliff:g id="NAMEORNUMBER">^1</xliff:g>進行視像通話。"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"快速回應"</string>
<string name="call_settings_label" msgid="313434211353070209">"通話"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"來電封鎖"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"暫時關閉來電封鎖功能"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"您在過去 48 小時內曾經使用此手機聯絡緊急服務,因此來電封鎖功能已停用。系統會在 48 小時期限結束後自動重新啟用功能。"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"匯入號碼"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"您早前透過其他應用程式標記部分來電者,將他們的來電自動轉駁至留言信箱。"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"查看電話號碼"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"匯入"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"匯入失敗"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"無法封存留言。"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"解除封鎖號碼"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"新增電話號碼"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"將會封鎖這些號碼的來電,而留言將會自動刪除。"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"將會封鎖這些號碼的來電,但來電可能會轉駁至留言信箱。"</string>
+ <string name="block_list" msgid="7760188925338078011">"已封鎖的號碼"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> 無效。"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"已封鎖 <xliff:g id="NUMBER">%1$s</xliff:g>。"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"已停用來電封鎖 (48 小時)"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"已撥打緊急電話,已停用來電封鎖功能。"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"通話帳戶"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"開放權限"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"設定權限"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"如要啟用快速撥號功能,\n請開放「通訊錄」權限。"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"如要查看通話記錄,\n請開放「手機」權限。"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"如要查看聯絡人,\n請開放「通訊錄」權限。"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"如要存取留言信箱,\n請開放「手機」權限。"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"如要啟用快速撥號功能,請開放「通訊錄」權限。"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"如要查看通話記錄,請開放「手機」權限。"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"如要查看聯絡人,請開放「通訊錄」權限。"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"如要存取留言信箱,請開放「手機」權限。"</string>
<string name="permission_no_search" msgid="84152933267902056">"如要搜尋聯絡人,請開啟「通訊錄」權限。"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"如要撥號,\n請開放「手機」權限。"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"如要撥打電話,請開放「手機」權限。"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"手機應用程式沒有系統設定的寫入權限。"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"已封鎖"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g>正在進行通話"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 77eb80d58..641ed5b55 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"電話"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"電話"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"電話撥號鍵盤"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"電話"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"通話紀錄"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"撥電話給<xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"回報號碼錯誤"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"撥打電話前編輯號碼"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"新增至聯絡人"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"從通話紀錄中刪除"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"清除通話紀錄"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"刪除語音留言"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"分享語音信箱"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"無通話紀錄"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"撥打電話"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"通話紀錄"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"回報號碼錯誤"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"複製號碼"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"複製留言轉錄內容"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"封鎖號碼"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"已封鎖 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"解除封鎖號碼"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"已解除封鎖 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"復原"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"刪除"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"撥打前編輯號碼"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"清除通話紀錄"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"刪除語音留言"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"封存語音留言"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"分享語音留言"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"已刪除語音留言"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"已封存語音留言"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"復原"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"前往封存檔案"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"清除通話紀錄?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"這項操作會將所有通話從您的紀錄中刪除"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"正在清除通話紀錄…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"撥打電話"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"未接來電"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"未接公司來電"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"未接來電"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> 通未接來電"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"回撥"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"傳送簡訊"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> 則語音留言</item>
<item quantity="one">語音留言</item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>、<xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"最新語音留言者:<xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"無法播放語音留言"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"緩衝處理中…"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"正在載入語音留言…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"正在封存語音留言…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"無法載入語音留言"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"僅顯示語音信箱留言"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"僅顯示來電"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"通話紀錄"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"更多選項"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"撥號鍵盤"</string>
- <string name="menu_copy" msgid="6108677035381940698">"複製"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"僅顯示撥出電話"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"僅顯示來電"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"僅顯示未接來電"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"撥出的視訊通話"</string>
<string name="type_missed_video" msgid="954396897034220545">"未接視訊通話來電"</string>
<string name="type_voicemail" msgid="5153139450668549908">"語音信箱"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"拒接的來電"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"封鎖的來電"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"來電"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"播放語音留言"</string>
<string name="description_view_contact" msgid="5205669345700598415">"查看聯絡人<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"撥電話給<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"「<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>」的聯絡詳細資料"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"新的語音留言。"</string>
<string name="description_num_calls" msgid="1601505153694540074">"通話 <xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> 次。"</string>
<string name="description_video_call" msgid="2933838090743214204">"視訊通話。"</string>
<string name="description_send_text_message" msgid="3118485319691414221">"傳送簡訊給<xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"公用電話"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> 分 <xliff:g id="SECONDS">%s</xliff:g> 秒"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g><xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"無法撥打這個號碼"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"如要設定語音信箱,請前往 [選單] &gt; [設定]。"</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"如要聽語音留言,請先關閉飛行模式。"</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"無法使用語音搜尋"</string>
<string name="call_not_available" msgid="8941576511946492225">"「電話」應用程式已遭停用,因此無法撥打電話。"</string>
<string name="activity_not_available" msgid="2287665636817987623">"這個裝置未安裝可執行該操作的應用程式"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"輸入姓名或電話號碼"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"您沒有任何未接來電。"</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"您沒有任何語音留言。"</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"搜尋聯絡人"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"新增號碼或搜尋聯絡人"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"沒有任何通話紀錄"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"撥打電話"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"您沒有任何未接來電。"</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"您沒有任何語音留言。"</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"您尚未封存任何語音留言。"</string>
<string name="show_favorites_only" msgid="5520072531022614595">"只顯示我的收藏"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"通話紀錄"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"通話紀錄"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"語音留言封存檔案"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"全部"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"未接來電"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"語音留言"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"全新、簡易的封鎖功能"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"「電話」應用程式需要變更封鎖功能的運作方式,以進一步保護您的安全。現在開始,系統會拒絕已封鎖號碼的來電和簡訊,還會將這些號碼提供給其他應用程式。"</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"允許"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"要封鎖 <xliff:g id="NUMBER">%1$s</xliff:g> 嗎?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"系統會封鎖這組號碼的來電,並自動刪除對方的語音留言。"</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"系統會封鎖這組號碼的來電,但對方仍可錄製語音留言給您。"</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"您不會再收到這組號碼的來電或簡訊。"</string>
+ <string name="block_number_ok" msgid="770551992296781873">"封鎖"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"要解除封鎖 <xliff:g id="NUMBER">%1$s</xliff:g> 嗎?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"解除封鎖"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"快速撥號"</string>
- <string name="tab_recents" msgid="929949073851377206">"近期通話"</string>
+ <string name="tab_history" msgid="2563144697322434940">"通話紀錄"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"聯絡人"</string>
<string name="tab_voicemail" msgid="155024725947496746">"語音信箱"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"已從常用聯絡人移除"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"新增至聯絡人"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"傳送簡訊"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"進行視訊通話"</string>
- <string name="show_call_history" msgid="1141502332266697170">"查看完整通話紀錄"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"封鎖號碼"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> 通新的未接來電"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"您的快速撥號功能尚未設定任何聯絡人"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"新增常用聯絡人"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"輕觸圖片即可查看所有號碼,輕觸並按住則可重新排序"</string>
<string name="remove_contact" msgid="1080555335283662961">"移除"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"視訊通話"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"傳送訊息"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"傳送簡訊"</string>
<string name="call_log_action_details" msgid="701345508704970622">"通話詳細資料"</string>
<string name="call_log_action_call" msgid="463690849042459842">"撥號給「<xliff:g id="NAMEORNUMBER">^1</xliff:g>」"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"未接來電:<xliff:g id="NAMEORNUMBER">^1</xliff:g>/<xliff:g id="TYPEORLOCATION">^2</xliff:g>/<xliff:g id="TIMEOFCALL">^3</xliff:g>/<xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"已接來電:<xliff:g id="NAMEORNUMBER">^1</xliff:g>/<xliff:g id="TYPEORLOCATION">^2</xliff:g>/<xliff:g id="TIMEOFCALL">^3</xliff:g>/<xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"您有一則未讀語音留言,來電者:<xliff:g id="NAMEORNUMBER">^1</xliff:g>,<xliff:g id="TYPEORLOCATION">^2</xliff:g>,<xliff:g id="TIMEOFCALL">^3</xliff:g>,<xliff:g id="PHONEACCOUNT">^4</xliff:g>。"</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"您有一則語音留言,來電者:<xliff:g id="NAMEORNUMBER">^1</xliff:g>,<xliff:g id="TYPEORLOCATION">^2</xliff:g>,<xliff:g id="TIMEOFCALL">^3</xliff:g>,<xliff:g id="PHONEACCOUNT">^4</xliff:g>。"</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"撥出通話:<xliff:g id="NAMEORNUMBER">^1</xliff:g>/<xliff:g id="TYPEORLOCATION">^2</xliff:g>/<xliff:g id="TIMEOFCALL">^3</xliff:g>/<xliff:g id="PHONEACCOUNT">^4</xliff:g>"</string>
<string name="description_phone_account" msgid="1767072759541443861">"透過 <xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"透過 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"透過 <xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>,透過 <xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> (透過 <xliff:g id="NUMBER">%2$s</xliff:g>)"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"撥號"</string>
<string name="description_call_action" msgid="4000549004089776147">"撥號給「<xliff:g id="NAMEORNUMBER">^1</xliff:g>」"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"與「<xliff:g id="NAMEORNUMBER">^1</xliff:g>」視訊通話。"</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"快速回應"</string>
<string name="call_settings_label" msgid="313434211353070209">"通話"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"來電封鎖"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"來電封鎖功能已暫時關閉"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"由於您曾在過去 48 小時內使用這支手機撥打緊急服務電話,因此來電封鎖功能已停用。此功能停用達 48 小時後,將由系統自動重新啟用。"</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"匯入電話號碼"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"您之前曾將某些來電者標示為自動透過其他應用程式轉到語音信箱。"</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"查看號碼"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"匯入"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"匯入失敗"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"無法封存語音留言。"</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"解除封鎖號碼"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"新增號碼"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"系統會封鎖這些號碼的來電,並自動刪除對方的語音留言。"</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"系統會封鎖這些號碼的來電,但對方仍可錄製語音留言給您。"</string>
+ <string name="block_list" msgid="7760188925338078011">"已封鎖的號碼"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> 無效。"</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> 已在封鎖清單中。"</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"來電封鎖功能會停用 48 小時"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"由於您曾撥打緊急電話,因此本功能已停用。"</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"通話帳戶"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"開啟"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"設定權限"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"如要啟用快速撥號,\n請開啟「聯絡人」存取權限。"</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"如要查看您的通話紀錄,\n請開啟「電話」存取權限。"</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"如要查看您的聯絡人,\n請開啟「聯絡人」存取權限。"</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"如要存取語音信箱,\n請開啟「電話」存取權限。"</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"如要啟用快速撥號,請開啟「聯絡人」存取權限。"</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"如要查看您的通話紀錄,請開啟「電話」存取權限。"</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"如要查看您的聯絡人,請開啟「聯絡人」存取權限。"</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"如要存取您的語音信箱,請開啟「電話」存取權限。"</string>
<string name="permission_no_search" msgid="84152933267902056">"如要搜尋您的聯絡人,請開啟「聯絡人」存取權限。"</string>
- <string name="permission_place_call" msgid="7588803619716288478">"如要撥打電話,\n請開啟「電話」存取權限。"</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"如要撥打電話,請開啟「電話」存取權限。"</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"電話應用程式的權限不足,無法寫入系統設定。"</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"已封鎖"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"目前顯示的聯絡人:<xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 9433a92c3..7f0fb0ea4 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -19,21 +19,37 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="applicationLabel" msgid="7762561155467201526">"Ifoni"</string>
<string name="launcherActivityLabel" msgid="1129729740601172692">"Ifoni"</string>
+ <string name="launcherDialpadActivityLabel" msgid="3959809805046059167">"Iphedi yokudayela yefoni"</string>
<string name="dialerIconLabel" msgid="6500826552823403796">"Ifoni"</string>
- <string name="recentCallsIconLabel" msgid="2639489159797075507">"Umlando wekholi"</string>
- <string name="recentCalls_callNumber" msgid="1756372533999226126">"Shayela <xliff:g id="NAME">%s</xliff:g>"</string>
- <string name="call_detail_menu_report" msgid="587960283417977382">"Bika inombolo engalungile"</string>
- <string name="recentCalls_editNumberBeforeCall" msgid="7756171675833267857">"Hlela inombolo ngaphambi kokushaya ucingo"</string>
- <string name="recentCalls_addToContact" msgid="4570467333422734645">"Engeza koxhumana naye"</string>
- <string name="recentCalls_removeFromRecentList" msgid="5551148439199439404">"Susa kusukela kumlando wekholi"</string>
- <string name="recentCalls_deleteAll" msgid="5157887960461979812">"Sula umlando wekholi"</string>
- <string name="recentCalls_trashVoicemail" msgid="7604696960787435655">"Susa imeyili yezwi"</string>
- <string name="recentCalls_shareVoicemail" msgid="1416112847592942840">"Abelana nemeyili yezwi"</string>
- <string name="recentCalls_empty" msgid="5934808652605981210">"Ilogi yakho yekholi ayinalutho"</string>
- <string name="recentCalls_empty_action" msgid="6033275870727664335">"Yenza ikholi"</string>
+ <string name="callHistoryIconLabel" msgid="3734413397291301223">"Umlando wekholi"</string>
+ <string name="action_report_number" msgid="4635403959812186162">"Bika inombolo engalungile"</string>
+ <string name="action_copy_number_text" msgid="588249522108594155">"Kopisha inombolo"</string>
+ <string name="copy_transcript_text" msgid="5652787482893879382">"Kopisha ukukhiphela"</string>
+ <string name="action_block_number" msgid="1482657602262262134">"Vimba inombolo"</string>
+ <string name="snackbar_number_blocked" msgid="939830142765936021">"<xliff:g id="NUMBER">%1$s</xliff:g> ivinjiwe"</string>
+ <string name="action_unblock_number" msgid="3043777622269776127">"Vulela inombolo"</string>
+ <string name="snackbar_number_unblocked" msgid="4854738171099045912">"<xliff:g id="NUMBER">%1$s</xliff:g> vulela"</string>
+ <string name="block_number_undo" msgid="591338370336724156">"HLEHLISA"</string>
+ <string name="call_details_delete" msgid="1833359621896346955">"Susa"</string>
+ <string name="action_edit_number_before_call" msgid="3100221149873436485">"Hlela inombolo ngaphambi kwekholi"</string>
+ <string name="call_log_delete_all" msgid="4677609108288680411">"Sula umlando wekholi"</string>
+ <string name="call_log_trash_voicemail" msgid="1283948488625129019">"Susa ivoyisimeyili"</string>
+ <string name="call_log_archive_voicemail" msgid="9072936797223284265">"Faka kungobo yomlando ivoyisimeyili"</string>
+ <string name="call_log_share_voicemail" msgid="7272635349055945546">"Abelana ngevoyisimeyili"</string>
+ <string name="snackbar_voicemail_deleted" msgid="5098542835986188582">"Ivoyisimeyili isusiwe"</string>
+ <string name="snackbar_voicemail_archived" msgid="7442340403660554373">"Ivoyisimeyili ifakwe kungobo yomlando"</string>
+ <string name="snackbar_voicemail_deleted_undo" msgid="3741811385891289167">"HLEHLISA"</string>
+ <string name="snackbar_voicemail_archived_goto" msgid="9186182602955185448">"IYA KUNGOBO YOMLANDO"</string>
<string name="clearCallLogConfirmation_title" msgid="801753155679372984">"Sula umlando wekholi?"</string>
<string name="clearCallLogConfirmation" msgid="7899552396101432827">"Lokhu kuzosusa wonke amakholi kusukela kumlando wakho"</string>
<string name="clearCallLogProgress_title" msgid="3372471156216306132">"Isula umlando wekholi…"</string>
+ <string name="userCallActivityLabel" product="default" msgid="6652512551977445095">"Ifoni"</string>
+ <string name="notification_missedCallTitle" msgid="2078223183024451723">"Ikholi ephuthelwe"</string>
+ <string name="notification_missedWorkCallTitle" msgid="8418335304394771688">"Ugeje ikholi yomsebenzi"</string>
+ <string name="notification_missedCallsTitle" msgid="4948840634672742797">"Amakholi akuphuthele"</string>
+ <string name="notification_missedCallsMsg" msgid="158790423221579961">"<xliff:g id="NUM_MISSED_CALLS">%s</xliff:g> amakholi akulahlekele"</string>
+ <string name="notification_missedCall_call_back" msgid="1991552423738343203">"Phinda ushayele"</string>
+ <string name="notification_missedCall_message" msgid="3042123733754151052">"Umlayezo"</string>
<plurals name="notification_voicemail_title" formatted="false" msgid="9088953961148324851">
<item quantity="one"> <xliff:g id="COUNT">%1$d</xliff:g> Amavoyisimeyili </item>
<item quantity="other"> <xliff:g id="COUNT">%1$d</xliff:g> Amavoyisimeyili </item>
@@ -42,8 +58,8 @@
<string name="notification_voicemail_callers_list" msgid="1153954809339404149">"<xliff:g id="NEWER_CALLERS">%1$s</xliff:g>, <xliff:g id="OLDER_CALLER">%2$s</xliff:g>"</string>
<string name="notification_new_voicemail_ticker" msgid="895342132049452081">"I-imeyli entsha esuka ku <xliff:g id="CALLER">%1$s</xliff:g>"</string>
<string name="voicemail_playback_error" msgid="3356071912353297599">"Ayikwazanga ukudlala ivoyisimeyili"</string>
- <string name="voicemail_buffering" msgid="738287747618697097">"Ukugcina kumthamo"</string>
<string name="voicemail_fetching_content" msgid="1287895365599580842">"Ilayisha ivoyisimeyili…"</string>
+ <string name="voicemail_archiving_content" msgid="722322091690281157">"Ifaka kungobo yomlando yevoyisimeyili…"</string>
<string name="voicemail_fetching_timout" msgid="3959428065511972176">"Ayikwazi ukulayisha ivoyisimeyili"</string>
<string name="call_log_voicemail_header" msgid="3945407886667089173">"Amakholi anevoyisimeyili kuphela"</string>
<string name="call_log_incoming_header" msgid="2787722299753674684">"Amakholi angenayo kuphela"</string>
@@ -73,7 +89,6 @@
<string name="action_menu_call_history_description" msgid="9018442816219748968">"Umlando wekholi"</string>
<string name="action_menu_overflow_description" msgid="2303272250613084574">"Izinketho eziningi"</string>
<string name="action_menu_dialpad_button" msgid="1425910318049008136">"okokudayila"</string>
- <string name="menu_copy" msgid="6108677035381940698">"Kopisha"</string>
<string name="menu_show_outgoing_only" msgid="1965570298133301970">"Bonisa eziphumayo kuphela"</string>
<string name="menu_show_incoming_only" msgid="7534206815238877417">"Bonisa okungenayo kuphela"</string>
<string name="menu_show_missed_only" msgid="154473166059743996">"Bonisa okugejiwe kuphela"</string>
@@ -96,12 +111,13 @@
<string name="type_outgoing_video" msgid="2858140021680755266">"Ikholi yevidiyo ephumayo"</string>
<string name="type_missed_video" msgid="954396897034220545">"Ikholi yevidiyo ephuthelwe"</string>
<string name="type_voicemail" msgid="5153139450668549908">"Ivoyisimeyili"</string>
+ <string name="type_rejected" msgid="7783201828312472691">"Ikholi enqatshelwe"</string>
+ <string name="type_blocked" msgid="3521686227115330015">"Ikholi evinjiwe"</string>
<string name="actionIncomingCall" msgid="6028930669817038600">"Amakholi angenayo"</string>
<string name="description_call_log_play_button" msgid="651182125650429846">"Dlala i-imeyli yezwi"</string>
<string name="description_view_contact" msgid="5205669345700598415">"Bheka oxhumana naye <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_call" msgid="3443678121983852666">"Fonela <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="description_contact_details" msgid="51229793651342809">"Imininingwane yokuxhumana ka-<xliff:g id="NAMEORNUMBER">%1$s</xliff:g>"</string>
- <string name="description_new_voicemail" msgid="2133792360865517746">"Ivoyisimeyili entsha."</string>
<string name="description_num_calls" msgid="1601505153694540074">"<xliff:g id="NUMBEROFCALLS">%1$s</xliff:g> amakholi."</string>
<string name="description_video_call" msgid="2933838090743214204">"Ikholi yevidiyo."</string>
<string name="description_send_text_message" msgid="3118485319691414221">"Thumela i-SMS ku-<xliff:g id="NAME">%1$s</xliff:g>"</string>
@@ -114,6 +130,11 @@
<string name="payphone" msgid="7726415831153618726">"Ucingo olufakwa imali"</string>
<string name="callDetailsShortDurationFormat" msgid="3988146235579303592">"<xliff:g id="SECONDS">%s</xliff:g> isekhondi"</string>
<string name="callDetailsDurationFormat" msgid="6061406028764382234">"<xliff:g id="MINUTES">%s</xliff:g> amaminithi <xliff:g id="SECONDS">%s</xliff:g> amasekhondi"</string>
+ <!-- no translation found for voicemailCallLogToday (682363079840402849) -->
+ <skip />
+ <string name="voicemailCallLogDateTimeFormat" msgid="4388070029056487713">"<xliff:g id="DATE">%1$s</xliff:g> ngo-<xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="voicemailDurationFormat" msgid="228211252076289564">"<xliff:g id="MINUTES">%1$02d</xliff:g>:<xliff:g id="SECONDS">%2$02d</xliff:g>"</string>
+ <string name="voicemailCallLogDateTimeFormatWithDuration" msgid="5118563814451588397">"<xliff:g id="DATEANDTIME">%1$s</xliff:g> • <xliff:g id="DURATION">%2$s</xliff:g>"</string>
<string name="dialog_phone_call_prohibited_message" msgid="5730565540182492608">"Ayikwazi ukushayela le nombolo"</string>
<string name="dialog_voicemail_not_ready_message" msgid="4384716252789515378">"Ukuya emyalezweni wephimbo, yana ezisethweni &gt; zemenyu."</string>
<string name="dialog_voicemail_airplane_mode_message" msgid="530922773669546093">"Ukushayela i-voicemail, vala kuqala imodi Yendiza."</string>
@@ -126,16 +147,31 @@
<string name="voice_search_not_available" msgid="2977719040254285301">"Usesho lwezwi alutholakali"</string>
<string name="call_not_available" msgid="8941576511946492225">"Ayikwazi ukwenza ikholi yefoni ngoba uhlelo lokusebenza lwefoni likhutshaziwe."</string>
<string name="activity_not_available" msgid="2287665636817987623">"Alukho uhlelo lokusebenza lalokho kule divayisi"</string>
- <string name="dialer_hint_find_contact" msgid="1012544667033887519">"Faka igama noma inombolo yefoni"</string>
- <string name="recentMissed_empty" msgid="6213733029875741604">"Awunawo amakholi aphuthelwe."</string>
- <string name="recentVoicemails_empty" msgid="7345542764648856330">"Ibhokisi lokungenayo kwakho levoyisimeyili alinalutho."</string>
+ <string name="dialer_hint_find_contact" msgid="3574350254520035364">"Sesha oxhumana nabo"</string>
+ <string name="block_number_search_hint" msgid="5409571607043872758">"Engeza inombolo noma useshe oxhumana nabo"</string>
+ <string name="call_log_all_empty" msgid="8357417710416340920">"Umlando wakho wekholi awunalutho"</string>
+ <string name="call_log_all_empty_action" msgid="9093210119068366147">"Yenza ikholi"</string>
+ <string name="call_log_missed_empty" msgid="3927274175205520135">"Awunawo amakholi aphuthelwe."</string>
+ <string name="call_log_voicemail_empty" msgid="8383585074222277550">"Ibhokisi lokungenayo kwakho levoyisimeyili alinalutho."</string>
+ <string name="voicemail_archive_empty" msgid="1087408796679056787">"Ingobo yomlando yevoyisimeyili yakho ayinalutho."</string>
<string name="show_favorites_only" msgid="5520072531022614595">"Bonisa izintandokazi kuphela"</string>
- <string name="call_log_activity_title" msgid="4612824396355272023">"Umlando"</string>
+ <string name="call_log_activity_title" msgid="7949633151371183580">"Umlando wekholi"</string>
+ <string name="voicemail_archive_activity_title" msgid="2638669189424535229">"Ukufaka kungobo yomlando iyoyisimeyili"</string>
<string name="call_log_all_title" msgid="3566738938889333307">"Konke"</string>
<string name="call_log_missed_title" msgid="4541142293870638971">"Phuthelwe"</string>
<string name="call_log_voicemail_title" msgid="940422274047025948">"Ivoyisimeyili"</string>
+ <string name="migrate_blocked_numbers_dialog_title" msgid="2039363199438872626">"Ukuvimbela okusha, okwenziwe lula"</string>
+ <string name="migrate_blocked_numbers_dialog_message" msgid="5598530398682662860">"Ukuze uvikeleke kangcono, ifoni kumele sishintshe indlela okusebenza ngayo ukuvimbela. Izinombolo zakho ezivinjelwe manje zizomisa kokubili amakholi nemibhalo futhi zingabiwa nezinye izinhlelo zokusebenza."</string>
+ <string name="migrate_blocked_numbers_dialog_allow_button" msgid="3116140286537760629">"Vumela"</string>
+ <string name="block_number_confirmation_title" msgid="6862219558186931304">"Vimba <xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="block_number_confirmation_message_vvm" msgid="5655646611437082611">"Amakholi wangakusasa kusuka kule nombolo azovinyelwa futhi amavoyisimeyili azosuswa ngokuzenzakalela."</string>
+ <string name="block_number_confirmation_message_no_vvm" msgid="4511900601491718173">"Amakholi kusuka kule nombolo azovinjwa, kodwa inkampani yenenethiwekhi ingakwazi ukukushiyela amavoyisimeyili."</string>
+ <string name="block_number_confirmation_message_new_filtering" msgid="4524854769790960179">"Ngeke usathola amakholi noma imibhalo kusukela kule nombolo."</string>
+ <string name="block_number_ok" msgid="770551992296781873">"VIMBA"</string>
+ <string name="unblock_number_confirmation_title" msgid="252824779504084354">"Vulela i-<xliff:g id="NUMBER">%1$s</xliff:g>?"</string>
+ <string name="unblock_number_ok" msgid="6449899182699684786">"VULELA"</string>
<string name="tab_speed_dial" msgid="7552166276545648893">"Ukudayela okusheshayo"</string>
- <string name="tab_recents" msgid="929949073851377206">"Okwakamuva"</string>
+ <string name="tab_history" msgid="2563144697322434940">"Umlando wekholi"</string>
<string name="tab_all_contacts" msgid="1410922767166533690">"Oxhumana nabo"</string>
<string name="tab_voicemail" msgid="155024725947496746">"Ivoyisimeyili"</string>
<string name="favorite_hidden" msgid="5011234945140912047">"Kukhishiwe kusuka kuzintandokazi"</string>
@@ -145,7 +181,7 @@
<string name="search_shortcut_add_to_contact" msgid="4327842393369915751">"Engeza koxhumana naye"</string>
<string name="search_shortcut_send_sms_message" msgid="2569304043345025525">"Thumela i-SMS"</string>
<string name="search_shortcut_make_video_call" msgid="1265971685034465166">"Yenza ikholi yevidiyo"</string>
- <string name="show_call_history" msgid="1141502332266697170">"Buka wonke umlando wekholi"</string>
+ <string name="search_shortcut_block_number" msgid="4787156645163436072">"Vimba inombolo"</string>
<string name="num_missed_calls" msgid="8081736535604293886">"<xliff:g id="NUMBER">%s</xliff:g> amakholi amasha owaphuthelwe"</string>
<string name="speed_dial_empty" msgid="8838921693673366129">"Akekho umuntu osekudayeleni kwakho okusheshayo okwamanje"</string>
<string name="speed_dial_empty_add_favorite_action" msgid="7944893641496695770">"Engeza intandokazi"</string>
@@ -154,13 +190,19 @@
<string name="contact_tooltip" msgid="2019777545923635266">"Thinta isithombe ukuze ubone zonke izinombolo noma uthinte uphinde ubambe ukuze uhlele kabusha"</string>
<string name="remove_contact" msgid="1080555335283662961">"Susa"</string>
<string name="call_log_action_video_call" msgid="7724301709041128296">"Ikholi yevidiyo"</string>
- <string name="call_log_action_send_message" msgid="2826466379787846163">"Thumela umlayezo"</string>
+ <string name="call_log_action_send_message" msgid="5679719296905285131">"Thumela umlayezo"</string>
<string name="call_log_action_details" msgid="701345508704970622">"Imininingwane yekholi"</string>
<string name="call_log_action_call" msgid="463690849042459842">"Shayela ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_incoming_missed_call" msgid="2381085098795943627">"Ikholi egejiwe kusuka ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_incoming_answered_call" msgid="7117665748428816544">"Phendula ikholi kusuka ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_unread_voicemail" msgid="5826351827625665597">"Ivoyisimeyili engafundiwe kusukela ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
+ <string name="description_read_voicemail" msgid="133974208364152610">"Ivoyisimeyili esuka ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_outgoing_call" msgid="6386364390619734734">"Ikholi eya ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>, <xliff:g id="TYPEORLOCATION">^2</xliff:g>, <xliff:g id="TIMEOFCALL">^3</xliff:g>, <xliff:g id="PHONEACCOUNT">^4</xliff:g>."</string>
<string name="description_phone_account" msgid="1767072759541443861">"ku-<xliff:g id="PHONEACCOUNT">^1</xliff:g>"</string>
+ <string name="description_via_number" msgid="3503311803959108316">"nge-<xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="call_log_via_number" msgid="8373282986443543296">"nge-<xliff:g id="NUMBER">%1$s</xliff:g>"</string>
+ <string name="description_via_number_phone_account" msgid="5426866894799626474">"ku-<xliff:g id="PHONEACCOUNT">%1$s</xliff:g>, nge-<xliff:g id="NUMBER">%2$s</xliff:g>"</string>
+ <string name="call_log_via_number_phone_account" msgid="4394943791173578941">"<xliff:g id="PHONEACCOUNT">%1$s</xliff:g> nge-<xliff:g id="NUMBER">%2$s</xliff:g>"</string>
<string name="description_call_log_call_action" msgid="3682561657090693134">"Shaya"</string>
<string name="description_call_action" msgid="4000549004089776147">"Shayela ku-<xliff:g id="NAMEORNUMBER">^1</xliff:g>"</string>
<string name="description_video_call_action" msgid="7386922428155062213">"Ikholi yevidiyo ka-<xliff:g id="NAMEORNUMBER">^1</xliff:g>."</string>
@@ -199,14 +241,34 @@
</string-array>
<string name="respond_via_sms_setting_title" msgid="1318281521087951580">"Izimpendulo ezisheshayo"</string>
<string name="call_settings_label" msgid="313434211353070209">"Amakholi"</string>
+ <string name="manage_blocked_numbers_label" msgid="5959801428936629196">"Ukuvimbela ikholi"</string>
+ <string name="blocked_numbers_disabled_emergency_header_label" msgid="7870947220238070418">"Ukuvimbela ikholi kuvalwe isikhashana"</string>
+ <string name="blocked_numbers_disabled_emergency_desc" msgid="7755803249073401381">"Ukuvimbela ikholi kukhutshaziwe ngoba uxhumane nabosizo oluphuthumayo kusukela kule foni phakathi kwamahora angu-48 wokugcina. Kuzophinda kunikwe amandla ngokuzenzakalela uma sokuphele isikhathi samahora angu-48."</string>
+ <string name="import_send_to_voicemail_numbers_label" msgid="1606601823746799926">"Ngenisa izinombolo"</string>
+ <string name="blocked_call_settings_import_description" msgid="8640906226815125906">"Ngaphambilini umake abanye abashayi ukuthi bathunyelwe ngokuzenzakalelayo kuvoyisimeyili ngezinhlelo zokusebenza."</string>
+ <string name="blocked_call_settings_view_numbers_button" msgid="6698986720875955935">"Buka izinombolo"</string>
+ <string name="blocked_call_settings_import_button" msgid="178821255125295473">"Ngenisa"</string>
+ <string name="send_to_voicemail_import_failed" msgid="5547202002133560069">"Ukulanda akuphumelelanga"</string>
+ <string name="voicemail_archive_failed" msgid="6263467962738772223">"Yehlulekile ukufaka kungobo yomlando ivoyisimeyili."</string>
+ <string name="description_blocked_number_list_delete" msgid="3240093199107796792">"Vulela inombolo"</string>
+ <string name="addBlockedNumber" msgid="6064812257482886526">"Engeza inombolo"</string>
+ <string name="block_number_footer_message_vvm" msgid="5387302253765439712">"Amakholi kusuka kulezi lzinombolo azovinjwa futhi amavoyisimeyili azosulwa ngokuzenzakalela."</string>
+ <string name="block_number_footer_message_no_vvm" msgid="223238617533822381">"Amakholi kusuka kulezi zinombolo azovinjwa, kodwa angakwazi ukushiya amavoyisimeyili."</string>
+ <string name="block_list" msgid="7760188925338078011">"Izinombolo ezivinjiwe"</string>
+ <string name="invalidNumber" msgid="619058581062192851">"<xliff:g id="NUMBER">%1$s</xliff:g> ayivumelekile."</string>
+ <string name="alreadyBlocked" msgid="282340105563646876">"<xliff:g id="NUMBER">%1$s</xliff:g> isivinjiwe kakade."</string>
+ <string name="call_blocking_disabled_notification_title" msgid="8185193413377920194">"Ukuvimbela ikholi kukhutshaziwe amahora angu-48"</string>
+ <string name="call_blocking_disabled_notification_text" msgid="5330772013626378526">"Kukhutshaziwe ngoba ikholi ephuthumayo yenziwe."</string>
<string name="phone_account_settings_label" msgid="5864322009841175294">"Ama-akhawunti wokushaya"</string>
<string name="permission_single_turn_on" msgid="1543391076065465464">"Vula"</string>
<string name="permission_multiple_turn_on" msgid="2426278457455950554">"Setha izimvume"</string>
- <string name="permission_no_speeddial" msgid="7449042208802130085">"Ukuze unike amandla ukudayela okusheshayo,\n vula imvume yoxhumana nabo."</string>
- <string name="permission_no_calllog" msgid="8969825954337678018">"Ukuze ubone ilogi yakho yefoni,\n vula imvume yefoni yakho."</string>
- <string name="permission_no_contacts" msgid="4427828429876890950">"Ukuze ubone oxhumana nabo,\n vula imvume yoxhumana nabo."</string>
- <string name="permission_no_voicemail" msgid="7785949850839671813">"Ukuze ufinyelele kuvoyisimeyili yakho,\n vula imvume yefoni."</string>
+ <string name="permission_no_speeddial" msgid="6882563445996184051">"Nika amandla ukudayela okusheshayo, vula imvume yoxhumana nabo."</string>
+ <string name="permission_no_calllog" msgid="555711464287041043">"Ukuze ubone irekhodi lakho lamakholi, vuma imvume yefoni."</string>
+ <string name="permission_no_contacts" msgid="6237980143178936279">"Ukuze ubone oxhumana nabo, vula imvume yoxhumana nabo."</string>
+ <string name="permission_no_voicemail" msgid="8306280257799917574">"Ukuze ufinyelele ivoyisimeyili, vula imvume yefoni."</string>
<string name="permission_no_search" msgid="84152933267902056">"Ukuze useshe oxhumana nabo, vula izimvume zoxhumana nabo."</string>
- <string name="permission_place_call" msgid="7588803619716288478">"Ukuze wenze ikholi,\n vula imvume yefoni."</string>
+ <string name="permission_place_call" msgid="2101287782615887547">"Ukuze ubeke ikholi, vula imvume yefoni."</string>
<string name="toast_cannot_write_system_settings" msgid="5614246168296606709">"Uhlelo lokusebenza lefoni alinayo imvume yokubhalela kuzilungiselelo zesistimu."</string>
+ <string name="blocked_number_call_log_label" msgid="8912042441473014712">"Kuvinjelwe"</string>
+ <string name="accessibility_call_is_active" msgid="2297282583928508760">"<xliff:g id="NAMEORNUMBER">^1</xliff:g> iyasebenza"</string>
</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 8ce3c17ba..38fd6b39a 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -22,6 +22,10 @@
<color name="dialer_red_highlight_color">#ff1744</color>
<color name="dialer_green_highlight_color">#00c853</color>
+ <color name="dialer_button_text_color">#fff</color>
+ <color name="dialer_flat_button_text_color">@color/dialer_theme_color</color>
+ <color name="dialer_snackbar_action_text_color">@color/dialer_theme_color</color>
+
<!-- Color for the setting text. -->
<color name="setting_primary_color">@color/dialtacts_primary_text_color</color>
<!-- Color for the setting description text. -->
@@ -30,8 +34,20 @@
<color name="setting_background_color">#ffffff</color>
<color name="setting_button_color">#eee</color>
+ <!-- 54% black -->
+ <color name="call_log_icon_tint">#8a000000</color>
+ <!-- 87% black -->
+ <color name="call_log_primary_color">#de000000</color>
+ <!-- 54% black -->
+ <color name="call_log_detail_color">#8a000000</color>
+ <!-- 87% black -->
+ <color name="call_log_voicemail_transcript_color">#de000000</color>
<!-- 70% black -->
- <color name="call_log_icon_tint">#b3000000</color>
+ <color name="call_log_action_color">#b3000000</color>
+ <!-- 54% black -->
+ <color name="call_log_day_group_heading_color">#8a000000</color>
+ <!-- 87% black-->
+ <color name="call_log_unread_text_color">#de000000</color>
<color name="call_log_list_item_primary_action_icon_tint">@color/call_log_icon_tint</color>
<!-- Color of the text describing an unconsumed missed call. -->
<color name="call_log_missed_call_highlight_color">@color/dialer_red_highlight_color</color>
@@ -92,9 +108,10 @@
<!-- Color for missed call icons. -->
<color name="missed_call">#ff2e58</color>
-
<!-- Color for answered or outgoing call icons. -->
<color name="answered_call">@color/dialer_green_highlight_color</color>
+ <!-- Color for blocked call icons. -->
+ <color name="blocked_call">@color/dialtacts_secondary_text_color</color>
<!-- Color for icons in the actionbar -->
<color name="actionbar_icon_color">#ffffff</color>
@@ -104,4 +121,22 @@
<color name="floating_action_button_touch_tint">#80ffffff</color>
<color name="call_log_action_divider">#eeeeee</color>
+ <color name="divider_line_color">#D8D8D8</color>
+
+ <!-- Colors for blocked numbers list -->
+ <color name="blocked_contact_background">@android:color/holo_red_dark</color>
+ <color name="blocked_number_primary_text_color">@color/dialtacts_primary_text_color</color>
+ <color name="blocked_number_secondary_text_color">@color/dialtacts_secondary_text_color</color>
+ <color name="blocked_number_icon_tint">#616161</color>
+ <color name="blocked_number_background">#FFFFFF</color>
+ <color name="blocked_number_accent_color">#42A5F5</color>
+ <color name="blocked_number_block_color">#F44336</color>
+ <color name="blocked_number_header_color">@color/dialer_theme_color</color>
+ <color name="blocked_number_disabled_emergency_header_color">#616161</color>
+ <color name="blocked_number_disabled_emergency_background_color">#E0E0E0</color>
+ <color name="add_blocked_number_icon_color">#bdbdbd</color>
+ <!-- Grey 700 -->
+ <color name="call_detail_footer_text_color">#616161</color>
+ <color name="call_detail_footer_icon_tint">@color/call_detail_footer_text_color</color>
+
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 776cd1150..371a1c6ab 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -15,6 +15,9 @@
~ limitations under the License
-->
<resources>
+ <dimen name="button_horizontal_padding">16dp</dimen>
+ <dimen name="divider_line_thickness">1dp</dimen>
+
<!--
Drag to remove view (in dp because it is used in conjunction with a statically
sized icon
@@ -31,6 +34,7 @@
<dimen name="call_log_start_margin">8dp</dimen>
<dimen name="call_log_indent_margin">24dp</dimen>
<dimen name="call_log_name_margin_bottom">2dp</dimen>
+ <dimen name="call_log_call_account_margin_bottom">2dp</dimen>
<dimen name="call_log_vertical_padding">12dp</dimen>
<dimen name="call_log_list_item_height">56dp</dimen>
<dimen name="call_log_list_item_info_margin_start">16dp</dimen>
@@ -39,12 +43,16 @@
<!-- Size of contact photos in the call log and call details. -->
<dimen name="contact_photo_size">40dp</dimen>
<dimen name="call_detail_button_spacing">2dip</dimen>
- <dimen name="call_detail_horizontal_margin">16dp</dimen>
- <dimen name="call_detail_top_margin">36dp</dimen>
- <dimen name="call_detail_bottom_margin">32dp</dimen>
+ <dimen name="call_detail_horizontal_margin">20dp</dimen>
+ <dimen name="call_detail_top_margin">16dp</dimen>
+ <dimen name="call_detail_bottom_margin">16dp</dimen>
<dimen name="call_detail_header_top_margin">20dp</dimen>
<dimen name="call_detail_header_bottom_margin">9dp</dimen>
- <dimen name="call_detail_translation_z">0.5dp</dimen>
+ <dimen name="call_detail_elevation">0.5dp</dimen>
+ <dimen name="call_detail_action_item_padding_horizontal">28dp</dimen>
+ <dimen name="call_detail_action_item_padding_vertical">16dp</dimen>
+ <dimen name="call_detail_action_item_drawable_padding">28dp</dimen>
+ <dimen name="call_detail_action_item_text_size">16sp</dimen>
<dimen name="transcription_top_margin">18dp</dimen>
<dimen name="transcription_bottom_margin">18dp</dimen>
@@ -79,7 +87,7 @@
room to the search box-->
<dimen name="action_bar_height">56dp</dimen>
<dimen name="action_bar_height_large">64dp</dimen>
- <dimen name="action_bar_elevation">2dp</dimen>
+ <dimen name="action_bar_elevation">3dp</dimen>
<dimen name="tab_height">43dp</dimen>
<!-- actionbar height + tab height -->
<dimen name="actionbar_and_tab_height">107dp</dimen>
@@ -96,24 +104,24 @@
<dimen name="search_box_left_padding">8dp</dimen>
<!-- Search box interior padding - right -->
<dimen name="search_box_right_padding">8dp</dimen>
- <!-- Padding around the icon in the search box. -->
- <dimen name="search_box_icon_margin">4dp</dimen>
<dimen name="search_box_search_icon_padding">2dp</dimen>
<dimen name="search_box_collapsed_text_margin_left">22dp</dimen>
<dimen name="search_list_padding_top">16dp</dimen>
<dimen name="search_box_elevation">3dp</dimen>
- <dimen name="call_log_action_height">48dp</dimen>
<dimen name="call_log_action_icon_margin_start">16dp</dimen>
<dimen name="call_log_action_icon_dimen">24dp</dimen>
<dimen name="call_log_action_horizontal_padding">24dp</dimen>
<dimen name="call_log_actions_left_padding">64dp</dimen>
- <dimen name="call_log_primary_text_size">14sp</dimen>
- <dimen name="call_log_secondary_text_size">14sp</dimen>
- <dimen name="call_log_list_item_actions_text_size">12sp</dimen>
+ <dimen name="call_log_actions_top_padding">8dp</dimen>
+ <dimen name="call_log_actions_bottom_padding">8dp</dimen>
+ <dimen name="call_log_primary_text_size">16sp</dimen>
+ <dimen name="call_log_detail_text_size">12sp</dimen>
+ <dimen name="call_log_day_group_heading_size">14sp</dimen>
+ <dimen name="call_log_voicemail_transcription_text_size">14sp</dimen>
<!-- Height of the call log actions section for each call log entry -->
- <dimen name="call_log_action_height">44dp</dimen>
+ <dimen name="call_log_action_height">48dp</dimen>
<dimen name="call_log_day_group_padding_top">15dp</dimen>
<dimen name="call_log_day_group_padding_bottom">9dp</dimen>
@@ -147,4 +155,22 @@
<dimen name="promo_card_line_spacing">4dp</dimen>
<dimen name="voicemail_playback_top_padding">12dp</dimen>
+
+ <!-- Size of entries in blocked numbers list -->
+ <dimen name="blocked_number_container_padding">16dp</dimen>
+ <dimen name="blocked_number_horizontal_margin">16dp</dimen>
+ <dimen name="blocked_number_top_margin">16dp</dimen>
+ <dimen name="blocked_number_bottom_margin">16dp</dimen>
+ <dimen name="blocked_number_add_top_margin">8dp</dimen>
+ <dimen name="blocked_number_add_bottom_margin">8dp</dimen>
+ <dimen name="blocked_number_primary_text_size">16sp</dimen>
+ <dimen name="blocked_number_secondary_text_size">12sp</dimen>
+ <dimen name="blocked_number_delete_icon_size">32dp</dimen>
+ <dimen name="blocked_number_search_text_size">14sp</dimen>
+ <dimen name="blocked_number_settings_description_text_size">14sp</dimen>
+ <dimen name="blocked_number_header_height">48dp</dimen>
+
+ <dimen name="call_type_icon_size">12dp</dimen>
+
+ <dimen name="tab_unread_count_margin_left">0dp</dimen>
</resources>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index 468e41586..4ed41d0d5 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -34,4 +34,6 @@
Ignored if empty. -->
<string name="config_prohibited_phone_number_regexp"></string>
+ <!-- File Authority for AOSP Dialer files -->
+ <string name="contacts_file_provider_authority">com.android.dialer.files</string>
</resources>
diff --git a/res/values/ids.xml b/res/values/ids.xml
index d8f4aa877..f850327ea 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -15,7 +15,11 @@
-->
<resources>
+ <item type="id" name="call_detail_delete_menu_item" />
<item type="id" name="context_menu_copy_to_clipboard" />
+ <item type="id" name="context_menu_copy_transcript_to_clipboard" />
<item type="id" name="context_menu_edit_before_call" />
+ <item type="id" name="context_menu_block_number" />
<item type="id" name="settings_header_sounds_and_vibration" />
+ <item type="id" name="block_id" />
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5e2476db0..cb8568411 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -26,6 +26,9 @@
used in the Launcher icon. -->
<string name="launcherActivityLabel">Phone</string>
+
+ <!-- Title for the activity that dials the phone, when launched directly into the dialpad -->
+ <string name="launcherDialpadActivityLabel">Phone Dialpad</string>
<!-- The description text for the dialer tab.
Note: AccessibilityServices use this attribute to announce what the view represents.
@@ -40,40 +43,64 @@
This is especially valuable for views without textual representation like ImageView.
[CHAR LIMIT=NONE] -->
- <string name="recentCallsIconLabel">Call history</string>
+ <string name="callHistoryIconLabel">Call history</string>
- <!-- Menu item used to call a contact from the call log -->
- <string name="recentCalls_callNumber">Call
- <xliff:g id="name">%s</xliff:g>
- </string>
+ <!-- Text for a menu item to report a call as having been incorrectly identified. [CHAR LIMIT=48] -->
+ <string name="action_report_number">Report inaccurate number</string>
- <!-- Text for a menu item to report a call as having been incorrectly identified.
- [CHAR LIMIT=30] -->
- <string name="call_detail_menu_report">Report inaccurate number</string>
+ <!-- Option displayed in context menu to copy long pressed phone number. [CHAR LIMIT=48] -->
+ <string name="action_copy_number_text">Copy number</string>
+
+ <!-- Option displayed in context menu to copy long pressed voicemail transcription. [CHAR LIMIT=48] -->
+ <string name="copy_transcript_text">Copy transcription</string>
+
+ <!-- Label for action to block a number. [CHAR LIMIT=48] -->
+ <string name="action_block_number">Block number</string>
+
+ <!-- Text for snackbar to undo blocking a number. [CHAR LIMIT=64] -->
+ <string name="snackbar_number_blocked">
+ <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g> blocked</string>
- <!-- Menu item used to copy a number from the call log to the dialer so it can be edited before calling it -->
- <string name="recentCalls_editNumberBeforeCall">Edit number before call</string>
+ <!-- Label for action to unblock a number [CHAR LIMIT=48]-->
+ <string name="action_unblock_number">Unblock number</string>
- <!-- Menu item used to add a number from the call log to contacts -->
- <string name="recentCalls_addToContact">Add to a contact</string>
+ <!-- Text for snackbar to undo unblocking a number. [CHAR LIMIT=64] -->
+ <string name="snackbar_number_unblocked">
+ <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
+ unblocked</string>
- <!-- Menu item used to remove a single call from the call log -->
- <string name="recentCalls_removeFromRecentList">Delete from call history</string>
+ <!-- Text for undo button in snackbar for blocking/unblocking number. [CHAR LIMIT=10] -->
+ <string name="block_number_undo">UNDO</string>
+
+ <!-- Menu item in call details used to remove a call or voicemail from the call log. -->
+ <string name="call_details_delete">Delete</string>
+
+ <!-- Label for action to edit a number before calling it. [CHAR LIMIT=48] -->
+ <string name="action_edit_number_before_call">Edit number before call</string>
<!-- Menu item used to remove all calls from the call log -->
- <string name="recentCalls_deleteAll">Clear call history</string>
+ <string name="call_log_delete_all">Clear call history</string>
<!-- Menu item used to delete a voicemail. [CHAR LIMIT=30] -->
- <string name="recentCalls_trashVoicemail">Delete voicemail</string>
+ <string name="call_log_trash_voicemail">Delete voicemail</string>
- <!-- Menu item used to share a voicemail. [CHAR LIMIT=30] -->
- <string name="recentCalls_shareVoicemail">Share voicemail</string>
+ <!-- Menu item used to archive a voicemail. [CHAR LIMIT=30] -->
+ <string name="call_log_archive_voicemail">Archive voicemail</string>
- <!-- Text displayed when the call log is empty. -->
- <string name="recentCalls_empty">Your call log is empty</string>
+ <!-- Menu item used to send a voicemail through other applications [CHAR LIMIT=30] -->
+ <string name="call_log_share_voicemail">Share voicemail</string>
+
+ <!-- Text for snackbar to undo a voicemail delete. [CHAR LIMIT=30] -->
+ <string name="snackbar_voicemail_deleted">Voicemail deleted</string>
+
+ <!-- Text for snackbar to undo a voicemail archive. [CHAR LIMIT=30] -->
+ <string name="snackbar_voicemail_archived">Voicemail archived</string>
- <!-- Label of the button displayed when the call log is empty. Allows the user to make a call. -->
- <string name="recentCalls_empty_action">Make a call</string>
+ <!-- Text for undo button in snackbar for voicemail deletion. [CHAR LIMIT=10] -->
+ <string name="snackbar_voicemail_deleted_undo">UNDO</string>
+
+ <!-- Text for going to archive button in snackbar for voicemail archive. [CHAR LIMIT=10] -->
+ <string name="snackbar_voicemail_archived_goto">GOTO ARCHIVE</string>
<!-- Title of the confirmation dialog for clearing the call log. [CHAR LIMIT=37] -->
<string name="clearCallLogConfirmation_title">Clear call history?</string>
@@ -84,6 +111,30 @@
<!-- Title of the "Clearing call log" progress-dialog [CHAR LIMIT=35] -->
<string name="clearCallLogProgress_title">Clearing call history\u2026</string>
+ <!-- Title used for the activity for placing a call. This name appears
+ in activity disambig dialogs -->
+ <string name="userCallActivityLabel" product="default">Phone</string>
+
+ <!-- Notification strings -->
+ <!-- Missed call notification label, used when there's exactly one missed call -->
+ <string name="notification_missedCallTitle">Missed call</string>
+ <!-- Missed call notification label, used when there's exactly one missed call from work contact -->
+ <string name="notification_missedWorkCallTitle">Missed work call</string>
+ <!-- Missed call notification label, used when there are two or more missed calls -->
+ <string name="notification_missedCallsTitle">Missed calls</string>
+ <!-- Missed call notification message used when there are multiple missed calls -->
+ <string name="notification_missedCallsMsg"><xliff:g id="num_missed_calls">%s</xliff:g> missed calls</string>
+ <!-- Message for "call back" Action, which is displayed in the missed call notificaiton.
+ The user will be able to call back to the person or the phone number.
+ [CHAR LIMIT=18] -->
+ <string name="notification_missedCall_call_back">Call back</string>
+ <!-- Message for "reply via sms" action, which is displayed in the missed call notification.
+ The user will be able to send text messages using the phone number.
+ [CHAR LIMIT=18] -->
+ <string name="notification_missedCall_message">Message</string>
+ <!-- DO NOT TRANSLATE. Hardcoded number used for restricted incoming phone numbers. -->
+ <string name="handle_restricted">RESTRICTED</string>
+
<!-- Title of the notification of new voicemails. [CHAR LIMIT=30] -->
<plurals name="notification_voicemail_title">
<item quantity="one">Voicemail</item>
@@ -116,12 +167,12 @@
<!-- Message to show when there is an error playing back the voicemail. [CHAR LIMIT=40] -->
<string name="voicemail_playback_error">Couldn\'t play voicemail</string>
- <!-- Message to display before we have prepared the media player, i.e. before we know duration. [CHAR LIMIT=40] -->
- <string name="voicemail_buffering">Buffering\u2026</string>
-
<!-- Message to display whilst we are waiting for the content to be fetched. [CHAR LIMIT=40] -->
<string name="voicemail_fetching_content">Loading voicemail\u2026</string>
+ <!-- Message to display whilst we are waiting for the content to be archived. [CHAR LIMIT=40] -->
+ <string name="voicemail_archiving_content">Archiving voicemail\u2026</string>
+
<!-- Message to display if we fail to get content within a suitable time period. [CHAR LIMIT=40] -->
<string name="voicemail_fetching_timout">Couldn\'t load voicemail</string>
@@ -247,9 +298,6 @@
[CHAR LIMIT=NONE] -->
<string name="action_menu_dialpad_button">dial pad</string>
- <!-- Menu item to copy something [CHAR_LIMIT=10] -->
- <string name="menu_copy">Copy</string>
-
<!-- Menu item used to show only outgoing in the call log. [CHAR LIMIT=30] -->
<string name="menu_show_outgoing_only">Show outgoing only</string>
@@ -299,13 +347,13 @@
is already in progress.) -->
<string name="dialer_addAnotherCall">Add call</string>
- <!-- Title for incoming call details screen -->
+ <!-- Title for incoming call type. [CHAR LIMIT=40] -->
<string name="type_incoming">Incoming call</string>
- <!-- Title for outgoing call details screen -->
+ <!-- Title for outgoing call type. [CHAR LIMIT=40] -->
<string name="type_outgoing">Outgoing call</string>
- <!-- Title for missed call details screen -->
+ <!-- Title for missed call type. [CHAR LIMIT=40] -->
<string name="type_missed">Missed call</string>
<!-- Title for incoming video call in call details screen [CHAR LIMIT=60] -->
@@ -320,6 +368,12 @@
<!-- Title for voicemail details screen -->
<string name="type_voicemail">Voicemail</string>
+ <!-- Title for rejected call type. [CHAR LIMIT=40] -->
+ <string name="type_rejected">Declined call</string>
+
+ <!-- Title for blocked call type. [CHAR LIMIT=40] -->
+ <string name="type_blocked">Blocked call</string>
+
<!-- Description for incoming calls going to voice mail vs. not -->
<string name="actionIncomingCall">Incoming calls</string>
@@ -351,13 +405,6 @@
-->
<string name="description_contact_details">Contact details for <xliff:g id="nameOrNumber">%1$s</xliff:g></string>
- <!-- String indicating a call log entry has an associated voicemail.
-
- Note: AccessibilityServices use this attribute to announce what the view represents.
- This is especially valuable for views without textual representation like ImageView.
- -->
- <string name="description_new_voicemail">New voicemail.</string>
-
<!-- String indicating the number of calls to/from a caller in the call log.
Note: AccessibilityServices use this attribute to announce what the view represents.
@@ -414,6 +461,21 @@
<!-- A nicely formatted call duration displayed when viewing call details. For example "42 min 28 sec" -->
<string name="callDetailsDurationFormat"><xliff:g id="minutes" example="42">%s</xliff:g> min <xliff:g id="seconds" example="28">%s</xliff:g> sec</string>
+ <!-- The string 'Today'. This value is used in the voicemailCallLogDateTimeFormat rather than an
+ explicit date string, e.g. Jul 25, 2014, in the event that a voicemail was created on the
+ current day -->
+ <string name="voicemailCallLogToday">@string/call_log_header_today</string>
+
+ <!-- A format string used for displaying the date and time for a voicemail call log. For example: Jul 25, 2014 at 2:49 PM
+ The date will be replaced by 'Today' for voicemails created on the current day. For example: Today at 2:49 PM -->
+ <string name="voicemailCallLogDateTimeFormat"><xliff:g id="date" example="Jul 25, 2014">%1$s</xliff:g> at <xliff:g id="time" example="2:49 PM">%2$s</xliff:g></string>
+
+ <!-- Format for duration of voicemails which are displayed when viewing voicemail logs. For example "01:22" -->
+ <string name="voicemailDurationFormat"><xliff:g id="minutes" example="10">%1$02d</xliff:g>:<xliff:g id="seconds" example="20">%2$02d</xliff:g></string>
+
+ <!-- A format string used for displaying the date, time and duration for a voicemail call log. For example: Jul 25, 2014 at 2:49 PM • 00:34 -->
+ <string name="voicemailCallLogDateTimeFormatWithDuration"><xliff:g id="dateAndTime" example="Jul 25, 2014 at 2:49PM">%1$s</xliff:g> \u2022 <xliff:g id="duration" example="01:22">%2$s</xliff:g></string>
+
<!-- Dialog message which is shown when the user tries to make a phone call
to prohibited phone numbers [CHAR LIMIT=NONE] -->
<string name="dialog_phone_call_prohibited_message" msgid="4313552620858880999">Can\'t call this number</string>
@@ -458,7 +520,11 @@
<!-- Hint displayed in dialer search box when there is no query that is currently typed.
[CHAR LIMIT=30] -->
- <string name="dialer_hint_find_contact">Enter a name or phone number</string>
+ <string name="dialer_hint_find_contact">Search contacts</string>
+
+ <!-- Hint displayed in add blocked number search box when there is no query typed.
+ [CHAR LIMIT=45] -->
+ <string name="block_number_search_hint">Add number or search contacts</string>
<!-- String resource for the font-family to use for the call log activity's title
Do not translate. -->
@@ -468,17 +534,29 @@
Do not translate. -->
<string name="view_full_call_history_font_family">sans-serif</string>
+ <!-- Text displayed when the call log is empty. -->
+ <string name="call_log_all_empty">Your call history is empty</string>
+
+ <!-- Label of the button displayed when the call history is empty. Allows the user to make a call. -->
+ <string name="call_log_all_empty_action">Make a call</string>
+
<!-- Text displayed when the list of missed calls is empty -->
- <string name="recentMissed_empty">You have no missed calls.</string>
+ <string name="call_log_missed_empty">You have no missed calls.</string>
<!-- Text displayed when the list of voicemails is empty -->
- <string name="recentVoicemails_empty">Your voicemail inbox is empty.</string>
+ <string name="call_log_voicemail_empty">Your voicemail inbox is empty.</string>
+
+ <!-- Text displayed when the list of voicemail archives is empty -->
+ <string name="voicemail_archive_empty">Your voicemail archive is empty.</string>
<!-- Menu option to show favorite contacts only -->
<string name="show_favorites_only">Show favorites only</string>
<!-- Title of activity that displays a list of all calls -->
- <string name="call_log_activity_title">History</string>
+ <string name="call_log_activity_title">Call History</string>
+
+ <!-- Title of activity that displays a list of all archived voicemails -->
+ <string name="voicemail_archive_activity_title">Voicemail Archive</string>
<!-- Title for the call log tab containing the list of all voicemails and calls
[CHAR LIMIT=30] -->
@@ -492,12 +570,56 @@
[CHAR LIMIT=30] -->
<string name="call_log_voicemail_title">Voicemail</string>
+ <!-- Title for dialog which opens when the user needs to migrate to the framework blocking implementation [CHAR LIMIT=30]-->
+ <string name="migrate_blocked_numbers_dialog_title">New, simplified blocking</string>
+
+ <!-- Body text for dialog which opens when the user needs to migrate to the framework blocking implementation [CHAR LIMIT=NONE]-->
+ <string name="migrate_blocked_numbers_dialog_message">To better protect you, Phone needs to change how blocking works. Your blocked numbers will now stop both calls and texts and may be shared with other apps.</string>
+
+ <!-- Positive confirmation button for the dialog which opens when the user needs to migrate to the framework blocking implementation [CHAR LIMIT=NONE]-->
+ <string name="migrate_blocked_numbers_dialog_allow_button">Allow</string>
+
+ <!-- Do not translate -->
+ <string name="migrate_blocked_numbers_dialog_cancel_button">@android:string/cancel</string>
+
+ <!-- Confirmation dialog title for blocking a number. [CHAR LIMIT=NONE] -->
+ <string name="block_number_confirmation_title">Block
+ <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>?</string>
+
+ <!-- Confirmation dialog message for blocking a number with visual voicemail active.
+ [CHAR LIMIT=NONE] -->
+ <string name="block_number_confirmation_message_vvm">
+ Calls from this number will be blocked and voicemails will be automatically deleted.
+ </string>
+
+ <!-- Confirmation dialog message for blocking a number with no visual voicemail.
+ [CHAR LIMIT=NONE] -->
+ <string name="block_number_confirmation_message_no_vvm">
+ Calls from this number will be blocked, but the caller may still be able to leave you voicemails.
+ </string>
+
+ <!-- Confirmation dialog message for blocking a number with new filtering enabled.
+ [CHAR LIMIT=NONE] -->
+ <string name="block_number_confirmation_message_new_filtering">
+ You will no longer receive calls or texts from this number.
+ </string>
+
+ <!-- Block number alert dialog button [CHAR LIMIT=32] -->
+ <string name="block_number_ok">BLOCK</string>
+
+ <!-- Confirmation dialog for unblocking a number. [CHAR LIMIT=NONE] -->
+ <string name="unblock_number_confirmation_title">Unblock
+ <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>?</string>
+
+ <!-- Unblock number alert dialog button [CHAR LIMIT=32] -->
+ <string name="unblock_number_ok">UNBLOCK</string>
+
<!-- Accessibility text for the tab showing recent and favorite contacts who can be called.
[CHAR LIMIT=40] -->
<string name="tab_speed_dial">Speed dial</string>
- <!-- Accessibility text for the tab showing the call log of recent calls. [CHAR LIMIT=40] -->
- <string name="tab_recents">Recents</string>
+ <!-- Accessibility text for the tab showing the call history. [CHAR LIMIT=40] -->
+ <string name="tab_history">Call History</string>
<!-- Accessibility text for the tab showing the user's contacts. [CHAR LIMIT=40] -->
<string name="tab_all_contacts">Contacts</string>
@@ -529,8 +651,8 @@
<!-- Shortcut item used to make a video call directly from search. [CHAR LIMIT=25] -->
<string name="search_shortcut_make_video_call">Make video call</string>
- <!-- Title for the call log list item that brings users to the full call history when clicked -->
- <string name="show_call_history">View full call history</string>
+ <!-- Shortcut item used to block a number directly from search. [CHAR LIMIT=25] -->
+ <string name="search_shortcut_block_number">Block number</string>
<!-- Number of missed calls shown on call card [CHAR LIMIT=40] -->
<string name="num_missed_calls"><xliff:g id="number">%s</xliff:g> new missed calls</string>
@@ -564,7 +686,7 @@
<!-- Button text for a button displayed underneath an entry in the call log, which opens up a
messaging app to send a SMS to the number represented by the call log entry.
[CHAR LIMIT=30] -->
- <string name="call_log_action_send_message">Send Message</string>
+ <string name="call_log_action_send_message">Send a message</string>
<!-- Button text for the button displayed underneath an entry in the call log.
Tapping navigates the user to the call details screen where the user can view details for
@@ -587,6 +709,16 @@
[CHAR LIMIT=NONE] -->
<string name="description_incoming_answered_call">Answered call from <xliff:g id="nameOrNumber" example="John Smith">^1</xliff:g>, <xliff:g id="typeOrLocation" example="Mobile">^2</xliff:g>, <xliff:g id="timeOfCall" example="2 min ago">^3</xliff:g>, <xliff:g id="phoneAccount" example="on SIM 1">^4</xliff:g>.</string>
+ <!-- String describing an "unread" voicemail entry in the voicemails tab.
+ Note: AccessibilityServices use this attribute to announce what the view represents.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_unread_voicemail">Unread voicemail from <xliff:g id="nameOrNumber" example="John Smith">^1</xliff:g>, <xliff:g id="typeOrLocation" example="Mobile">^2</xliff:g>, <xliff:g id="timeOfCall" example="2 min ago">^3</xliff:g>, <xliff:g id="phoneAccount" example="on SIM 1">^4</xliff:g>.</string>
+
+ <!-- String describing a "read" voicemail entry in the voicemails tab.
+ Note: AccessibilityServices use this attribute to announce what the view represents.
+ [CHAR LIMIT=NONE] -->
+ <string name="description_read_voicemail">Voicemail from <xliff:g id="nameOrNumber" example="John Smith">^1</xliff:g>, <xliff:g id="typeOrLocation" example="Mobile">^2</xliff:g>, <xliff:g id="timeOfCall" example="2 min ago">^3</xliff:g>, <xliff:g id="phoneAccount" example="on SIM 1">^4</xliff:g>.</string>
+
<!-- String describing an outgoing call entry in the call log.
Note: AccessibilityServices uses this attribute to announce what the view represents.
[CHAR LIMIT=NONE] -->
@@ -599,6 +731,26 @@
[CHAR LIMIT=NONE] -->
<string name="description_phone_account">on <xliff:g id="phoneAccount" example="SIM 1">^1</xliff:g></string>
+ <!-- String describing the secondary line number the call was received via.
+ Note: AccessibilityServices use this attribute to announce what the view represents.
+ [CHAR LIMIT=NONE]-->
+ <string name="description_via_number">via <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g></string>
+
+ <!-- TextView text item showing the secondary line number the call was received via.
+ [CHAR LIMIT=NONE]-->
+ <string name="call_log_via_number">via <xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g></string>
+
+ <!-- String describing the PhoneAccount and via number that a call was received on, if both are
+ visible.
+ Note: AccessibilityServices use this attribute to announce what the view represents.
+ [CHAR LIMIT=NONE]-->
+ <string name="description_via_number_phone_account">on <xliff:g id="phoneAccount" example="SIM 1">%1$s</xliff:g>, via <xliff:g id="number" example="(555) 555-5555">%2$s</xliff:g></string>
+
+ <!-- The order of the PhoneAccount and via number that a call was received on,
+ if both are visible.
+ [CHAR LIMIT=NONE]-->
+ <string name="call_log_via_number_phone_account"><xliff:g id="phoneAccount" example="SIM 1">%1$s</xliff:g> via <xliff:g id="number" example="(555) 555-5555">%2$s</xliff:g></string>
+
<!-- String describing the phone icon on a call log list item. When tapped, it will place a
call to the number represented by that call log entry. [CHAR LIMIT=NONE]-->
<string name="description_call_log_call_action">Call</string>
@@ -778,6 +930,95 @@
<!-- Label for the call settings section [CHAR LIMIT=30] -->
<string name="call_settings_label">Calls</string>
+ <!-- Label for the blocked numbers settings section [CHAR LIMIT=30] -->
+ <string name="manage_blocked_numbers_label">Call blocking</string>
+
+ <!-- Label for a section describing that call blocking is temporarily disabled because an
+ emergency call was made. [CHAR LIMIT=50] -->
+ <string name="blocked_numbers_disabled_emergency_header_label">
+ Call blocking temporarily off
+ </string>
+
+ <!-- Description that call blocking is temporarily disabled because the user called an
+ emergency number, and explains that call blocking will be re-enabled after a buffer
+ period has passed. [CHAR LIMIT=NONE] -->
+ <string name="blocked_numbers_disabled_emergency_desc">
+ Call blocking has been disabled because you contacted emergency services from this phone
+ within the last 48 hours. It will be automatically reenabled once the 48 hour period
+ expires.
+ </string>
+
+ <!-- Label for fragment to import numbers from contacts marked as send to voicemail.
+ [CHAR_LIMIT=30] -->
+ <string name="import_send_to_voicemail_numbers_label">Import numbers</string>
+
+ <!-- Text informing the user they have previously marked contacts to be sent to voicemail.
+ This will be followed by two buttons, 1) to view who is marked to be sent to voicemail
+ and 2) importing these settings to Dialer's block list. [CHAR LIMIT=NONE] -->
+ <string name="blocked_call_settings_import_description">
+ You previously marked some callers to be automatically sent to voicemail via other apps.
+ </string>
+
+ <!-- Label for button to view numbers of contacts previous marked to be sent to voicemail.
+ [CHAR_LIMIT=20] -->
+ <string name="blocked_call_settings_view_numbers_button">View Numbers</string>
+
+ <!-- Label for button to import settings for sending contacts to voicemail into Dialer's block
+ list. [CHAR_LIMIT=20] -->
+ <string name="blocked_call_settings_import_button">Import</string>
+
+ <!-- Error toast message for when send to voicemail import fails. [CHAR LIMIT=40] -->
+ <string name="send_to_voicemail_import_failed">Import failed</string>
+
+ <!-- Error toast message for when voicemail archive fails. [CHAR LIMIT=40] -->
+ <string name="voicemail_archive_failed">Failed to archive voicemail.</string>
+
+ <!-- String describing the delete icon on a blocked number list item.
+ When tapped, it will show a dialog confirming the unblocking of the number.
+ [CHAR LIMIT=NONE]-->
+ <string name="description_blocked_number_list_delete">Unblock number</string>
+
+ <!-- Button to bring up UI to add a number to the blocked call list. [CHAR LIMIT=40] -->
+ <string name="addBlockedNumber">Add number</string>
+
+ <!-- Footer message of number blocking screen with visual voicemail active.
+ [CHAR LIMIT=NONE] -->
+ <string name="block_number_footer_message_vvm">
+ Calls from these numbers will be blocked and voicemails will be automatically deleted.
+ </string>
+
+ <!-- Footer message of number blocking screen with no visual voicemail.
+ [CHAR LIMIT=NONE] -->
+ <string name="block_number_footer_message_no_vvm">
+ Calls from these numbers will be blocked, but they may still be able to leave you voicemails.
+ </string>
+
+ <!-- Heading for the block list in the "Spam and blocked cal)ls" settings. [CHAR LIMIT=64] -->
+ <string name="block_list">Blocked numbers</string>
+
+ <!-- Error message shown when user tries to add invalid number to the block list.
+ [CHAR LIMIT=64] -->
+ <string name="invalidNumber"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
+ is invalid.</string>
+
+ <!-- Error message shown when user tries to add a number to the block list that was already
+ blocked. [CHAR LIMIT=64] -->
+ <string name="alreadyBlocked"><xliff:g id="number" example="(555) 555-5555">%1$s</xliff:g>
+ is already blocked.</string>
+
+ <!-- Title of notification telling the user that call blocking has been temporarily disabled.
+ [CHAR LIMIT=56] -->
+ <string name="call_blocking_disabled_notification_title">
+ Call blocking disabled for 48 hours
+ </string>
+
+ <!-- Text for notification which provides the reason that call blocking has been temporarily
+ disabled. Namely, we disable call blocking after an emergency call in case of return
+ phone calls made by emergency services. [CHAR LIMIT=64] -->
+ <string name="call_blocking_disabled_notification_text">
+ Disabled because an emergency call was made.
+ </string>
+
<!-- Label for the phone account settings [CHAR LIMIT=30] -->
<string name="phone_account_settings_label">Calling accounts</string>
@@ -790,30 +1031,36 @@
<!-- DO NOT TRANSLATE. Internal key for DTMF tone length preference. -->
<string name="dtmf_tone_length_preference_key" translatable="false">button_dtmf_settings</string>
- <!-- The label of the button used to turn on a single permission -->
+ <!-- The label of the button used to turn on a single permission [CHAR LIMIT=30]-->
<string name="permission_single_turn_on">Turn on</string>
- <!-- The label of the button used to turn on multiple permissions -->
+ <!-- The label of the button used to turn on multiple permissions [CHAR LIMIT=30]-->
<string name="permission_multiple_turn_on">Set permissions</string>
- <!-- Shown as a prompt to turn on the contacts permission to enable speed dial -->
- <string name="permission_no_speeddial">To enable speed dial,\n turn on the Contacts permission.</string>
+ <!-- Shown as a prompt to turn on the contacts permission to enable speed dial [CHAR LIMIT=NONE]-->
+ <string name="permission_no_speeddial">To enable speed dial, turn on the Contacts permission.</string>
- <!-- Shown as a prompt to turn on the phone permission to enable the call log -->
- <string name="permission_no_calllog">To see your call log,\n turn on the Phone permission.</string>
+ <!-- Shown as a prompt to turn on the phone permission to enable the call log [CHAR LIMIT=NONE]-->
+ <string name="permission_no_calllog">To see your call log, turn on the Phone permission.</string>
- <!-- Shown as a prompt to turn on the contacts permission to show all contacts -->
- <string name="permission_no_contacts">To see your contacts,\n turn on the Contacts permission.</string>
+ <!-- Shown as a prompt to turn on the contacts permission to show all contacts [CHAR LIMIT=NONE]-->
+ <string name="permission_no_contacts">To see your contacts, turn on the Contacts permission.</string>
- <!-- Shown as a prompt to turn on the phone permission to show voicemails -->
- <string name="permission_no_voicemail">To access your voicemail,\n turn on the Phone permission.</string>
+ <!-- Shown as a prompt to turn on the phone permission to show voicemails [CHAR LIMIT=NONE]-->
+ <string name="permission_no_voicemail">To access your voicemail, turn on the Phone permission.</string>
- <!-- Shown as a prompt to turn on contacts permissions to allow contact search -->
+ <!-- Shown as a prompt to turn on contacts permissions to allow contact search [CHAR LIMIT=NONE]-->
<string name="permission_no_search">To search your contacts, turn on the Contacts permissions.</string>
- <!-- Shown as a prompt to turn on the phone permission to allow a call to be placed -->
- <string name="permission_place_call">To place a call,\n turn on the Phone permission.</string>
+ <!-- Shown as a prompt to turn on the phone permission to allow a call to be placed [CHAR LIMIT=NONE]-->
+ <string name="permission_place_call">To place a call, turn on the Phone permission.</string>
- <!-- Shown as a message that notifies the user that the Phone app cannot write to system settings, which is why the system settings app is being launched directly instead.-->
+ <!-- Shown as a message that notifies the user that the Phone app cannot write to system settings, which is why the system settings app is being launched directly instead. [CHAR LIMIT=NONE]-->
<string name="toast_cannot_write_system_settings">Phone app does not have permission to write to system settings.</string>
+
+ <!-- Label under the name of a blocked number in the call log. [CHAR LIMIT=15] -->
+ <string name="blocked_number_call_log_label">Blocked</string>
+
+ <!-- Accessibility announcement to indicate which call is active -->
+ <string name="accessibility_call_is_active"><xliff:g id="nameOrNumber">^1</xliff:g> is active</string>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index e3a2f9974..6a40d09be 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -15,15 +15,21 @@
~ limitations under the License
-->
<resources>
- <style name="DialtactsTheme"
- parent="android:Theme.Material.Light">
+ <style name="DialtactsTheme" parent="Theme.AppCompat.Light">
<item name="android:textColorPrimary">@color/dialtacts_primary_text_color</item>
<item name="android:textColorSecondary">@color/dialtacts_secondary_text_color</item>
+
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:windowActionBarOverlay">true</item>
+ <item name="windowActionBarOverlay">true</item>
<item name="android:windowActionModeOverlay">true</item>
+ <item name="windowActionModeOverlay">true</item>
<item name="android:actionBarStyle">@style/DialtactsActionBarStyle</item>
+ <item name="actionBarStyle">@style/DialtactsActionBarStyle</item>
<!-- Style for the overflow button in the actionbar. -->
<item name="android:actionOverflowButtonStyle">@style/DialtactsActionBarOverflow</item>
+ <item name="actionOverflowButtonStyle">@style/DialtactsActionBarOverflow</item>
+
<!-- Drawable for the back button -->
<item name="android:homeAsUpIndicator">@drawable/ic_back_arrow</item>
<item name="android:windowContentOverlay">@null</item>
@@ -34,13 +40,13 @@
<item name="section_header_background">@drawable/list_title_holo</item>
<item name="list_section_header_height">32dip</item>
<item name="list_item_padding_top">12dp</item>
- <item name="list_item_padding_right">32dp</item>
+ <item name="list_item_padding_right">24dp</item>
<item name="list_item_padding_bottom">12dp</item>
<item name="list_item_padding_left">16dp</item>
<item name="list_item_gap_between_image_and_text">
@dimen/contact_browser_list_item_gap_between_image_and_text
</item>
- <item name="list_item_gap_between_label_and_data">5dip</item>
+ <item name="list_item_gap_between_label_and_data">8dip</item>
<item name="list_item_presence_icon_margin">4dip</item>
<item name="list_item_presence_icon_size">16dip</item>
<item name="list_item_photo_size">@dimen/contact_browser_list_item_photo_size</item>
@@ -77,6 +83,16 @@
<item name="android:colorPrimaryDark">@color/dialer_theme_color_dark</item>
<item name="dialpad_key_button_touch_tint">@color/dialer_dialpad_touch_tint</item>
<item name="android:colorControlActivated">@color/dialer_theme_color</item>
+ <item name="android:colorButtonNormal">@color/dialer_theme_color</item>
+ <item name="android:textAppearanceButton">@style/DialerButtonTextStyle</item>
+
+ <!-- Video call icon -->
+ <item name="list_item_video_call_icon_size">32dip</item>
+ <item name="list_item_video_call_icon_margin">8dip</item>
+ </style>
+
+ <style name="DialerButtonTextStyle" parent="@android:style/TextAppearance.Material.Widget.Button">
+ <item name="android:textColor">#fff</item>
</style>
<!-- Action bar overflow menu icon. -->
@@ -96,13 +112,19 @@
</style>
<style name="DialtactsThemeWithoutActionBarOverlay" parent="DialtactsTheme">
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:windowActionBarOverlay">false</item>
+ <item name="windowActionBarOverlay">false</item>
<item name="android:actionOverflowButtonStyle">@style/DialtactsActionBarOverflowWhite</item>
+ <item name="actionOverflowButtonStyle">@style/DialtactsActionBarOverflowWhite</item>
</style>
<!-- Hide the actionbar title during the activity preview -->
<style name="DialtactsActivityTheme" parent="DialtactsTheme">
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:actionBarStyle">@style/DialtactsActionBarWithoutTitleStyle</item>
+ <item name="actionBarStyle">@style/DialtactsActionBarWithoutTitleStyle</item>
+
<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb</item>
<item name="android:fastScrollTrackDrawable">@null</item>
</style>
@@ -121,23 +143,49 @@
<item name="android:actionOverflowButtonStyle">@style/DialtactsActionBarOverflowWhite</item>
</style>
- <style name="DialtactsActionBarStyle" parent="android:Widget.Material.ActionBar">
+ <style name="CallDetailActionItemStyle">
+ <item name="android:foreground">?android:attr/selectableItemBackground</item>
+ <item name="android:clickable">true</item>
+ <item name="android:drawablePadding">@dimen/call_detail_action_item_drawable_padding</item>
+ <item name="android:gravity">center_vertical</item>
+ <item name="android:paddingStart">@dimen/call_detail_action_item_padding_horizontal</item>
+ <item name="android:paddingEnd">@dimen/call_detail_action_item_padding_horizontal</item>
+ <item name="android:paddingTop">@dimen/call_detail_action_item_padding_vertical</item>
+ <item name="android:paddingBottom">@dimen/call_detail_action_item_padding_vertical</item>
+ <item name="android:textColor">@color/call_detail_footer_text_color</item>
+ <item name="android:textSize">@dimen/call_detail_action_item_text_size</item>
+ </style>
+
+ <style name="DialtactsActionBarStyle"
+ parent="@style/Widget.AppCompat.Light.ActionBar.Solid.Inverse">
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:background">@color/actionbar_background_color</item>
+ <item name="background">@color/actionbar_background_color</item>
<item name="android:titleTextStyle">@style/DialtactsActionBarTitleText</item>
+ <item name="titleTextStyle">@style/DialtactsActionBarTitleText</item>
<item name="android:height">@dimen/action_bar_height</item>
+ <item name="height">@dimen/action_bar_height</item>
<item name="android:elevation">@dimen/action_bar_elevation</item>
+ <item name="elevation">@dimen/action_bar_elevation</item>
<!-- Empty icon -->
<item name="android:icon">@android:color/transparent</item>
+ <item name="icon">@android:color/transparent</item>
<!-- Shift the title text to the right -->
<item name="android:contentInsetStart">@dimen/actionbar_contentInsetStart</item>
+ <item name="contentInsetStart">@dimen/actionbar_contentInsetStart</item>
</style>
<style name="DialtactsActionBarWithoutTitleStyle" parent="DialtactsActionBarStyle">
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
<item name="android:displayOptions"></item>
+ <item name="displayOptions"></item>
<item name="android:height">@dimen/action_bar_height_large</item>
+ <item name="height">@dimen/action_bar_height_large</item>
<!-- Override ActionBar title offset to keep search box aligned left -->
<item name="android:contentInsetStart">0dp</item>
+ <item name="contentInsetStart">0dp</item>
<item name="android:contentInsetEnd">0dp</item>
+ <item name="contentInsetEnd">0dp</item>
</style>
<!-- Text in the action bar at the top of the screen -->
@@ -171,14 +219,19 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:paddingStart">@dimen/call_log_action_horizontal_padding</item>
<item name="android:paddingEnd">@dimen/call_log_action_horizontal_padding</item>
- <item name="android:textColor">?attr/call_log_secondary_text_color</item>
- <item name="android:textSize">@dimen/call_log_list_item_actions_text_size</item>
- <item name="android:fontFamily">"sans-serif-medium"</item>
+ <item name="android:textColor">@color/call_log_action_color</item>
+ <item name="android:textSize">@dimen/call_log_primary_text_size</item>
+ <item name="android:fontFamily">"sans-serif"</item>
<item name="android:focusable">true</item>
<item name="android:singleLine">true</item>
<item name="android:importantForAccessibility">no</item>
</style>
+ <style name="CallLogActionSupportTextStyle" parent="@style/CallLogActionTextStyle">
+ <item name="android:textSize">@dimen/call_log_detail_text_size</item>
+ <item name="android:textColor">@color/call_log_detail_color</item>
+ </style>
+
<style name="CallLogActionIconStyle">
<item name="android:layout_width">@dimen/call_log_action_icon_dimen</item>
<item name="android:layout_height">@dimen/call_log_action_icon_dimen</item>
@@ -203,6 +256,21 @@
<item name="android:textColorLink">@color/dialtacts_theme_color</item>
</style>
+ <style name="ManageBlockedNumbersStyle" parent="SettingsStyle">
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
+ <item name="android:windowActionBarOverlay">true</item>
+ <item name="windowActionBarOverlay">true</item>
+ <item name="android:actionBarStyle">@style/ManageBlockedNumbersActionBarStyle</item>
+ <item name="actionBarStyle">@style/ManageBlockedNumbersActionBarStyle</item>
+ <item name="android:fastScrollTrackDrawable">@null</item>
+ </style>
+
+ <style name="ManageBlockedNumbersActionBarStyle" parent="DialtactsActionBarWithoutTitleStyle">
+ <!-- Styles that require AppCompat compatibility, remember to update both sets -->
+ <item name="android:height">@dimen/action_bar_height</item>
+ <item name="height">@dimen/action_bar_height</item>
+ </style>
+
<!-- Inherit from Theme.Material.Light.Dialog instead of Theme.Material.Light.Dialog.Alert
since the Alert dialog is private. They are identical anyway. -->
<style name="AlertDialogTheme" parent="@android:style/Theme.Material.Light.Dialog">
@@ -233,7 +301,7 @@
<style name="PromoCardActionStyle" parent="TextActionStyle">
<item name="android:textColor">@color/promo_card_text</item>
- <item name="android:textSize">@dimen/call_log_list_item_actions_text_size</item>
+ <item name="android:textSize">@dimen/call_log_primary_text_size</item>
</style>
<style name="VoicemailPlaybackLayoutTextStyle">
@@ -246,4 +314,33 @@
<item name="android:background">@drawable/oval_ripple</item>
<item name="android:padding">8dp</item>
</style>
+
+ <style name="DialerFlatButtonStyle" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ <item name="android:paddingEnd">@dimen/button_horizontal_padding</item>
+ <item name="android:paddingStart">@dimen/button_horizontal_padding</item>
+ <item name="android:textColor">@color/dialer_flat_button_text_color</item>
+ </style>
+
+ <!-- Style for the 'primary' button in a view. Unlike the DialerFlatButtonStyle, this button -->
+ <!-- is not colored white, to draw more attention to it. -->
+ <style name="DialerPrimaryFlatButtonStyle" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/selectable_primary_flat_button</item>
+ <item name="android:paddingEnd">@dimen/button_horizontal_padding</item>
+ <item name="android:paddingStart">@dimen/button_horizontal_padding</item>
+ <item name="android:textColor">@android:color/white</item>
+ </style>
+
+ <style name="BlockedNumbersDescriptionTextStyle">
+ <item name="android:lineSpacingMultiplier">1.43</item>
+ <item name="android:paddingTop">8dp</item>
+ <item name="android:paddingBottom">8dp</item>
+ <item name="android:textSize">@dimen/blocked_number_settings_description_text_size</item>
+ </style>
+
+ <style name="FullWidthDivider">
+ <item name="android:layout_width">match_parent</item>
+ <item name="android:layout_height">1dp</item>
+ <item name="android:background">?android:attr/listDivider</item>
+ </style>
</resources>
diff --git a/res/xml/file_paths.xml b/res/xml/file_paths.xml
new file mode 100644
index 000000000..365a60318
--- /dev/null
+++ b/res/xml/file_paths.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- Offer access to files under Context.getCacheDir() -->
+ <cache-path name="my_cache" />
+ <!-- Offer access to voicemail folder under Context.getFilesDir() -->
+ <files-path name="voicemails" path="voicemails/" />
+</paths>
diff --git a/src-N/com/android/dialer/SdkSelectionUtils.java b/src-N/com/android/dialer/SdkSelectionUtils.java
new file mode 100644
index 000000000..ae7a63174
--- /dev/null
+++ b/src-N/com/android/dialer/SdkSelectionUtils.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer;
+
+/**
+ * Provides information for the SDK the app is built against.
+ * Specifically, information that change when the TARGET_N_SDK build flag is set in the makefile.
+ * This is not related to the targetSdkVersion value in AndroidManifest.xml.
+ *
+ * Usage case will be branching test code in src/, instead of swapping between src-N and src-pre-N.
+ */
+public class SdkSelectionUtils {
+
+ /**
+ * Whether the app is build against N SDK.
+ *
+ * Since Build.VERSION.SDK_INT remains 23 on N SDK for now, this is currently the only way to
+ * check if we are building with N SDK or other.
+ */
+ public static final boolean TARGET_N_SDK = true;
+}
diff --git a/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java b/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
new file mode 100644
index 000000000..a60820732
--- /dev/null
+++ b/src-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.compat;
+
+import android.content.Context;
+import android.net.Uri;
+import android.provider.BlockedNumberContract;
+import android.provider.BlockedNumberContract.BlockedNumbers;
+
+public class BlockedNumbersSdkCompat {
+
+ public static final Uri CONTENT_URI = BlockedNumbers.CONTENT_URI;
+
+ public static final String _ID = BlockedNumbers.COLUMN_ID;
+
+ public static final String COLUMN_ORIGINAL_NUMBER = BlockedNumbers.COLUMN_ORIGINAL_NUMBER;
+
+ public static final String E164_NUMBER = BlockedNumbers.COLUMN_E164_NUMBER;
+
+ public static boolean canCurrentUserBlockNumbers(Context context) {
+ return BlockedNumberContract.canCurrentUserBlockNumbers(context);
+ }
+}
diff --git a/src-N/com/android/dialer/compat/CallsSdkCompat.java b/src-N/com/android/dialer/compat/CallsSdkCompat.java
new file mode 100644
index 000000000..a428ca386
--- /dev/null
+++ b/src-N/com/android/dialer/compat/CallsSdkCompat.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.compat;
+
+import android.provider.CallLog;
+
+public class CallsSdkCompat {
+
+ public static final String POST_DIAL_DIGITS = CallLog.Calls.POST_DIAL_DIGITS;
+ public static final String VIA_NUMBER = CallLog.Calls.VIA_NUMBER;
+}
diff --git a/src-N/com/android/dialer/compat/UserManagerSdkCompat.java b/src-N/com/android/dialer/compat/UserManagerSdkCompat.java
new file mode 100644
index 000000000..9a08d4e71
--- /dev/null
+++ b/src-N/com/android/dialer/compat/UserManagerSdkCompat.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.dialer.compat;
+
+import android.content.Context;
+
+/**
+ * UserManagerCompat respecting Sdk requirements
+ */
+public class UserManagerSdkCompat {
+
+ /**
+ * Return whether the calling user is running in an "unlocked" state. A user
+ * is unlocked only after they've entered their credentials (such as a lock
+ * pattern or PIN), and credential-encrypted private app data storage is
+ * available.
+ *
+ * @param context the current context
+ * @return {@code true} if the user is unlocked or context is null, {@code false} otherwise
+ * @throws NullPointerException if context is null
+ */
+ public static boolean isUserUnlocked(Context context) {
+ return android.support.v4.os.UserManagerCompat.isUserUnlocked(context);
+ }
+
+}
diff --git a/src-pre-N/com/android/dialer/SdkSelectionUtils.java b/src-pre-N/com/android/dialer/SdkSelectionUtils.java
new file mode 100644
index 000000000..7e36b332c
--- /dev/null
+++ b/src-pre-N/com/android/dialer/SdkSelectionUtils.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer;
+
+/**
+ * Provides information for the SDK the app is built against.
+ * Specifically, information that change when the TARGET_N_SDK build flag is set in the makefile.
+ * This is not related to the targetSdkVersion value in AndroidManifest.xml.
+ *
+ * Usage case will be branching test code in src/, instead of using src-N/ and src-pre-N/
+ */
+public class SdkSelectionUtils {
+
+ /**
+ * Whether the app is build against N SDK.
+ *
+ * Since Build.VERSION.SDK_INT remains 23 on N SDK for now, this is currently the only way to
+ * check if we are building with N SDK or other.
+ */
+ public static final boolean TARGET_N_SDK = false;
+}
diff --git a/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java b/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
new file mode 100644
index 000000000..559d71899
--- /dev/null
+++ b/src-pre-N/com/android/dialer/compat/BlockedNumbersSdkCompat.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.compat;
+
+import android.content.Context;
+import android.net.Uri;
+
+public class BlockedNumbersSdkCompat {
+
+ public static final Uri CONTENT_URI = null;
+
+ public static final String _ID = null;
+
+ public static final String COLUMN_ORIGINAL_NUMBER = null;
+
+ public static final String E164_NUMBER = null;
+
+ public static boolean canCurrentUserBlockNumbers(Context context) {
+ return false;
+ }
+}
diff --git a/src-pre-N/com/android/dialer/compat/CallsSdkCompat.java b/src-pre-N/com/android/dialer/compat/CallsSdkCompat.java
new file mode 100644
index 000000000..60d3ca14d
--- /dev/null
+++ b/src-pre-N/com/android/dialer/compat/CallsSdkCompat.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.compat;
+
+import android.support.annotation.Nullable;
+
+public class CallsSdkCompat {
+
+ @Nullable public static final String POST_DIAL_DIGITS = null;
+ @Nullable public static final String VIA_NUMBER = null;
+}
diff --git a/src-pre-N/com/android/dialer/compat/UserManagerSdkCompat.java b/src-pre-N/com/android/dialer/compat/UserManagerSdkCompat.java
new file mode 100644
index 000000000..c79ac2f91
--- /dev/null
+++ b/src-pre-N/com/android/dialer/compat/UserManagerSdkCompat.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+package com.android.dialer.compat;
+
+import android.content.Context;
+import android.util.Log;
+
+/**
+ * UserManagerCompat respecting Sdk requirements
+ */
+public class UserManagerSdkCompat {
+
+ /**
+ * @return {@code true}
+ */
+ public static boolean isUserUnlocked(Context context) {
+ Log.wtf("UserManagerSdkCompat", "Not implemented");
+ return true;
+ }
+
+}
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 56f2cb1dc..94c2f0018 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -16,55 +16,56 @@
package com.android.dialer;
-import android.app.Activity;
-import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
-import android.os.PowerManager;
import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.VoicemailContract.Voicemails;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
-import android.telephony.TelephonyManager;
+import android.support.v7.app.AppCompatActivity;
import android.text.BidiFormatter;
import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
import android.util.Log;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.MotionEvent;
import android.view.View;
-import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import android.widget.Toast;
+import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
-import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.GeoUtil;
-import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.testing.NeededForTesting;
import com.android.contacts.common.util.UriUtils;
import com.android.dialer.calllog.CallDetailHistoryAdapter;
-import com.android.dialer.calllog.CallLogAsyncTaskUtil.CallLogAsyncTaskListener;
import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil.CallLogAsyncTaskListener;
import com.android.dialer.calllog.CallTypeHelper;
-import com.android.dialer.calllog.ContactInfo;
import com.android.dialer.calllog.ContactInfoHelper;
import com.android.dialer.calllog.PhoneAccountUtils;
-import com.android.dialer.calllog.PhoneNumberDisplayUtil;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.FilteredNumbersUtil;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
import com.android.dialer.util.DialerUtils;
-import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.IntentUtil.CallIntentBuilder;
import com.android.dialer.util.PhoneNumberUtil;
import com.android.dialer.util.TelecomUtil;
-
-import java.util.List;
+import com.android.incallui.Call.LogState;
/**
* Displays the details of a specific call log entry.
@@ -72,9 +73,10 @@ import java.util.List;
* This activity can be either started with the URI of a single call log entry, or with the
* {@link #EXTRA_CALL_LOG_IDS} extra to specify a group of call log entries.
*/
-public class CallDetailActivity extends Activity
- implements MenuItem.OnMenuItemClickListener {
- private static final String TAG = "CallDetail";
+public class CallDetailActivity extends AppCompatActivity
+ implements MenuItem.OnMenuItemClickListener, View.OnClickListener,
+ BlockNumberDialogFragment.Callback {
+ private static final String TAG = CallDetailActivity.class.getSimpleName();
/** A long array extra containing ids of call log entries to display. */
public static final String EXTRA_CALL_LOG_IDS = "EXTRA_CALL_LOG_IDS";
@@ -106,31 +108,29 @@ public class CallDetailActivity extends Activity
return;
}
- // We know that all calls are from the same number and the same contact, so pick the
- // first.
- PhoneCallDetails firstDetails = details[0];
- mNumber = TextUtils.isEmpty(firstDetails.number) ?
- null : firstDetails.number.toString();
- final int numberPresentation = firstDetails.numberPresentation;
- final Uri contactUri = firstDetails.contactUri;
- final Uri photoUri = firstDetails.photoUri;
- final PhoneAccountHandle accountHandle = firstDetails.accountHandle;
-
- // Cache the details about the phone number.
- final boolean canPlaceCallsTo =
- PhoneNumberUtil.canPlaceCallsTo(mNumber, numberPresentation);
- mIsVoicemailNumber =
- PhoneNumberUtil.isVoicemailNumber(mContext, accountHandle, mNumber);
- final boolean isSipNumber = PhoneNumberUtil.isSipNumber(mNumber);
+ // All calls are from the same number and same contact, so pick the first detail.
+ mDetails = details[0];
+ mNumber = TextUtils.isEmpty(mDetails.number) ? null : mDetails.number.toString();
+ mPostDialDigits = TextUtils.isEmpty(mDetails.postDialDigits)
+ ? "" : mDetails.postDialDigits;
+ mDisplayNumber = mDetails.displayNumber;
+
+ final CharSequence callLocationOrType = getNumberTypeOrLocation(mDetails);
- final CharSequence callLocationOrType = getNumberTypeOrLocation(firstDetails);
+ final CharSequence displayNumber;
+ if (!TextUtils.isEmpty(mDetails.postDialDigits)) {
+ displayNumber = mDetails.number + mDetails.postDialDigits;
+ } else {
+ displayNumber = mDetails.displayNumber;
+ }
- final CharSequence displayNumber = firstDetails.displayNumber;
final String displayNumberStr = mBidiFormatter.unicodeWrap(
displayNumber.toString(), TextDirectionHeuristics.LTR);
- if (!TextUtils.isEmpty(firstDetails.name)) {
- mCallerName.setText(firstDetails.name);
+ mDetails.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
+
+ if (!TextUtils.isEmpty(mDetails.getPreferredName())) {
+ mCallerName.setText(mDetails.getPreferredName());
mCallerNumber.setText(callLocationOrType + " " + displayNumberStr);
} else {
mCallerName.setText(displayNumberStr);
@@ -142,45 +142,56 @@ public class CallDetailActivity extends Activity
}
}
- mCallButton.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
-
- String accountLabel = PhoneAccountUtils.getAccountLabel(mContext, accountHandle);
+ CharSequence accountLabel = PhoneAccountUtils.getAccountLabel(mContext,
+ mDetails.accountHandle);
+ CharSequence accountContentDescription =
+ PhoneCallDetails.createAccountLabelDescription(mResources, mDetails.viaNumber,
+ accountLabel);
+ if (!TextUtils.isEmpty(mDetails.viaNumber)) {
+ if (!TextUtils.isEmpty(accountLabel)) {
+ accountLabel = mResources.getString(R.string.call_log_via_number_phone_account,
+ accountLabel, mDetails.viaNumber);
+ } else {
+ accountLabel = mResources.getString(R.string.call_log_via_number,
+ mDetails.viaNumber);
+ }
+ }
if (!TextUtils.isEmpty(accountLabel)) {
mAccountLabel.setText(accountLabel);
+ mAccountLabel.setContentDescription(accountContentDescription);
mAccountLabel.setVisibility(View.VISIBLE);
} else {
mAccountLabel.setVisibility(View.GONE);
}
- mHasEditNumberBeforeCallOption =
- canPlaceCallsTo && !isSipNumber && !mIsVoicemailNumber;
- mHasReportMenuOption = mContactInfoHelper.canReportAsInvalid(
- firstDetails.sourceType, firstDetails.objectId);
- invalidateOptionsMenu();
+ final boolean canPlaceCallsTo =
+ PhoneNumberUtil.canPlaceCallsTo(mNumber, mDetails.numberPresentation);
+ mCallButton.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
+ mCopyNumberActionItem.setVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
- ListView historyList = (ListView) findViewById(R.id.history);
- historyList.setAdapter(
- new CallDetailHistoryAdapter(mContext, mInflater, mCallTypeHelper, details));
+ updateBlockActionItemVisibility(canPlaceCallsTo ? View.VISIBLE : View.GONE);
- String lookupKey = contactUri == null ? null
- : UriUtils.getLookupKeyFromUri(contactUri);
+ final boolean isSipNumber = PhoneNumberUtil.isSipNumber(mNumber);
+ final boolean isVoicemailNumber =
+ PhoneNumberUtil.isVoicemailNumber(mContext, mDetails.accountHandle, mNumber);
+ final boolean showEditNumberBeforeCallAction =
+ canPlaceCallsTo && !isSipNumber && !isVoicemailNumber;
+ mEditBeforeCallActionItem.setVisibility(
+ showEditNumberBeforeCallAction ? View.VISIBLE : View.GONE);
+
+ final boolean showReportAction = mContactInfoHelper.canReportAsInvalid(
+ mDetails.sourceType, mDetails.objectId);
+ mReportActionItem.setVisibility(
+ showReportAction ? View.VISIBLE : View.GONE);
- final boolean isBusiness = mContactInfoHelper.isBusiness(firstDetails.sourceType);
+ invalidateOptionsMenu();
- final int contactType =
- mIsVoicemailNumber ? ContactPhotoManager.TYPE_VOICEMAIL :
- isBusiness ? ContactPhotoManager.TYPE_BUSINESS :
- ContactPhotoManager.TYPE_DEFAULT;
+ mHistoryList.setAdapter(
+ new CallDetailHistoryAdapter(mContext, mInflater, mCallTypeHelper, details));
- String nameForDefaultImage;
- if (TextUtils.isEmpty(firstDetails.name)) {
- nameForDefaultImage = firstDetails.displayNumber;
- } else {
- nameForDefaultImage = firstDetails.name.toString();
- }
+ updateFilteredNumberChanges();
+ updateContactPhoto();
- loadContactPhotos(
- contactUri, photoUri, nameForDefaultImage, lookupKey, contactType);
findViewById(R.id.call_detail).setVisibility(View.VISIBLE);
}
@@ -192,7 +203,7 @@ public class CallDetailActivity extends Activity
* @return The phone number type or location.
*/
private CharSequence getNumberTypeOrLocation(PhoneCallDetails details) {
- if (!TextUtils.isEmpty(details.name)) {
+ if (!TextUtils.isEmpty(details.namePrimary)) {
return Phone.getTypeLabel(mResources, details.numberType,
details.numberLabel);
} else {
@@ -202,82 +213,124 @@ public class CallDetailActivity extends Activity
};
private Context mContext;
+ private ContactInfoHelper mContactInfoHelper;
+ private ContactsPreferences mContactsPreferences;
private CallTypeHelper mCallTypeHelper;
+ private ContactPhotoManager mContactPhotoManager;
+ private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+ private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
+ private LayoutInflater mInflater;
+ private Resources mResources;
+
+ private PhoneCallDetails mDetails;
+ protected String mNumber;
+ private Uri mVoicemailUri;
+ private String mPostDialDigits = "";
+ private String mDisplayNumber;
+
+ private ListView mHistoryList;
private QuickContactBadge mQuickContactBadge;
private TextView mCallerName;
private TextView mCallerNumber;
private TextView mAccountLabel;
private View mCallButton;
- private ContactInfoHelper mContactInfoHelper;
-
- protected String mNumber;
- private boolean mIsVoicemailNumber;
- private String mDefaultCountryIso;
- /* package */ LayoutInflater mInflater;
- /* package */ Resources mResources;
- /** Helper to load contact photos. */
- private ContactPhotoManager mContactPhotoManager;
-
- private Uri mVoicemailUri;
- private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
+ private TextView mBlockNumberActionItem;
+ private View mEditBeforeCallActionItem;
+ private View mReportActionItem;
+ private View mCopyNumberActionItem;
- /** Whether we should show "edit number before call" in the options menu. */
- private boolean mHasEditNumberBeforeCallOption;
- private boolean mHasReportMenuOption;
+ private Integer mBlockedNumberId;
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mContext = this;
-
- setContentView(R.layout.call_detail);
-
- mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
mResources = getResources();
-
+ mContactInfoHelper = new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this));
+ mContactsPreferences = new ContactsPreferences(mContext);
mCallTypeHelper = new CallTypeHelper(getResources());
+ mFilteredNumberAsyncQueryHandler =
+ new FilteredNumberAsyncQueryHandler(getContentResolver());
mVoicemailUri = getIntent().getParcelableExtra(EXTRA_VOICEMAIL_URI);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ setContentView(R.layout.call_detail);
+ mInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
+
+ mHistoryList = (ListView) findViewById(R.id.history);
+ mHistoryList.addHeaderView(mInflater.inflate(R.layout.call_detail_header, null));
+ mHistoryList.addFooterView(
+ mInflater.inflate(R.layout.call_detail_footer, null), null, false);
+
mQuickContactBadge = (QuickContactBadge) findViewById(R.id.quick_contact_photo);
mQuickContactBadge.setOverlay(null);
- mQuickContactBadge.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
+ if (CompatUtils.hasPrioritizedMimeType()) {
+ mQuickContactBadge.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
+ }
mCallerName = (TextView) findViewById(R.id.caller_name);
mCallerNumber = (TextView) findViewById(R.id.caller_number);
mAccountLabel = (TextView) findViewById(R.id.phone_account_label);
- mDefaultCountryIso = GeoUtil.getCurrentCountryIso(this);
mContactPhotoManager = ContactPhotoManager.getInstance(this);
- mCallButton = (View) findViewById(R.id.call_back_button);
+ mCallButton = findViewById(R.id.call_back_button);
mCallButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- mContext.startActivity(IntentUtil.getCallIntent(mNumber));
+ if (TextUtils.isEmpty(mNumber)) {
+ return;
+ }
+ mContext.startActivity(
+ new CallIntentBuilder(getDialableNumber())
+ .setCallInitiationType(LogState.INITIATION_CALL_DETAILS)
+ .build());
}
});
- mContactInfoHelper = new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this));
- getActionBar().setDisplayHomeAsUpEnabled(true);
+
+ mBlockNumberActionItem = (TextView) findViewById(R.id.call_detail_action_block);
+ updateBlockActionItemVisibility(View.VISIBLE);
+ mBlockNumberActionItem.setOnClickListener(this);
+ mEditBeforeCallActionItem = findViewById(R.id.call_detail_action_edit_before_call);
+ mEditBeforeCallActionItem.setOnClickListener(this);
+ mReportActionItem = findViewById(R.id.call_detail_action_report);
+ mReportActionItem.setOnClickListener(this);
+
+ mCopyNumberActionItem = findViewById(R.id.call_detail_action_copy);
+ mCopyNumberActionItem.setOnClickListener(this);
if (getIntent().getBooleanExtra(EXTRA_FROM_NOTIFICATION, false)) {
closeSystemDialogs();
}
}
+ private void updateBlockActionItemVisibility(int visibility) {
+ if (!FilteredNumberCompat.canAttemptBlockOperations(mContext)) {
+ visibility = View.GONE;
+ }
+ mBlockNumberActionItem.setVisibility(visibility);
+ }
+
@Override
public void onResume() {
super.onResume();
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
getCallDetails();
}
- public void getCallDetails() {
- CallLogAsyncTaskUtil.getCallDetails(this, getCallLogEntryUris(), mCallLogAsyncTaskListener);
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+ TouchPointManager.getInstance().setPoint((int) ev.getRawX(), (int) ev.getRawY());
+ }
+ return super.dispatchTouchEvent(ev);
}
- private boolean hasVoicemail() {
- return mVoicemailUri != null;
+ public void getCallDetails() {
+ CallLogAsyncTaskUtil.getCallDetails(this, getCallLogEntryUris(), mCallLogAsyncTaskListener);
}
/**
@@ -304,50 +357,27 @@ public class CallDetailActivity extends Activity
return uris;
}
- /** Load the contact photos and places them in the corresponding views. */
- private void loadContactPhotos(Uri contactUri, Uri photoUri, String displayName,
- String lookupKey, int contactType) {
-
- final DefaultImageRequest request = new DefaultImageRequest(displayName, lookupKey,
- contactType, true /* isCircular */);
-
- mQuickContactBadge.assignContactUri(contactUri);
- mQuickContactBadge.setContentDescription(
- mResources.getString(R.string.description_contact_details, displayName));
-
- mContactPhotoManager.loadDirectoryPhoto(mQuickContactBadge, photoUri,
- false /* darkTheme */, true /* isCircular */, request);
- }
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.call_details_options, menu);
- return super.onCreateOptionsMenu(menu);
- }
+ final MenuItem deleteMenuItem = menu.add(
+ Menu.NONE,
+ R.id.call_detail_delete_menu_item,
+ Menu.NONE,
+ R.string.call_details_delete);
+ deleteMenuItem.setIcon(R.drawable.ic_delete_24dp);
+ deleteMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ deleteMenuItem.setOnMenuItemClickListener(this);
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- // This action deletes all elements in the group from the call log.
- // We don't have this action for voicemails, because you can just use the trash button.
- menu.findItem(R.id.menu_remove_from_call_log)
- .setVisible(!hasVoicemail())
- .setOnMenuItemClickListener(this);
- menu.findItem(R.id.menu_edit_number_before_call)
- .setVisible(mHasEditNumberBeforeCallOption)
- .setOnMenuItemClickListener(this);
- menu.findItem(R.id.menu_trash)
- .setVisible(hasVoicemail())
- .setOnMenuItemClickListener(this);
- menu.findItem(R.id.menu_report)
- .setVisible(mHasReportMenuOption)
- .setOnMenuItemClickListener(this);
- return super.onPrepareOptionsMenu(menu);
+ return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_remove_from_call_log:
+ if (item.getItemId() == R.id.call_detail_delete_menu_item) {
+ if (hasVoicemail()) {
+ CallLogAsyncTaskUtil.deleteVoicemail(
+ this, mVoicemailUri, mCallLogAsyncTaskListener);
+ } else {
final StringBuilder callIds = new StringBuilder();
for (Uri callUri : getCallLogEntryUris()) {
if (callIds.length() != 0) {
@@ -357,19 +387,121 @@ public class CallDetailActivity extends Activity
}
CallLogAsyncTaskUtil.deleteCalls(
this, callIds.toString(), mCallLogAsyncTaskListener);
- break;
- case R.id.menu_edit_number_before_call:
- startActivity(new Intent(Intent.ACTION_DIAL, CallUtil.getCallUri(mNumber)));
- break;
- case R.id.menu_trash:
- CallLogAsyncTaskUtil.deleteVoicemail(
- this, mVoicemailUri, mCallLogAsyncTaskListener);
- break;
+ }
}
return true;
}
+ @Override
+ public void onClick(View view) {
+ int resId = view.getId();
+ if (resId == R.id.call_detail_action_block) {
+ FilteredNumberCompat
+ .showBlockNumberDialogFlow(mContext.getContentResolver(), mBlockedNumberId,
+ mNumber, mDetails.countryIso, mDisplayNumber, R.id.call_detail,
+ getFragmentManager(), this);
+ } else if (resId == R.id.call_detail_action_copy) {
+ ClipboardUtils.copyText(mContext, null, mNumber, true);
+ } else if (resId == R.id.call_detail_action_edit_before_call) {
+ Intent dialIntent = new Intent(Intent.ACTION_DIAL,
+ CallUtil.getCallUri(getDialableNumber()));
+ DialerUtils.startActivityWithErrorToast(mContext, dialIntent);
+ } else {
+ Log.wtf(TAG, "Unexpected onClick event from " + view);
+ }
+ }
+
+ @Override
+ public void onFilterNumberSuccess() {
+ Logger.logInteraction(InteractionEvent.BLOCK_NUMBER_CALL_DETAIL);
+ updateFilteredNumberChanges();
+ }
+
+ @Override
+ public void onUnfilterNumberSuccess() {
+ Logger.logInteraction(InteractionEvent.UNBLOCK_NUMBER_CALL_DETAIL);
+ updateFilteredNumberChanges();
+ }
+
+ @Override
+ public void onChangeFilteredNumberUndo() {
+ updateFilteredNumberChanges();
+ }
+
+ private void updateFilteredNumberChanges() {
+ if (mDetails == null ||
+ !FilteredNumbersUtil.canBlockNumber(this, mNumber, mDetails.countryIso)) {
+ return;
+ }
+
+ final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(Integer id) {
+ mBlockedNumberId = id;
+ updateBlockActionItem();
+ }
+ }, mNumber, mDetails.countryIso);
+
+ if (!success) {
+ updateBlockActionItem();
+ }
+ }
+
+ // Loads and displays the contact photo.
+ private void updateContactPhoto() {
+ if (mDetails == null) {
+ return;
+ }
+
+ final boolean isVoicemailNumber =
+ PhoneNumberUtil.isVoicemailNumber(mContext, mDetails.accountHandle, mNumber);
+ final boolean isBusiness = mContactInfoHelper.isBusiness(mDetails.sourceType);
+ int contactType = ContactPhotoManager.TYPE_DEFAULT;
+ if (isVoicemailNumber) {
+ contactType = ContactPhotoManager.TYPE_VOICEMAIL;
+ } else if (isBusiness) {
+ contactType = ContactPhotoManager.TYPE_BUSINESS;
+ }
+
+ final String displayName = TextUtils.isEmpty(mDetails.namePrimary)
+ ? mDetails.displayNumber : mDetails.namePrimary.toString();
+ final String lookupKey = mDetails.contactUri == null
+ ? null : UriUtils.getLookupKeyFromUri(mDetails.contactUri);
+
+ final DefaultImageRequest request =
+ new DefaultImageRequest(displayName, lookupKey, contactType, true /* isCircular */);
+
+ mQuickContactBadge.assignContactUri(mDetails.contactUri);
+ mQuickContactBadge.setContentDescription(
+ mResources.getString(R.string.description_contact_details, displayName));
+
+ mContactPhotoManager.loadDirectoryPhoto(mQuickContactBadge, mDetails.photoUri,
+ false /* darkTheme */, true /* isCircular */, request);
+ }
+
+ private void updateBlockActionItem() {
+ if (mBlockedNumberId == null) {
+ mBlockNumberActionItem.setText(R.string.action_block_number);
+ mBlockNumberActionItem.setCompoundDrawablesRelativeWithIntrinsicBounds(
+ R.drawable.ic_call_detail_block, 0, 0, 0);
+ } else {
+ mBlockNumberActionItem.setText(R.string.action_unblock_number);
+ mBlockNumberActionItem.setCompoundDrawablesRelativeWithIntrinsicBounds(
+ R.drawable.ic_call_detail_unblock, 0, 0, 0);
+ }
+ }
+
private void closeSystemDialogs() {
sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}
+
+ private String getDialableNumber() {
+ return mNumber + mPostDialDigits;
+ }
+
+ @NeededForTesting
+ public boolean hasVoicemail() {
+ return mVoicemailUri != null;
+ }
}
diff --git a/src/com/android/dialer/DialerApplication.java b/src/com/android/dialer/DialerApplication.java
index b177d8336..1a0497bb9 100644
--- a/src/com/android/dialer/DialerApplication.java
+++ b/src/com/android/dialer/DialerApplication.java
@@ -17,25 +17,42 @@
package com.android.dialer;
import android.app.Application;
+import android.content.Context;
import android.os.Trace;
+import android.preference.PreferenceManager;
+import android.support.annotation.Nullable;
import com.android.contacts.common.extensions.ExtensionsFactory;
-import com.android.contacts.commonbind.analytics.AnalyticsUtil;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.filterednumber.BlockedNumbersAutoMigrator;
public class DialerApplication extends Application {
private static final String TAG = "DialerApplication";
+ private static Context sContext;
+
@Override
public void onCreate() {
+ sContext = this;
Trace.beginSection(TAG + " onCreate");
super.onCreate();
Trace.beginSection(TAG + " ExtensionsFactory initialization");
ExtensionsFactory.init(getApplicationContext());
Trace.endSection();
- Trace.beginSection(TAG + " Analytics initialization");
- AnalyticsUtil.initialize(this);
- Trace.endSection();
+ new BlockedNumbersAutoMigrator(PreferenceManager.getDefaultSharedPreferences(this),
+ new FilteredNumberAsyncQueryHandler(getContentResolver())).autoMigrate();
Trace.endSection();
}
+
+ @Nullable
+ public static Context getContext() {
+ return sContext;
+ }
+
+ @NeededForTesting
+ public static void setContextForTest(Context context) {
+ sContext = context;
+ }
}
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index 69cc14673..d063fef5a 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -16,7 +16,6 @@
package com.android.dialer;
-import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.ActivityNotFoundException;
@@ -31,9 +30,10 @@ import android.os.Bundle;
import android.os.Trace;
import android.provider.CallLog.Calls;
import android.speech.RecognizerIntent;
+import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewPager;
+import android.support.v7.app.ActionBar;
import android.telecom.PhoneAccount;
-import android.telecom.TelecomManager;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
@@ -46,25 +46,22 @@ import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnDragListener;
-import android.view.View.OnTouchListener;
import android.view.ViewTreeObserver;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AbsListView.OnScrollListener;
import android.widget.EditText;
-import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.PopupMenu;
+import android.widget.TextView;
import android.widget.Toast;
-import com.android.contacts.common.activity.TransactionSafeActivity;
import com.android.contacts.common.dialog.ClearFrequentsDialog;
import com.android.contacts.common.interactions.ImportExportDialogFragment;
import com.android.contacts.common.interactions.TouchPointManager;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.widget.FloatingActionButtonController;
-import com.android.contacts.commonbind.analytics.AnalyticsUtil;
import com.android.dialer.calllog.CallLogActivity;
import com.android.dialer.calllog.CallLogFragment;
import com.android.dialer.database.DialerDatabaseHelper;
@@ -81,17 +78,22 @@ import com.android.dialer.list.RegularSearchFragment;
import com.android.dialer.list.SearchFragment;
import com.android.dialer.list.SmartDialSearchFragment;
import com.android.dialer.list.SpeedDialFragment;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.settings.DialerSettingsActivity;
-import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.Assert;
import com.android.dialer.util.DialerUtils;
+import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.IntentUtil.CallIntentBuilder;
+import com.android.dialer.util.TelecomUtil;
+import com.android.dialer.voicemail.VoicemailArchiveActivity;
import com.android.dialer.widget.ActionBarController;
import com.android.dialer.widget.SearchEditTextLayout;
-import com.android.dialer.widget.SearchEditTextLayout.Callback;
import com.android.dialerbind.DatabaseHelperManager;
+import com.android.dialerbind.ObjectFactory;
import com.android.phone.common.animation.AnimUtils;
import com.android.phone.common.animation.AnimationListenerAdapter;
-
-import junit.framework.Assert;
+import com.google.common.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.List;
@@ -118,17 +120,14 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
public static final String SHARED_PREFS_NAME = "com.android.dialer_preferences";
- /** @see #getCallOrigin() */
- private static final String CALL_ORIGIN_DIALTACTS =
- "com.android.dialer.DialtactsActivity";
-
private static final String KEY_IN_REGULAR_SEARCH_UI = "in_regular_search_ui";
private static final String KEY_IN_DIALPAD_SEARCH_UI = "in_dialpad_search_ui";
private static final String KEY_SEARCH_QUERY = "search_query";
private static final String KEY_FIRST_LAUNCH = "first_launch";
private static final String KEY_IS_DIALPAD_SHOWN = "is_dialpad_shown";
- private static final String TAG_DIALPAD_FRAGMENT = "dialpad";
+ @VisibleForTesting
+ public static final String TAG_DIALPAD_FRAGMENT = "dialpad";
private static final String TAG_REGULAR_SEARCH_FRAGMENT = "search";
private static final String TAG_SMARTDIAL_SEARCH_FRAGMENT = "smartdial";
private static final String TAG_FAVORITES_FRAGMENT = "favorites";
@@ -143,7 +142,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
private static final int FAB_SCALE_IN_DELAY_MS = 300;
- private FrameLayout mParentLayout;
+ private CoordinatorLayout mParentLayout;
/**
* Fragment containing the dialpad that slides into view
@@ -188,7 +187,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
};
/**
- * Fragment containing the speed dial list, recents list, and all contacts list.
+ * Fragment containing the speed dial list, call history list, and all contacts list.
*/
private ListsFragment mListsFragment;
@@ -230,6 +229,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
private View mVoiceSearchButton;
private String mSearchQuery;
+ private String mDialpadQuery;
private DialerDatabaseHelper mDialerDatabaseHelper;
private DragDropController mDragDropController;
@@ -238,6 +238,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
private FloatingActionButtonController mFloatingActionButtonController;
private int mActionBarHeight;
+ private int mPreviouslySelectedTabIndex;
/**
* The text returned from a voice search query. Set in {@link #onActivityResult} and used in
@@ -369,7 +370,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
TouchPointManager.getInstance().setPoint((int) ev.getRawX(), (int) ev.getRawY());
}
return super.dispatchTouchEvent(ev);
-
}
@Override
@@ -388,13 +388,13 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
getWindow().setBackgroundDrawable(null);
Trace.beginSection(TAG + " setup Views");
- final ActionBar actionBar = getActionBar();
+ final ActionBar actionBar = getSupportActionBar();
actionBar.setCustomView(R.layout.search_edittext);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setBackgroundDrawable(null);
- SearchEditTextLayout searchEditTextLayout =
- (SearchEditTextLayout) actionBar.getCustomView().findViewById(R.id.search_view_container);
+ SearchEditTextLayout searchEditTextLayout = (SearchEditTextLayout) actionBar
+ .getCustomView().findViewById(R.id.search_view_container);
searchEditTextLayout.setPreImeKeyListener(mSearchEditTextLayoutListener);
mActionBarController = new ActionBarController(this, searchEditTextLayout);
@@ -422,7 +422,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mIsLandscape = getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE;
-
+ mPreviouslySelectedTabIndex = ListsFragment.TAB_INDEX_SPEED_DIAL;
final View floatingActionButtonContainer = findViewById(
R.id.floating_action_button_container);
ImageButton floatingActionButton = (ImageButton) findViewById(R.id.floating_action_button);
@@ -468,7 +468,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mSlideIn.setAnimationListener(mSlideInListener);
mSlideOut.setAnimationListener(mSlideOutListener);
- mParentLayout = (FrameLayout) findViewById(R.id.dialtacts_mainlayout);
+ mParentLayout = (CoordinatorLayout) findViewById(R.id.dialtacts_mainlayout);
mParentLayout.setOnDragListener(new LayoutOnDragListener());
floatingActionButtonContainer.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@@ -527,7 +527,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
// This is only called when the activity goes from resumed -> paused -> resumed, so it
// will not cause an extra view to be sent out on rotation
if (mIsDialpadShown) {
- AnalyticsUtil.sendScreenView(mDialpadFragment, this);
+ Logger.logScreenView(ScreenEvent.DIALPAD, this);
}
mIsRestarting = false;
}
@@ -536,15 +536,25 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mDialerDatabaseHelper.startSmartDialUpdateThread();
mFloatingActionButtonController.align(getFabAlignment(), false /* animate */);
- if (getIntent().hasExtra(EXTRA_SHOW_TAB)) {
+ if (Calls.CONTENT_TYPE.equals(getIntent().getType())) {
+ // Externally specified extras take precedence to EXTRA_SHOW_TAB, which is only
+ // used internally.
+ final Bundle extras = getIntent().getExtras();
+ if (extras != null
+ && extras.getInt(Calls.EXTRA_CALL_TYPE_FILTER) == Calls.VOICEMAIL_TYPE) {
+ mListsFragment.showTab(ListsFragment.TAB_INDEX_VOICEMAIL);
+ } else {
+ mListsFragment.showTab(ListsFragment.TAB_INDEX_HISTORY);
+ }
+ } else if (getIntent().hasExtra(EXTRA_SHOW_TAB)) {
int index = getIntent().getIntExtra(EXTRA_SHOW_TAB, ListsFragment.TAB_INDEX_SPEED_DIAL);
if (index < mListsFragment.getTabCount()) {
mListsFragment.showTab(index);
}
- } else if (Calls.CONTENT_TYPE.equals(getIntent().getType())) {
- mListsFragment.showTab(ListsFragment.TAB_INDEX_RECENTS);
}
+ setSearchBoxHint();
+
Trace.endSection();
}
@@ -556,6 +566,11 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
protected void onPause() {
+ // Only clear missed calls if the pause was not triggered by an orientation change
+ // (or any other confirguration change)
+ if (!isChangingConfigurations()) {
+ updateMissedCalls();
+ }
if (mClearSearchOnPause) {
hideDialpadAndSearchUi();
mClearSearchOnPause = false;
@@ -590,6 +605,9 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
} else if (fragment instanceof SmartDialSearchFragment) {
mSmartDialSearchFragment = (SmartDialSearchFragment) fragment;
mSmartDialSearchFragment.setOnPhoneNumberPickerActionListener(this);
+ if (!TextUtils.isEmpty(mDialpadQuery)) {
+ mSmartDialSearchFragment.setAddToContactNumber(mDialpadQuery);
+ }
} else if (fragment instanceof SearchFragment) {
mRegularSearchFragment = (RegularSearchFragment) fragment;
mRegularSearchFragment.setOnPhoneNumberPickerActionListener(this);
@@ -606,67 +624,74 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
public void onClick(View view) {
- switch (view.getId()) {
- case R.id.floating_action_button:
- if (mListsFragment.getCurrentTabIndex()
- == ListsFragment.TAB_INDEX_ALL_CONTACTS && !mInRegularSearch) {
- DialerUtils.startActivityWithErrorToast(
- this,
- IntentUtil.getNewContactIntent(),
- R.string.add_contact_not_available);
- } else if (!mIsDialpadShown) {
- mInCallDialpadUp = false;
- showDialpadFragment(true);
- }
- break;
- case R.id.voice_search_button:
- try {
- startActivityForResult(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH),
- ACTIVITY_REQUEST_CODE_VOICE_SEARCH);
- } catch (ActivityNotFoundException e) {
- Toast.makeText(DialtactsActivity.this, R.string.voice_search_not_available,
- Toast.LENGTH_SHORT).show();
- }
- break;
- case R.id.dialtacts_options_menu_button:
- mOverflowMenu.show();
- break;
- default: {
- Log.wtf(TAG, "Unexpected onClick event from " + view);
- break;
+ int resId = view.getId();
+ if (resId == R.id.floating_action_button) {
+ if (mListsFragment.getCurrentTabIndex()
+ == ListsFragment.TAB_INDEX_ALL_CONTACTS && !mInRegularSearch) {
+ DialerUtils.startActivityWithErrorToast(
+ this,
+ IntentUtil.getNewContactIntent(),
+ R.string.add_contact_not_available);
+ } else if (!mIsDialpadShown) {
+ mInCallDialpadUp = false;
+ showDialpadFragment(true);
+ }
+ } else if (resId == R.id.voice_search_button) {
+ try {
+ startActivityForResult(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH),
+ ACTIVITY_REQUEST_CODE_VOICE_SEARCH);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(DialtactsActivity.this, R.string.voice_search_not_available,
+ Toast.LENGTH_SHORT).show();
}
+ } else if (resId == R.id.dialtacts_options_menu_button) {
+ mOverflowMenu.show();
+ } else {
+ Log.wtf(TAG, "Unexpected onClick event from " + view);
}
}
@Override
public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_history:
- // Use explicit CallLogActivity intent instead of ACTION_VIEW +
- // CONTENT_TYPE, so that we always open our call log from our dialer
- final Intent intent = new Intent(this, CallLogActivity.class);
- startActivity(intent);
- break;
- case R.id.menu_add_contact:
- DialerUtils.startActivityWithErrorToast(
- this,
- IntentUtil.getNewContactIntent(),
- R.string.add_contact_not_available);
- break;
- case R.id.menu_import_export:
- // We hard-code the "contactsAreAvailable" argument because doing it properly would
- // involve querying a {@link ProviderStatusLoader}, which we don't want to do right
- // now in Dialtacts for (potential) performance reasons. Compare with how it is
- // done in {@link PeopleActivity}.
+ if (!isSafeToCommitTransactions()) {
+ return true;
+ }
+
+ int resId = item.getItemId();
+ if (resId == R.id.menu_history) {// Use explicit CallLogActivity intent instead of ACTION_VIEW +
+ // CONTENT_TYPE, so that we always open our call log from our dialer
+ final Intent intent = new Intent(this, CallLogActivity.class);
+ startActivity(intent);
+ } else if (resId == R.id.menu_add_contact) {
+ DialerUtils.startActivityWithErrorToast(
+ this,
+ IntentUtil.getNewContactIntent(),
+ R.string.add_contact_not_available);
+ } else if (resId == R.id.menu_import_export) {// We hard-code the "contactsAreAvailable" argument because doing it properly would
+ // involve querying a {@link ProviderStatusLoader}, which we don't want to do right
+ // now in Dialtacts for (potential) performance reasons. Compare with how it is
+ // done in {@link PeopleActivity}.
+ if (mListsFragment.getCurrentTabIndex() == ListsFragment.TAB_INDEX_SPEED_DIAL) {
ImportExportDialogFragment.show(getFragmentManager(), true,
- DialtactsActivity.class);
- return true;
- case R.id.menu_clear_frequents:
- ClearFrequentsDialog.show(getFragmentManager());
- return true;
- case R.id.menu_call_settings:
- handleMenuSettings();
- return true;
+ DialtactsActivity.class, ImportExportDialogFragment.EXPORT_MODE_FAVORITES);
+ } else {
+ ImportExportDialogFragment.show(getFragmentManager(), true,
+ DialtactsActivity.class, ImportExportDialogFragment.EXPORT_MODE_DEFAULT);
+ }
+ Logger.logScreenView(ScreenEvent.IMPORT_EXPORT_CONTACTS, this);
+ return true;
+ } else if (resId == R.id.menu_clear_frequents) {
+ ClearFrequentsDialog.show(getFragmentManager());
+ Logger.logScreenView(ScreenEvent.CLEAR_FREQUENTS, this);
+ return true;
+ } else if (resId == R.id.menu_call_settings) {
+ handleMenuSettings();
+ Logger.logScreenView(ScreenEvent.SETTINGS, this);
+ return true;
+ } else if (resId == R.id.menu_archive) {
+ final Intent intent = new Intent(this, VoicemailArchiveActivity.class);
+ startActivity(intent);
+ return true;
}
return false;
}
@@ -691,6 +716,14 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
/**
+ * Update the number of unread voicemails (potentially other tabs) displayed next to the tab
+ * icon.
+ */
+ public void updateTabUnreadCounts() {
+ mListsFragment.updateTabUnreadCounts();
+ }
+
+ /**
* Initiates a fragment transaction to show the dialpad fragment. Animations and other visual
* updates are handled by a callback which is invoked after the dialpad fragment is shown.
* @see #onDialpadShown
@@ -712,7 +745,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
mDialpadFragment.setAnimate(animate);
- AnalyticsUtil.sendScreenView(mDialpadFragment);
+ Logger.logScreenView(ScreenEvent.DIALPAD, this);
ft.commit();
if (animate) {
@@ -724,6 +757,9 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mActionBarController.onDialpadUp();
mListsFragment.getView().animate().alpha(0).withLayer();
+
+ //adjust the title, so the user will know where we're at when the activity start/resumes.
+ setTitle(R.string.launcherDialpadActivityLabel);
}
/**
@@ -750,7 +786,13 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
return;
}
if (clearDialpad) {
+ // Temporarily disable accessibility when we clear the dialpad, since it should be
+ // invisible and should not announce anything.
+ mDialpadFragment.getDigitsWidget().setImportantForAccessibility(
+ View.IMPORTANT_FOR_ACCESSIBILITY_NO);
mDialpadFragment.clearDialpad();
+ mDialpadFragment.getDigitsWidget().setImportantForAccessibility(
+ View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
}
if (!mIsDialpadShown) {
return;
@@ -776,6 +818,8 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
exitSearchUi();
}
}
+ //reset the title to normal.
+ setTitle(R.string.launcherActivityLabel);
}
/**
@@ -840,9 +884,30 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
}
+ public boolean isNearbyPlacesSearchEnabled() {
+ return false;
+ }
+
+ protected int getSearchBoxHint () {
+ return R.string.dialer_hint_find_contact;
+ }
+
+ /**
+ * Sets the hint text for the contacts search box
+ */
+ private void setSearchBoxHint() {
+ SearchEditTextLayout searchEditTextLayout = (SearchEditTextLayout) getSupportActionBar()
+ .getCustomView().findViewById(R.id.search_view_container);
+ ((TextView) searchEditTextLayout.findViewById(R.id.search_box_start_search))
+ .setHint(getSearchBoxHint());
+ }
+
protected OptionsPopupMenu buildOptionsMenu(View invoker) {
final OptionsPopupMenu popupMenu = new OptionsPopupMenu(this, invoker);
popupMenu.inflate(R.menu.dialtacts_options);
+ if (ObjectFactory.isVoicemailArchiveEnabled(this)) {
+ popupMenu.getMenu().findItem(R.id.menu_archive).setVisible(true);
+ }
popupMenu.setOnMenuItemClickListener(this);
return popupMenu;
}
@@ -872,7 +937,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
final boolean callKey = Intent.ACTION_CALL_BUTTON.equals(intent.getAction());
if (callKey) {
- getTelecomManager().showInCallScreen(false);
+ TelecomUtil.showInCallScreen(this, false);
return true;
}
@@ -891,11 +956,11 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
return;
}
- final boolean phoneIsInUse = phoneIsInUse();
- if (phoneIsInUse || (intent.getData() != null && isDialIntent(intent))) {
+ final boolean showDialpadChooser = phoneIsInUse() && !DialpadFragment.isAddCallMode(intent);
+ if (showDialpadChooser || (intent.getData() != null && isDialIntent(intent))) {
showDialpadFragment(false);
mDialpadFragment.setStartedFromNewIntent(true);
- if (phoneIsInUse && !mDialpadFragment.isVisible()) {
+ if (showDialpadChooser && !mDialpadFragment.isVisible()) {
mInCallDialpadUp = true;
}
}
@@ -927,16 +992,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
/**
- * Returns an appropriate call origin for this Activity. May return null when no call origin
- * should be used (e.g. when some 3rd party application launched the screen. Call origin is
- * for remembering the tab in which the user made a phone call, so the external app's DIAL
- * request should not be counted.)
- */
- public String getCallOrigin() {
- return !isDialIntent(getIntent()) ? CALL_ORIGIN_DIALTACTS : null;
- }
-
- /**
* Shows the search fragment
*/
private void enterSearchUi(boolean smartDialSearch, String query, boolean animate) {
@@ -979,12 +1034,13 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
if (smartDialSearch) {
fragment = new SmartDialSearchFragment();
} else {
- fragment = new RegularSearchFragment();
+ fragment = ObjectFactory.newRegularSearchFragment();
fragment.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// Show the FAB when the user touches the lists fragment and the soft
// keyboard is hidden.
+ hideDialpadFragment(true, false);
showFabInSearchUi();
return false;
}
@@ -1006,6 +1062,12 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
mListsFragment.getView().animate().alpha(0).withLayer();
}
mListsFragment.setUserVisibleHint(false);
+
+ if (smartDialSearch) {
+ Logger.logScreenView(ScreenEvent.SMART_DIAL_SEARCH, this);
+ } else {
+ Logger.logScreenView(ScreenEvent.REGULAR_SEARCH, this);
+ }
}
/**
@@ -1103,6 +1165,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
public void onDialpadQueryChanged(String query) {
+ mDialpadQuery = query;
if (mSmartDialSearchFragment != null) {
mSmartDialSearchFragment.setAddToContactNumber(query);
}
@@ -1162,7 +1225,7 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
private boolean phoneIsInUse() {
- return getTelecomManager().isInCall();
+ return TelecomUtil.isInCall(this);
}
private boolean canIntentBeHandled(Intent intent) {
@@ -1224,29 +1287,25 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
@Override
- public void onPickPhoneNumberAction(Uri dataUri) {
- // Specify call-origin so that users will see the previous tab instead of
- // CallLog screen (search UI will be automatically exited).
- PhoneNumberInteraction.startInteractionForPhoneCall(
- DialtactsActivity.this, dataUri, getCallOrigin());
+ public void onPickDataUri(Uri dataUri, boolean isVideoCall, int callInitiationType) {
mClearSearchOnPause = true;
+ PhoneNumberInteraction.startInteractionForPhoneCall(
+ DialtactsActivity.this, dataUri, isVideoCall, callInitiationType);
}
@Override
- public void onCallNumberDirectly(String phoneNumber) {
- onCallNumberDirectly(phoneNumber, false /* isVideoCall */);
- }
-
- @Override
- public void onCallNumberDirectly(String phoneNumber, boolean isVideoCall) {
+ public void onPickPhoneNumber(String phoneNumber, boolean isVideoCall, int callInitiationType) {
if (phoneNumber == null) {
// Invalid phone number, but let the call go through so that InCallUI can show
// an error message.
phoneNumber = "";
}
- Intent intent = isVideoCall ?
- IntentUtil.getVideoCallIntent(phoneNumber, getCallOrigin()) :
- IntentUtil.getCallIntent(phoneNumber, getCallOrigin());
+
+ final Intent intent = new CallIntentBuilder(phoneNumber)
+ .setIsVideoCall(isVideoCall)
+ .setCallInitiationType(callInitiationType)
+ .build();
+
DialerUtils.startActivityWithErrorToast(this, intent);
mClearSearchOnPause = true;
}
@@ -1265,13 +1324,13 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
int tabIndex = mListsFragment.getCurrentTabIndex();
- // Scroll the button from center to end when moving from the Speed Dial to Recents tab.
- // In RTL, scroll when the current tab is Recents instead of Speed Dial, because the order
- // of the tabs is reversed and the ViewPager returns the left tab position during scroll.
+ // Scroll the button from center to end when moving from the Speed Dial to Call History tab.
+ // In RTL, scroll when the current tab is Call History instead, since the order of the tabs
+ // is reversed and the ViewPager returns the left tab position during scroll.
boolean isRtl = DialerUtils.isRtl();
if (!isRtl && tabIndex == ListsFragment.TAB_INDEX_SPEED_DIAL && !mIsLandscape) {
mFloatingActionButtonController.onPageScrolled(positionOffset);
- } else if (isRtl && tabIndex == ListsFragment.TAB_INDEX_RECENTS && !mIsLandscape) {
+ } else if (isRtl && tabIndex == ListsFragment.TAB_INDEX_HISTORY && !mIsLandscape) {
mFloatingActionButtonController.onPageScrolled(1 - positionOffset);
} else if (tabIndex != ListsFragment.TAB_INDEX_SPEED_DIAL) {
mFloatingActionButtonController.onPageScrolled(1);
@@ -1280,7 +1339,9 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
public void onPageSelected(int position) {
+ updateMissedCalls();
int tabIndex = mListsFragment.getCurrentTabIndex();
+ mPreviouslySelectedTabIndex = tabIndex;
if (tabIndex == ListsFragment.TAB_INDEX_ALL_CONTACTS) {
mFloatingActionButtonController.changeIcon(
getResources().getDrawable(R.drawable.ic_person_add_24dp),
@@ -1296,10 +1357,6 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
public void onPageScrollStateChanged(int state) {
}
- private TelecomManager getTelecomManager() {
- return (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
- }
-
@Override
public boolean isActionBarShowing() {
return mActionBarController.isActionBarShowing();
@@ -1325,12 +1382,12 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
@Override
public int getActionBarHideOffset() {
- return getActionBar().getHideOffset();
+ return getSupportActionBar().getHideOffset();
}
@Override
public void setActionBarHideOffset(int offset) {
- getActionBar().setHideOffset(offset);
+ getSupportActionBar().setHideOffset(offset);
}
@Override
@@ -1345,4 +1402,10 @@ public class DialtactsActivity extends TransactionSafeActivity implements View.O
}
return FloatingActionButtonController.ALIGN_END;
}
+
+ private void updateMissedCalls() {
+ if (mPreviouslySelectedTabIndex == ListsFragment.TAB_INDEX_HISTORY) {
+ mListsFragment.markMissedCallsAsReadAndRemoveNotifications();
+ }
+ }
}
diff --git a/src/com/android/dialer/FloatingActionButtonBehavior.java b/src/com/android/dialer/FloatingActionButtonBehavior.java
new file mode 100644
index 000000000..679c9a7c1
--- /dev/null
+++ b/src/com/android/dialer/FloatingActionButtonBehavior.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer;
+
+import android.content.Context;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.design.widget.Snackbar.SnackbarLayout;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.FrameLayout;
+
+/**
+ * Implements custom behavior for the movement of the FAB in response to the Snackbar.
+ * Because we are not using the design framework FloatingActionButton widget, we need to manually
+ * implement the Material Design behavior of having the FAB translate upward and downward with
+ * the appearance and disappearance of a Snackbar.
+ */
+public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FrameLayout> {
+ public FloatingActionButtonBehavior(Context context, AttributeSet attrs) {
+ }
+
+ @Override
+ public boolean layoutDependsOn(CoordinatorLayout parent, FrameLayout child, View dependency) {
+ return dependency instanceof SnackbarLayout;
+ }
+
+ @Override
+ public boolean onDependentViewChanged(CoordinatorLayout parent, FrameLayout child,
+ View dependency) {
+ float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
+ child.setTranslationY(translationY);
+ return true;
+ }
+}
diff --git a/src/com/android/dialer/PhoneCallDetails.java b/src/com/android/dialer/PhoneCallDetails.java
index 403c4e86c..17f1c2b64 100644
--- a/src/com/android/dialer/PhoneCallDetails.java
+++ b/src/com/android/dialer/PhoneCallDetails.java
@@ -16,12 +16,18 @@
package com.android.dialer;
+import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.calllog.PhoneNumberDisplayUtil;
import android.content.Context;
+import android.content.res.Resources;
import android.net.Uri;
import android.provider.CallLog.Calls;
+import android.support.annotation.Nullable;
import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
/**
* The details of a phone call to be shown in the UI.
@@ -29,6 +35,10 @@ import android.telecom.PhoneAccountHandle;
public class PhoneCallDetails {
// The number of the other party involved in the call.
public CharSequence number;
+ // Post-dial digits associated with the outgoing call.
+ public String postDialDigits;
+ // The secondary line number the call was received via.
+ public String viaNumber;
// The number presenting rules set by the network, e.g., {@link Calls#PRESENTATION_ALLOWED}
public int numberPresentation;
// The formatted version of {@link #number}.
@@ -50,7 +60,14 @@ public class PhoneCallDetails {
// The duration of the call in milliseconds, or 0 for missed calls.
public long duration;
// The name of the contact, or the empty string.
- public CharSequence name;
+ public CharSequence namePrimary;
+ // The alternative name of the contact, e.g. last name first, or the empty string
+ public CharSequence nameAlternative;
+ /**
+ * The user's preference on name display order, last name first or first time first.
+ * {@see ContactsPreferences}
+ */
+ public int nameDisplayOrder;
// The type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available.
public int numberType;
// The custom label associated with the phone number in the contact, or the empty string.
@@ -90,6 +107,9 @@ public class PhoneCallDetails {
// Whether the contact number is a voicemail number.
public boolean isVoicemail;
+ /** The {@link UserType} of the contact */
+ public @UserType long contactUserType;
+
/**
* If this is a voicemail, whether the message is read. For other types of calls, this defaults
* to {@code true}.
@@ -105,16 +125,60 @@ public class PhoneCallDetails {
CharSequence number,
int numberPresentation,
CharSequence formattedNumber,
+ CharSequence postDialDigits,
boolean isVoicemail) {
this.number = number;
this.numberPresentation = numberPresentation;
this.formattedNumber = formattedNumber;
this.isVoicemail = isVoicemail;
+ this.postDialDigits = postDialDigits.toString();
this.displayNumber = PhoneNumberDisplayUtil.getDisplayNumber(
context,
this.number,
this.numberPresentation,
this.formattedNumber,
+ this.postDialDigits,
this.isVoicemail).toString();
}
+
+ /**
+ * Returns the preferred name for the call details as specified by the
+ * {@link #nameDisplayOrder}
+ *
+ * @return the preferred name
+ */
+ public CharSequence getPreferredName() {
+ if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
+ || TextUtils.isEmpty(nameAlternative)) {
+ return namePrimary;
+ }
+ return nameAlternative;
+ }
+
+ /**
+ * Construct the "on {accountLabel} via {viaNumber}" accessibility description for the account
+ * list item, depending on the existence of the accountLabel and viaNumber.
+ * @param viaNumber The number that this call is being placed via.
+ * @param accountLabel The {@link PhoneAccount} label that this call is being placed with.
+ * @return The description of the account that this call has been placed on.
+ */
+ public static CharSequence createAccountLabelDescription(Resources resources,
+ @Nullable String viaNumber, @Nullable CharSequence accountLabel) {
+
+ if((!TextUtils.isEmpty(viaNumber)) && !TextUtils.isEmpty(accountLabel)) {
+ String msg = resources.getString(R.string.description_via_number_phone_account,
+ accountLabel, viaNumber);
+ CharSequence accountNumberLabel = ContactDisplayUtils.getTelephoneTtsSpannable(msg,
+ viaNumber);
+ return (accountNumberLabel == null) ? msg : accountNumberLabel;
+ } else if (!TextUtils.isEmpty(viaNumber)) {
+ CharSequence viaNumberLabel = ContactDisplayUtils.getTtsSpannedPhoneNumber(resources,
+ R.string.description_via_number, viaNumber);
+ return (viaNumberLabel == null) ? viaNumber : viaNumberLabel;
+ } else if (!TextUtils.isEmpty(accountLabel)) {
+ return TextUtils.expandTemplate(
+ resources.getString(R.string.description_phone_account), accountLabel);
+ }
+ return "";
+ }
}
diff --git a/src/com/android/dialer/SpecialCharSequenceMgr.java b/src/com/android/dialer/SpecialCharSequenceMgr.java
index 31aa5c3c7..4303f3e1f 100644
--- a/src/com/android/dialer/SpecialCharSequenceMgr.java
+++ b/src/com/android/dialer/SpecialCharSequenceMgr.java
@@ -32,7 +32,6 @@ import android.os.Looper;
import android.provider.Settings;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -42,13 +41,15 @@ import android.widget.EditText;
import android.widget.Toast;
import com.android.common.io.MoreCloseables;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.TelephonyManagerCompat;
import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler;
+import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment;
import com.android.contacts.common.widget.SelectPhoneAccountDialogFragment.SelectPhoneAccountListener;
import com.android.dialer.calllog.PhoneAccountUtils;
import com.android.dialer.util.TelecomUtil;
-import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
@@ -91,13 +92,13 @@ public class SpecialCharSequenceMgr {
private static QueryHandler sPreviousAdnQueryHandler;
public static class HandleAdnEntryAccountSelectedCallback extends SelectPhoneAccountListener{
- final private TelecomManager mTelecomManager;
+ final private Context mContext;
final private QueryHandler mQueryHandler;
final private SimContactQueryCookie mCookie;
- public HandleAdnEntryAccountSelectedCallback(TelecomManager telecomManager,
+ public HandleAdnEntryAccountSelectedCallback(Context context,
QueryHandler queryHandler, SimContactQueryCookie cookie) {
- mTelecomManager = telecomManager;
+ mContext = context;
mQueryHandler = queryHandler;
mCookie = cookie;
}
@@ -105,7 +106,7 @@ public class SpecialCharSequenceMgr {
@Override
public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle,
boolean setDefault) {
- Uri uri = mTelecomManager.getAdnUriForPhoneAccount(selectedAccountHandle);
+ Uri uri = TelecomUtil.getAdnUriForPhoneAccount(mContext, selectedAccountHandle);
handleAdnQuery(mQueryHandler, mCookie, uri);
// TODO: Show error dialog if result isn't valid.
}
@@ -225,7 +226,7 @@ public class SpecialCharSequenceMgr {
// the dialer text field.
// create the async query handler
- final QueryHandler handler = new QueryHandler (context.getContentResolver());
+ final QueryHandler handler = new QueryHandler(context.getContentResolver());
// create the cookie object
final SimContactQueryCookie sc = new SimContactQueryCookie(index - 1, handler,
@@ -245,27 +246,24 @@ public class SpecialCharSequenceMgr {
sc.progressDialog.getWindow().addFlags(
WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
- final TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
List<PhoneAccountHandle> subscriptionAccountHandles =
PhoneAccountUtils.getSubscriptionPhoneAccounts(context);
-
+ Context applicationContext = context.getApplicationContext();
boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
- telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
+ TelecomUtil.getDefaultOutgoingPhoneAccount(applicationContext,
+ PhoneAccount.SCHEME_TEL));
- if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
- Uri uri = telecomManager.getAdnUriForPhoneAccount(null);
+ if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) {
+ Uri uri = TelecomUtil.getAdnUriForPhoneAccount(applicationContext, null);
handleAdnQuery(handler, sc, uri);
- } else if (subscriptionAccountHandles.size() > 1){
- SelectPhoneAccountListener callback =
- new HandleAdnEntryAccountSelectedCallback(telecomManager, handler, sc);
+ } else {
+ SelectPhoneAccountListener callback = new HandleAdnEntryAccountSelectedCallback(
+ applicationContext, handler, sc);
DialogFragment dialogFragment = SelectPhoneAccountDialogFragment.newInstance(
subscriptionAccountHandles, callback);
dialogFragment.show(((Activity) context).getFragmentManager(),
TAG_SELECT_ACCT_FRAGMENT);
- } else {
- return false;
}
return true;
@@ -299,18 +297,16 @@ public class SpecialCharSequenceMgr {
static boolean handlePinEntry(final Context context, final String input) {
if ((input.startsWith("**04") || input.startsWith("**05")) && input.endsWith("#")) {
- final TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
List<PhoneAccountHandle> subscriptionAccountHandles =
PhoneAccountUtils.getSubscriptionPhoneAccounts(context);
boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
- telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
+ TelecomUtil.getDefaultOutgoingPhoneAccount(context, PhoneAccount.SCHEME_TEL));
- if (subscriptionAccountHandles.size() == 1 || hasUserSelectedDefault) {
+ if (subscriptionAccountHandles.size() <= 1 || hasUserSelectedDefault) {
// Don't bring up the dialog for single-SIM or if the default outgoing account is
// a subscription account.
return TelecomUtil.handleMmi(context, input, null);
- } else if (subscriptionAccountHandles.size() > 1){
+ } else {
SelectPhoneAccountListener listener =
new HandleMmiAccountSelectedCallback(context, input);
@@ -335,11 +331,17 @@ public class SpecialCharSequenceMgr {
R.string.imei : R.string.meid;
List<String> deviceIds = new ArrayList<String>();
- for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) {
- String deviceId = telephonyManager.getDeviceId(slot);
- if (!TextUtils.isEmpty(deviceId)) {
- deviceIds.add(deviceId);
+ if (TelephonyManagerCompat.getPhoneCount(telephonyManager) > 1 &&
+ CompatUtils.isMethodAvailable(TelephonyManagerCompat.TELEPHONY_MANAGER_CLASS,
+ "getDeviceId", Integer.TYPE)) {
+ for (int slot = 0; slot < telephonyManager.getPhoneCount(); slot++) {
+ String deviceId = telephonyManager.getDeviceId(slot);
+ if (!TextUtils.isEmpty(deviceId)) {
+ deviceIds.add(deviceId);
+ }
}
+ } else {
+ deviceIds.add(telephonyManager.getDeviceId());
}
AlertDialog alert = new AlertDialog.Builder(context)
@@ -478,9 +480,9 @@ public class SpecialCharSequenceMgr {
// display the name as a toast
Context context = sc.progressDialog.getContext();
- name = context.getString(R.string.menu_callNumber, name);
- Toast.makeText(context, name, Toast.LENGTH_SHORT)
- .show();
+ CharSequence msg = ContactDisplayUtils.getTtsSpannedPhoneNumber(
+ context.getResources(), R.string.menu_callNumber, name);
+ Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
} finally {
MoreCloseables.closeQuietly(c);
diff --git a/src/com/android/dialer/TransactionSafeActivity.java b/src/com/android/dialer/TransactionSafeActivity.java
new file mode 100644
index 000000000..81e50128d
--- /dev/null
+++ b/src/com/android/dialer/TransactionSafeActivity.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * A common superclass that keeps track of whether an {@link Activity} has saved its state yet or
+ * not.
+ */
+public abstract class TransactionSafeActivity extends AppCompatActivity {
+
+ private boolean mIsSafeToCommitTransactions;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mIsSafeToCommitTransactions = true;
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mIsSafeToCommitTransactions = true;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mIsSafeToCommitTransactions = true;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mIsSafeToCommitTransactions = false;
+ }
+
+ /**
+ * Returns true if it is safe to commit {@link FragmentTransaction}s at this time, based on
+ * whether {@link Activity#onSaveInstanceState} has been called or not.
+ *
+ * Make sure that the current activity calls into
+ * {@link super.onSaveInstanceState(Bundle outState)} (if that method is overridden),
+ * so the flag is properly set.
+ */
+ public boolean isSafeToCommitTransactions() {
+ return mIsSafeToCommitTransactions;
+ }
+}
diff --git a/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java b/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
index 3b488a8ae..ac56332ce 100644
--- a/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
+++ b/src/com/android/dialer/calllog/CallDetailHistoryAdapter.java
@@ -38,8 +38,6 @@ import java.util.ArrayList;
* Adapter for a ListView containing history items from the details of a call.
*/
public class CallDetailHistoryAdapter extends BaseAdapter {
- /** The top element is a blank header, which is hidden under the rest of the UI. */
- private static final int VIEW_TYPE_HEADER = 0;
/** Each history item shows the detail of a call. */
private static final int VIEW_TYPE_HISTORY_ITEM = 1;
@@ -69,53 +67,37 @@ public class CallDetailHistoryAdapter extends BaseAdapter {
@Override
public int getCount() {
- return mPhoneCallDetails.length + 1;
+ return mPhoneCallDetails.length;
}
@Override
public Object getItem(int position) {
- if (position == 0) {
- return null;
- }
- return mPhoneCallDetails[position - 1];
+ return mPhoneCallDetails[position];
}
@Override
public long getItemId(int position) {
- if (position == 0) {
- return -1;
- }
- return position - 1;
+ return position;
}
@Override
public int getViewTypeCount() {
- return 2;
+ return 1;
}
@Override
public int getItemViewType(int position) {
- if (position == 0) {
- return VIEW_TYPE_HEADER;
- }
return VIEW_TYPE_HISTORY_ITEM;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- if (position == 0) {
- final View header = convertView == null
- ? mLayoutInflater.inflate(R.layout.call_detail_history_header, parent, false)
- : convertView;
- return header;
- }
-
// Make sure we have a valid convertView to start with
final View result = convertView == null
? mLayoutInflater.inflate(R.layout.call_detail_history_item, parent, false)
: convertView;
- PhoneCallDetails details = mPhoneCallDetails[position - 1];
+ PhoneCallDetails details = mPhoneCallDetails[position];
CallTypeIconsView callTypeIconView =
(CallTypeIconsView) result.findViewById(R.id.call_type_icon);
TextView callTypeTextView = (TextView) result.findViewById(R.id.call_type_text);
diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java
index 97e601630..1823a5bd3 100644
--- a/src/com/android/dialer/calllog/CallLogActivity.java
+++ b/src/com/android/dialer/calllog/CallLogActivity.java
@@ -15,7 +15,6 @@
*/
package com.android.dialer.calllog;
-import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
@@ -27,6 +26,7 @@ import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
+import android.support.v7.app.ActionBar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -39,11 +39,12 @@ import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.commonbind.analytics.AnalyticsUtil;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
+import com.android.dialer.TransactionSafeActivity;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.util.DialerUtils;
-import com.android.dialer.voicemail.VoicemailStatusHelper;
-import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
-public class CallLogActivity extends Activity implements ViewPager.OnPageChangeListener {
+public class CallLogActivity extends TransactionSafeActivity implements ViewPager.OnPageChangeListener {
private ViewPager mViewPager;
private ViewPagerTabs mViewPagerTabs;
private ViewPagerAdapter mViewPagerAdapter;
@@ -73,9 +74,10 @@ public class CallLogActivity extends Activity implements ViewPager.OnPageChangeL
public Fragment getItem(int position) {
switch (getRtlPosition(position)) {
case TAB_INDEX_ALL:
- return new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
+ return new CallLogFragment(
+ CallLogQueryHandler.CALL_TYPE_ALL, true /* isCallLogActivity */);
case TAB_INDEX_MISSED:
- return new CallLogFragment(Calls.MISSED_TYPE);
+ return new CallLogFragment(Calls.MISSED_TYPE, true /* isCallLogActivity */);
}
throw new IllegalStateException("No fragment at position " + position);
}
@@ -121,7 +123,7 @@ public class CallLogActivity extends Activity implements ViewPager.OnPageChangeL
setContentView(R.layout.call_log_activity);
getWindow().setBackgroundDrawable(null);
- final ActionBar actionBar = getActionBar();
+ final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowHomeEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
@@ -186,15 +188,18 @@ public class CallLogActivity extends Activity implements ViewPager.OnPageChangeL
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- final Intent intent = new Intent(this, DialtactsActivity.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivity(intent);
- return true;
- case R.id.delete_all:
- ClearCallLogDialog.show(getFragmentManager());
- return true;
+ if (!isSafeToCommitTransactions()) {
+ return true;
+ }
+
+ if (item.getItemId() == android.R.id.home) {
+ final Intent intent = new Intent(this, DialtactsActivity.class);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ return true;
+ } else if (item.getItemId() == R.id.delete_all) {
+ ClearCallLogDialog.show(getFragmentManager());
+ return true;
}
return super.onOptionsItemSelected(item);
}
@@ -218,22 +223,7 @@ public class CallLogActivity extends Activity implements ViewPager.OnPageChangeL
}
private void sendScreenViewForChildFragment(int position) {
- AnalyticsUtil.sendScreenView(CallLogFragment.class.getSimpleName(), this,
- getFragmentTagForPosition(position));
- }
-
- /**
- * Returns the fragment located at the given position in the {@link ViewPagerAdapter}. May
- * be null if the position is invalid.
- */
- private String getFragmentTagForPosition(int position) {
- switch (position) {
- case TAB_INDEX_ALL:
- return "All";
- case TAB_INDEX_MISSED:
- return "Missed";
- }
- return null;
+ Logger.logScreenView(ScreenEvent.CALL_LOG_FILTER, this);
}
private int getRtlPosition(int position) {
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index 5a87bc8ce..3958611b9 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -16,75 +16,81 @@
package com.android.dialer.calllog;
+import com.google.common.annotations.VisibleForTesting;
+
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.support.v7.widget.RecyclerView;
import android.os.Bundle;
import android.os.Trace;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.provider.CallLog;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.telecom.PhoneAccountHandle;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
-import android.util.Log;
-import android.view.ContextMenu;
+import android.util.ArrayMap;
import android.view.LayoutInflater;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.AccessibilityDelegate;
import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.view.ContextMenu.ContextMenuInfo;
import android.view.accessibility.AccessibilityEvent;
-import com.android.contacts.common.CallUtil;
-import com.android.contacts.common.ClipboardUtils;
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.preference.ContactsPreferences;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.R;
+import com.android.dialer.calllog.calllogcache.CallLogCache;
import com.android.dialer.contactinfo.ContactInfoCache;
import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.VoicemailArchiveContract;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment.Callback;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.service.ExtendedBlockingButtonRenderer;
import com.android.dialer.util.PhoneNumberUtil;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
-import com.google.common.annotations.VisibleForTesting;
-
import java.util.HashMap;
+import java.util.Map;
/**
* Adapter class to fill in data for the Call Log.
*/
public class CallLogAdapter extends GroupingListAdapter
implements CallLogGroupBuilder.GroupCreator,
- VoicemailPlaybackPresenter.OnVoicemailDeletedListener {
+ VoicemailPlaybackPresenter.OnVoicemailDeletedListener,
+ ExtendedBlockingButtonRenderer.Listener {
+
+ // Types of activities the call log adapter is used for
+ public static final int ACTIVITY_TYPE_CALL_LOG = 1;
+ public static final int ACTIVITY_TYPE_ARCHIVE = 2;
+ public static final int ACTIVITY_TYPE_DIALTACTS = 3;
/** Interface used to initiate a refresh of the content. */
public interface CallFetcher {
public void fetchCalls();
}
- private static final int VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM = 10;
private static final int NO_EXPANDED_LIST_ITEM = -1;
+ // ConcurrentHashMap doesn't store null values. Use this value for numbers which aren't blocked.
+ private static final int NOT_BLOCKED = -1;
private static final int VOICEMAIL_PROMO_CARD_POSITION = 0;
- /**
- * View type for voicemail promo card. Note: Numbering starts at 20 to avoid collision
- * with {@link com.android.common.widget.GroupingListAdapter#ITEM_TYPE_IN_GROUP}, and
- * {@link CallLogAdapter#VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM}.
- */
- private static final int VIEW_TYPE_VOICEMAIL_PROMO_CARD = 20;
+
+ protected static final int VIEW_TYPE_NORMAL = 0;
+ private static final int VIEW_TYPE_VOICEMAIL_PROMO_CARD = 1;
/**
* The key for the show voicemail promo card preference which will determine whether the promo
@@ -95,12 +101,14 @@ public class CallLogAdapter extends GroupingListAdapter
protected final Context mContext;
private final ContactInfoHelper mContactInfoHelper;
- private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+ protected final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
private final CallFetcher mCallFetcher;
+ private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+ private final Map<String, Boolean> mBlockedNumberCache = new ArrayMap<>();
protected ContactInfoCache mContactInfoCache;
- private boolean mIsShowingRecentsTab;
+ private final int mActivityType;
private static final String KEY_EXPANDED_POSITION = "expanded_position";
private static final String KEY_EXPANDED_ROW_ID = "expanded_row_id";
@@ -110,6 +118,9 @@ public class CallLogAdapter extends GroupingListAdapter
// Tracks the rowId of the currently expanded list item, so the position can be updated if there
// are any changes to the call log entries, such as additions or removals.
private long mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
+ private int mHiddenPosition = RecyclerView.NO_POSITION;
+ private Uri mHiddenItemUri = null;
+ private boolean mPendingHide = false;
/**
* Hashmap, keyed by call Id, used to track the day group for a call. As call log entries are
@@ -123,19 +134,21 @@ public class CallLogAdapter extends GroupingListAdapter
* its day group. This hashmap provides a means of determining the previous day group without
* having to reverse the cursor to the start of the previous day call log entry.
*/
- private HashMap<Long,Integer> mDayGroups = new HashMap<Long, Integer>();
+ private HashMap<Long, Integer> mDayGroups = new HashMap<>();
private boolean mLoading = true;
private SharedPreferences mPrefs;
- private boolean mShowPromoCard = false;
+ private ContactsPreferences mContactsPreferences;
+
+ protected boolean mShowVoicemailPromoCard = false;
/** Instance of helper class for managing views. */
private final CallLogListItemHelper mCallLogListItemHelper;
- /** Cache for repeated requests to TelecomManager. */
- protected final TelecomCallLogCache mTelecomCallLogCache;
+ /** Cache for repeated requests to Telecom/Telephony. */
+ protected final CallLogCache mCallLogCache;
/** Helper to group call log entries. */
private final CallLogGroupBuilder mCallLogGroupBuilder;
@@ -163,6 +176,12 @@ public class CallLogAdapter extends GroupingListAdapter
mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
} else {
+ if (viewHolder.callType == CallLog.Calls.MISSED_TYPE) {
+ CallLogAsyncTaskUtil.markCallAsRead(mContext, viewHolder.callIds);
+ if (mActivityType == ACTIVITY_TYPE_DIALTACTS) {
+ ((DialtactsActivity) v.getContext()).updateTabUnreadCounts();
+ }
+ }
expandViewHolderActions(viewHolder);
}
@@ -193,68 +212,6 @@ public class CallLogAdapter extends GroupingListAdapter
}
};
- /**
- * Listener that is triggered to populate the context menu with actions to perform on the call's
- * number, when the call log entry is long pressed.
- */
- private final View.OnCreateContextMenuListener mOnCreateContextMenuListener =
- new View.OnCreateContextMenuListener() {
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- final CallLogListItemViewHolder vh =
- (CallLogListItemViewHolder) v.getTag();
- if (TextUtils.isEmpty(vh.number)) {
- return;
- }
-
- menu.setHeaderTitle(vh.number);
-
- final MenuItem copyItem = menu.add(
- ContextMenu.NONE,
- R.id.context_menu_copy_to_clipboard,
- ContextMenu.NONE,
- R.string.copy_text);
-
- copyItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- ClipboardUtils.copyText(CallLogAdapter.this.mContext, null,
- vh.number, true);
- return true;
- }
- });
-
- // The edit number before call does not show up if any of the conditions apply:
- // 1) Number cannot be called
- // 2) Number is the voicemail number
- // 3) Number is a SIP address
-
- if (!PhoneNumberUtil.canPlaceCallsTo(vh.number, vh.numberPresentation)
- || mTelecomCallLogCache.isVoicemailNumber(vh.accountHandle, vh.number)
- || PhoneNumberUtil.isSipNumber(vh.number)) {
- return;
- }
-
- final MenuItem editItem = menu.add(
- ContextMenu.NONE,
- R.id.context_menu_edit_before_call,
- ContextMenu.NONE,
- R.string.recentCalls_editNumberBeforeCall);
-
- editItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- final Intent intent = new Intent(Intent.ACTION_DIAL,
- CallUtil.getCallUri(vh.number));
- intent.setClass(mContext, DialtactsActivity.class);
- DialerUtils.startActivityWithErrorToast(mContext, intent);
- return true;
- }
- });
- }
- };
-
private void expandViewHolderActions(CallLogListItemViewHolder viewHolder) {
// If another item is expanded, notify it that it has changed. Its actions will be
// hidden when it is re-binded because we change mCurrentlyExpandedPosition below.
@@ -279,6 +236,11 @@ public class CallLogAdapter extends GroupingListAdapter
// function on clicks causes the action views to lose the focus indicator.
CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder) host.getTag();
if (mCurrentlyExpandedPosition != viewHolder.getAdapterPosition()) {
+ if (mVoicemailPlaybackPresenter != null) {
+ // Always reset the voicemail playback state on expand.
+ mVoicemailPlaybackPresenter.resetAll();
+ }
+
expandViewHolderActions((CallLogListItemViewHolder) host.getTag());
}
}
@@ -299,7 +261,7 @@ public class CallLogAdapter extends GroupingListAdapter
CallFetcher callFetcher,
ContactInfoHelper contactInfoHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter,
- boolean isShowingRecentsTab) {
+ int activityType) {
super(context);
mContext = context;
@@ -309,7 +271,8 @@ public class CallLogAdapter extends GroupingListAdapter
if (mVoicemailPlaybackPresenter != null) {
mVoicemailPlaybackPresenter.setOnVoicemailDeletedListener(this);
}
- mIsShowingRecentsTab = isShowingRecentsTab;
+
+ mActivityType = activityType;
mContactInfoCache = new ContactInfoCache(
mContactInfoHelper, mOnContactInfoChangedListener);
@@ -320,13 +283,18 @@ public class CallLogAdapter extends GroupingListAdapter
Resources resources = mContext.getResources();
CallTypeHelper callTypeHelper = new CallTypeHelper(resources);
- mTelecomCallLogCache = new TelecomCallLogCache(mContext);
+ mCallLogCache = CallLogCache.getCallLogCache(mContext);
+
PhoneCallDetailsHelper phoneCallDetailsHelper =
- new PhoneCallDetailsHelper(mContext, resources, mTelecomCallLogCache);
+ new PhoneCallDetailsHelper(mContext, resources, mCallLogCache);
mCallLogListItemHelper =
- new CallLogListItemHelper(phoneCallDetailsHelper, resources, mTelecomCallLogCache);
+ new CallLogListItemHelper(phoneCallDetailsHelper, resources, mCallLogCache);
mCallLogGroupBuilder = new CallLogGroupBuilder(this);
+ mFilteredNumberAsyncQueryHandler =
+ new FilteredNumberAsyncQueryHandler(mContext.getContentResolver());
+
mPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ mContactsPreferences = new ContactsPreferences(mContext);
maybeShowVoicemailPromoCard();
}
@@ -344,6 +312,24 @@ public class CallLogAdapter extends GroupingListAdapter
}
}
+ @Override
+ public void onBlockedNumber(String number,String countryIso) {
+ String cacheKey = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ if (!TextUtils.isEmpty(cacheKey)) {
+ mBlockedNumberCache.put(cacheKey, true);
+ notifyDataSetChanged();
+ }
+ }
+
+ @Override
+ public void onUnblockedNumber( String number, String countryIso) {
+ String cacheKey = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ if (!TextUtils.isEmpty(cacheKey)) {
+ mBlockedNumberCache.put(cacheKey, false);
+ notifyDataSetChanged();
+ }
+ }
+
/**
* Requery on background thread when {@link Cursor} changes.
*/
@@ -369,15 +355,25 @@ public class CallLogAdapter extends GroupingListAdapter
mContactInfoCache.invalidate();
}
- public void startCache() {
+ public void onResume() {
if (PermissionsUtil.hasPermission(mContext, android.Manifest.permission.READ_CONTACTS)) {
mContactInfoCache.start();
}
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ }
+
+ public void onPause() {
+ pauseCache();
+
+ if (mHiddenItemUri != null) {
+ CallLogAsyncTaskUtil.deleteVoicemail(mContext, mHiddenItemUri, null);
+ }
}
- public void pauseCache() {
+ @VisibleForTesting
+ /* package */ void pauseCache() {
mContactInfoCache.stop();
- mTelecomCallLogCache.reset();
+ mCallLogCache.reset();
}
@Override
@@ -386,10 +382,13 @@ public class CallLogAdapter extends GroupingListAdapter
}
@Override
+ public void addVoicemailGroups(Cursor cursor) {
+ mCallLogGroupBuilder.addVoicemailGroups(cursor);
+ }
+
+ @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- if (viewType == VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM) {
- return ShowCallHistoryViewHolder.create(mContext, parent);
- } else if (viewType == VIEW_TYPE_VOICEMAIL_PROMO_CARD) {
+ if (viewType == VIEW_TYPE_VOICEMAIL_PROMO_CARD) {
return createVoicemailPromoCardViewHolder(parent);
}
return createCallLogEntryViewHolder(parent);
@@ -407,15 +406,32 @@ public class CallLogAdapter extends GroupingListAdapter
CallLogListItemViewHolder viewHolder = CallLogListItemViewHolder.create(
view,
mContext,
+ this,
mExpandCollapseListener,
- mTelecomCallLogCache,
+ mCallLogCache,
mCallLogListItemHelper,
- mVoicemailPlaybackPresenter);
+ mVoicemailPlaybackPresenter,
+ mFilteredNumberAsyncQueryHandler,
+ new Callback() {
+ @Override
+ public void onFilterNumberSuccess() {
+ Logger.logInteraction(
+ InteractionEvent.BLOCK_NUMBER_CALL_LOG);
+ }
+
+ @Override
+ public void onUnfilterNumberSuccess() {
+ Logger.logInteraction(
+ InteractionEvent.UNBLOCK_NUMBER_CALL_LOG);
+ }
+
+ @Override
+ public void onChangeFilteredNumberUndo() {}
+ }, mActivityType == ACTIVITY_TYPE_ARCHIVE);
viewHolder.callLogEntryView.setTag(viewHolder);
viewHolder.callLogEntryView.setAccessibilityDelegate(mAccessibilityDelegate);
- viewHolder.primaryActionView.setOnCreateContextMenuListener(mOnCreateContextMenuListener);
viewHolder.primaryActionView.setTag(viewHolder);
return viewHolder;
@@ -426,15 +442,14 @@ public class CallLogAdapter extends GroupingListAdapter
* TODO: This gets called 20-30 times when Dialer starts up for a single call log entry and
* should not. It invokes cross-process methods and the repeat execution can get costly.
*
- * @param ViewHolder The view corresponding to this entry.
+ * @param viewHolder The view corresponding to this entry.
* @param position The position of the entry.
*/
+ @Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
Trace.beginSection("onBindViewHolder: " + position);
switch (getItemViewType(position)) {
- case VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM:
- break;
case VIEW_TYPE_VOICEMAIL_PROMO_CARD:
bindVoicemailPromoCardViewHolder(viewHolder);
break;
@@ -454,9 +469,9 @@ public class CallLogAdapter extends GroupingListAdapter
protected void bindVoicemailPromoCardViewHolder(ViewHolder viewHolder) {
PromoCardViewHolder promoCardViewHolder = (PromoCardViewHolder) viewHolder;
- promoCardViewHolder.getSettingsTextView().setOnClickListener(
- mVoicemailSettingsActionListener);
- promoCardViewHolder.getOkTextView().setOnClickListener(mOkActionListener);
+ promoCardViewHolder.getSecondaryActionView()
+ .setOnClickListener(mVoicemailSettingsActionListener);
+ promoCardViewHolder.getPrimaryActionView().setOnClickListener(mOkActionListener);
}
/**
@@ -475,14 +490,20 @@ public class CallLogAdapter extends GroupingListAdapter
int count = getGroupSize(position);
final String number = c.getString(CallLogQuery.NUMBER);
+ final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
+ final String postDialDigits = CompatUtils.isNCompatible()
+ && mActivityType != ACTIVITY_TYPE_ARCHIVE ?
+ c.getString(CallLogQuery.POST_DIAL_DIGITS) : "";
+ final String viaNumber = CompatUtils.isNCompatible()
+ && mActivityType != ACTIVITY_TYPE_ARCHIVE ?
+ c.getString(CallLogQuery.VIA_NUMBER) : "";
final int numberPresentation = c.getInt(CallLogQuery.NUMBER_PRESENTATION);
final PhoneAccountHandle accountHandle = PhoneAccountUtils.getAccount(
c.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME),
c.getString(CallLogQuery.ACCOUNT_ID));
- final String countryIso = c.getString(CallLogQuery.COUNTRY_ISO);
- final ContactInfo cachedContactInfo = mContactInfoHelper.getContactInfo(c);
+ final ContactInfo cachedContactInfo = ContactInfoHelper.getContactInfo(c);
final boolean isVoicemailNumber =
- mTelecomCallLogCache.isVoicemailNumber(accountHandle, number);
+ mCallLogCache.isVoicemailNumber(accountHandle, number);
// Note: Binding of the action buttons is done as required in configureActionViews when the
// user expands the actions ViewStub.
@@ -490,49 +511,52 @@ public class CallLogAdapter extends GroupingListAdapter
ContactInfo info = ContactInfo.EMPTY;
if (PhoneNumberUtil.canPlaceCallsTo(number, numberPresentation) && !isVoicemailNumber) {
// Lookup contacts with this number
- info = mContactInfoCache.getValue(number, countryIso, cachedContactInfo);
+ info = mContactInfoCache.getValue(number + postDialDigits,
+ countryIso, cachedContactInfo);
}
CharSequence formattedNumber = info.formattedNumber == null
- ? null : PhoneNumberUtils.createTtsSpannable(info.formattedNumber);
+ ? null : PhoneNumberUtilsCompat.createTtsSpannable(info.formattedNumber);
final PhoneCallDetails details = new PhoneCallDetails(
- mContext, number, numberPresentation, formattedNumber, isVoicemailNumber);
+ mContext, number, numberPresentation, formattedNumber,
+ postDialDigits, isVoicemailNumber);
+ details.viaNumber = viaNumber;
details.accountHandle = accountHandle;
- details.callTypes = getCallTypes(c, count);
details.countryIso = countryIso;
details.date = c.getLong(CallLogQuery.DATE);
details.duration = c.getLong(CallLogQuery.DURATION);
details.features = getCallFeatures(c, count);
details.geocode = c.getString(CallLogQuery.GEOCODED_LOCATION);
details.transcription = c.getString(CallLogQuery.TRANSCRIPTION);
- if (details.callTypes[0] == CallLog.Calls.VOICEMAIL_TYPE) {
- details.isRead = c.getInt(CallLogQuery.IS_READ) == 1;
- }
+ details.callTypes = getCallTypes(c, count);
if (!c.isNull(CallLogQuery.DATA_USAGE)) {
details.dataUsage = c.getLong(CallLogQuery.DATA_USAGE);
}
- if (!TextUtils.isEmpty(info.name)) {
+ if (!TextUtils.isEmpty(info.name) || !TextUtils.isEmpty(info.nameAlternative)) {
details.contactUri = info.lookupUri;
- details.name = info.name;
+ details.namePrimary = info.name;
+ details.nameAlternative = info.nameAlternative;
+ details.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
details.numberType = info.type;
details.numberLabel = info.label;
details.photoUri = info.photoUri;
details.sourceType = info.sourceType;
details.objectId = info.objectId;
+ details.contactUserType = info.userType;
}
- CallLogListItemViewHolder views = (CallLogListItemViewHolder) viewHolder;
+ final CallLogListItemViewHolder views = (CallLogListItemViewHolder) viewHolder;
views.info = info;
views.rowId = c.getLong(CallLogQuery.ID);
// Store values used when the actions ViewStub is inflated on expansion.
views.number = number;
+ views.postDialDigits = details.postDialDigits;
views.displayNumber = details.displayNumber;
views.numberPresentation = numberPresentation;
- views.callType = c.getInt(CallLogQuery.CALL_TYPE);
+
views.accountHandle = accountHandle;
- views.voicemailUri = c.getString(CallLogQuery.VOICEMAIL_URI);
// Stash away the Ids of the calls so that we can support deleting a row in the call log.
views.callIds = getCallIds(c, count);
views.isBusiness = mContactInfoHelper.isBusiness(info.sourceType);
@@ -540,6 +564,8 @@ public class CallLogAdapter extends GroupingListAdapter
details.numberLabel);
// Default case: an item in the call log.
views.primaryActionView.setVisibility(View.VISIBLE);
+ views.workIconView.setVisibility(
+ details.contactUserType == ContactsUtils.USER_TYPE_WORK ? View.VISIBLE : View.GONE);
// Check if the day group has changed and display a header if necessary.
int currentGroup = getDayGroupForCall(views.rowId);
@@ -551,38 +577,53 @@ public class CallLogAdapter extends GroupingListAdapter
views.dayGroupHeader.setVisibility(View.GONE);
}
+ if (mActivityType == ACTIVITY_TYPE_ARCHIVE) {
+ views.callType = CallLog.Calls.VOICEMAIL_TYPE;
+ views.voicemailUri = VoicemailArchiveContract.VoicemailArchive.buildWithId(c.getInt(
+ c.getColumnIndex(VoicemailArchiveContract.VoicemailArchive._ID)))
+ .toString();
+
+ } else {
+ if (details.callTypes[0] == CallLog.Calls.VOICEMAIL_TYPE ||
+ details.callTypes[0] == CallLog.Calls.MISSED_TYPE) {
+ details.isRead = c.getInt(CallLogQuery.IS_READ) == 1;
+ }
+ views.callType = c.getInt(CallLogQuery.CALL_TYPE);
+ views.voicemailUri = c.getString(CallLogQuery.VOICEMAIL_URI);
+ }
+
mCallLogListItemHelper.setPhoneCallDetails(views, details);
if (mCurrentlyExpandedRowId == views.rowId) {
// In case ViewHolders were added/removed, update the expanded position if the rowIds
// match so that we can restore the correct expanded state on rebind.
mCurrentlyExpandedPosition = position;
- }
-
- views.showActions(mCurrentlyExpandedPosition == position);
-
- String nameForDefaultImage = null;
- if (TextUtils.isEmpty(info.name)) {
- nameForDefaultImage = details.displayNumber;
+ views.showActions(true);
} else {
- nameForDefaultImage = info.name;
+ views.showActions(false);
}
- views.setPhoto(info.photoId, info.photoUri, info.lookupUri, nameForDefaultImage,
- isVoicemailNumber, views.isBusiness);
+ views.updatePhoto();
mCallLogListItemHelper.setPhoneCallDetails(views, details);
}
+ private String getPreferredDisplayName(ContactInfo contactInfo) {
+ if (mContactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY ||
+ TextUtils.isEmpty(contactInfo.nameAlternative)) {
+ return contactInfo.name;
+ }
+ return contactInfo.nameAlternative;
+ }
+
@Override
public int getItemCount() {
- return super.getItemCount() + ((isShowingRecentsTab() || mShowPromoCard) ? 1 : 0);
+ return super.getItemCount() + (mShowVoicemailPromoCard ? 1 : 0)
+ - (mHiddenPosition != RecyclerView.NO_POSITION ? 1 : 0);
}
@Override
public int getItemViewType(int position) {
- if (position == getItemCount() - 1 && isShowingRecentsTab()) {
- return VIEW_TYPE_SHOW_CALL_HISTORY_LIST_ITEM;
- } else if (position == VOICEMAIL_PROMO_CARD_POSITION && mShowPromoCard) {
+ if (position == VOICEMAIL_PROMO_CARD_POSITION && mShowVoicemailPromoCard) {
return VIEW_TYPE_VOICEMAIL_PROMO_CARD;
}
return super.getItemViewType(position);
@@ -597,20 +638,95 @@ public class CallLogAdapter extends GroupingListAdapter
*/
@Override
public Object getItem(int position) {
- return super.getItem(position - (mShowPromoCard ? 1 : 0));
+ return super.getItem(position - (mShowVoicemailPromoCard ? 1 : 0)
+ + ((mHiddenPosition != RecyclerView.NO_POSITION && position >= mHiddenPosition)
+ ? 1 : 0));
+ }
+
+ @Override
+ public int getGroupSize(int position) {
+ return super.getGroupSize(position - (mShowVoicemailPromoCard ? 1 : 0));
}
- protected boolean isShowingRecentsTab() {
- return mIsShowingRecentsTab;
+ protected boolean isCallLogActivity() {
+ return mActivityType == ACTIVITY_TYPE_CALL_LOG;
}
+ /**
+ * In order to implement the "undo" function, when a voicemail is "deleted" i.e. when the user
+ * clicks the delete button, the deleted item is temporarily hidden from the list. If a user
+ * clicks delete on a second item before the first item's undo option has expired, the first
+ * item is immediately deleted so that only one item can be "undoed" at a time.
+ */
@Override
public void onVoicemailDeleted(Uri uri) {
+ if (mHiddenItemUri == null) {
+ // Immediately hide the currently expanded card.
+ mHiddenPosition = mCurrentlyExpandedPosition;
+ notifyDataSetChanged();
+ } else {
+ // This means that there was a previous item that was hidden in the UI but not
+ // yet deleted from the database (call it a "pending delete"). Delete this previous item
+ // now since it is only possible to do one "undo" at a time.
+ CallLogAsyncTaskUtil.deleteVoicemail(mContext, mHiddenItemUri, null);
+
+ // Set pending hide action so that the current item is hidden only after the previous
+ // item is permanently deleted.
+ mPendingHide = true;
+ }
+
+ collapseExpandedCard();
+
+ // Save the new hidden item uri in case it needs to be deleted from the database when
+ // a user attempts to delete another item.
+ mHiddenItemUri = uri;
+ }
+
+ private void collapseExpandedCard() {
mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
}
/**
+ * When the list is changing all stored position is no longer valid.
+ */
+ public void invalidatePositions() {
+ mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;
+ mHiddenPosition = RecyclerView.NO_POSITION;
+ }
+
+ /**
+ * When the user clicks "undo", the hidden item is unhidden.
+ */
+ @Override
+ public void onVoicemailDeleteUndo() {
+ mHiddenPosition = RecyclerView.NO_POSITION;
+ mHiddenItemUri = null;
+
+ mPendingHide = false;
+ notifyDataSetChanged();
+ }
+
+ /**
+ * This callback signifies that a database deletion has completed. This means that if there is
+ * an item pending deletion, it will be hidden because the previous item that was in "undo" mode
+ * has been removed from the database. Otherwise it simply resets the hidden state because there
+ * are no pending deletes and thus no hidden items.
+ */
+ @Override
+ public void onVoicemailDeletedInDatabase() {
+ if (mPendingHide) {
+ mHiddenPosition = mCurrentlyExpandedPosition;
+ mPendingHide = false;
+ } else {
+ // There should no longer be any hidden item because it has been deleted from the
+ // database.
+ mHiddenPosition = RecyclerView.NO_POSITION;
+ mHiddenItemUri = null;
+ }
+ }
+
+ /**
* Retrieves the day group of the previous call in the call log. Used to determine if the day
* group has changed and to trigger display of the day group text.
*
@@ -622,8 +738,16 @@ public class CallLogAdapter extends GroupingListAdapter
int startingPosition = cursor.getPosition();
int dayGroup = CallLogGroupBuilder.DAY_GROUP_NONE;
if (cursor.moveToPrevious()) {
- long previousRowId = cursor.getLong(CallLogQuery.ID);
- dayGroup = getDayGroupForCall(previousRowId);
+ // If the previous entry is hidden (deleted in the UI but not in the database), skip it
+ // and check the card above it. A list with the voicemail promo card at the top will be
+ // 1-indexed because the 0th index is the promo card iteself.
+ int previousViewPosition = mShowVoicemailPromoCard ? startingPosition :
+ startingPosition - 1;
+ if (previousViewPosition != mHiddenPosition ||
+ (previousViewPosition == mHiddenPosition && cursor.moveToPrevious())) {
+ long previousRowId = cursor.getLong(CallLogQuery.ID);
+ dayGroup = getDayGroupForCall(previousRowId);
+ }
}
cursor.moveToPosition(startingPosition);
return dayGroup;
@@ -651,6 +775,9 @@ public class CallLogAdapter extends GroupingListAdapter
* It position in the cursor is unchanged by this function.
*/
private int[] getCallTypes(Cursor cursor, int count) {
+ if (mActivityType == ACTIVITY_TYPE_ARCHIVE) {
+ return new int[] {CallLog.Calls.VOICEMAIL_TYPE};
+ }
int position = cursor.getPosition();
int[] callTypes = new int[count];
for (int index = 0; index < count; ++index) {
@@ -698,11 +825,6 @@ public class CallLogAdapter extends GroupingListAdapter
mContactInfoCache.injectContactInfoForTest(number, countryIso, contactInfo);
}
- @Override
- public void addGroup(int cursorPosition, int size, boolean expanded) {
- super.addGroup(cursorPosition, size, expanded);
- }
-
/**
* Stores the day group associated with a call in the call log.
*
@@ -767,7 +889,8 @@ public class CallLogAdapter extends GroupingListAdapter
private void maybeShowVoicemailPromoCard() {
boolean showPromoCard = mPrefs.getBoolean(SHOW_VOICEMAIL_PROMO_CARD,
SHOW_VOICEMAIL_PROMO_CARD_DEFAULT);
- mShowPromoCard = (mVoicemailPlaybackPresenter != null) && showPromoCard;
+ mShowVoicemailPromoCard = mActivityType != ACTIVITY_TYPE_ARCHIVE &&
+ (mVoicemailPlaybackPresenter != null) && showPromoCard;
}
/**
@@ -775,7 +898,7 @@ public class CallLogAdapter extends GroupingListAdapter
*/
private void dismissVoicemailPromoCard() {
mPrefs.edit().putBoolean(SHOW_VOICEMAIL_PROMO_CARD, false).apply();
- mShowPromoCard = false;
+ mShowVoicemailPromoCard = false;
notifyItemRemoved(VOICEMAIL_PROMO_CARD_POSITION);
}
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 22dece57c..34b2f0ea9 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -16,6 +16,9 @@
package com.android.dialer.calllog;
+import com.google.common.annotations.VisibleForTesting;
+
+import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
@@ -25,17 +28,24 @@ import android.os.AsyncTask;
import android.provider.CallLog;
import android.provider.VoicemailContract.Voicemails;
import android.telecom.PhoneAccountHandle;
+import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.PhoneCallDetails;
+import com.android.dialer.compat.CallsSdkCompat;
+import com.android.dialer.database.VoicemailArchiveContract;
import com.android.dialer.util.AsyncTaskExecutor;
import com.android.dialer.util.AsyncTaskExecutors;
import com.android.dialer.util.PhoneNumberUtil;
import com.android.dialer.util.TelecomUtil;
-import com.google.common.annotations.VisibleForTesting;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Locale;
public class CallLogAsyncTaskUtil {
private static String TAG = CallLogAsyncTaskUtil.class.getSimpleName();
@@ -44,12 +54,16 @@ public class CallLogAsyncTaskUtil {
public enum Tasks {
DELETE_VOICEMAIL,
DELETE_CALL,
+ DELETE_BLOCKED_CALL,
MARK_VOICEMAIL_READ,
+ MARK_CALL_READ,
GET_CALL_DETAILS,
+ UPDATE_DURATION
}
- private static class CallDetailQuery {
- static final String[] CALL_LOG_PROJECTION = new String[] {
+ private static final class CallDetailQuery {
+
+ private static final String[] CALL_LOG_PROJECTION_INTERNAL = new String[] {
CallLog.Calls.DATE,
CallLog.Calls.DURATION,
CallLog.Calls.NUMBER,
@@ -63,6 +77,7 @@ public class CallLogAsyncTaskUtil {
CallLog.Calls.DATA_USAGE,
CallLog.Calls.TRANSCRIPTION
};
+ public static final String[] CALL_LOG_PROJECTION;
static final int DATE_COLUMN_INDEX = 0;
static final int DURATION_COLUMN_INDEX = 1;
@@ -76,14 +91,46 @@ public class CallLogAsyncTaskUtil {
static final int FEATURES = 9;
static final int DATA_USAGE = 10;
static final int TRANSCRIPTION_COLUMN_INDEX = 11;
+ static final int POST_DIAL_DIGITS = 12;
+ static final int VIA_NUMBER = 13;
+
+ static {
+ ArrayList<String> projectionList = new ArrayList<>();
+ projectionList.addAll(Arrays.asList(CALL_LOG_PROJECTION_INTERNAL));
+ if (CompatUtils.isNCompatible()) {
+ projectionList.add(CallsSdkCompat.POST_DIAL_DIGITS);
+ projectionList.add(CallsSdkCompat.VIA_NUMBER);
+ }
+ projectionList.trimToSize();
+ CALL_LOG_PROJECTION = projectionList.toArray(new String[projectionList.size()]);
+ }
+ }
+
+ private static class CallLogDeleteBlockedCallQuery {
+ static final String[] PROJECTION = new String[] {
+ CallLog.Calls._ID,
+ CallLog.Calls.DATE
+ };
+
+ static final int ID_COLUMN_INDEX = 0;
+ static final int DATE_COLUMN_INDEX = 1;
}
public interface CallLogAsyncTaskListener {
- public void onDeleteCall();
- public void onDeleteVoicemail();
- public void onGetCallDetails(PhoneCallDetails[] details);
+ void onDeleteCall();
+ void onDeleteVoicemail();
+ void onGetCallDetails(PhoneCallDetails[] details);
+ }
+
+ public interface OnCallLogQueryFinishedListener {
+ void onQueryFinished(boolean hasEntry);
}
+ // Try to identify if a call log entry corresponds to a number which was blocked. We match by
+ // by comparing its creation time to the time it was added in the InCallUi and seeing if they
+ // fall within a certain threshold.
+ private static final int MATCH_BLOCKED_CALL_THRESHOLD_MS = 3000;
+
private static AsyncTaskExecutor sAsyncTaskExecutor;
private static void initTaskExecutor() {
@@ -142,6 +189,10 @@ public class CallLogAsyncTaskUtil {
// Read call log.
final String countryIso = cursor.getString(CallDetailQuery.COUNTRY_ISO_COLUMN_INDEX);
final String number = cursor.getString(CallDetailQuery.NUMBER_COLUMN_INDEX);
+ final String postDialDigits = CompatUtils.isNCompatible()
+ ? cursor.getString(CallDetailQuery.POST_DIAL_DIGITS) : "";
+ final String viaNumber = CompatUtils.isNCompatible() ?
+ cursor.getString(CallDetailQuery.VIA_NUMBER) : "";
final int numberPresentation =
cursor.getInt(CallDetailQuery.NUMBER_PRESENTATION_COLUMN_INDEX);
@@ -155,19 +206,22 @@ public class CallLogAsyncTaskUtil {
boolean isVoicemail = PhoneNumberUtil.isVoicemailNumber(context, accountHandle, number);
boolean shouldLookupNumber =
PhoneNumberUtil.canPlaceCallsTo(number, numberPresentation) && !isVoicemail;
-
ContactInfo info = ContactInfo.EMPTY;
+
if (shouldLookupNumber) {
ContactInfo lookupInfo = contactInfoHelper.lookupNumber(number, countryIso);
info = lookupInfo != null ? lookupInfo : ContactInfo.EMPTY;
}
PhoneCallDetails details = new PhoneCallDetails(
- context, number, numberPresentation, info.formattedNumber, isVoicemail);
+ context, number, numberPresentation, info.formattedNumber,
+ postDialDigits, isVoicemail);
+ details.viaNumber = viaNumber;
details.accountHandle = accountHandle;
details.contactUri = info.lookupUri;
- details.name = info.name;
+ details.namePrimary = info.name;
+ details.nameAlternative = info.nameAlternative;
details.numberType = info.type;
details.numberLabel = info.label;
details.photoUri = info.photoUri;
@@ -204,7 +258,7 @@ public class CallLogAsyncTaskUtil {
*
* @param context The context.
* @param callIds String of the callIds to delete from the call log, delimited by commas (",").
- * @param callLogAsyncTaskListenerg The listener to invoke after the entries have been deleted.
+ * @param callLogAsyncTaskListener The listener to invoke after the entries have been deleted.
*/
public static void deleteCalls(
final Context context,
@@ -214,26 +268,82 @@ public class CallLogAsyncTaskUtil {
initTaskExecutor();
}
- sAsyncTaskExecutor.submit(Tasks.DELETE_CALL,
- new AsyncTask<Void, Void, Void>() {
- @Override
- public Void doInBackground(Void... params) {
+ sAsyncTaskExecutor.submit(Tasks.DELETE_CALL, new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... params) {
+ context.getContentResolver().delete(
+ TelecomUtil.getCallLogUri(context),
+ CallLog.Calls._ID + " IN (" + callIds + ")", null);
+ return null;
+ }
+
+ @Override
+ public void onPostExecute(Void result) {
+ if (callLogAsyncTaskListener != null) {
+ callLogAsyncTaskListener.onDeleteCall();
+ }
+ }
+ });
+ }
+
+ /**
+ * Deletes the last call made by the number within a threshold of the call time added in the
+ * call log, assuming it is a blocked call for which no entry should be shown.
+ *
+ * @param context The context.
+ * @param number Number of blocked call, for which to delete the call log entry.
+ * @param timeAddedMs The time the number was added to InCall, in milliseconds.
+ * @param listener The listener to invoke after looking up for a call log entry matching the
+ * number and time added.
+ */
+ public static void deleteBlockedCall(
+ final Context context,
+ final String number,
+ final long timeAddedMs,
+ final OnCallLogQueryFinishedListener listener) {
+ if (sAsyncTaskExecutor == null) {
+ initTaskExecutor();
+ }
+
+ sAsyncTaskExecutor.submit(Tasks.DELETE_BLOCKED_CALL, new AsyncTask<Void, Void, Long>() {
+ @Override
+ public Long doInBackground(Void... params) {
+ // First, lookup the call log entry of the most recent call with this number.
+ Cursor cursor = context.getContentResolver().query(
+ TelecomUtil.getCallLogUri(context),
+ CallLogDeleteBlockedCallQuery.PROJECTION,
+ CallLog.Calls.NUMBER + "= ?",
+ new String[] { number },
+ CallLog.Calls.DATE + " DESC LIMIT 1");
+
+ // If match is found, delete this call log entry and return the call log entry id.
+ if (cursor.moveToFirst()) {
+ long creationTime =
+ cursor.getLong(CallLogDeleteBlockedCallQuery.DATE_COLUMN_INDEX);
+ if (timeAddedMs > creationTime
+ && timeAddedMs - creationTime < MATCH_BLOCKED_CALL_THRESHOLD_MS) {
+ long callLogEntryId =
+ cursor.getLong(CallLogDeleteBlockedCallQuery.ID_COLUMN_INDEX);
context.getContentResolver().delete(
TelecomUtil.getCallLogUri(context),
- CallLog.Calls._ID + " IN (" + callIds + ")", null);
- return null;
+ CallLog.Calls._ID + " IN (" + callLogEntryId + ")",
+ null);
+ return callLogEntryId;
}
+ }
+ return (long) -1;
+ }
- @Override
- public void onPostExecute(Void result) {
- if (callLogAsyncTaskListener != null) {
- callLogAsyncTaskListener.onDeleteCall();
- }
- }
- });
-
+ @Override
+ public void onPostExecute(Long callLogEntryId) {
+ if (listener != null) {
+ listener.onQueryFinished(callLogEntryId >= 0);
+ }
+ }
+ });
}
+
public static void markVoicemailAsRead(final Context context, final Uri voicemailUri) {
if (sAsyncTaskExecutor == null) {
initTaskExecutor();
@@ -263,21 +373,87 @@ public class CallLogAsyncTaskUtil {
initTaskExecutor();
}
- sAsyncTaskExecutor.submit(Tasks.DELETE_VOICEMAIL,
- new AsyncTask<Void, Void, Void>() {
- @Override
- public Void doInBackground(Void... params) {
- context.getContentResolver().delete(voicemailUri, null, null);
- return null;
- }
+ sAsyncTaskExecutor.submit(Tasks.DELETE_VOICEMAIL, new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... params) {
+ context.getContentResolver().delete(voicemailUri, null, null);
+ return null;
+ }
- @Override
- public void onPostExecute(Void result) {
- if (callLogAsyncTaskListener != null) {
- callLogAsyncTaskListener.onDeleteVoicemail();
- }
- }
- });
+ @Override
+ public void onPostExecute(Void result) {
+ if (callLogAsyncTaskListener != null) {
+ callLogAsyncTaskListener.onDeleteVoicemail();
+ }
+ }
+ });
+ }
+
+ public static void markCallAsRead(final Context context, final long[] callIds) {
+ if (!PermissionsUtil.hasPhonePermissions(context)) {
+ return;
+ }
+ if (sAsyncTaskExecutor == null) {
+ initTaskExecutor();
+ }
+
+ sAsyncTaskExecutor.submit(Tasks.MARK_CALL_READ, new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... params) {
+
+ StringBuilder where = new StringBuilder();
+ where.append(CallLog.Calls.TYPE).append(" = ").append(CallLog.Calls.MISSED_TYPE);
+ where.append(" AND ");
+
+ Long[] callIdLongs = new Long[callIds.length];
+ for (int i = 0; i < callIds.length; i++) {
+ callIdLongs[i] = callIds[i];
+ }
+ where.append(CallLog.Calls._ID).append(
+ " IN (" + TextUtils.join(",", callIdLongs) + ")");
+
+ ContentValues values = new ContentValues(1);
+ values.put(CallLog.Calls.IS_READ, "1");
+ context.getContentResolver().update(
+ CallLog.Calls.CONTENT_URI, values, where.toString(), null);
+ return null;
+ }
+ });
+ }
+
+ /**
+ * Updates the duration of a voicemail call log entry if the duration given is greater than 0,
+ * and if if the duration currently in the database is less than or equal to 0 (non-existent).
+ */
+ public static void updateVoicemailDuration(
+ final Context context,
+ final Uri voicemailUri,
+ final long duration) {
+ if (duration <= 0 || !PermissionsUtil.hasPhonePermissions(context)) {
+ return;
+ }
+ if (sAsyncTaskExecutor == null) {
+ initTaskExecutor();
+ }
+
+ sAsyncTaskExecutor.submit(Tasks.UPDATE_DURATION, new AsyncTask<Void, Void, Void>() {
+ @Override
+ public Void doInBackground(Void... params) {
+ ContentResolver contentResolver = context.getContentResolver();
+ Cursor cursor = contentResolver.query(
+ voicemailUri,
+ new String[] { VoicemailArchiveContract.VoicemailArchive.DURATION },
+ null, null, null);
+ if (cursor != null && cursor.moveToFirst() && cursor.getInt(
+ cursor.getColumnIndex(
+ VoicemailArchiveContract.VoicemailArchive.DURATION)) <= 0) {
+ ContentValues values = new ContentValues(1);
+ values.put(CallLog.Calls.DURATION, duration);
+ context.getContentResolver().update(voicemailUri, values, null, null);
+ }
+ return null;
+ }
+ });
}
@VisibleForTesting
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index e7b77646d..67b72a5a3 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -16,61 +16,47 @@
package com.android.dialer.calllog;
-import static android.Manifest.permission.READ_CALL_LOG;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
import android.app.Activity;
-import android.app.DialogFragment;
import android.app.Fragment;
import android.app.KeyguardManager;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.database.Cursor;
-import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
+import android.os.Message;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract;
-import android.provider.VoicemailContract.Status;
-import android.support.v7.widget.RecyclerView;
+import android.support.annotation.Nullable;
+import android.support.v13.app.FragmentCompat;
import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.ListView;
-import android.widget.TextView;
import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.util.PermissionsUtil;
-import com.android.contacts.common.util.ViewUtil;
import com.android.dialer.R;
-import com.android.dialer.list.ListsFragment.HostInterface;
-import com.android.dialer.util.DialerUtils;
+import com.android.dialer.list.ListsFragment;
import com.android.dialer.util.EmptyLoader;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
-import com.android.dialer.voicemail.VoicemailStatusHelper;
-import com.android.dialer.voicemail.VoicemailStatusHelper.StatusMessage;
-import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
import com.android.dialer.widget.EmptyContentView;
import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
import com.android.dialerbind.ObjectFactory;
-import java.util.List;
+import static android.Manifest.permission.READ_CALL_LOG;
/**
* Displays a list of call log entries. To filter for a particular kind of call
* (all, missed or voicemails), specify it in the constructor.
*/
public class CallLogFragment extends Fragment implements CallLogQueryHandler.Listener,
- CallLogAdapter.CallFetcher, OnEmptyViewActionButtonClickedListener {
+ CallLogAdapter.CallFetcher, OnEmptyViewActionButtonClickedListener,
+ FragmentCompat.OnRequestPermissionsResultCallback {
private static final String TAG = "CallLogFragment";
/**
@@ -81,6 +67,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
private static final String KEY_FILTER_TYPE = "filter_type";
private static final String KEY_LOG_LIMIT = "log_limit";
private static final String KEY_DATE_LIMIT = "date_limit";
+ private static final String KEY_IS_CALL_LOG_ACTIVITY = "is_call_log_activity";
// No limit specified for the number of logs to show; use the CallLogQueryHandler's default.
private static final int NO_LOG_LIMIT = -1;
@@ -89,15 +76,16 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
private static final int READ_CALL_LOG_PERMISSION_REQUEST_CODE = 1;
+ private static final int EVENT_UPDATE_DISPLAY = 1;
+
+ private static final long MILLIS_IN_MINUTE = 60 * 1000;
+
private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;
private CallLogAdapter mAdapter;
private CallLogQueryHandler mCallLogQueryHandler;
- private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
private boolean mScrollToTop;
- /** Whether there is at least one voicemail source installed. */
- private boolean mVoicemailSourcesAvailable = false;
private EmptyContentView mEmptyListView;
private KeyguardManager mKeyguardManager;
@@ -106,9 +94,21 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
private boolean mCallLogFetched;
private boolean mVoicemailStatusFetched;
+ private final Handler mDisplayUpdateHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case EVENT_UPDATE_DISPLAY:
+ refreshData();
+ rescheduleDisplayUpdate();
+ break;
+ }
+ }
+ };
+
private final Handler mHandler = new Handler();
- private class CustomContentObserver extends ContentObserver {
+ protected class CustomContentObserver extends ContentObserver {
public CustomContentObserver() {
super(mHandler);
}
@@ -121,7 +121,6 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
// See issue 6363009
private final ContentObserver mCallLogObserver = new CustomContentObserver();
private final ContentObserver mContactsObserver = new CustomContentObserver();
- private final ContentObserver mVoicemailStatusObserver = new CustomContentObserver();
private boolean mRefreshDataRequired = true;
private boolean mHasReadCallLogPermission = false;
@@ -141,10 +140,9 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
private long mDateLimit = NO_DATE_LIMIT;
/*
- * True if this instance of the CallLogFragment is the Recents screen shown in
- * DialtactsActivity.
+ * True if this instance of the CallLogFragment shown in the CallLogActivity.
*/
- private boolean mIsRecentsFragment;
+ private boolean mIsCallLogActivity = false;
public interface HostInterface {
public void showDialpad();
@@ -158,6 +156,11 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
this(filterType, NO_LOG_LIMIT);
}
+ public CallLogFragment(int filterType, boolean isCallLogActivity) {
+ this(filterType, NO_LOG_LIMIT);
+ mIsCallLogActivity = isCallLogActivity;
+ }
+
public CallLogFragment(int filterType, int logLimit) {
this(filterType, logLimit, NO_DATE_LIMIT);
}
@@ -192,10 +195,9 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
mCallTypeFilter = state.getInt(KEY_FILTER_TYPE, mCallTypeFilter);
mLogLimit = state.getInt(KEY_LOG_LIMIT, mLogLimit);
mDateLimit = state.getLong(KEY_DATE_LIMIT, mDateLimit);
+ mIsCallLogActivity = state.getBoolean(KEY_IS_CALL_LOG_ACTIVITY, mIsCallLogActivity);
}
- mIsRecentsFragment = mLogLimit != NO_LOG_LIMIT;
-
final Activity activity = getActivity();
final ContentResolver resolver = activity.getContentResolver();
String currentCountryIso = GeoUtil.getCurrentCountryIso(activity);
@@ -205,13 +207,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
resolver.registerContentObserver(CallLog.CONTENT_URI, true, mCallLogObserver);
resolver.registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true,
mContactsObserver);
- resolver.registerContentObserver(Status.CONTENT_URI, true, mVoicemailStatusObserver);
setHasOptionsMenu(true);
-
- if (mCallTypeFilter == Calls.VOICEMAIL_TYPE) {
- mVoicemailPlaybackPresenter = VoicemailPlaybackPresenter
- .getInstance(activity, state);
- }
}
/** Called by the CallLogQueryHandler when the list of calls has been fetched or updated. */
@@ -221,6 +217,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
// Return false; we did not take ownership of the cursor
return false;
}
+ mAdapter.invalidatePositions();
mAdapter.setLoading(false);
mAdapter.changeCursor(cursor);
// This will update the state of the "Clear call log" menu item.
@@ -282,9 +279,20 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
}
@Override
+ public void onVoicemailUnreadCountFetched(Cursor cursor) {}
+
+ @Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {}
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
View view = inflater.inflate(R.layout.call_log_fragment, container, false);
+ setupView(view, null);
+ return view;
+ }
+ protected void setupView(
+ View view, @Nullable VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
@@ -293,18 +301,17 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
mEmptyListView.setImage(R.drawable.empty_call_log);
mEmptyListView.setActionClickedListener(this);
+ int activityType = mIsCallLogActivity ? CallLogAdapter.ACTIVITY_TYPE_CALL_LOG :
+ CallLogAdapter.ACTIVITY_TYPE_DIALTACTS;
String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
- boolean isShowingRecentsTab = mLogLimit != NO_LOG_LIMIT || mDateLimit != NO_DATE_LIMIT;
mAdapter = ObjectFactory.newCallLogAdapter(
- getActivity(),
- this,
- new ContactInfoHelper(getActivity(), currentCountryIso),
- mVoicemailPlaybackPresenter,
- isShowingRecentsTab);
+ getActivity(),
+ this,
+ new ContactInfoHelper(getActivity(), currentCountryIso),
+ voicemailPlaybackPresenter,
+ activityType);
mRecyclerView.setAdapter(mAdapter);
-
fetchCalls();
- return view;
}
@Override
@@ -336,39 +343,34 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
mRefreshDataRequired = true;
updateEmptyMessage(mCallTypeFilter);
}
+
mHasReadCallLogPermission = hasReadCallLogPermission;
refreshData();
- mAdapter.startCache();
+ mAdapter.onResume();
+
+ rescheduleDisplayUpdate();
}
@Override
public void onPause() {
- if (mVoicemailPlaybackPresenter != null) {
- mVoicemailPlaybackPresenter.onPause();
- }
- mAdapter.pauseCache();
+ cancelDisplayUpdate();
+ mAdapter.onPause();
super.onPause();
}
@Override
public void onStop() {
- updateOnTransition(false /* onEntry */);
+ updateOnTransition();
super.onStop();
}
@Override
public void onDestroy() {
- mAdapter.pauseCache();
mAdapter.changeCursor(null);
- if (mVoicemailPlaybackPresenter != null) {
- mVoicemailPlaybackPresenter.onDestroy();
- }
-
getActivity().getContentResolver().unregisterContentObserver(mCallLogObserver);
getActivity().getContentResolver().unregisterContentObserver(mContactsObserver);
- getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
super.onDestroy();
}
@@ -378,17 +380,17 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
outState.putInt(KEY_FILTER_TYPE, mCallTypeFilter);
outState.putInt(KEY_LOG_LIMIT, mLogLimit);
outState.putLong(KEY_DATE_LIMIT, mDateLimit);
+ outState.putBoolean(KEY_IS_CALL_LOG_ACTIVITY, mIsCallLogActivity);
mAdapter.onSaveInstanceState(outState);
-
- if (mVoicemailPlaybackPresenter != null) {
- mVoicemailPlaybackPresenter.onSaveInstanceState(outState);
- }
}
@Override
public void fetchCalls() {
mCallLogQueryHandler.fetchCalls(mCallTypeFilter, mDateLimit);
+ if (!mIsCallLogActivity) {
+ ((ListsFragment) getParentFragment()).updateTabUnreadCounts();
+ }
}
private void updateEmptyMessage(int filterType) {
@@ -406,23 +408,23 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
final int messageId;
switch (filterType) {
case Calls.MISSED_TYPE:
- messageId = R.string.recentMissed_empty;
+ messageId = R.string.call_log_missed_empty;
break;
case Calls.VOICEMAIL_TYPE:
- messageId = R.string.recentVoicemails_empty;
+ messageId = R.string.call_log_voicemail_empty;
break;
case CallLogQueryHandler.CALL_TYPE_ALL:
- messageId = R.string.recentCalls_empty;
+ messageId = R.string.call_log_all_empty;
break;
default:
throw new IllegalArgumentException("Unexpected filter type in CallLogFragment: "
+ filterType);
}
mEmptyListView.setDescription(messageId);
- if (mIsRecentsFragment) {
- mEmptyListView.setActionLabel(R.string.recentCalls_empty_action);
- } else {
+ if (mIsCallLogActivity) {
mEmptyListView.setActionLabel(EmptyContentView.NO_LABEL);
+ } else if (filterType == CallLogQueryHandler.CALL_TYPE_ALL) {
+ mEmptyListView.setActionLabel(R.string.call_log_all_empty_action);
}
}
@@ -436,7 +438,7 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
if (mMenuVisible != menuVisible) {
mMenuVisible = menuVisible;
if (!menuVisible) {
- updateOnTransition(false /* onEntry */);
+ updateOnTransition();
} else if (isResumed()) {
refreshData();
}
@@ -454,8 +456,8 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
fetchCalls();
mCallLogQueryHandler.fetchVoicemailStatus();
-
- updateOnTransition(true /* onEntry */);
+ mCallLogQueryHandler.fetchMissedCallsUnreadCount();
+ updateOnTransition();
mRefreshDataRequired = false;
} else {
// Refresh the display of the existing data to update the timestamp text descriptions.
@@ -464,24 +466,16 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
}
/**
- * Updates the call data and notification state on entering or leaving the call log tab.
- *
- * If we are leaving the call log tab, mark all the missed calls as read.
+ * Updates the voicemail notification state.
*
* TODO: Move to CallLogActivity
*/
- private void updateOnTransition(boolean onEntry) {
+ private void updateOnTransition() {
// We don't want to update any call data when keyguard is on because the user has likely not
// seen the new calls yet.
// This might be called before onCreate() and thus we need to check null explicitly.
- if (mKeyguardManager != null && !mKeyguardManager.inKeyguardRestrictedInputMode()) {
- // On either of the transitions we update the missed call and voicemail notifications.
- // While exiting we additionally consume all missed calls (by marking them as read).
- mCallLogQueryHandler.markNewCallsAsOld();
- if (!onEntry) {
- mCallLogQueryHandler.markMissedCallsAsRead();
- }
- CallLogNotificationsHelper.removeMissedCallNotifications(getActivity());
+ if (mKeyguardManager != null && !mKeyguardManager.inKeyguardRestrictedInputMode()
+ && mCallTypeFilter == Calls.VOICEMAIL_TYPE) {
CallLogNotificationsHelper.updateVoicemailNotifications(getActivity());
}
}
@@ -494,9 +488,10 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
}
if (!PermissionsUtil.hasPermission(activity, READ_CALL_LOG)) {
- requestPermissions(new String[] {READ_CALL_LOG}, READ_CALL_LOG_PERMISSION_REQUEST_CODE);
- } else if (mIsRecentsFragment) {
- // Show dialpad if we are the recents fragment.
+ FragmentCompat.requestPermissions(this, new String[] {READ_CALL_LOG},
+ READ_CALL_LOG_PERMISSION_REQUEST_CODE);
+ } else if (!mIsCallLogActivity) {
+ // Show dialpad if we are not in the call log activity.
((HostInterface) activity).showDialpad();
}
}
@@ -511,4 +506,25 @@ public class CallLogFragment extends Fragment implements CallLogQueryHandler.Lis
}
}
}
+
+ /**
+ * Schedules an update to the relative call times (X mins ago).
+ */
+ private void rescheduleDisplayUpdate() {
+ if (!mDisplayUpdateHandler.hasMessages(EVENT_UPDATE_DISPLAY)) {
+ long time = System.currentTimeMillis();
+ // This value allows us to change the display relatively close to when the time changes
+ // from one minute to the next.
+ long millisUtilNextMinute = MILLIS_IN_MINUTE - (time % MILLIS_IN_MINUTE);
+ mDisplayUpdateHandler.sendEmptyMessageDelayed(
+ EVENT_UPDATE_DISPLAY, millisUtilNextMinute);
+ }
+ }
+
+ /**
+ * Cancels any pending update requests to update the relative call times (X mins ago).
+ */
+ private void cancelDisplayUpdate() {
+ mDisplayUpdateHandler.removeMessages(EVENT_UPDATE_DISPLAY);
+ }
}
diff --git a/src/com/android/dialer/calllog/CallLogGroupBuilder.java b/src/com/android/dialer/calllog/CallLogGroupBuilder.java
index 0826aeb4a..aa45029c0 100644
--- a/src/com/android/dialer/calllog/CallLogGroupBuilder.java
+++ b/src/com/android/dialer/calllog/CallLogGroupBuilder.java
@@ -16,17 +16,17 @@
package com.android.dialer.calllog;
+import com.google.common.annotations.VisibleForTesting;
+
import android.database.Cursor;
-import android.provider.CallLog.Calls;
import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
import android.text.format.Time;
+import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.util.DateUtils;
import com.android.contacts.common.util.PhoneNumberHelper;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import java.util.Objects;
+import com.android.dialer.util.AppCompatConstants;
/**
* Groups together calls in the call log. The primary grouping attempts to group together calls
@@ -46,9 +46,8 @@ public class CallLogGroupBuilder {
* dialed.
* @param cursorPosition The starting position of the group in the cursor.
* @param size The size of the group.
- * @param expanded Whether the group is expanded; always false for the call log.
*/
- public void addGroup(int cursorPosition, int size, boolean expanded);
+ public void addGroup(int cursorPosition, int size);
/**
* Defines the interface for tracking the day group each call belongs to. Calls in a call
@@ -94,7 +93,7 @@ public class CallLogGroupBuilder {
/**
* Finds all groups of adjacent entries in the call log which should be grouped together and
- * calls {@link GroupCreator#addGroup(int, int, boolean)} on {@link #mGroupCreator} for each of
+ * calls {@link GroupCreator#addGroup(int, int)} on {@link #mGroupCreator} for each of
* them.
* <p>
* For entries that are not grouped with others, we do not need to create a group of size one.
@@ -114,98 +113,113 @@ public class CallLogGroupBuilder {
// Get current system time, used for calculating which day group calls belong to.
long currentTime = System.currentTimeMillis();
-
- int currentGroupSize = 1;
cursor.moveToFirst();
- // The number of the first entry in the group.
- String firstNumber = cursor.getString(CallLogQuery.NUMBER);
- // This is the type of the first call in the group.
- int firstCallType = cursor.getInt(CallLogQuery.CALL_TYPE);
-
- // The account information of the first entry in the group.
- String firstAccountComponentName = cursor.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME);
- String firstAccountId = cursor.getString(CallLogQuery.ACCOUNT_ID);
// Determine the day group for the first call in the cursor.
final long firstDate = cursor.getLong(CallLogQuery.DATE);
final long firstRowId = cursor.getLong(CallLogQuery.ID);
- int currentGroupDayGroup = getDayGroup(firstDate, currentTime);
- mGroupCreator.setDayGroup(firstRowId, currentGroupDayGroup);
+ int groupDayGroup = getDayGroup(firstDate, currentTime);
+ mGroupCreator.setDayGroup(firstRowId, groupDayGroup);
+
+ // Instantiate the group values to those of the first call in the cursor.
+ String groupNumber = cursor.getString(CallLogQuery.NUMBER);
+ String groupPostDialDigits = CompatUtils.isNCompatible()
+ ? cursor.getString(CallLogQuery.POST_DIAL_DIGITS) : "";
+ String groupViaNumbers = CompatUtils.isNCompatible()
+ ? cursor.getString(CallLogQuery.VIA_NUMBER) : "";
+ int groupCallType = cursor.getInt(CallLogQuery.CALL_TYPE);
+ String groupAccountComponentName = cursor.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME);
+ String groupAccountId = cursor.getString(CallLogQuery.ACCOUNT_ID);
+ int groupSize = 1;
+
+ String number;
+ String numberPostDialDigits;
+ String numberViaNumbers;
+ int callType;
+ String accountComponentName;
+ String accountId;
while (cursor.moveToNext()) {
- // The number of the current row in the cursor.
- final String currentNumber = cursor.getString(CallLogQuery.NUMBER);
- final int callType = cursor.getInt(CallLogQuery.CALL_TYPE);
- final String currentAccountComponentName = cursor.getString(
- CallLogQuery.ACCOUNT_COMPONENT_NAME);
- final String currentAccountId = cursor.getString(CallLogQuery.ACCOUNT_ID);
-
- final boolean sameNumber = equalNumbers(firstNumber, currentNumber);
- final boolean sameAccountComponentName = Objects.equals(
- firstAccountComponentName,
- currentAccountComponentName);
- final boolean sameAccountId = Objects.equals(
- firstAccountId,
- currentAccountId);
- final boolean sameAccount = sameAccountComponentName && sameAccountId;
-
- final boolean shouldGroup;
- final long currentCallId = cursor.getLong(CallLogQuery.ID);
- final long date = cursor.getLong(CallLogQuery.DATE);
-
- if (!sameNumber || !sameAccount) {
- // Should only group with calls from the same number.
- shouldGroup = false;
- } else if (firstCallType == Calls.VOICEMAIL_TYPE) {
- // never group voicemail.
- shouldGroup = false;
- } else {
- // Incoming, outgoing, and missed calls group together.
- shouldGroup = callType != Calls.VOICEMAIL_TYPE;
- }
-
- if (shouldGroup) {
+ // Obtain the values for the current call to group.
+ number = cursor.getString(CallLogQuery.NUMBER);
+ numberPostDialDigits = CompatUtils.isNCompatible()
+ ? cursor.getString(CallLogQuery.POST_DIAL_DIGITS) : "";
+ numberViaNumbers = CompatUtils.isNCompatible()
+ ? cursor.getString(CallLogQuery.VIA_NUMBER) : "";
+ callType = cursor.getInt(CallLogQuery.CALL_TYPE);
+ accountComponentName = cursor.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME);
+ accountId = cursor.getString(CallLogQuery.ACCOUNT_ID);
+
+ final boolean isSameNumber = equalNumbers(groupNumber, number);
+ final boolean isSamePostDialDigits = groupPostDialDigits.equals(numberPostDialDigits);
+ final boolean isSameViaNumbers = groupViaNumbers.equals(numberViaNumbers);
+ final boolean isSameAccount = isSameAccount(
+ groupAccountComponentName, accountComponentName, groupAccountId, accountId);
+
+ // Group with the same number and account. Never group voicemails. Only group blocked
+ // calls with other blocked calls.
+ if (isSameNumber && isSameAccount && isSamePostDialDigits && isSameViaNumbers
+ && areBothNotVoicemail(callType, groupCallType)
+ && (areBothNotBlocked(callType, groupCallType)
+ || areBothBlocked(callType, groupCallType))) {
// Increment the size of the group to include the current call, but do not create
- // the group until we find a call that does not match.
- currentGroupSize++;
+ // the group until finding a call that does not match.
+ groupSize++;
} else {
- // The call group has changed, so determine the day group for the new call group.
- // This ensures all calls grouped together in the call log are assigned the same
- // day group.
- currentGroupDayGroup = getDayGroup(date, currentTime);
-
- // Create a group for the previous set of calls, excluding the current one, but do
- // not create a group for a single call.
- if (currentGroupSize > 1) {
- addGroup(cursor.getPosition() - currentGroupSize, currentGroupSize);
- }
+ // The call group has changed. Determine the day group for the new call group.
+ final long date = cursor.getLong(CallLogQuery.DATE);
+ groupDayGroup = getDayGroup(date, currentTime);
+
+ // Create a group for the previous group of calls, which does not include the
+ // current call.
+ mGroupCreator.addGroup(cursor.getPosition() - groupSize, groupSize);
+
// Start a new group; it will include at least the current call.
- currentGroupSize = 1;
- // The current entry is now the first in the group.
- firstNumber = currentNumber;
- firstCallType = callType;
- firstAccountComponentName = currentAccountComponentName;
- firstAccountId = currentAccountId;
+ groupSize = 1;
+
+ // Update the group values to those of the current call.
+ groupNumber = number;
+ groupPostDialDigits = numberPostDialDigits;
+ groupViaNumbers = numberViaNumbers;
+ groupCallType = callType;
+ groupAccountComponentName = accountComponentName;
+ groupAccountId = accountId;
}
// Save the day group associated with the current call.
- mGroupCreator.setDayGroup(currentCallId, currentGroupDayGroup);
- }
- // If the last set of calls at the end of the call log was itself a group, create it now.
- if (currentGroupSize > 1) {
- addGroup(count - currentGroupSize, currentGroupSize);
+ final long currentCallId = cursor.getLong(CallLogQuery.ID);
+ mGroupCreator.setDayGroup(currentCallId, groupDayGroup);
}
+
+ // Create a group for the last set of calls.
+ mGroupCreator.addGroup(count - groupSize, groupSize);
}
/**
- * Creates a group of items in the cursor.
- * <p>
- * The group is always unexpanded.
- *
- * @see CallLogAdapter#addGroup(int, int, boolean)
+ * Group cursor entries by date, with only one entry per group. This is used for listing
+ * voicemails in the archive tab.
*/
- private void addGroup(int cursorPosition, int size) {
- mGroupCreator.addGroup(cursorPosition, size, false);
+ public void addVoicemailGroups(Cursor cursor) {
+ if (cursor.getCount() == 0) {
+ return;
+ }
+
+ // Clear any previous day grouping information.
+ mGroupCreator.clearDayGroups();
+
+ // Get current system time, used for calculating which day group calls belong to.
+ long currentTime = System.currentTimeMillis();
+
+ // Reset cursor to start before the first row
+ cursor.moveToPosition(-1);
+
+ // Create an individual group for each voicemail
+ while (cursor.moveToNext()) {
+ mGroupCreator.addGroup(cursor.getPosition(), 1);
+ mGroupCreator.setDayGroup(cursor.getLong(CallLogQuery.ID),
+ getDayGroup(cursor.getLong(CallLogQuery.DATE), currentTime));
+
+ }
}
@VisibleForTesting
@@ -217,6 +231,10 @@ public class CallLogGroupBuilder {
}
}
+ private boolean isSameAccount(String name1, String name2, String id1, String id2) {
+ return TextUtils.equals(name1, name2) && TextUtils.equals(id1, id2);
+ }
+
@VisibleForTesting
boolean compareSipAddresses(String number1, String number2) {
if (number1 == null || number2 == null) return number1 == number2;
@@ -264,4 +282,19 @@ public class CallLogGroupBuilder {
return DAY_GROUP_OTHER;
}
}
+
+ private boolean areBothNotVoicemail(int callType, int groupCallType) {
+ return callType != AppCompatConstants.CALLS_VOICEMAIL_TYPE
+ && groupCallType != AppCompatConstants.CALLS_VOICEMAIL_TYPE;
+ }
+
+ private boolean areBothNotBlocked(int callType, int groupCallType) {
+ return callType != AppCompatConstants.CALLS_BLOCKED_TYPE
+ && groupCallType != AppCompatConstants.CALLS_BLOCKED_TYPE;
+ }
+
+ private boolean areBothBlocked(int callType, int groupCallType) {
+ return callType == AppCompatConstants.CALLS_BLOCKED_TYPE
+ && groupCallType == AppCompatConstants.CALLS_BLOCKED_TYPE;
+ }
}
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index 1c8e397e4..07e2bb425 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -16,7 +16,6 @@
package com.android.dialer.calllog;
-import android.content.Context;
import android.content.res.Resources;
import android.provider.CallLog.Calls;
import android.text.SpannableStringBuilder;
@@ -24,7 +23,9 @@ import android.text.TextUtils;
import android.util.Log;
import com.android.dialer.PhoneCallDetails;
+import com.android.dialer.util.AppCompatConstants;
import com.android.dialer.R;
+import com.android.dialer.calllog.calllogcache.CallLogCache;
/**
* Helper class to fill in the views of a call log entry.
@@ -36,27 +37,27 @@ import com.android.dialer.R;
private final PhoneCallDetailsHelper mPhoneCallDetailsHelper;
/** Resources to look up strings. */
private final Resources mResources;
- private final TelecomCallLogCache mTelecomCallLogCache;
+ private final CallLogCache mCallLogCache;
/**
* Creates a new helper instance.
*
* @param phoneCallDetailsHelper used to set the details of a phone call
- * @param phoneNumberHelper used to process phone number
+ * @param resources The object from which resources can be retrieved
+ * @param callLogCache A cache for values retrieved from telecom/telephony
*/
public CallLogListItemHelper(
PhoneCallDetailsHelper phoneCallDetailsHelper,
Resources resources,
- TelecomCallLogCache telecomCallLogCache) {
+ CallLogCache callLogCache) {
mPhoneCallDetailsHelper = phoneCallDetailsHelper;
mResources = resources;
- mTelecomCallLogCache = telecomCallLogCache;
+ mCallLogCache = callLogCache;
}
/**
* Sets the name, label, and number for a contact.
*
- * @param context The application context.
* @param views the views to populate
* @param details the details of a phone call needed to fill in the data
*/
@@ -74,6 +75,13 @@ import com.android.dialer.R;
// Cache name or number of caller. Used when setting the content descriptions of buttons
// when the actions ViewStub is inflated.
views.nameOrNumber = getNameOrNumber(details);
+
+ // The call type or Location associated with the call. Use when setting text for a
+ // voicemail log's call button
+ views.callTypeOrLocation = mPhoneCallDetailsHelper.getCallTypeOrLocation(details);
+
+ // Cache country iso. Used for number filtering.
+ views.countryIso = details.countryIso;
}
/**
@@ -157,7 +165,6 @@ import com.android.dialer.R;
*/
public CharSequence getCallDescription(PhoneCallDetails details) {
int lastCallType = getLastCallType(details.callTypes);
- boolean isVoiceMail = lastCallType == Calls.VOICEMAIL_TYPE;
// Get the name or number of the caller.
final CharSequence nameOrNumber = getNameOrNumber(details);
@@ -170,11 +177,6 @@ import com.android.dialer.R;
SpannableStringBuilder callDescription = new SpannableStringBuilder();
- // Prepend the voicemail indication.
- if (isVoiceMail) {
- callDescription.append(mResources.getString(R.string.description_new_voicemail));
- }
-
// Add number of calls if more than one.
if (details.callTypes.length > 1) {
callDescription.append(mResources.getString(R.string.description_num_calls,
@@ -186,20 +188,15 @@ import com.android.dialer.R;
callDescription.append(mResources.getString(R.string.description_video_call));
}
- int stringID = getCallDescriptionStringID(details.callTypes);
- String accountLabel = mTelecomCallLogCache.getAccountLabel(details.accountHandle);
+ String accountLabel = mCallLogCache.getAccountLabel(details.accountHandle);
+ CharSequence onAccountLabel = PhoneCallDetails.createAccountLabelDescription(mResources,
+ details.viaNumber, accountLabel);
- // Use chosen string resource to build up the message.
- CharSequence onAccountLabel = accountLabel == null
- ? ""
- : TextUtils.expandTemplate(
- mResources.getString(R.string.description_phone_account),
- accountLabel);
+ int stringID = getCallDescriptionStringID(details.callTypes, details.isRead);
callDescription.append(
TextUtils.expandTemplate(
mResources.getString(stringID),
nameOrNumber,
- // If no type or location can be determined, sub in empty string.
typeOrLocation == null ? "" : typeOrLocation,
timeOfCall,
onAccountLabel));
@@ -210,21 +207,28 @@ import com.android.dialer.R;
/**
* Determine the appropriate string ID to describe a call for accessibility purposes.
*
- * @param details Call details.
+ * @param callTypes The type of call corresponding to this entry or multiple if this entry
+ * represents multiple calls grouped together.
+ * @param isRead If the entry is a voicemail, {@code true} if the voicemail is read.
* @return String resource ID to use.
*/
- public int getCallDescriptionStringID(int[] callTypes) {
+ public int getCallDescriptionStringID(int[] callTypes, boolean isRead) {
int lastCallType = getLastCallType(callTypes);
int stringID;
- if (lastCallType == Calls.VOICEMAIL_TYPE || lastCallType == Calls.MISSED_TYPE) {
+ if (lastCallType == AppCompatConstants.CALLS_MISSED_TYPE) {
//Message: Missed call from <NameOrNumber>, <TypeOrLocation>, <TimeOfCall>,
//<PhoneAccount>.
stringID = R.string.description_incoming_missed_call;
- } else if (lastCallType == Calls.INCOMING_TYPE) {
+ } else if (lastCallType == AppCompatConstants.CALLS_INCOMING_TYPE) {
//Message: Answered call from <NameOrNumber>, <TypeOrLocation>, <TimeOfCall>,
//<PhoneAccount>.
stringID = R.string.description_incoming_answered_call;
+ } else if (lastCallType == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
+ //Message: (Unread) [V/v]oicemail from <NameOrNumber>, <TypeOrLocation>, <TimeOfCall>,
+ //<PhoneAccount>.
+ stringID = isRead ? R.string.description_read_voicemail
+ : R.string.description_unread_voicemail;
} else {
//Message: Call to <NameOrNumber>, <TypeOrLocation>, <TimeOfCall>, <PhoneAccount>.
stringID = R.string.description_outgoing_call;
@@ -252,10 +256,10 @@ import com.android.dialer.R;
*/
private CharSequence getNameOrNumber(PhoneCallDetails details) {
final CharSequence recipient;
- if (!TextUtils.isEmpty(details.name)) {
- recipient = details.name;
+ if (!TextUtils.isEmpty(details.getPreferredName())) {
+ recipient = details.getPreferredName();
} else {
- recipient = details.displayNumber;
+ recipient = details.displayNumber + details.postDialDigits;
}
return recipient;
}
diff --git a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
index 0fa5e6d33..baf2e1ab5 100644
--- a/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
+++ b/src/com/android/dialer/calllog/CallLogListItemViewHolder.java
@@ -18,32 +18,54 @@ package com.android.dialer.calllog;
import android.app.Activity;
import android.content.Context;
-import android.content.res.Resources;
import android.content.Intent;
+import android.content.res.Resources;
import android.net.Uri;
+import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.telecom.PhoneAccountHandle;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
+import android.view.ContextMenu;
+import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
import android.view.ViewStub;
-import android.widget.QuickContactBadge;
+import android.widget.ImageButton;
import android.widget.ImageView;
+import android.widget.QuickContactBadge;
import android.widget.TextView;
+import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.ClipboardUtils;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
import com.android.contacts.common.dialog.CallSubjectDialog;
import com.android.contacts.common.testing.NeededForTesting;
import com.android.contacts.common.util.UriUtils;
+import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
+import com.android.dialer.calllog.calllogcache.CallLogCache;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.FilteredNumbersUtil;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
+import com.android.dialer.service.ExtendedBlockingButtonRenderer;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.PhoneNumberUtil;
-import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
import com.android.dialer.voicemail.VoicemailPlaybackLayout;
+import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
+import com.android.dialerbind.ObjectFactory;
+import com.google.common.collect.Lists;
+
+import java.util.List;
/**
* This is an object containing references to views contained by the call log list item. This
@@ -52,7 +74,8 @@ import com.android.dialer.voicemail.VoicemailPlaybackLayout;
* This object also contains UI logic pertaining to the view, to isolate it from the CallLogAdapter.
*/
public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
- implements View.OnClickListener {
+ implements View.OnClickListener, MenuItem.OnMenuItemClickListener,
+ View.OnCreateContextMenuListener {
/** The root view of the call log list item */
public final View rootView;
@@ -80,6 +103,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
public View sendMessageView;
public View detailsButtonView;
public View callWithNoteButtonView;
+ public ImageView workIconView;
/**
* The row Id for the first call associated with the call log entry. Used as a key for the
@@ -100,6 +124,11 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
public String number;
/**
+ * The post-dial numbers that are dialed following the phone number.
+ */
+ public String postDialDigits;
+
+ /**
* The formatted phone number to display.
*/
public String displayNumber;
@@ -116,12 +145,24 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
public String numberType;
/**
+ * The country iso for the call. Cached here as the call back
+ * intent is set only when the actions ViewStub is inflated.
+ */
+ public String countryIso;
+
+ /**
* The type of call for the current call log entry. Cached here as the call back
* intent is set only when the actions ViewStub is inflated.
*/
public int callType;
/**
+ * ID for blocked numbers database.
+ * Set when context menu is created, if the number is blocked.
+ */
+ public Integer blockId;
+
+ /**
* The account for the current call log entry. Cached here as the call back
* intent is set only when the actions ViewStub is inflated.
*/
@@ -141,6 +182,12 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
public CharSequence nameOrNumber;
/**
+ * The call type or Location associated with the call. Cached here for use when setting text
+ * for a voicemail log's call button
+ */
+ public CharSequence callTypeOrLocation;
+
+ /**
* Whether this row is for a business or not.
*/
public boolean isBusiness;
@@ -150,38 +197,57 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
*/
public ContactInfo info;
- private static final int VOICEMAIL_TRANSCRIPTION_MAX_LINES = 10;
+ /**
+ * Whether the current log entry is a blocked number or not. Used in updatePhoto()
+ */
+ public boolean isBlocked;
+
+ /**
+ * Whether this is the archive tab or not.
+ */
+ public final boolean isArchiveTab;
private final Context mContext;
- private final TelecomCallLogCache mTelecomCallLogCache;
+ private final CallLogCache mCallLogCache;
private final CallLogListItemHelper mCallLogListItemHelper;
private final VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+ private final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+
+ private final BlockNumberDialogFragment.Callback mFilteredNumberDialogCallback;
private final int mPhotoSize;
+ private ViewStub mExtendedBlockingViewStub;
+ private final ExtendedBlockingButtonRenderer mExtendedBlockingButtonRenderer;
private View.OnClickListener mExpandCollapseListener;
private boolean mVoicemailPrimaryActionButtonClicked;
private CallLogListItemViewHolder(
Context context,
+ ExtendedBlockingButtonRenderer.Listener eventListener,
View.OnClickListener expandCollapseListener,
- TelecomCallLogCache telecomCallLogCache,
+ CallLogCache callLogCache,
CallLogListItemHelper callLogListItemHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter,
+ FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
+ BlockNumberDialogFragment.Callback filteredNumberDialogCallback,
View rootView,
QuickContactBadge quickContactView,
View primaryActionView,
PhoneCallDetailsViews phoneCallDetailsViews,
CardView callLogEntryView,
TextView dayGroupHeader,
- ImageView primaryActionButtonView) {
+ ImageView primaryActionButtonView,
+ boolean isArchiveTab) {
super(rootView);
mContext = context;
mExpandCollapseListener = expandCollapseListener;
- mTelecomCallLogCache = telecomCallLogCache;
+ mCallLogCache = callLogCache;
mCallLogListItemHelper = callLogListItemHelper;
mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
+ mFilteredNumberAsyncQueryHandler = filteredNumberAsyncQueryHandler;
+ mFilteredNumberDialogCallback = filteredNumberDialogCallback;
this.rootView = rootView;
this.quickContactView = quickContactView;
@@ -190,7 +256,8 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
this.callLogEntryView = callLogEntryView;
this.dayGroupHeader = dayGroupHeader;
this.primaryActionButtonView = primaryActionButtonView;
-
+ this.workIconView = (ImageView) rootView.findViewById(R.id.work_profile_icon);
+ this.isArchiveTab = isArchiveTab;
Resources resources = mContext.getResources();
mPhotoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
@@ -198,49 +265,152 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
phoneCallDetailsViews.nameView.setElegantTextHeight(false);
phoneCallDetailsViews.callLocationAndDate.setElegantTextHeight(false);
- quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
-
+ quickContactView.setOverlay(null);
+ if (CompatUtils.hasPrioritizedMimeType()) {
+ quickContactView.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
+ }
primaryActionButtonView.setOnClickListener(this);
primaryActionView.setOnClickListener(mExpandCollapseListener);
+ primaryActionView.setOnCreateContextMenuListener(this);
+ mExtendedBlockingButtonRenderer =
+ ObjectFactory.newExtendedBlockingButtonRenderer(mContext, eventListener);
}
public static CallLogListItemViewHolder create(
View view,
Context context,
+ ExtendedBlockingButtonRenderer.Listener eventListener,
View.OnClickListener expandCollapseListener,
- TelecomCallLogCache telecomCallLogCache,
+ CallLogCache callLogCache,
CallLogListItemHelper callLogListItemHelper,
- VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
+ VoicemailPlaybackPresenter voicemailPlaybackPresenter,
+ FilteredNumberAsyncQueryHandler filteredNumberAsyncQueryHandler,
+ BlockNumberDialogFragment.Callback filteredNumberDialogCallback,
+ boolean isArchiveTab) {
return new CallLogListItemViewHolder(
context,
+ eventListener,
expandCollapseListener,
- telecomCallLogCache,
+ callLogCache,
callLogListItemHelper,
voicemailPlaybackPresenter,
+ filteredNumberAsyncQueryHandler,
+ filteredNumberDialogCallback,
view,
(QuickContactBadge) view.findViewById(R.id.quick_contact_photo),
view.findViewById(R.id.primary_action_view),
PhoneCallDetailsViews.fromView(view),
(CardView) view.findViewById(R.id.call_log_row),
(TextView) view.findViewById(R.id.call_log_day_group_label),
- (ImageView) view.findViewById(R.id.primary_action_button));
+ (ImageView) view.findViewById(R.id.primary_action_button),
+ isArchiveTab);
+ }
+
+ @Override
+ public void onCreateContextMenu(
+ final ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ if (TextUtils.isEmpty(number)) {
+ return;
+ }
+
+ if (callType == CallLog.Calls.VOICEMAIL_TYPE) {
+ menu.setHeaderTitle(mContext.getResources().getText(R.string.voicemail));
+ } else {
+ menu.setHeaderTitle(PhoneNumberUtilsCompat.createTtsSpannable(
+ BidiFormatter.getInstance().unicodeWrap(number, TextDirectionHeuristics.LTR)));
+ }
+
+ menu.add(ContextMenu.NONE, R.id.context_menu_copy_to_clipboard, ContextMenu.NONE,
+ R.string.action_copy_number_text)
+ .setOnMenuItemClickListener(this);
+
+ // The edit number before call does not show up if any of the conditions apply:
+ // 1) Number cannot be called
+ // 2) Number is the voicemail number
+ // 3) Number is a SIP address
+
+ if (PhoneNumberUtil.canPlaceCallsTo(number, numberPresentation)
+ && !mCallLogCache.isVoicemailNumber(accountHandle, number)
+ && !PhoneNumberUtil.isSipNumber(number)) {
+ menu.add(ContextMenu.NONE, R.id.context_menu_edit_before_call, ContextMenu.NONE,
+ R.string.action_edit_number_before_call)
+ .setOnMenuItemClickListener(this);
+ }
+
+ if (callType == CallLog.Calls.VOICEMAIL_TYPE
+ && phoneCallDetailsViews.voicemailTranscriptionView.length() > 0) {
+ menu.add(ContextMenu.NONE, R.id.context_menu_copy_transcript_to_clipboard,
+ ContextMenu.NONE, R.string.copy_transcript_text)
+ .setOnMenuItemClickListener(this);
+ }
+
+ if (FilteredNumberCompat.canAttemptBlockOperations(mContext)
+ && FilteredNumbersUtil.canBlockNumber(mContext, number, countryIso)) {
+ mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(Integer id) {
+ blockId = id;
+ int blockTitleId = blockId == null ? R.string.action_block_number
+ : R.string.action_unblock_number;
+ final MenuItem blockItem = menu.add(
+ ContextMenu.NONE,
+ R.id.context_menu_block_number,
+ ContextMenu.NONE,
+ blockTitleId);
+ blockItem.setOnMenuItemClickListener(
+ CallLogListItemViewHolder.this);
+ }
+ }, number, countryIso);
+ }
+
+ Logger.logScreenView(ScreenEvent.CALL_LOG_CONTEXT_MENU, (Activity) mContext);
+ }
+
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ int resId = item.getItemId();
+ if (resId == R.id.context_menu_block_number) {
+ FilteredNumberCompat
+ .showBlockNumberDialogFlow(mContext.getContentResolver(), blockId, number,
+ countryIso, displayNumber, R.id.floating_action_button_container,
+ ((Activity) mContext).getFragmentManager(),
+ mFilteredNumberDialogCallback);
+ return true;
+ } else if (resId == R.id.context_menu_copy_to_clipboard) {
+ ClipboardUtils.copyText(mContext, null, number, true);
+ return true;
+ } else if (resId == R.id.context_menu_copy_transcript_to_clipboard) {
+ ClipboardUtils.copyText(mContext, null,
+ phoneCallDetailsViews.voicemailTranscriptionView.getText(), true);
+ return true;
+ } else if (resId == R.id.context_menu_edit_before_call) {
+ final Intent intent = new Intent(
+ Intent.ACTION_DIAL, CallUtil.getCallUri(number));
+ intent.setClass(mContext, DialtactsActivity.class);
+ DialerUtils.startActivityWithErrorToast(mContext, intent);
+ return true;
+ }
+ return false;
}
/**
* Configures the action buttons in the expandable actions ViewStub. The ViewStub is not
* inflated during initial binding, so click handlers, tags and accessibility text must be set
* here, if necessary.
- *
- * @param callLogItem The call log list item view.
*/
public void inflateActionViewStub() {
ViewStub stub = (ViewStub) rootView.findViewById(R.id.call_log_entry_actions_stub);
if (stub != null) {
- actionsView = (ViewGroup) stub.inflate();
+ actionsView = stub.inflate();
voicemailPlaybackView = (VoicemailPlaybackLayout) actionsView
.findViewById(R.id.voicemail_playback_layout);
+ if (isArchiveTab) {
+ voicemailPlaybackView.hideArchiveButton();
+ }
+
callButtonView = actionsView.findViewById(R.id.call_action);
callButtonView.setOnClickListener(this);
@@ -263,6 +433,9 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
callWithNoteButtonView = actionsView.findViewById(R.id.call_with_note_action);
callWithNoteButtonView.setOnClickListener(this);
+
+ mExtendedBlockingViewStub =
+ (ViewStub) actionsView.findViewById(R.id.extended_blocking_actions_container);
}
bindActionButtons();
@@ -273,25 +446,25 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
// Treat as voicemail list item; show play button if not expanded.
if (!isExpanded) {
primaryActionButtonView.setImageResource(R.drawable.ic_play_arrow_24dp);
+ primaryActionButtonView.setContentDescription(TextUtils.expandTemplate(
+ mContext.getString(R.string.description_voicemail_action),
+ nameOrNumber));
primaryActionButtonView.setVisibility(View.VISIBLE);
} else {
primaryActionButtonView.setVisibility(View.GONE);
}
} else {
// Treat as normal list item; show call button, if possible.
- boolean canPlaceCallToNumber =
- PhoneNumberUtil.canPlaceCallsTo(number, numberPresentation);
-
- if (canPlaceCallToNumber) {
+ if (PhoneNumberUtil.canPlaceCallsTo(number, numberPresentation)) {
boolean isVoicemailNumber =
- mTelecomCallLogCache.isVoicemailNumber(accountHandle, number);
+ mCallLogCache.isVoicemailNumber(accountHandle, number);
if (isVoicemailNumber) {
// Call to generic voicemail number, in case there are multiple accounts.
primaryActionButtonView.setTag(
IntentProvider.getReturnVoicemailCallIntentProvider());
} else {
primaryActionButtonView.setTag(
- IntentProvider.getReturnCallIntentProvider(number));
+ IntentProvider.getReturnCallIntentProvider(number + postDialDigits));
}
primaryActionButtonView.setContentDescription(TextUtils.expandTemplate(
@@ -319,13 +492,21 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
.setText(TextUtils.expandTemplate(
mContext.getString(R.string.call_log_action_call),
nameOrNumber));
+ TextView callTypeOrLocationView = ((TextView) callButtonView.findViewById(
+ R.id.call_type_or_location_text));
+ if (callType == Calls.VOICEMAIL_TYPE && !TextUtils.isEmpty(callTypeOrLocation)) {
+ callTypeOrLocationView.setText(callTypeOrLocation);
+ callTypeOrLocationView.setVisibility(View.VISIBLE);
+ } else {
+ callTypeOrLocationView.setVisibility(View.GONE);
+ }
callButtonView.setVisibility(View.VISIBLE);
} else {
callButtonView.setVisibility(View.GONE);
}
// If one of the calls had video capabilities, show the video call button.
- if (mTelecomCallLogCache.isVideoEnabled() && canPlaceCallToNumber &&
+ if (mCallLogCache.isVideoEnabled() && canPlaceCallToNumber &&
phoneCallDetailsViews.callTypeIcons.isVideoShown()) {
videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));
videoCallButtonView.setVisibility(View.VISIBLE);
@@ -334,22 +515,29 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
}
// For voicemail calls, show the voicemail playback layout; hide otherwise.
- if (callType == Calls.VOICEMAIL_TYPE && mVoicemailPlaybackPresenter != null) {
+ if (callType == Calls.VOICEMAIL_TYPE && mVoicemailPlaybackPresenter != null
+ && !TextUtils.isEmpty(voicemailUri)) {
voicemailPlaybackView.setVisibility(View.VISIBLE);
Uri uri = Uri.parse(voicemailUri);
mVoicemailPlaybackPresenter.setPlaybackView(
voicemailPlaybackView, uri, mVoicemailPrimaryActionButtonClicked);
mVoicemailPrimaryActionButtonClicked = false;
-
- CallLogAsyncTaskUtil.markVoicemailAsRead(mContext, uri);
+ // Only mark voicemail as read when not in archive tab
+ if (!isArchiveTab) {
+ CallLogAsyncTaskUtil.markVoicemailAsRead(mContext, uri);
+ }
} else {
voicemailPlaybackView.setVisibility(View.GONE);
}
- detailsButtonView.setVisibility(View.VISIBLE);
- detailsButtonView.setTag(
- IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));
+ if (callType == Calls.VOICEMAIL_TYPE) {
+ detailsButtonView.setVisibility(View.GONE);
+ } else {
+ detailsButtonView.setVisibility(View.VISIBLE);
+ detailsButtonView.setTag(
+ IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));
+ }
if (info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {
createNewContactButtonView.setTag(IntentProvider.getAddContactIntentProvider(
@@ -364,16 +552,48 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
addToExistingContactButtonView.setVisibility(View.GONE);
}
- sendMessageView.setTag(IntentProvider.getSendSmsIntentProvider(number));
+ if (canPlaceCallToNumber) {
+ sendMessageView.setTag(IntentProvider.getSendSmsIntentProvider(number));
+ sendMessageView.setVisibility(View.VISIBLE);
+ } else {
+ sendMessageView.setVisibility(View.GONE);
+ }
mCallLogListItemHelper.setActionContentDescriptions(this);
boolean supportsCallSubject =
- mTelecomCallLogCache.doesAccountSupportCallSubject(accountHandle);
+ mCallLogCache.doesAccountSupportCallSubject(accountHandle);
boolean isVoicemailNumber =
- mTelecomCallLogCache.isVoicemailNumber(accountHandle, number);
+ mCallLogCache.isVoicemailNumber(accountHandle, number);
callWithNoteButtonView.setVisibility(
supportsCallSubject && !isVoicemailNumber ? View.VISIBLE : View.GONE);
+
+ if(mExtendedBlockingButtonRenderer != null){
+ List<View> completeLogListItems = Lists.newArrayList(
+ createNewContactButtonView,
+ addToExistingContactButtonView,
+ sendMessageView,
+ callButtonView,
+ callWithNoteButtonView,
+ detailsButtonView,
+ voicemailPlaybackView);
+
+ List<View> blockedNumberVisibleViews = Lists.newArrayList(detailsButtonView);
+ List<View> extendedBlockingVisibleViews = Lists.newArrayList(detailsButtonView);
+
+ ExtendedBlockingButtonRenderer.ViewHolderInfo viewHolderInfo =
+ new ExtendedBlockingButtonRenderer.ViewHolderInfo(
+ completeLogListItems,
+ extendedBlockingVisibleViews,
+ blockedNumberVisibleViews,
+ number,
+ countryIso,
+ nameOrNumber.toString(),
+ displayNumber);
+ mExtendedBlockingButtonRenderer.setViewHolderInfo(viewHolderInfo);
+
+ mExtendedBlockingButtonRenderer.render(mExtendedBlockingViewStub);
+ }
}
/**
@@ -382,7 +602,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
* If the action views have never been shown yet for this view, inflate the view stub.
*/
public void showActions(boolean show) {
- expandVoicemailTranscriptionView(show);
+ showOrHideVoicemailTranscriptionView(show);
if (show) {
// Inflate the view stub if necessary, and wire up the event handlers.
@@ -401,24 +621,23 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
updatePrimaryActionButton(show);
}
- public void expandVoicemailTranscriptionView(boolean isExpanded) {
+ public void showOrHideVoicemailTranscriptionView(boolean isExpanded) {
if (callType != Calls.VOICEMAIL_TYPE) {
return;
}
final TextView view = phoneCallDetailsViews.voicemailTranscriptionView;
- if (TextUtils.isEmpty(view.getText())) {
+ if (!isExpanded || TextUtils.isEmpty(view.getText())) {
+ view.setVisibility(View.GONE);
return;
}
- view.setMaxLines(isExpanded ? VOICEMAIL_TRANSCRIPTION_MAX_LINES : 1);
- view.setSingleLine(!isExpanded);
+ view.setVisibility(View.VISIBLE);
}
- public void setPhoto(long photoId, Uri photoUri, Uri contactUri, String displayName,
- boolean isVoicemail, boolean isBusiness) {
- quickContactView.assignContactUri(contactUri);
- quickContactView.setOverlay(null);
+ public void updatePhoto() {
+ quickContactView.assignContactUri(info.lookupUri);
+ final boolean isVoicemail = mCallLogCache.isVoicemailNumber(accountHandle, number);
int contactType = ContactPhotoManager.TYPE_DEFAULT;
if (isVoicemail) {
contactType = ContactPhotoManager.TYPE_VOICEMAIL;
@@ -426,21 +645,27 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
contactType = ContactPhotoManager.TYPE_BUSINESS;
}
- String lookupKey = null;
- if (contactUri != null) {
- lookupKey = UriUtils.getLookupKeyFromUri(contactUri);
- }
-
- DefaultImageRequest request = new DefaultImageRequest(
+ final String lookupKey = info.lookupUri != null
+ ? UriUtils.getLookupKeyFromUri(info.lookupUri) : null;
+ final String displayName = TextUtils.isEmpty(info.name) ? displayNumber : info.name;
+ final DefaultImageRequest request = new DefaultImageRequest(
displayName, lookupKey, contactType, true /* isCircular */);
- if (photoId == 0 && photoUri != null) {
- ContactPhotoManager.getInstance(mContext).loadPhoto(quickContactView, photoUri,
+ if (info.photoId == 0 && info.photoUri != null) {
+ ContactPhotoManager.getInstance(mContext).loadPhoto(quickContactView, info.photoUri,
mPhotoSize, false /* darkTheme */, true /* isCircular */, request);
} else {
- ContactPhotoManager.getInstance(mContext).loadThumbnail(quickContactView, photoId,
+ ContactPhotoManager.getInstance(mContext).loadThumbnail(quickContactView, info.photoId,
false /* darkTheme */, true /* isCircular */, request);
}
+
+ if (mExtendedBlockingButtonRenderer != null) {
+ mExtendedBlockingButtonRenderer.updatePhotoAndLabelIfNecessary(
+ number,
+ countryIso,
+ quickContactView,
+ phoneCallDetailsViews.callLocationAndDate);
+ }
}
@Override
@@ -456,7 +681,7 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
info.lookupUri,
(String) nameOrNumber /* top line of contact view in call subject dialog */,
isBusiness,
- number, /* callable number used for ACTION_CALL intent */
+ number,
TextUtils.isEmpty(info.name) ? null : displayNumber, /* second line of contact
view in dialog. */
numberType, /* phone number type (e.g. mobile) in second line of contact view */
@@ -476,27 +701,32 @@ public final class CallLogListItemViewHolder extends RecyclerView.ViewHolder
@NeededForTesting
public static CallLogListItemViewHolder createForTest(Context context) {
Resources resources = context.getResources();
- TelecomCallLogCache telecomCallLogCache = new TelecomCallLogCache(context);
+ CallLogCache callLogCache =
+ CallLogCache.getCallLogCache(context);
PhoneCallDetailsHelper phoneCallDetailsHelper = new PhoneCallDetailsHelper(
- context, resources, telecomCallLogCache);
+ context, resources, callLogCache);
CallLogListItemViewHolder viewHolder = new CallLogListItemViewHolder(
context,
+ null,
null /* expandCollapseListener */,
- telecomCallLogCache,
- new CallLogListItemHelper(phoneCallDetailsHelper, resources, telecomCallLogCache),
+ callLogCache,
+ new CallLogListItemHelper(phoneCallDetailsHelper, resources, callLogCache),
null /* voicemailPlaybackPresenter */,
+ null /* filteredNumberAsyncQueryHandler */,
+ null /* filteredNumberDialogCallback */,
new View(context),
new QuickContactBadge(context),
new View(context),
PhoneCallDetailsViews.createForTest(context),
new CardView(context),
new TextView(context),
- new ImageView(context));
+ new ImageView(context),
+ false);
viewHolder.detailsButtonView = new TextView(context);
viewHolder.actionsView = new View(context);
viewHolder.voicemailPlaybackView = new VoicemailPlaybackLayout(context);
-
+ viewHolder.workIconView = new ImageButton(context);
return viewHolder;
}
-}
+} \ No newline at end of file
diff --git a/src/com/android/dialer/calllog/CallLogNotificationsHelper.java b/src/com/android/dialer/calllog/CallLogNotificationsHelper.java
index 367cb78c3..9a5028460 100644
--- a/src/com/android/dialer/calllog/CallLogNotificationsHelper.java
+++ b/src/com/android/dialer/calllog/CallLogNotificationsHelper.java
@@ -16,14 +16,147 @@
package com.android.dialer.calllog;
+import com.google.common.base.Strings;
+
+import android.Manifest;
+import android.content.ContentResolver;
+import android.content.ContentUris;
import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.CallLog.Calls;
+import android.provider.ContactsContract.PhoneLookup;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.util.Log;
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.util.PermissionsUtil;
+import com.android.dialer.R;
import com.android.dialer.util.TelecomUtil;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Helper class operating on call log notifications.
*/
public class CallLogNotificationsHelper {
+ private static final String TAG = "CallLogNotifHelper";
+ private static CallLogNotificationsHelper sInstance;
+
+ /** Returns the singleton instance of the {@link CallLogNotificationsHelper}. */
+ public static CallLogNotificationsHelper getInstance(Context context) {
+ if (sInstance == null) {
+ ContentResolver contentResolver = context.getContentResolver();
+ String countryIso = GeoUtil.getCurrentCountryIso(context);
+ sInstance = new CallLogNotificationsHelper(context,
+ createNewCallsQuery(context, contentResolver),
+ createNameLookupQuery(context, contentResolver),
+ new ContactInfoHelper(context, countryIso),
+ countryIso);
+ }
+ return sInstance;
+ }
+
+ private final Context mContext;
+ private final NewCallsQuery mNewCallsQuery;
+ private final NameLookupQuery mNameLookupQuery;
+ private final ContactInfoHelper mContactInfoHelper;
+ private final String mCurrentCountryIso;
+
+ CallLogNotificationsHelper(Context context, NewCallsQuery newCallsQuery,
+ NameLookupQuery nameLookupQuery, ContactInfoHelper contactInfoHelper,
+ String countryIso) {
+ mContext = context;
+ mNewCallsQuery = newCallsQuery;
+ mNameLookupQuery = nameLookupQuery;
+ mContactInfoHelper = contactInfoHelper;
+ mCurrentCountryIso = countryIso;
+ }
+
+ /**
+ * Get all voicemails with the "new" flag set to 1.
+ *
+ * @return A list of NewCall objects where each object represents a new voicemail.
+ */
+ @Nullable
+ public List<NewCall> getNewVoicemails() {
+ return mNewCallsQuery.query(Calls.VOICEMAIL_TYPE);
+ }
+
+ /**
+ * Get all missed calls with the "new" flag set to 1.
+ *
+ * @return A list of NewCall objects where each object represents a new missed call.
+ */
+ @Nullable
+ public List<NewCall> getNewMissedCalls() {
+ return mNewCallsQuery.query(Calls.MISSED_TYPE);
+ }
+
+ /**
+ * Given a number and number information (presentation and country ISO), get the best name
+ * for display. If the name is empty but we have a special presentation, display that.
+ * Otherwise attempt to look it up in the database or the cache.
+ * If that fails, fall back to displaying the number.
+ */
+ public String getName(@Nullable String number, int numberPresentation,
+ @Nullable String countryIso) {
+ return getContactInfo(number, numberPresentation, countryIso).name;
+ }
+
+ /**
+ * Given a number and number information (presentation and country ISO), get
+ * {@link ContactInfo}. If the name is empty but we have a special presentation, display that.
+ * Otherwise attempt to look it up in the cache.
+ * If that fails, fall back to displaying the number.
+ */
+ public ContactInfo getContactInfo(@Nullable String number, int numberPresentation,
+ @Nullable String countryIso) {
+ if (countryIso == null) {
+ countryIso = mCurrentCountryIso;
+ }
+
+ number = Strings.nullToEmpty(number);
+ ContactInfo contactInfo = new ContactInfo();
+ contactInfo.number = number;
+ contactInfo.formattedNumber = PhoneNumberUtils.formatNumber(number, countryIso);
+ // contactInfo.normalizedNumber is not PhoneNumberUtils.normalizeNumber. Read ContactInfo.
+ contactInfo.normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+
+ // 1. Special number representation.
+ contactInfo.name = PhoneNumberDisplayUtil.getDisplayName(
+ mContext,
+ number,
+ numberPresentation,
+ false).toString();
+ if (!TextUtils.isEmpty(contactInfo.name)) {
+ return contactInfo;
+ }
+
+ // 2. Look it up in the cache.
+ ContactInfo cachedContactInfo = mContactInfoHelper.lookupNumber(number, countryIso);
+
+ if (cachedContactInfo != null && !TextUtils.isEmpty(cachedContactInfo.name)) {
+ return cachedContactInfo;
+ }
+
+ if (!TextUtils.isEmpty(contactInfo.formattedNumber)) {
+ // 3. If we cannot lookup the contact, use the formatted number instead.
+ contactInfo.name = contactInfo.formattedNumber;
+ } else if (!TextUtils.isEmpty(number)) {
+ // 4. If number can't be formatted, use number.
+ contactInfo.name = number;
+ } else {
+ // 5. Otherwise, it's unknown number.
+ contactInfo.name = mContext.getResources().getString(R.string.unknown);
+ }
+ return contactInfo;
+ }
+
/** Removes the missed call notifications. */
public static void removeMissedCallNotifications(Context context) {
TelecomUtil.cancelMissedCallsNotification(context);
@@ -33,4 +166,188 @@ public class CallLogNotificationsHelper {
public static void updateVoicemailNotifications(Context context) {
CallLogNotificationsService.updateVoicemailNotifications(context, null);
}
+
+ /** Information about a new voicemail. */
+ public static final class NewCall {
+ public final Uri callsUri;
+ public final Uri voicemailUri;
+ public final String number;
+ public final int numberPresentation;
+ public final String accountComponentName;
+ public final String accountId;
+ public final String transcription;
+ public final String countryIso;
+ public final long dateMs;
+
+ public NewCall(
+ Uri callsUri,
+ Uri voicemailUri,
+ String number,
+ int numberPresentation,
+ String accountComponentName,
+ String accountId,
+ String transcription,
+ String countryIso,
+ long dateMs) {
+ this.callsUri = callsUri;
+ this.voicemailUri = voicemailUri;
+ this.number = number;
+ this.numberPresentation = numberPresentation;
+ this.accountComponentName = accountComponentName;
+ this.accountId = accountId;
+ this.transcription = transcription;
+ this.countryIso = countryIso;
+ this.dateMs = dateMs;
+ }
+ }
+
+ /** Allows determining the new calls for which a notification should be generated. */
+ public interface NewCallsQuery {
+ /**
+ * Returns the new calls of a certain type for which a notification should be generated.
+ */
+ @Nullable
+ public List<NewCall> query(int type);
+ }
+
+ /** Create a new instance of {@link NewCallsQuery}. */
+ public static NewCallsQuery createNewCallsQuery(Context context,
+ ContentResolver contentResolver) {
+
+ return new DefaultNewCallsQuery(context.getApplicationContext(), contentResolver);
+ }
+
+ /**
+ * Default implementation of {@link NewCallsQuery} that looks up the list of new calls to
+ * notify about in the call log.
+ */
+ private static final class DefaultNewCallsQuery implements NewCallsQuery {
+ private static final String[] PROJECTION = {
+ Calls._ID,
+ Calls.NUMBER,
+ Calls.VOICEMAIL_URI,
+ Calls.NUMBER_PRESENTATION,
+ Calls.PHONE_ACCOUNT_COMPONENT_NAME,
+ Calls.PHONE_ACCOUNT_ID,
+ Calls.TRANSCRIPTION,
+ Calls.COUNTRY_ISO,
+ Calls.DATE
+ };
+ private static final int ID_COLUMN_INDEX = 0;
+ private static final int NUMBER_COLUMN_INDEX = 1;
+ private static final int VOICEMAIL_URI_COLUMN_INDEX = 2;
+ private static final int NUMBER_PRESENTATION_COLUMN_INDEX = 3;
+ private static final int PHONE_ACCOUNT_COMPONENT_NAME_COLUMN_INDEX = 4;
+ private static final int PHONE_ACCOUNT_ID_COLUMN_INDEX = 5;
+ private static final int TRANSCRIPTION_COLUMN_INDEX = 6;
+ private static final int COUNTRY_ISO_COLUMN_INDEX = 7;
+ private static final int DATE_COLUMN_INDEX = 8;
+
+ private final ContentResolver mContentResolver;
+ private final Context mContext;
+
+ private DefaultNewCallsQuery(Context context, ContentResolver contentResolver) {
+ mContext = context;
+ mContentResolver = contentResolver;
+ }
+
+ @Override
+ @Nullable
+ public List<NewCall> query(int type) {
+ if (!PermissionsUtil.hasPermission(mContext, Manifest.permission.READ_CALL_LOG)) {
+ Log.w(TAG, "No READ_CALL_LOG permission, returning null for calls lookup.");
+ return null;
+ }
+ final String selection = String.format("%s = 1 AND %s = ?", Calls.NEW, Calls.TYPE);
+ final String[] selectionArgs = new String[]{ Integer.toString(type) };
+ try (Cursor cursor = mContentResolver.query(Calls.CONTENT_URI_WITH_VOICEMAIL,
+ PROJECTION, selection, selectionArgs, Calls.DEFAULT_SORT_ORDER)) {
+ if (cursor == null) {
+ return null;
+ }
+ List<NewCall> newCalls = new ArrayList<>();
+ while (cursor.moveToNext()) {
+ newCalls.add(createNewCallsFromCursor(cursor));
+ }
+ return newCalls;
+ } catch (RuntimeException e) {
+ Log.w(TAG, "Exception when querying Contacts Provider for calls lookup");
+ return null;
+ }
+ }
+
+ /** Returns an instance of {@link NewCall} created by using the values of the cursor. */
+ private NewCall createNewCallsFromCursor(Cursor cursor) {
+ String voicemailUriString = cursor.getString(VOICEMAIL_URI_COLUMN_INDEX);
+ Uri callsUri = ContentUris.withAppendedId(
+ Calls.CONTENT_URI_WITH_VOICEMAIL, cursor.getLong(ID_COLUMN_INDEX));
+ Uri voicemailUri = voicemailUriString == null ? null : Uri.parse(voicemailUriString);
+ return new NewCall(
+ callsUri,
+ voicemailUri,
+ cursor.getString(NUMBER_COLUMN_INDEX),
+ cursor.getInt(NUMBER_PRESENTATION_COLUMN_INDEX),
+ cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME_COLUMN_INDEX),
+ cursor.getString(PHONE_ACCOUNT_ID_COLUMN_INDEX),
+ cursor.getString(TRANSCRIPTION_COLUMN_INDEX),
+ cursor.getString(COUNTRY_ISO_COLUMN_INDEX),
+ cursor.getLong(DATE_COLUMN_INDEX));
+ }
+ }
+
+ /** Allows determining the name associated with a given phone number. */
+ public interface NameLookupQuery {
+ /**
+ * Returns the name associated with the given number in the contacts database, or null if
+ * the number does not correspond to any of the contacts.
+ * <p>
+ * If there are multiple contacts with the same phone number, it will return the name of one
+ * of the matching contacts.
+ */
+ @Nullable
+ public String query(@Nullable String number);
+ }
+
+ /** Create a new instance of {@link NameLookupQuery}. */
+ public static NameLookupQuery createNameLookupQuery(Context context,
+ ContentResolver contentResolver) {
+ return new DefaultNameLookupQuery(context.getApplicationContext(), contentResolver);
+ }
+
+ /**
+ * Default implementation of {@link NameLookupQuery} that looks up the name of a contact in the
+ * contacts database.
+ */
+ private static final class DefaultNameLookupQuery implements NameLookupQuery {
+ private static final String[] PROJECTION = { PhoneLookup.DISPLAY_NAME };
+ private static final int DISPLAY_NAME_COLUMN_INDEX = 0;
+
+ private final ContentResolver mContentResolver;
+ private final Context mContext;
+
+ private DefaultNameLookupQuery(Context context, ContentResolver contentResolver) {
+ mContext = context;
+ mContentResolver = contentResolver;
+ }
+
+ @Override
+ @Nullable
+ public String query(@Nullable String number) {
+ if (!PermissionsUtil.hasPermission(mContext, Manifest.permission.READ_CONTACTS)) {
+ Log.w(TAG, "No READ_CONTACTS permission, returning null for name lookup.");
+ return null;
+ }
+ try (Cursor cursor = mContentResolver.query(
+ Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)),
+ PROJECTION, null, null, null)) {
+ if (cursor == null || !cursor.moveToFirst()) {
+ return null;
+ }
+ return cursor.getString(DISPLAY_NAME_COLUMN_INDEX);
+ } catch (RuntimeException e) {
+ Log.w(TAG, "Exception when querying Contacts Provider for name lookup");
+ return null;
+ }
+ }
+ }
}
diff --git a/src/com/android/dialer/calllog/CallLogNotificationsService.java b/src/com/android/dialer/calllog/CallLogNotificationsService.java
index 9a67b61b6..4ff9576ca 100644
--- a/src/com/android/dialer/calllog/CallLogNotificationsService.java
+++ b/src/com/android/dialer/calllog/CallLogNotificationsService.java
@@ -26,15 +26,16 @@ import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.util.TelecomUtil;
/**
- * Provides operations for managing notifications.
+ * Provides operations for managing call-related notifications.
* <p>
* It handles the following actions:
* <ul>
- * <li>{@link #ACTION_MARK_NEW_VOICEMAILS_AS_OLD}: marks all the new voicemails in the call log as
- * old; this is called when a notification is dismissed.</li>
- * <li>{@link #ACTION_UPDATE_NOTIFICATIONS}: updates the content of the new items notification; it
- * may include an optional extra {@link #EXTRA_NEW_VOICEMAIL_URI}, containing the URI of the new
- * voicemail that has triggered this update (if any).</li>
+ * <li>Updating voicemail notifications</li>
+ * <li>Marking new voicemails as old</li>
+ * <li>Updating missed call notifications</li>
+ * <li>Marking new missed calls as old</li>
+ * <li>Calling back from a missed call</li>
+ * <li>Sending an SMS from a missed call</li>
* </ul>
*/
public class CallLogNotificationsService extends IntentService {
@@ -45,21 +46,62 @@ public class CallLogNotificationsService extends IntentService {
"com.android.dialer.calllog.ACTION_MARK_NEW_VOICEMAILS_AS_OLD";
/**
- * Action to update the notifications.
+ * Action to update voicemail notifications.
* <p>
* May include an optional extra {@link #EXTRA_NEW_VOICEMAIL_URI}.
*/
- public static final String ACTION_UPDATE_NOTIFICATIONS =
- "com.android.dialer.calllog.UPDATE_NOTIFICATIONS";
+ public static final String ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS =
+ "com.android.dialer.calllog.UPDATE_VOICEMAIL_NOTIFICATIONS";
/**
- * Extra to included with {@link #ACTION_UPDATE_NOTIFICATIONS} to identify the new voicemail
- * that triggered an update.
+ * Extra to included with {@link #ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS} to identify the new
+ * voicemail that triggered an update.
* <p>
* It must be a {@link Uri}.
*/
public static final String EXTRA_NEW_VOICEMAIL_URI = "NEW_VOICEMAIL_URI";
+ /**
+ * Action to update the missed call notifications.
+ * <p>
+ * Includes optional extras {@link #EXTRA_MISSED_CALL_NUMBER} and
+ * {@link #EXTRA_MISSED_CALL_COUNT}.
+ */
+ public static final String ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS =
+ "com.android.dialer.calllog.UPDATE_MISSED_CALL_NOTIFICATIONS";
+
+ /** Action to mark all the new missed calls as old. */
+ public static final String ACTION_MARK_NEW_MISSED_CALLS_AS_OLD =
+ "com.android.dialer.calllog.ACTION_MARK_NEW_MISSED_CALLS_AS_OLD";
+
+ /** Action to call back a missed call. */
+ public static final String ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION =
+ "com.android.dialer.calllog.CALL_BACK_FROM_MISSED_CALL_NOTIFICATION";
+
+ public static final String ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION =
+ "com.android.dialer.calllog.SEND_SMS_FROM_MISSED_CALL_NOTIFICATION";
+
+ /**
+ * Extra to be included with {@link #ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS},
+ * {@link #ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION} and
+ * {@link #ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION} to identify the number to display,
+ * call or text back.
+ * <p>
+ * It must be a {@link String}.
+ */
+ public static final String EXTRA_MISSED_CALL_NUMBER = "MISSED_CALL_NUMBER";
+
+ /**
+ * Extra to be included with {@link #ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS} to represent the
+ * number of missed calls.
+ * <p>
+ * It must be a {@link Integer}
+ */
+ public static final String EXTRA_MISSED_CALL_COUNT =
+ "MISSED_CALL_COUNT";
+
+ public static final int UNKNOWN_MISSED_CALL_COUNT = -1;
+
private VoicemailQueryHandler mVoicemailQueryHandler;
public CallLogNotificationsService() {
@@ -67,12 +109,6 @@ public class CallLogNotificationsService extends IntentService {
}
@Override
- public void onCreate() {
- super.onCreate();
- mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver());
- }
-
- @Override
protected void onHandleIntent(Intent intent) {
if (intent == null) {
Log.d(TAG, "onHandleIntent: could not handle null intent");
@@ -83,13 +119,38 @@ public class CallLogNotificationsService extends IntentService {
return;
}
- if (ACTION_MARK_NEW_VOICEMAILS_AS_OLD.equals(intent.getAction())) {
- mVoicemailQueryHandler.markNewVoicemailsAsOld();
- } else if (ACTION_UPDATE_NOTIFICATIONS.equals(intent.getAction())) {
- Uri voicemailUri = (Uri) intent.getParcelableExtra(EXTRA_NEW_VOICEMAIL_URI);
- DefaultVoicemailNotifier.getInstance(this).updateNotification(voicemailUri);
- } else {
- Log.d(TAG, "onHandleIntent: could not handle: " + intent);
+ String action = intent.getAction();
+ switch (action) {
+ case ACTION_MARK_NEW_VOICEMAILS_AS_OLD:
+ if (mVoicemailQueryHandler == null) {
+ mVoicemailQueryHandler = new VoicemailQueryHandler(this, getContentResolver());
+ }
+ mVoicemailQueryHandler.markNewVoicemailsAsOld();
+ break;
+ case ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS:
+ Uri voicemailUri = (Uri) intent.getParcelableExtra(EXTRA_NEW_VOICEMAIL_URI);
+ DefaultVoicemailNotifier.getInstance(this).updateNotification(voicemailUri);
+ break;
+ case ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS:
+ int count = intent.getIntExtra(EXTRA_MISSED_CALL_COUNT,
+ UNKNOWN_MISSED_CALL_COUNT);
+ String number = intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER);
+ MissedCallNotifier.getInstance(this).updateMissedCallNotification(count, number);
+ break;
+ case ACTION_MARK_NEW_MISSED_CALLS_AS_OLD:
+ CallLogNotificationsHelper.removeMissedCallNotifications(this);
+ break;
+ case ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION:
+ MissedCallNotifier.getInstance(this).callBackFromMissedCall(
+ intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER));
+ break;
+ case ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION:
+ MissedCallNotifier.getInstance(this).sendSmsFromMissedCall(
+ intent.getStringExtra(EXTRA_MISSED_CALL_NUMBER));
+ break;
+ default:
+ Log.d(TAG, "onHandleIntent: could not handle: " + intent);
+ break;
}
}
@@ -103,7 +164,8 @@ public class CallLogNotificationsService extends IntentService {
public static void updateVoicemailNotifications(Context context, Uri voicemailUri) {
if (TelecomUtil.hasReadWriteVoicemailPermissions(context)) {
Intent serviceIntent = new Intent(context, CallLogNotificationsService.class);
- serviceIntent.setAction(CallLogNotificationsService.ACTION_UPDATE_NOTIFICATIONS);
+ serviceIntent.setAction(
+ CallLogNotificationsService.ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS);
// If voicemailUri is null, then notifications for all voicemails will be updated.
if (voicemailUri != null) {
serviceIntent.putExtra(
@@ -112,4 +174,21 @@ public class CallLogNotificationsService extends IntentService {
context.startService(serviceIntent);
}
}
+
+ /**
+ * Updates notifications for any new missed calls.
+ *
+ * @param context A valid context.
+ * @param count The number of new missed calls.
+ * @param number The phone number of the newest missed call.
+ */
+ public static void updateMissedCallNotifications(Context context, int count,
+ String number) {
+ Intent serviceIntent = new Intent(context, CallLogNotificationsService.class);
+ serviceIntent.setAction(
+ CallLogNotificationsService.ACTION_UPDATE_MISSED_CALL_NOTIFICATIONS);
+ serviceIntent.putExtra(EXTRA_MISSED_CALL_COUNT, count);
+ serviceIntent.putExtra(EXTRA_MISSED_CALL_NUMBER, number);
+ context.startService(serviceIntent);
+ }
}
diff --git a/src/com/android/dialer/calllog/CallLogQuery.java b/src/com/android/dialer/calllog/CallLogQuery.java
index 2b43c2857..e1a41199a 100644
--- a/src/com/android/dialer/calllog/CallLogQuery.java
+++ b/src/com/android/dialer/calllog/CallLogQuery.java
@@ -16,13 +16,22 @@
package com.android.dialer.calllog;
+import com.google.common.collect.Lists;
+
import android.provider.CallLog.Calls;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.compat.CallsSdkCompat;
+import com.android.dialer.compat.DialerCompatUtils;
+
+import java.util.List;
+
/**
* The query for the call log table.
*/
public final class CallLogQuery {
- public static final String[] _PROJECTION = new String[] {
+
+ private static final String[] _PROJECTION_INTERNAL = new String[] {
Calls._ID, // 0
Calls.NUMBER, // 1
Calls.DATE, // 2
@@ -46,7 +55,6 @@ public final class CallLogQuery {
Calls.FEATURES, // 20
Calls.DATA_USAGE, // 21
Calls.TRANSCRIPTION, // 22
- Calls.CACHED_PHOTO_URI // 23
};
public static final int ID = 0;
@@ -72,5 +80,36 @@ public final class CallLogQuery {
public static final int FEATURES = 20;
public static final int DATA_USAGE = 21;
public static final int TRANSCRIPTION = 22;
- public static final int CACHED_PHOTO_URI = 23;
+
+ // Indices for columns that may not be available, depending on the Sdk Version
+ /**
+ * Only available in versions >= M
+ * Call {@link DialerCompatUtils#isCallsCachedPhotoUriCompatible()} prior to use
+ */
+ public static int CACHED_PHOTO_URI = -1;
+
+ /**
+ * Only available in versions > M
+ * Call {@link CompatUtils#isNCompatible()} prior to use
+ */
+ public static int POST_DIAL_DIGITS = -1;
+ public static int VIA_NUMBER = -1;
+
+ public static final String[] _PROJECTION;
+
+ static {
+ List<String> projectionList = Lists.newArrayList(_PROJECTION_INTERNAL);
+ if (DialerCompatUtils.isCallsCachedPhotoUriCompatible()) {
+ projectionList.add(Calls.CACHED_PHOTO_URI);
+ CACHED_PHOTO_URI = projectionList.size() - 1;
+ }
+ if (CompatUtils.isNCompatible()) {
+ projectionList.add(CallsSdkCompat.POST_DIAL_DIGITS);
+ POST_DIAL_DIGITS = projectionList.size() - 1;
+ projectionList.add(CallsSdkCompat.VIA_NUMBER);
+ VIA_NUMBER = projectionList.size() - 1;
+ }
+ _PROJECTION = projectionList.toArray(new String[projectionList.size()]);
+ }
+
}
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 60bdcff46..cf86bad7f 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -26,6 +26,7 @@ import android.database.sqlite.SQLiteDiskIOException;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteFullException;
import android.net.Uri;
+import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -34,8 +35,11 @@ import android.provider.VoicemailContract.Status;
import android.provider.VoicemailContract.Voicemails;
import android.util.Log;
+import com.android.contacts.common.compat.SdkVersionOverride;
import com.android.contacts.common.database.NoNullCursorAsyncQueryHandler;
import com.android.contacts.common.util.PermissionsUtil;
+import com.android.dialer.database.VoicemailArchiveContract;
+import com.android.dialer.util.AppCompatConstants;
import com.android.dialer.util.TelecomUtil;
import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
@@ -46,8 +50,6 @@ import java.util.List;
/** Handles asynchronous queries to the call log. */
public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
- private static final String[] EMPTY_STRING_ARRAY = new String[0];
-
private static final String TAG = "CallLogQueryHandler";
private static final int NUM_LOGS_TO_DISPLAY = 1000;
@@ -59,6 +61,12 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
private static final int UPDATE_MARK_MISSED_CALL_AS_READ_TOKEN = 56;
/** The token for the query to fetch voicemail status messages. */
private static final int QUERY_VOICEMAIL_STATUS_TOKEN = 57;
+ /** The token for the query to fetch the number of unread voicemails. */
+ private static final int QUERY_VOICEMAIL_UNREAD_COUNT_TOKEN = 58;
+ /** The token for the query to fetch the number of missed calls. */
+ private static final int QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN = 59;
+ /** The oken for the query to fetch the archived voicemails. */
+ private static final int QUERY_VOICEMAIL_ARCHIVE = 60;
private final int mLogLimit;
@@ -122,6 +130,17 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
}
/**
+ * Fetch all the voicemails in the voicemail archive.
+ */
+ public void fetchVoicemailArchive() {
+ startQuery(QUERY_VOICEMAIL_ARCHIVE, null,
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI,
+ null, VoicemailArchiveContract.VoicemailArchive.ARCHIVED + " = 1", null,
+ VoicemailArchiveContract.VoicemailArchive.DATE + " DESC");
+ }
+
+
+ /**
* Fetches the list of calls from the call log for a given type.
* This call ignores the new or old state.
* <p>
@@ -147,36 +166,44 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
}
}
+ public void fetchVoicemailUnreadCount() {
+ if (TelecomUtil.hasReadWriteVoicemailPermissions(mContext)) {
+ // Only count voicemails that have not been read and have not been deleted.
+ startQuery(QUERY_VOICEMAIL_UNREAD_COUNT_TOKEN, null, Voicemails.CONTENT_URI,
+ new String[] { Voicemails._ID },
+ Voicemails.IS_READ + "=0" + " AND " + Voicemails.DELETED + "=0", null, null);
+ }
+ }
+
/** Fetches the list of calls in the call log. */
private void fetchCalls(int token, int callType, boolean newOnly, long newerThan) {
- // We need to check for NULL explicitly otherwise entries with where READ is NULL
- // may not match either the query or its negation.
- // We consider the calls that are not yet consumed (i.e. IS_READ = 0) as "new".
StringBuilder where = new StringBuilder();
List<String> selectionArgs = Lists.newArrayList();
+ // Always hide blocked calls.
+ where.append("(").append(Calls.TYPE).append(" != ?)");
+ selectionArgs.add(Integer.toString(AppCompatConstants.CALLS_BLOCKED_TYPE));
+
// Ignore voicemails marked as deleted
- where.append(Voicemails.DELETED);
- where.append(" = 0");
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M)
+ >= Build.VERSION_CODES.M) {
+ where.append(" AND (").append(Voicemails.DELETED).append(" = 0)");
+ }
if (newOnly) {
- where.append(" AND ");
- where.append(Calls.NEW);
- where.append(" = 1");
+ where.append(" AND (").append(Calls.NEW).append(" = 1)");
}
if (callType > CALL_TYPE_ALL) {
- where.append(" AND ");
- where.append(String.format("(%s = ?)", Calls.TYPE));
+ where.append(" AND (").append(Calls.TYPE).append(" = ?)");
selectionArgs.add(Integer.toString(callType));
} else {
where.append(" AND NOT ");
- where.append("(" + Calls.TYPE + " = " + Calls.VOICEMAIL_TYPE + ")");
+ where.append("(" + Calls.TYPE + " = " + AppCompatConstants.CALLS_VOICEMAIL_TYPE + ")");
}
if (newerThan > 0) {
- where.append(" AND ");
- where.append(String.format("(%s > ?)", Calls.DATE));
+ where.append(" AND (").append(Calls.DATE).append(" > ?)");
selectionArgs.add(Long.toString(newerThan));
}
@@ -185,9 +212,8 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
Uri uri = TelecomUtil.getCallLogUri(mContext).buildUpon()
.appendQueryParameter(Calls.LIMIT_PARAM_KEY, Integer.toString(limit))
.build();
- startQuery(token, null, uri,
- CallLogQuery._PROJECTION, selection, selectionArgs.toArray(EMPTY_STRING_ARRAY),
- Calls.DEFAULT_SORT_ORDER);
+ startQuery(token, null, uri, CallLogQuery._PROJECTION, selection, selectionArgs.toArray(
+ new String[selectionArgs.size()]), Calls.DEFAULT_SORT_ORDER);
}
/** Cancel any pending fetch request. */
@@ -217,19 +243,25 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
if (!PermissionsUtil.hasPhonePermissions(mContext)) {
return;
}
- // Mark all "new" calls as not new anymore.
- StringBuilder where = new StringBuilder();
- where.append(Calls.IS_READ).append(" = 0");
- where.append(" AND ");
- where.append(Calls.TYPE).append(" = ").append(Calls.MISSED_TYPE);
ContentValues values = new ContentValues(1);
values.put(Calls.IS_READ, "1");
startUpdate(UPDATE_MARK_MISSED_CALL_AS_READ_TOKEN, null, Calls.CONTENT_URI, values,
- where.toString(), null);
+ getUnreadMissedCallsQuery(), null);
+ }
+
+ /** Fetch all missed calls received since last time the tab was opened. */
+ public void fetchMissedCallsUnreadCount() {
+ if (!PermissionsUtil.hasPhonePermissions(mContext)) {
+ return;
+ }
+
+ startQuery(QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN, null, Calls.CONTENT_URI,
+ new String[]{Calls._ID}, getUnreadMissedCallsQuery(), null, null);
}
+
@Override
protected synchronized void onNotNullableQueryComplete(int token, Object cookie,
Cursor cursor) {
@@ -237,12 +269,16 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
return;
}
try {
- if (token == QUERY_CALLLOG_TOKEN) {
+ if (token == QUERY_CALLLOG_TOKEN || token == QUERY_VOICEMAIL_ARCHIVE) {
if (updateAdapterData(cursor)) {
cursor = null;
}
} else if (token == QUERY_VOICEMAIL_STATUS_TOKEN) {
updateVoicemailStatus(cursor);
+ } else if (token == QUERY_VOICEMAIL_UNREAD_COUNT_TOKEN) {
+ updateVoicemailUnreadCount(cursor);
+ } else if (token == QUERY_MISSED_CALLS_UNREAD_COUNT_TOKEN) {
+ updateMissedCallsUnreadCount(cursor);
} else {
Log.w(TAG, "Unknown query completed: ignoring: " + token);
}
@@ -266,6 +302,17 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
}
+ /**
+ * @return Query string to get all unread missed calls.
+ */
+ private String getUnreadMissedCallsQuery() {
+ StringBuilder where = new StringBuilder();
+ where.append(Calls.IS_READ).append(" = 0 OR ").append(Calls.IS_READ).append(" IS NULL");
+ where.append(" AND ");
+ where.append(Calls.TYPE).append(" = ").append(Calls.MISSED_TYPE);
+ return where.toString();
+ }
+
private void updateVoicemailStatus(Cursor statusCursor) {
final Listener listener = mListener.get();
if (listener != null) {
@@ -273,11 +320,31 @@ public class CallLogQueryHandler extends NoNullCursorAsyncQueryHandler {
}
}
+ private void updateVoicemailUnreadCount(Cursor statusCursor) {
+ final Listener listener = mListener.get();
+ if (listener != null) {
+ listener.onVoicemailUnreadCountFetched(statusCursor);
+ }
+ }
+
+ private void updateMissedCallsUnreadCount(Cursor statusCursor) {
+ final Listener listener = mListener.get();
+ if (listener != null) {
+ listener.onMissedCallsUnreadCountFetched(statusCursor);
+ }
+ }
+
/** Listener to completion of various queries. */
public interface Listener {
/** Called when {@link CallLogQueryHandler#fetchVoicemailStatus()} completes. */
void onVoicemailStatusFetched(Cursor statusCursor);
+ /** Called when {@link CallLogQueryHandler#fetchVoicemailUnreadCount()} completes. */
+ void onVoicemailUnreadCountFetched(Cursor cursor);
+
+ /** Called when {@link CallLogQueryHandler#fetchMissedCallsUnreadCount()} completes. */
+ void onMissedCallsUnreadCountFetched(Cursor cursor);
+
/**
* Called when {@link CallLogQueryHandler#fetchCalls(int)} complete.
* Returns true if takes ownership of cursor.
diff --git a/src/com/android/dialer/calllog/CallTypeHelper.java b/src/com/android/dialer/calllog/CallTypeHelper.java
index 36c0975bd..acc114c5c 100644
--- a/src/com/android/dialer/calllog/CallTypeHelper.java
+++ b/src/com/android/dialer/calllog/CallTypeHelper.java
@@ -17,9 +17,9 @@
package com.android.dialer.calllog;
import android.content.res.Resources;
-import android.provider.CallLog.Calls;
import com.android.dialer.R;
+import com.android.dialer.util.AppCompatConstants;
/**
* Helper class to perform operations related to call types.
@@ -39,6 +39,10 @@ public class CallTypeHelper {
private final CharSequence mMissedVideoName;
/** Name used to identify voicemail calls. */
private final CharSequence mVoicemailName;
+ /** Name used to identify rejected calls. */
+ private final CharSequence mRejectedName;
+ /** Name used to identify blocked calls. */
+ private final CharSequence mBlockedName;
/** Color used to identify new missed calls. */
private final int mNewMissedColor;
/** Color used to identify new voicemail calls. */
@@ -53,6 +57,8 @@ public class CallTypeHelper {
mOutgoingVideoName = resources.getString(R.string.type_outgoing_video);
mMissedVideoName = resources.getString(R.string.type_missed_video);
mVoicemailName = resources.getString(R.string.type_voicemail);
+ mRejectedName = resources.getString(R.string.type_rejected);
+ mBlockedName = resources.getString(R.string.type_blocked);
mNewMissedColor = resources.getColor(R.color.call_log_missed_call_highlight_color);
mNewVoicemailColor = resources.getColor(R.color.call_log_voicemail_highlight_color);
}
@@ -60,30 +66,36 @@ public class CallTypeHelper {
/** Returns the text used to represent the given call type. */
public CharSequence getCallTypeText(int callType, boolean isVideoCall) {
switch (callType) {
- case Calls.INCOMING_TYPE:
+ case AppCompatConstants.CALLS_INCOMING_TYPE:
if (isVideoCall) {
return mIncomingVideoName;
} else {
return mIncomingName;
}
- case Calls.OUTGOING_TYPE:
+ case AppCompatConstants.CALLS_OUTGOING_TYPE:
if (isVideoCall) {
return mOutgoingVideoName;
} else {
return mOutgoingName;
}
- case Calls.MISSED_TYPE:
+ case AppCompatConstants.CALLS_MISSED_TYPE:
if (isVideoCall) {
return mMissedVideoName;
} else {
return mMissedName;
}
- case Calls.VOICEMAIL_TYPE:
+ case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
return mVoicemailName;
+ case AppCompatConstants.CALLS_REJECTED_TYPE:
+ return mRejectedName;
+
+ case AppCompatConstants.CALLS_BLOCKED_TYPE:
+ return mBlockedName;
+
default:
return mMissedName;
}
@@ -92,18 +104,18 @@ public class CallTypeHelper {
/** Returns the color used to highlight the given call type, null if not highlight is needed. */
public Integer getHighlightedColor(int callType) {
switch (callType) {
- case Calls.INCOMING_TYPE:
+ case AppCompatConstants.CALLS_INCOMING_TYPE:
// New incoming calls are not highlighted.
return null;
- case Calls.OUTGOING_TYPE:
+ case AppCompatConstants.CALLS_OUTGOING_TYPE:
// New outgoing calls are not highlighted.
return null;
- case Calls.MISSED_TYPE:
+ case AppCompatConstants.CALLS_MISSED_TYPE:
return mNewMissedColor;
- case Calls.VOICEMAIL_TYPE:
+ case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
return mNewVoicemailColor;
default:
@@ -115,7 +127,8 @@ public class CallTypeHelper {
}
public static boolean isMissedCallType(int callType) {
- return (callType != Calls.INCOMING_TYPE && callType != Calls.OUTGOING_TYPE &&
- callType != Calls.VOICEMAIL_TYPE);
+ return (callType != AppCompatConstants.CALLS_INCOMING_TYPE
+ && callType != AppCompatConstants.CALLS_OUTGOING_TYPE
+ && callType != AppCompatConstants.CALLS_VOICEMAIL_TYPE);
}
}
diff --git a/src/com/android/dialer/calllog/CallTypeIconsView.java b/src/com/android/dialer/calllog/CallTypeIconsView.java
index 31d4f4b0e..14748433c 100644
--- a/src/com/android/dialer/calllog/CallTypeIconsView.java
+++ b/src/com/android/dialer/calllog/CallTypeIconsView.java
@@ -23,13 +23,13 @@ import android.graphics.Canvas;
import android.graphics.PorterDuff;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
-import android.provider.CallLog.Calls;
import android.util.AttributeSet;
import android.view.View;
import com.android.contacts.common.testing.NeededForTesting;
import com.android.contacts.common.util.BitmapUtil;
import com.android.dialer.R;
+import com.android.dialer.util.AppCompatConstants;
import com.google.common.collect.Lists;
import java.util.List;
@@ -42,17 +42,20 @@ import java.util.List;
public class CallTypeIconsView extends View {
private List<Integer> mCallTypes = Lists.newArrayListWithCapacity(3);
private boolean mShowVideo = false;
- private Resources mResources;
private int mWidth;
private int mHeight;
+ private static Resources sResources;
+
public CallTypeIconsView(Context context) {
this(context, null);
}
public CallTypeIconsView(Context context, AttributeSet attrs) {
super(context, attrs);
- mResources = new Resources(context);
+ if (sResources == null) {
+ sResources = new Resources(context);
+ }
}
public void clear() {
@@ -66,7 +69,7 @@ public class CallTypeIconsView extends View {
mCallTypes.add(callType);
final Drawable drawable = getCallTypeDrawable(callType);
- mWidth += drawable.getIntrinsicWidth() + mResources.iconMargin;
+ mWidth += drawable.getIntrinsicWidth() + sResources.iconMargin;
mHeight = Math.max(mHeight, drawable.getIntrinsicHeight());
invalidate();
}
@@ -79,8 +82,8 @@ public class CallTypeIconsView extends View {
public void setShowVideo(boolean showVideo) {
mShowVideo = showVideo;
if (showVideo) {
- mWidth += mResources.videoCall.getIntrinsicWidth();
- mHeight = Math.max(mHeight, mResources.videoCall.getIntrinsicHeight());
+ mWidth += sResources.videoCall.getIntrinsicWidth();
+ mHeight = Math.max(mHeight, sResources.videoCall.getIntrinsicHeight());
invalidate();
}
}
@@ -106,20 +109,22 @@ public class CallTypeIconsView extends View {
private Drawable getCallTypeDrawable(int callType) {
switch (callType) {
- case Calls.INCOMING_TYPE:
- return mResources.incoming;
- case Calls.OUTGOING_TYPE:
- return mResources.outgoing;
- case Calls.MISSED_TYPE:
- return mResources.missed;
- case Calls.VOICEMAIL_TYPE:
- return mResources.voicemail;
+ case AppCompatConstants.CALLS_INCOMING_TYPE:
+ return sResources.incoming;
+ case AppCompatConstants.CALLS_OUTGOING_TYPE:
+ return sResources.outgoing;
+ case AppCompatConstants.CALLS_MISSED_TYPE:
+ return sResources.missed;
+ case AppCompatConstants.CALLS_VOICEMAIL_TYPE:
+ return sResources.voicemail;
+ case AppCompatConstants.CALLS_BLOCKED_TYPE:
+ return sResources.blocked;
default:
// It is possible for users to end up with calls with unknown call types in their
// call history, possibly due to 3rd party call log implementations (e.g. to
// distinguish between rejected and missed calls). Instead of crashing, just
// assume that all unknown call types are missed calls.
- return mResources.missed;
+ return sResources.missed;
}
}
@@ -136,43 +141,36 @@ public class CallTypeIconsView extends View {
final int right = left + drawable.getIntrinsicWidth();
drawable.setBounds(left, 0, right, drawable.getIntrinsicHeight());
drawable.draw(canvas);
- left = right + mResources.iconMargin;
+ left = right + sResources.iconMargin;
}
// If showing the video call icon, draw it scaled appropriately.
if (mShowVideo) {
- final Drawable drawable = mResources.videoCall;
- final int right = left + mResources.videoCall.getIntrinsicWidth();
- drawable.setBounds(left, 0, right, mResources.videoCall.getIntrinsicHeight());
+ final Drawable drawable = sResources.videoCall;
+ final int right = left + sResources.videoCall.getIntrinsicWidth();
+ drawable.setBounds(left, 0, right, sResources.videoCall.getIntrinsicHeight());
drawable.draw(canvas);
}
}
private static class Resources {
- /**
- * Drawable representing an incoming answered call.
- */
+ // Drawable representing an incoming answered call.
public final Drawable incoming;
- /**
- * Drawable respresenting an outgoing call.
- */
+ // Drawable respresenting an outgoing call.
public final Drawable outgoing;
- /**
- * Drawable representing an incoming missed call.
- */
+ // Drawable representing an incoming missed call.
public final Drawable missed;
- /**
- * Drawable representing a voicemail.
- */
+ // Drawable representing a voicemail.
public final Drawable voicemail;
- /**
- * Drawable repesenting a video call.
- */
+ // Drawable representing a blocked call.
+ public final Drawable blocked;
+
+ // Drawable repesenting a video call.
public final Drawable videoCall;
/**
@@ -204,21 +202,26 @@ public class CallTypeIconsView extends View {
voicemail = r.getDrawable(R.drawable.ic_call_voicemail_holo_dark);
- // Get the video call icon, scaled to match the height of the call arrows.
- // We want the video call icon to be the same height as the call arrows, while keeping
- // the same width aspect ratio.
- Bitmap videoIcon = BitmapFactory.decodeResource(context.getResources(),
- R.drawable.ic_videocam_24dp);
- int scaledHeight = missed.getIntrinsicHeight();
- int scaledWidth = (int) ((float) videoIcon.getWidth() *
- ((float) missed.getIntrinsicHeight() /
- (float) videoIcon.getHeight()));
- Bitmap scaled = Bitmap.createScaledBitmap(videoIcon, scaledWidth, scaledHeight, false);
- videoCall = new BitmapDrawable(context.getResources(), scaled);
+ blocked = getScaledBitmap(context, R.drawable.ic_block_24dp);
+ blocked.setColorFilter(r.getColor(R.color.blocked_call), PorterDuff.Mode.MULTIPLY);
+
+ videoCall = getScaledBitmap(context, R.drawable.ic_videocam_24dp);
videoCall.setColorFilter(r.getColor(R.color.dialtacts_secondary_text_color),
PorterDuff.Mode.MULTIPLY);
iconMargin = r.getDimensionPixelSize(R.dimen.call_log_icon_margin);
}
+
+ // Gets the icon, scaled to the height of the call type icons. This helps display all the
+ // icons to be the same height, while preserving their width aspect ratio.
+ private Drawable getScaledBitmap(Context context, int resourceId) {
+ Bitmap icon = BitmapFactory.decodeResource(context.getResources(), resourceId);
+ int scaledHeight =
+ context.getResources().getDimensionPixelSize(R.dimen.call_type_icon_size);
+ int scaledWidth = (int) ((float) icon.getWidth()
+ * ((float) scaledHeight / (float) icon.getHeight()));
+ Bitmap scaledIcon = Bitmap.createScaledBitmap(icon, scaledWidth, scaledHeight, false);
+ return new BitmapDrawable(context.getResources(), scaledIcon);
+ }
}
}
diff --git a/src/com/android/dialer/calllog/ContactInfo.java b/src/com/android/dialer/calllog/ContactInfo.java
index 357c832cf..8fe4964bc 100644
--- a/src/com/android/dialer/calllog/ContactInfo.java
+++ b/src/com/android/dialer/calllog/ContactInfo.java
@@ -19,6 +19,7 @@ package com.android.dialer.calllog;
import android.net.Uri;
import android.text.TextUtils;
+import com.android.contacts.common.ContactsUtils.UserType;
import com.android.contacts.common.util.UriUtils;
import com.google.common.base.Objects;
@@ -34,10 +35,20 @@ public class ContactInfo {
*/
public String lookupKey;
public String name;
+ public String nameAlternative;
public int type;
public String label;
public String number;
public String formattedNumber;
+ /*
+ * ContactInfo.normalizedNumber is a column value returned by PhoneLookup query. By definition,
+ * it's E164 representation.
+ * http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookupColumns.
+ * html#NORMALIZED_NUMBER.
+ *
+ * The fallback value, when PhoneLookup fails or else, should be either null or
+ * PhoneNumberUtils.formatNumberToE164.
+ */
public String normalizedNumber;
/** The photo for the contact, if available. */
public long photoId;
@@ -45,6 +56,7 @@ public class ContactInfo {
public Uri photoUri;
public boolean isBadData;
public String objectId;
+ public @UserType long userType;
public static ContactInfo EMPTY = new ContactInfo();
@@ -70,6 +82,7 @@ public class ContactInfo {
ContactInfo other = (ContactInfo) obj;
if (!UriUtils.areEqual(lookupUri, other.lookupUri)) return false;
if (!TextUtils.equals(name, other.name)) return false;
+ if (!TextUtils.equals(nameAlternative, other.nameAlternative)) return false;
if (type != other.type) return false;
if (!TextUtils.equals(label, other.label)) return false;
if (!TextUtils.equals(number, other.number)) return false;
@@ -78,14 +91,18 @@ public class ContactInfo {
if (photoId != other.photoId) return false;
if (!UriUtils.areEqual(photoUri, other.photoUri)) return false;
if (!TextUtils.equals(objectId, other.objectId)) return false;
+ if (userType != other.userType) return false;
return true;
}
@Override
public String toString() {
- return Objects.toStringHelper(this).add("lookupUri", lookupUri).add("name", name).add(
- "type", type).add("label", label).add("number", number).add("formattedNumber",
- formattedNumber).add("normalizedNumber", normalizedNumber).add("photoId", photoId)
- .add("photoUri", photoUri).add("objectId", objectId).toString();
+ return Objects.toStringHelper(this).add("lookupUri", lookupUri).add("name", name)
+ .add("nameAlternative", nameAlternative)
+ .add("type", type).add("label", label)
+ .add("number", number).add("formattedNumber",formattedNumber)
+ .add("normalizedNumber", normalizedNumber).add("photoId", photoId)
+ .add("photoUri", photoUri).add("objectId", objectId)
+ .add("userType",userType).toString();
}
}
diff --git a/src/com/android/dialer/calllog/ContactInfoHelper.java b/src/com/android/dialer/calllog/ContactInfoHelper.java
index 2e07a03b1..b0ef0abf4 100644
--- a/src/com/android/dialer/calllog/ContactInfoHelper.java
+++ b/src/com/android/dialer/calllog/ContactInfoHelper.java
@@ -25,14 +25,19 @@ import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.DisplayNameSources;
import android.provider.ContactsContract.PhoneLookup;
+import android.support.annotation.Nullable;
import android.telephony.PhoneNumberUtils;
import android.text.TextUtils;
import android.util.Log;
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.ContactsUtils.UserType;
+import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.util.Constants;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.util.PhoneNumberHelper;
import com.android.contacts.common.util.UriUtils;
+import com.android.dialer.compat.DialerCompatUtils;
import com.android.dialer.service.CachedNumberLookupService;
import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
import com.android.dialer.util.TelecomUtil;
@@ -41,8 +46,6 @@ import com.android.dialerbind.ObjectFactory;
import org.json.JSONException;
import org.json.JSONObject;
-import java.util.List;
-
/**
* Utility class to look up the contact information for a given number.
*/
@@ -71,34 +74,27 @@ public class ContactInfoHelper {
* @param number the number to look up
* @param countryIso the country associated with this number
*/
+ @Nullable
public ContactInfo lookupNumber(String number, String countryIso) {
if (TextUtils.isEmpty(number)) {
return null;
}
- final ContactInfo info;
- // Determine the contact info.
+ ContactInfo info;
+
if (PhoneNumberHelper.isUriNumber(number)) {
- // This "number" is really a SIP address.
- ContactInfo sipInfo = queryContactInfoForSipAddress(number);
- if (sipInfo == null || sipInfo == ContactInfo.EMPTY) {
- // Check whether the "username" part of the SIP address is
- // actually the phone number of a contact.
+ // The number is a SIP address..
+ info = lookupContactFromUri(getContactInfoLookupUri(number), true);
+ if (info == null || info == ContactInfo.EMPTY) {
+ // If lookup failed, check if the "username" of the SIP address is a phone number.
String username = PhoneNumberHelper.getUsernameFromUriNumber(number);
if (PhoneNumberUtils.isGlobalPhoneNumber(username)) {
- sipInfo = queryContactInfoForPhoneNumber(username, countryIso);
+ info = queryContactInfoForPhoneNumber(username, countryIso, true);
}
}
- info = sipInfo;
} else {
// Look for a contact that has the given phone number.
- ContactInfo phoneInfo = queryContactInfoForPhoneNumber(number, countryIso);
-
- if (phoneInfo == null || phoneInfo == ContactInfo.EMPTY) {
- // Check whether the phone number has been saved as an "Internet call" number.
- phoneInfo = queryContactInfoForSipAddress(number);
- }
- info = phoneInfo;
+ info = queryContactInfoForPhoneNumber(number, countryIso, false);
}
final ContactInfo updatedInfo;
@@ -159,67 +155,84 @@ public class ContactInfoHelper {
* The {@link ContactInfo#formattedNumber} field is always set to {@code null} in the returned
* value.
*/
- private ContactInfo lookupContactFromUri(Uri uri) {
+ ContactInfo lookupContactFromUri(Uri uri, boolean isSip) {
if (uri == null) {
return null;
}
if (!PermissionsUtil.hasContactsPermissions(mContext)) {
return ContactInfo.EMPTY;
}
- final ContactInfo info;
- Cursor phonesCursor =
- mContext.getContentResolver().query(uri, PhoneQuery._PROJECTION, null, null, null);
-
- if (phonesCursor != null) {
- try {
- if (phonesCursor.moveToFirst()) {
- info = new ContactInfo();
- long contactId = phonesCursor.getLong(PhoneQuery.PERSON_ID);
- String lookupKey = phonesCursor.getString(PhoneQuery.LOOKUP_KEY);
- info.lookupKey = lookupKey;
- info.lookupUri = Contacts.getLookupUri(contactId, lookupKey);
- info.name = phonesCursor.getString(PhoneQuery.NAME);
- info.type = phonesCursor.getInt(PhoneQuery.PHONE_TYPE);
- info.label = phonesCursor.getString(PhoneQuery.LABEL);
- info.number = phonesCursor.getString(PhoneQuery.MATCHED_NUMBER);
- info.normalizedNumber = phonesCursor.getString(PhoneQuery.NORMALIZED_NUMBER);
- info.photoId = phonesCursor.getLong(PhoneQuery.PHOTO_ID);
- info.photoUri =
- UriUtils.parseUriOrNull(phonesCursor.getString(PhoneQuery.PHOTO_URI));
- info.formattedNumber = null;
- } else {
- info = ContactInfo.EMPTY;
- }
- } finally {
- phonesCursor.close();
+
+ Cursor phoneLookupCursor = null;
+ try {
+ String[] projection = PhoneQuery.getPhoneLookupProjection(uri);
+ phoneLookupCursor = mContext.getContentResolver().query(uri, projection, null, null,
+ null);
+ } catch (NullPointerException e) {
+ // Trap NPE from pre-N CP2
+ return null;
+ }
+ if (phoneLookupCursor == null) {
+ return null;
+ }
+
+ try {
+ if (!phoneLookupCursor.moveToFirst()) {
+ return ContactInfo.EMPTY;
}
- } else {
- // Failed to fetch the data, ignore this request.
- info = null;
+ String lookupKey = phoneLookupCursor.getString(PhoneQuery.LOOKUP_KEY);
+ ContactInfo contactInfo = createPhoneLookupContactInfo(phoneLookupCursor, lookupKey);
+ contactInfo.nameAlternative = lookUpDisplayNameAlternative(mContext, lookupKey,
+ contactInfo.userType);
+ return contactInfo;
+ } finally {
+ phoneLookupCursor.close();
}
+ }
+
+ private ContactInfo createPhoneLookupContactInfo(Cursor phoneLookupCursor, String lookupKey) {
+ ContactInfo info = new ContactInfo();
+ info.lookupKey = lookupKey;
+ info.lookupUri = Contacts.getLookupUri(phoneLookupCursor.getLong(PhoneQuery.PERSON_ID),
+ lookupKey);
+ info.name = phoneLookupCursor.getString(PhoneQuery.NAME);
+ info.type = phoneLookupCursor.getInt(PhoneQuery.PHONE_TYPE);
+ info.label = phoneLookupCursor.getString(PhoneQuery.LABEL);
+ info.number = phoneLookupCursor.getString(PhoneQuery.MATCHED_NUMBER);
+ info.normalizedNumber = phoneLookupCursor.getString(PhoneQuery.NORMALIZED_NUMBER);
+ info.photoId = phoneLookupCursor.getLong(PhoneQuery.PHOTO_ID);
+ info.photoUri = UriUtils.parseUriOrNull(phoneLookupCursor.getString(PhoneQuery.PHOTO_URI));
+ info.formattedNumber = null;
+ info.userType = ContactsUtils.determineUserType(null,
+ phoneLookupCursor.getLong(PhoneQuery.PERSON_ID));
+
return info;
}
- /**
- * Determines the contact information for the given SIP address.
- * <p>
- * It returns the contact info if found.
- * <p>
- * If no contact corresponds to the given SIP address, returns {@link ContactInfo#EMPTY}.
- * <p>
- * If the lookup fails for some other reason, it returns null.
- */
- private ContactInfo queryContactInfoForSipAddress(String sipAddress) {
- if (TextUtils.isEmpty(sipAddress)) {
+ public static String lookUpDisplayNameAlternative(Context context, String lookupKey,
+ @UserType long userType) {
+ // Query {@link Contacts#CONTENT_LOOKUP_URI} directly with work lookup key is not allowed.
+ if (lookupKey == null || userType == ContactsUtils.USER_TYPE_WORK) {
return null;
}
- final ContactInfo info;
+ final Uri uri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, lookupKey);
+ Cursor cursor = null;
+ try {
+ cursor = context.getContentResolver().query(uri,
+ PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION, null, null, null);
- // "contactNumber" is a SIP address, so use the PhoneLookup table with the SIP parameter.
- Uri.Builder uriBuilder = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI.buildUpon();
- uriBuilder.appendPath(Uri.encode(sipAddress));
- uriBuilder.appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, "1");
- return lookupContactFromUri(uriBuilder.build());
+ if (cursor != null && cursor.moveToFirst()) {
+ return cursor.getString(PhoneQuery.NAME_ALTERNATIVE);
+ }
+ } catch (IllegalArgumentException e) {
+ // Avoid dialer crash when lookup key is not valid
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ return null;
}
/**
@@ -231,25 +244,13 @@ public class ContactInfoHelper {
* <p>
* If the lookup fails for some other reason, it returns null.
*/
- private ContactInfo queryContactInfoForPhoneNumber(String number, String countryIso) {
+ private ContactInfo queryContactInfoForPhoneNumber(String number, String countryIso,
+ boolean isSip) {
if (TextUtils.isEmpty(number)) {
return null;
}
- String contactNumber = number;
- if (!TextUtils.isEmpty(countryIso)) {
- // Normalize the number: this is needed because the PhoneLookup query below does not
- // accept a country code as an input.
- String numberE164 = PhoneNumberUtils.formatNumberToE164(number, countryIso);
- if (!TextUtils.isEmpty(numberE164)) {
- // Only use it if the number could be formatted to E164.
- contactNumber = numberE164;
- }
- }
- // The "contactNumber" is a regular phone number, so use the PhoneLookup table.
- Uri uri = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
- Uri.encode(contactNumber));
- ContactInfo info = lookupContactFromUri(uri);
+ ContactInfo info = lookupContactFromUri(getContactInfoLookupUri(number), isSip);
if (info != null && info != ContactInfo.EMPTY) {
info.formattedNumber = formatPhoneNumber(number, null, countryIso);
} else if (mCachedNumberLookupService != null) {
@@ -345,7 +346,8 @@ public class ContactInfoHelper {
final Uri updatedPhotoUriContactsOnly =
UriUtils.nullForNonContactsUri(updatedInfo.photoUri);
- if (!UriUtils.areEqual(updatedPhotoUriContactsOnly, callLogInfo.photoUri)) {
+ if (DialerCompatUtils.isCallsCachedPhotoUriCompatible() &&
+ !UriUtils.areEqual(updatedPhotoUriContactsOnly, callLogInfo.photoUri)) {
values.put(Calls.CACHED_PHOTO_URI,
UriUtils.uriToString(updatedPhotoUriContactsOnly));
needsUpdate = true;
@@ -364,8 +366,10 @@ public class ContactInfoHelper {
values.put(Calls.CACHED_MATCHED_NUMBER, updatedInfo.number);
values.put(Calls.CACHED_NORMALIZED_NUMBER, updatedInfo.normalizedNumber);
values.put(Calls.CACHED_PHOTO_ID, updatedInfo.photoId);
- values.put(Calls.CACHED_PHOTO_URI, UriUtils.uriToString(
- UriUtils.nullForNonContactsUri(updatedInfo.photoUri)));
+ if (DialerCompatUtils.isCallsCachedPhotoUriCompatible()) {
+ values.put(Calls.CACHED_PHOTO_URI, UriUtils.uriToString(
+ UriUtils.nullForNonContactsUri(updatedInfo.photoUri)));
+ }
values.put(Calls.CACHED_FORMATTED_NUMBER, updatedInfo.formattedNumber);
needsUpdate = true;
}
@@ -393,6 +397,34 @@ public class ContactInfoHelper {
}
}
+ public static Uri getContactInfoLookupUri(String number) {
+ return getContactInfoLookupUri(number, -1);
+ }
+
+ public static Uri getContactInfoLookupUri(String number, long directoryId) {
+ // Get URI for the number in the PhoneLookup table, with a parameter to indicate whether
+ // the number is a SIP number.
+ Uri uri = PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI;
+ if (!ContactsUtils.FLAG_N_FEATURE) {
+ if (directoryId != -1) {
+ // ENTERPRISE_CONTENT_FILTER_URI in M doesn't support directory lookup
+ uri = PhoneLookup.CONTENT_FILTER_URI;
+ } else {
+ // b/25900607 in M. PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, encodes twice.
+ number = Uri.encode(number);
+ }
+ }
+ Uri.Builder builder = uri.buildUpon()
+ .appendPath(number)
+ .appendQueryParameter(PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS,
+ String.valueOf(PhoneNumberHelper.isUriNumber(number)));
+ if (directoryId != -1) {
+ builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
+ String.valueOf(directoryId));
+ }
+ return builder.build();
+ }
+
/**
* Returns the contact information stored in an entry of the call log.
*
@@ -400,17 +432,22 @@ public class ContactInfoHelper {
*/
public static ContactInfo getContactInfo(Cursor c) {
ContactInfo info = new ContactInfo();
-
info.lookupUri = UriUtils.parseUriOrNull(c.getString(CallLogQuery.CACHED_LOOKUP_URI));
info.name = c.getString(CallLogQuery.CACHED_NAME);
info.type = c.getInt(CallLogQuery.CACHED_NUMBER_TYPE);
info.label = c.getString(CallLogQuery.CACHED_NUMBER_LABEL);
String matchedNumber = c.getString(CallLogQuery.CACHED_MATCHED_NUMBER);
- info.number = matchedNumber == null ? c.getString(CallLogQuery.NUMBER) : matchedNumber;
+ String postDialDigits = CompatUtils.isNCompatible()
+ ? c.getString(CallLogQuery.POST_DIAL_DIGITS) : "";
+ info.number = (matchedNumber == null) ?
+ c.getString(CallLogQuery.NUMBER) + postDialDigits : matchedNumber;
+
info.normalizedNumber = c.getString(CallLogQuery.CACHED_NORMALIZED_NUMBER);
info.photoId = c.getLong(CallLogQuery.CACHED_PHOTO_ID);
- info.photoUri = UriUtils.nullForNonContactsUri(
- UriUtils.parseUriOrNull(c.getString(CallLogQuery.CACHED_PHOTO_URI)));
+ info.photoUri = DialerCompatUtils.isCallsCachedPhotoUriCompatible() ?
+ UriUtils.nullForNonContactsUri(
+ UriUtils.parseUriOrNull(c.getString(CallLogQuery.CACHED_PHOTO_URI)))
+ : null;
info.formattedNumber = c.getString(CallLogQuery.CACHED_FORMATTED_NUMBER);
return info;
@@ -439,6 +476,4 @@ public class ContactInfoHelper {
return mCachedNumberLookupService != null
&& mCachedNumberLookupService.canReportAsInvalid(sourceType, objectId);
}
-
-
}
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index a6d165e3a..de6fc6a3d 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -16,39 +16,45 @@
package com.android.dialer.calllog;
-import static android.Manifest.permission.READ_CALL_LOG;
-import static android.Manifest.permission.READ_CONTACTS;
+import com.google.common.collect.Maps;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
+import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
-import android.database.Cursor;
import android.net.Uri;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.PhoneLookup;
+import android.support.annotation.Nullable;
+import android.support.v4.util.Pair;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
-import com.android.common.io.MoreCloseables;
-import com.android.contacts.common.util.PermissionsUtil;
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.TelephonyManagerCompat;
+import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
-import com.android.dialer.calllog.PhoneAccountUtils;
+import com.android.dialer.calllog.CallLogNotificationsHelper.NewCall;
+import com.android.dialer.filterednumber.FilteredNumbersUtil;
import com.android.dialer.list.ListsFragment;
-import com.google.common.collect.Maps;
+import com.android.dialer.util.TelecomUtil;
+import java.util.Iterator;
+import java.util.List;
import java.util.Map;
/**
- * VoicemailNotifier that shows a notification in the status bar.
+ * Shows a voicemail notification in the status bar.
*/
public class DefaultVoicemailNotifier {
- public static final String TAG = "DefaultVoicemailNotifier";
+ public static final String TAG = "VoicemailNotifier";
/** The tag used to identify notifications from this class. */
private static final String NOTIFICATION_TAG = "DefaultVoicemailNotifier";
@@ -59,30 +65,18 @@ public class DefaultVoicemailNotifier {
private static DefaultVoicemailNotifier sInstance;
private final Context mContext;
- private final NotificationManager mNotificationManager;
- private final NewCallsQuery mNewCallsQuery;
- private final NameLookupQuery mNameLookupQuery;
/** Returns the singleton instance of the {@link DefaultVoicemailNotifier}. */
- public static synchronized DefaultVoicemailNotifier getInstance(Context context) {
+ public static DefaultVoicemailNotifier getInstance(Context context) {
if (sInstance == null) {
- NotificationManager notificationManager =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
ContentResolver contentResolver = context.getContentResolver();
- sInstance = new DefaultVoicemailNotifier(context, notificationManager,
- createNewCallsQuery(context, contentResolver),
- createNameLookupQuery(context, contentResolver));
+ sInstance = new DefaultVoicemailNotifier(context);
}
return sInstance;
}
- private DefaultVoicemailNotifier(Context context,
- NotificationManager notificationManager, NewCallsQuery newCallsQuery,
- NameLookupQuery nameLookupQuery) {
+ private DefaultVoicemailNotifier(Context context) {
mContext = context;
- mNotificationManager = notificationManager;
- mNewCallsQuery = newCallsQuery;
- mNameLookupQuery = nameLookupQuery;
}
/**
@@ -96,16 +90,17 @@ public class DefaultVoicemailNotifier {
public void updateNotification(Uri newCallUri) {
// Lookup the list of new voicemails to include in the notification.
// TODO: Move this into a service, to avoid holding the receiver up.
- final NewCall[] newCalls = mNewCallsQuery.query();
+ final List<NewCall> newCalls =
+ CallLogNotificationsHelper.getInstance(mContext).getNewVoicemails();
if (newCalls == null) {
// Query failed, just return.
return;
}
- if (newCalls.length == 0) {
+ if (newCalls.isEmpty()) {
// No voicemails to notify about: clear the notification.
- clearNotification();
+ getNotificationManager().cancel(NOTIFICATION_TAG, NOTIFICATION_ID);
return;
}
@@ -122,23 +117,25 @@ public class DefaultVoicemailNotifier {
NewCall callToNotify = null;
// Iterate over the new voicemails to determine all the information above.
- for (NewCall newCall : newCalls) {
+ Iterator<NewCall> itr = newCalls.iterator();
+ while (itr.hasNext()) {
+ NewCall newCall = itr.next();
+
+ // Skip notifying for numbers which are blocked.
+ if (FilteredNumbersUtil.shouldBlockVoicemail(
+ mContext, newCall.number, newCall.countryIso, newCall.dateMs)) {
+ itr.remove();
+
+ // Delete the voicemail.
+ mContext.getContentResolver().delete(newCall.voicemailUri, null, null);
+ continue;
+ }
+
// Check if we already know the name associated with this number.
String name = names.get(newCall.number);
if (name == null) {
- name = PhoneNumberDisplayUtil.getDisplayName(
- mContext,
- newCall.number,
- newCall.numberPresentation,
- /* isVoicemail */ false).toString();
- // If we cannot lookup the contact, use the number instead.
- if (TextUtils.isEmpty(name)) {
- // Look it up in the database.
- name = mNameLookupQuery.query(newCall.number);
- if (TextUtils.isEmpty(name)) {
- name = newCall.number;
- }
- }
+ name = CallLogNotificationsHelper.getInstance(mContext).getName(newCall.number,
+ newCall.numberPresentation, newCall.countryIso);
names.put(newCall.number, name);
// This is a new caller. Add it to the back of the list of callers.
if (TextUtils.isEmpty(callers)) {
@@ -155,10 +152,15 @@ public class DefaultVoicemailNotifier {
}
}
+ // All the potential new voicemails have been removed, e.g. if they were spam.
+ if (newCalls.isEmpty()) {
+ return;
+ }
+
// If there is only one voicemail, set its transcription as the "long text".
String transcription = null;
- if (newCalls.length == 1) {
- transcription = newCalls[0].transcription;
+ if (newCalls.size() == 1) {
+ transcription = newCalls.get(0).transcription;
}
if (newCallUri != null && callToNotify == null) {
@@ -167,24 +169,26 @@ public class DefaultVoicemailNotifier {
// Determine the title of the notification and the icon for it.
final String title = resources.getQuantityString(
- R.plurals.notification_voicemail_title, newCalls.length, newCalls.length);
+ R.plurals.notification_voicemail_title, newCalls.size(), newCalls.size());
// TODO: Use the photo of contact if all calls are from the same person.
final int icon = android.R.drawable.stat_notify_voicemail;
+ Pair<Uri, Integer> info = getNotificationInfo(callToNotify);
+
Notification.Builder notificationBuilder = new Notification.Builder(mContext)
.setSmallIcon(icon)
.setContentTitle(title)
.setContentText(callers)
.setStyle(new Notification.BigTextStyle().bigText(transcription))
.setColor(resources.getColor(R.color.dialer_theme_color))
- .setDefaults(callToNotify != null ? Notification.DEFAULT_ALL : 0)
+ .setSound(info.first)
+ .setDefaults(info.second)
.setDeleteIntent(createMarkNewVoicemailsAsOldIntent())
.setAutoCancel(true);
// Determine the intent to fire when the notification is clicked on.
final Intent contentIntent;
// Open the call log.
- // TODO: Send to recents tab in Dialer instead.
contentIntent = new Intent(mContext, DialtactsActivity.class);
contentIntent.putExtra(DialtactsActivity.EXTRA_SHOW_TAB, ListsFragment.TAB_INDEX_VOICEMAIL);
notificationBuilder.setContentIntent(PendingIntent.getActivity(
@@ -192,196 +196,74 @@ public class DefaultVoicemailNotifier {
// The text to show in the ticker, describing the new event.
if (callToNotify != null) {
- notificationBuilder.setTicker(resources.getString(
- R.string.notification_new_voicemail_ticker, names.get(callToNotify.number)));
+ CharSequence msg = ContactDisplayUtils.getTtsSpannedPhoneNumber(
+ resources,
+ R.string.notification_new_voicemail_ticker,
+ names.get(callToNotify.number));
+ notificationBuilder.setTicker(msg);
}
-
- mNotificationManager.notify(NOTIFICATION_TAG, NOTIFICATION_ID, notificationBuilder.build());
- }
-
- /** Creates a pending intent that marks all new voicemails as old. */
- private PendingIntent createMarkNewVoicemailsAsOldIntent() {
- Intent intent = new Intent(mContext, CallLogNotificationsService.class);
- intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD);
- return PendingIntent.getService(mContext, 0, intent, 0);
- }
-
- public void clearNotification() {
- mNotificationManager.cancel(NOTIFICATION_TAG, NOTIFICATION_ID);
- }
-
- /** Information about a new voicemail. */
- private static final class NewCall {
- public final Uri callsUri;
- public final Uri voicemailUri;
- public final String number;
- public final int numberPresentation;
- public final String accountComponentName;
- public final String accountId;
- public final String transcription;
-
- public NewCall(
- Uri callsUri,
- Uri voicemailUri,
- String number,
- int numberPresentation,
- String accountComponentName,
- String accountId,
- String transcription) {
- this.callsUri = callsUri;
- this.voicemailUri = voicemailUri;
- this.number = number;
- this.numberPresentation = numberPresentation;
- this.accountComponentName = accountComponentName;
- this.accountId = accountId;
- this.transcription = transcription;
- }
- }
-
- /** Allows determining the new calls for which a notification should be generated. */
- public interface NewCallsQuery {
- /**
- * Returns the new calls for which a notification should be generated.
- */
- public NewCall[] query();
- }
-
- /** Create a new instance of {@link NewCallsQuery}. */
- public static NewCallsQuery createNewCallsQuery(Context context,
- ContentResolver contentResolver) {
- return new DefaultNewCallsQuery(context.getApplicationContext(), contentResolver);
+ Log.i(TAG, "Creating voicemail notification");
+ getNotificationManager().notify(NOTIFICATION_TAG, NOTIFICATION_ID,
+ notificationBuilder.build());
}
/**
- * Default implementation of {@link NewCallsQuery} that looks up the list of new calls to
- * notify about in the call log.
+ * Determines which ringtone Uri and Notification defaults to use when updating the notification
+ * for the given call.
*/
- private static final class DefaultNewCallsQuery implements NewCallsQuery {
- private static final String[] PROJECTION = {
- Calls._ID,
- Calls.NUMBER,
- Calls.VOICEMAIL_URI,
- Calls.NUMBER_PRESENTATION,
- Calls.PHONE_ACCOUNT_COMPONENT_NAME,
- Calls.PHONE_ACCOUNT_ID,
- Calls.TRANSCRIPTION
- };
- private static final int ID_COLUMN_INDEX = 0;
- private static final int NUMBER_COLUMN_INDEX = 1;
- private static final int VOICEMAIL_URI_COLUMN_INDEX = 2;
- private static final int NUMBER_PRESENTATION_COLUMN_INDEX = 3;
- private static final int PHONE_ACCOUNT_COMPONENT_NAME_COLUMN_INDEX = 4;
- private static final int PHONE_ACCOUNT_ID_COLUMN_INDEX = 5;
- private static final int TRANSCRIPTION_COLUMN_INDEX = 6;
-
- private final ContentResolver mContentResolver;
- private final Context mContext;
-
- private DefaultNewCallsQuery(Context context, ContentResolver contentResolver) {
- mContext = context;
- mContentResolver = contentResolver;
+ private Pair<Uri, Integer> getNotificationInfo(@Nullable NewCall callToNotify) {
+ Log.v(TAG, "getNotificationInfo");
+ if (callToNotify == null) {
+ Log.i(TAG, "callToNotify == null");
+ return new Pair<>(null, 0);
}
-
- @Override
- public NewCall[] query() {
- if (!PermissionsUtil.hasPermission(mContext, READ_CALL_LOG)) {
- Log.w(TAG, "No READ_CALL_LOG permission, returning null for calls lookup.");
- return null;
- }
- final String selection = String.format("%s = 1 AND %s = ?", Calls.NEW, Calls.TYPE);
- final String[] selectionArgs = new String[]{ Integer.toString(Calls.VOICEMAIL_TYPE) };
- Cursor cursor = null;
- try {
- cursor = mContentResolver.query(Calls.CONTENT_URI_WITH_VOICEMAIL, PROJECTION,
- selection, selectionArgs, Calls.DEFAULT_SORT_ORDER);
- if (cursor == null) {
- return null;
- }
- NewCall[] newCalls = new NewCall[cursor.getCount()];
- while (cursor.moveToNext()) {
- newCalls[cursor.getPosition()] = createNewCallsFromCursor(cursor);
- }
- return newCalls;
- } catch (RuntimeException e) {
- Log.w(TAG, "Exception when querying Contacts Provider for calls lookup");
- return null;
- } finally {
- MoreCloseables.closeQuietly(cursor);
+ PhoneAccountHandle accountHandle = null;
+ if (callToNotify.accountComponentName == null || callToNotify.accountId == null) {
+ Log.v(TAG, "accountComponentName == null || callToNotify.accountId == null");
+ accountHandle = TelecomUtil
+ .getDefaultOutgoingPhoneAccount(mContext, PhoneAccount.SCHEME_TEL);
+ if (accountHandle == null) {
+ Log.i(TAG, "No default phone account found, using default notification ringtone");
+ return new Pair<>(null, Notification.DEFAULT_ALL);
}
- }
- /** Returns an instance of {@link NewCall} created by using the values of the cursor. */
- private NewCall createNewCallsFromCursor(Cursor cursor) {
- String voicemailUriString = cursor.getString(VOICEMAIL_URI_COLUMN_INDEX);
- Uri callsUri = ContentUris.withAppendedId(
- Calls.CONTENT_URI_WITH_VOICEMAIL, cursor.getLong(ID_COLUMN_INDEX));
- Uri voicemailUri = voicemailUriString == null ? null : Uri.parse(voicemailUriString);
- return new NewCall(
- callsUri,
- voicemailUri,
- cursor.getString(NUMBER_COLUMN_INDEX),
- cursor.getInt(NUMBER_PRESENTATION_COLUMN_INDEX),
- cursor.getString(PHONE_ACCOUNT_COMPONENT_NAME_COLUMN_INDEX),
- cursor.getString(PHONE_ACCOUNT_ID_COLUMN_INDEX),
- cursor.getString(TRANSCRIPTION_COLUMN_INDEX));
+ } else {
+ accountHandle = new PhoneAccountHandle(
+ ComponentName.unflattenFromString(callToNotify.accountComponentName),
+ callToNotify.accountId);
}
+ if (accountHandle.getComponentName() != null) {
+ Log.v(TAG, "PhoneAccountHandle.ComponentInfo:" + accountHandle.getComponentName());
+ } else {
+ Log.i(TAG, "PhoneAccountHandle.ComponentInfo: null");
+ }
+ return new Pair<>(
+ TelephonyManagerCompat.getVoicemailRingtoneUri(
+ getTelephonyManager(), accountHandle),
+ getNotificationDefaults(accountHandle));
}
- /** Allows determining the name associated with a given phone number. */
- public interface NameLookupQuery {
- /**
- * Returns the name associated with the given number in the contacts database, or null if
- * the number does not correspond to any of the contacts.
- * <p>
- * If there are multiple contacts with the same phone number, it will return the name of one
- * of the matching contacts.
- */
- public String query(String number);
+ private int getNotificationDefaults(PhoneAccountHandle accountHandle) {
+ if (ContactsUtils.FLAG_N_FEATURE) {
+ return TelephonyManagerCompat.isVoicemailVibrationEnabled(getTelephonyManager(),
+ accountHandle) ? Notification.DEFAULT_VIBRATE : 0;
+ }
+ return Notification.DEFAULT_ALL;
}
- /** Create a new instance of {@link NameLookupQuery}. */
- public static NameLookupQuery createNameLookupQuery(Context context,
- ContentResolver contentResolver) {
- return new DefaultNameLookupQuery(context.getApplicationContext(), contentResolver);
+ /** Creates a pending intent that marks all new voicemails as old. */
+ private PendingIntent createMarkNewVoicemailsAsOldIntent() {
+ Intent intent = new Intent(mContext, CallLogNotificationsService.class);
+ intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_VOICEMAILS_AS_OLD);
+ return PendingIntent.getService(mContext, 0, intent, 0);
}
- /**
- * Default implementation of {@link NameLookupQuery} that looks up the name of a contact in the
- * contacts database.
- */
- private static final class DefaultNameLookupQuery implements NameLookupQuery {
- private static final String[] PROJECTION = { PhoneLookup.DISPLAY_NAME };
- private static final int DISPLAY_NAME_COLUMN_INDEX = 0;
-
- private final ContentResolver mContentResolver;
- private final Context mContext;
-
- private DefaultNameLookupQuery(Context context, ContentResolver contentResolver) {
- mContext = context;
- mContentResolver = contentResolver;
- }
+ private NotificationManager getNotificationManager() {
+ return (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ }
- @Override
- public String query(String number) {
- if (!PermissionsUtil.hasPermission(mContext, READ_CONTACTS)) {
- Log.w(TAG, "No READ_CONTACTS permission, returning null for name lookup.");
- return null;
- }
- Cursor cursor = null;
- try {
- cursor = mContentResolver.query(
- Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)),
- PROJECTION, null, null, null);
- if (cursor == null || !cursor.moveToFirst()) return null;
- return cursor.getString(DISPLAY_NAME_COLUMN_INDEX);
- } catch (RuntimeException e) {
- Log.w(TAG, "Exception when querying Contacts Provider for name lookup");
- return null;
- } finally {
- if (cursor != null) {
- cursor.close();
- }
- }
- }
+ private TelephonyManager getTelephonyManager() {
+ return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
}
+
}
diff --git a/src/com/android/dialer/calllog/GroupingListAdapter.java b/src/com/android/dialer/calllog/GroupingListAdapter.java
index 8d3ab4545..0d06298e7 100644
--- a/src/com/android/dialer/calllog/GroupingListAdapter.java
+++ b/src/com/android/dialer/calllog/GroupingListAdapter.java
@@ -22,78 +22,28 @@ import android.database.Cursor;
import android.database.DataSetObserver;
import android.os.Handler;
import android.support.v7.widget.RecyclerView;
-import android.util.Log;
import android.util.SparseIntArray;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-
-import com.android.contacts.common.testing.NeededForTesting;
/**
- * Maintains a list that groups adjacent items sharing the same value of a "group-by" field.
+ * Maintains a list that groups items into groups of consecutive elements which are disjoint,
+ * that is, an item can only belong to one group. This is leveraged for grouping calls in the
+ * call log received from or made to the same phone number.
*
- * The list has three types of elements: stand-alone, group header and group child. Groups are
- * collapsible and collapsed by default. This is used by the call log to group related entries.
+ * There are two integers stored as metadata for every list item in the adapter.
*/
abstract class GroupingListAdapter extends RecyclerView.Adapter {
- private static final int GROUP_METADATA_ARRAY_INITIAL_SIZE = 16;
- private static final int GROUP_METADATA_ARRAY_INCREMENT = 128;
- private static final long GROUP_OFFSET_MASK = 0x00000000FFFFFFFFL;
- private static final long GROUP_SIZE_MASK = 0x7FFFFFFF00000000L;
- private static final long EXPANDED_GROUP_MASK = 0x8000000000000000L;
-
- public static final int ITEM_TYPE_STANDALONE = 0;
- public static final int ITEM_TYPE_GROUP_HEADER = 1;
- public static final int ITEM_TYPE_IN_GROUP = 2;
-
- /**
- * Information about a specific list item: is it a group, if so is it expanded.
- * Otherwise, is it a stand-alone item or a group member.
- */
- protected static class PositionMetadata {
- int itemType;
- boolean isExpanded;
- int cursorPosition;
- int childCount;
- private int groupPosition;
- private int listPosition = -1;
- }
-
private Context mContext;
private Cursor mCursor;
/**
- * Count of list items.
- */
- private int mCount;
-
- private int mRowIdColumnIndex;
-
- /**
- * Count of groups in the list.
- */
- private int mGroupCount;
-
- /**
- * Information about where these groups are located in the list, how large they are
- * and whether they are expanded.
+ * SparseIntArray, which maps the cursor position of the first element of a group to the size
+ * of the group. The index of a key in this map corresponds to the list position of that group.
*/
- private long[] mGroupMetadata;
-
- private SparseIntArray mPositionCache = new SparseIntArray();
- private int mLastCachedListPosition;
- private int mLastCachedCursorPosition;
- private int mLastCachedGroup;
-
- /**
- * A reusable temporary instance of PositionMetadata
- */
- private PositionMetadata mPositionMetadata = new PositionMetadata();
+ private SparseIntArray mGroupMetadata;
+ private int mItemCount;
protected ContentObserver mChangeObserver = new ContentObserver(new Handler()) {
-
@Override
public boolean deliverSelfNotifications() {
return true;
@@ -106,7 +56,6 @@ abstract class GroupingListAdapter extends RecyclerView.Adapter {
};
protected DataSetObserver mDataSetObserver = new DataSetObserver() {
-
@Override
public void onChanged() {
notifyDataSetChanged();
@@ -115,7 +64,7 @@ abstract class GroupingListAdapter extends RecyclerView.Adapter {
public GroupingListAdapter(Context context) {
mContext = context;
- resetCache();
+ reset();
}
/**
@@ -124,21 +73,19 @@ abstract class GroupingListAdapter extends RecyclerView.Adapter {
*/
protected abstract void addGroups(Cursor cursor);
+ protected abstract void addVoicemailGroups(Cursor cursor);
+
protected abstract void onContentChanged();
- /**
- * Cache should be reset whenever the cursor changes or groups are expanded or collapsed.
- */
- private void resetCache() {
- mCount = -1;
- mLastCachedListPosition = -1;
- mLastCachedCursorPosition = -1;
- mLastCachedGroup = -1;
- mPositionMetadata.listPosition = -1;
- mPositionCache.clear();
+ public void changeCursor(Cursor cursor) {
+ changeCursor(cursor, false);
}
- public void changeCursor(Cursor cursor) {
+ public void changeCursorVoicemail(Cursor cursor) {
+ changeCursor(cursor, true);
+ }
+
+ public void changeCursor(Cursor cursor, boolean voicemail) {
if (cursor == mCursor) {
return;
}
@@ -148,288 +95,77 @@ abstract class GroupingListAdapter extends RecyclerView.Adapter {
mCursor.unregisterDataSetObserver(mDataSetObserver);
mCursor.close();
}
+
+ // Reset whenever the cursor is changed.
+ reset();
mCursor = cursor;
- resetCache();
- findGroups();
if (cursor != null) {
+ if (voicemail) {
+ addVoicemailGroups(mCursor);
+ } else {
+ addGroups(mCursor);
+ }
+
+ // Calculate the item count by subtracting group child counts from the cursor count.
+ mItemCount = mGroupMetadata.size();
+
cursor.registerContentObserver(mChangeObserver);
cursor.registerDataSetObserver(mDataSetObserver);
- mRowIdColumnIndex = cursor.getColumnIndexOrThrow("_id");
notifyDataSetChanged();
}
}
- @NeededForTesting
- public Cursor getCursor() {
- return mCursor;
- }
-
- /**
- * Scans over the entire cursor looking for duplicate phone numbers that need
- * to be collapsed.
- */
- private void findGroups() {
- mGroupCount = 0;
- mGroupMetadata = new long[GROUP_METADATA_ARRAY_INITIAL_SIZE];
-
- if (mCursor == null) {
- return;
- }
-
- addGroups(mCursor);
- }
-
/**
- * Records information about grouping in the list. Should be called by the overridden
- * {@link #addGroups} method.
+ * Records information about grouping in the list.
+ * Should be called by the overridden {@link #addGroups} method.
*/
- protected void addGroup(int cursorPosition, int size, boolean expanded) {
- if (mGroupCount >= mGroupMetadata.length) {
- int newSize = idealLongArraySize(
- mGroupMetadata.length + GROUP_METADATA_ARRAY_INCREMENT);
- long[] array = new long[newSize];
- System.arraycopy(mGroupMetadata, 0, array, 0, mGroupCount);
- mGroupMetadata = array;
- }
-
- long metadata = ((long)size << 32) | cursorPosition;
- if (expanded) {
- metadata |= EXPANDED_GROUP_MASK;
+ public void addGroup(int cursorPosition, int groupSize) {
+ int lastIndex = mGroupMetadata.size() - 1;
+ if (lastIndex < 0 || cursorPosition <= mGroupMetadata.keyAt(lastIndex)) {
+ mGroupMetadata.put(cursorPosition, groupSize);
+ } else {
+ // Optimization to avoid binary search if adding groups in ascending cursor position.
+ mGroupMetadata.append(cursorPosition, groupSize);
}
- mGroupMetadata[mGroupCount++] = metadata;
- }
-
- // Copy/paste from ArrayUtils
- private int idealLongArraySize(int need) {
- return idealByteArraySize(need * 8) / 8;
- }
-
- // Copy/paste from ArrayUtils
- private int idealByteArraySize(int need) {
- for (int i = 4; i < 32; i++)
- if (need <= (1 << i) - 12)
- return (1 << i) - 12;
-
- return need;
}
@Override
public int getItemCount() {
- if (mCursor == null) {
- return 0;
- }
-
- if (mCount != -1) {
- return mCount;
- }
-
- int cursorPosition = 0;
- int count = 0;
- for (int i = 0; i < mGroupCount; i++) {
- long metadata = mGroupMetadata[i];
- int offset = (int)(metadata & GROUP_OFFSET_MASK);
- boolean expanded = (metadata & EXPANDED_GROUP_MASK) != 0;
- int size = (int)((metadata & GROUP_SIZE_MASK) >> 32);
-
- count += (offset - cursorPosition);
-
- if (expanded) {
- count += size + 1;
- } else {
- count++;
- }
-
- cursorPosition = offset + size;
- }
-
- mCount = count + mCursor.getCount() - cursorPosition;
- return mCount;
+ return mItemCount;
}
/**
- * Figures out whether the item at the specified position represents a
- * stand-alone element, a group or a group child. Also computes the
- * corresponding cursor position.
+ * Given the position of a list item, returns the size of the group of items corresponding to
+ * that position.
*/
- public void obtainPositionMetadata(PositionMetadata metadata, int position) {
- // If the description object already contains requested information, just return
- if (metadata.listPosition == position) {
- return;
- }
-
- int listPosition = 0;
- int cursorPosition = 0;
- int firstGroupToCheck = 0;
-
- // Check cache for the supplied position. What we are looking for is
- // the group descriptor immediately preceding the supplied position.
- // Once we have that, we will be able to tell whether the position
- // is the header of the group, a member of the group or a standalone item.
- if (mLastCachedListPosition != -1) {
- if (position <= mLastCachedListPosition) {
-
- // Have SparceIntArray do a binary search for us.
- int index = mPositionCache.indexOfKey(position);
-
- // If we get back a positive number, the position corresponds to
- // a group header.
- if (index < 0) {
-
- // We had a cache miss, but we did obtain valuable information anyway.
- // The negative number will allow us to compute the location of
- // the group header immediately preceding the supplied position.
- index = ~index - 1;
-
- if (index >= mPositionCache.size()) {
- index--;
- }
- }
-
- // A non-negative index gives us the position of the group header
- // corresponding or preceding the position, so we can
- // search for the group information at the supplied position
- // starting with the cached group we just found
- if (index >= 0) {
- listPosition = mPositionCache.keyAt(index);
- firstGroupToCheck = mPositionCache.valueAt(index);
- long descriptor = mGroupMetadata[firstGroupToCheck];
- cursorPosition = (int)(descriptor & GROUP_OFFSET_MASK);
- }
- } else {
-
- // If we haven't examined groups beyond the supplied position,
- // we will start where we left off previously
- firstGroupToCheck = mLastCachedGroup;
- listPosition = mLastCachedListPosition;
- cursorPosition = mLastCachedCursorPosition;
- }
- }
-
- for (int i = firstGroupToCheck; i < mGroupCount; i++) {
- long group = mGroupMetadata[i];
- int offset = (int)(group & GROUP_OFFSET_MASK);
-
- // Move pointers to the beginning of the group
- listPosition += (offset - cursorPosition);
- cursorPosition = offset;
-
- if (i > mLastCachedGroup) {
- mPositionCache.append(listPosition, i);
- mLastCachedListPosition = listPosition;
- mLastCachedCursorPosition = cursorPosition;
- mLastCachedGroup = i;
- }
-
- // Now we have several possibilities:
- // A) The requested position precedes the group
- if (position < listPosition) {
- metadata.itemType = ITEM_TYPE_STANDALONE;
- metadata.cursorPosition = cursorPosition - (listPosition - position);
- metadata.childCount = 1;
- return;
- }
-
- boolean expanded = (group & EXPANDED_GROUP_MASK) != 0;
- int size = (int) ((group & GROUP_SIZE_MASK) >> 32);
-
- // B) The requested position is a group header
- if (position == listPosition) {
- metadata.itemType = ITEM_TYPE_GROUP_HEADER;
- metadata.groupPosition = i;
- metadata.isExpanded = expanded;
- metadata.childCount = size;
- metadata.cursorPosition = offset;
- return;
- }
-
- if (expanded) {
- // C) The requested position is an element in the expanded group
- if (position < listPosition + size + 1) {
- metadata.itemType = ITEM_TYPE_IN_GROUP;
- metadata.cursorPosition = cursorPosition + (position - listPosition) - 1;
- return;
- }
-
- // D) The element is past the expanded group
- listPosition += size + 1;
- } else {
-
- // E) The element is past the collapsed group
- listPosition++;
- }
-
- // Move cursor past the group
- cursorPosition += size;
+ public int getGroupSize(int listPosition) {
+ if (listPosition < 0 || listPosition >= mGroupMetadata.size()) {
+ return 0;
}
- // The required item is past the last group
- metadata.itemType = ITEM_TYPE_STANDALONE;
- metadata.cursorPosition = cursorPosition + (position - listPosition);
- metadata.childCount = 1;
+ return mGroupMetadata.valueAt(listPosition);
}
/**
- * Returns true if the specified position in the list corresponds to a
- * group header.
+ * Given the position of a list item, returns the the first item in the group of items
+ * corresponding to that position.
*/
- public boolean isGroupHeader(int position) {
- obtainPositionMetadata(mPositionMetadata, position);
- return mPositionMetadata.itemType == ITEM_TYPE_GROUP_HEADER;
- }
-
- /**
- * Given a position of a groups header in the list, returns the size of
- * the corresponding group.
- */
- public int getGroupSize(int position) {
- obtainPositionMetadata(mPositionMetadata, position);
- return mPositionMetadata.childCount;
- }
-
- /**
- * Mark group as expanded if it is collapsed and vice versa.
- */
- @NeededForTesting
- public void toggleGroup(int position) {
- obtainPositionMetadata(mPositionMetadata, position);
- if (mPositionMetadata.itemType != ITEM_TYPE_GROUP_HEADER) {
- throw new IllegalArgumentException("Not a group at position " + position);
- }
-
- if (mPositionMetadata.isExpanded) {
- mGroupMetadata[mPositionMetadata.groupPosition] &= ~EXPANDED_GROUP_MASK;
- } else {
- mGroupMetadata[mPositionMetadata.groupPosition] |= EXPANDED_GROUP_MASK;
- }
- resetCache();
- notifyDataSetChanged();
- }
-
- public int getItemViewType(int position) {
- obtainPositionMetadata(mPositionMetadata, position);
- return mPositionMetadata.itemType;
- }
-
- public Object getItem(int position) {
- if (mCursor == null) {
+ public Object getItem(int listPosition) {
+ if (mCursor == null || listPosition < 0 || listPosition >= mGroupMetadata.size()) {
return null;
}
- obtainPositionMetadata(mPositionMetadata, position);
- if (mCursor.moveToPosition(mPositionMetadata.cursorPosition)) {
+ int cursorPosition = mGroupMetadata.keyAt(listPosition);
+ if (mCursor.moveToPosition(cursorPosition)) {
return mCursor;
} else {
return null;
}
}
- public long getItemId(int position) {
- Object item = getItem(position);
- if (item != null) {
- return mCursor.getLong(mRowIdColumnIndex);
- } else {
- return -1;
- }
+ private void reset() {
+ mItemCount = 0;
+ mGroupMetadata = new SparseIntArray();
}
}
diff --git a/src/com/android/dialer/calllog/IntentProvider.java b/src/com/android/dialer/calllog/IntentProvider.java
index a11d00bc2..773436be4 100644
--- a/src/com/android/dialer/calllog/IntentProvider.java
+++ b/src/com/android/dialer/calllog/IntentProvider.java
@@ -21,17 +21,17 @@ import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
-import android.provider.CallLog.Calls;
import android.provider.ContactsContract;
import android.telecom.PhoneAccountHandle;
+import com.android.contacts.common.CallUtil;
import com.android.contacts.common.model.Contact;
import com.android.contacts.common.model.ContactLoader;
import com.android.dialer.CallDetailActivity;
-import com.android.dialer.DialtactsActivity;
-import com.android.dialer.PhoneCallDetails;
import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.IntentUtil.CallIntentBuilder;
import com.android.dialer.util.TelecomUtil;
+import com.android.incallui.Call.LogState;
import java.util.ArrayList;
@@ -55,7 +55,10 @@ public abstract class IntentProvider {
return new IntentProvider() {
@Override
public Intent getIntent(Context context) {
- return IntentUtil.getCallIntent(number, accountHandle);
+ return new CallIntentBuilder(number)
+ .setPhoneAccountHandle(accountHandle)
+ .setCallInitiationType(LogState.INITIATION_CALL_LOG)
+ .build();
}
};
}
@@ -69,7 +72,11 @@ public abstract class IntentProvider {
return new IntentProvider() {
@Override
public Intent getIntent(Context context) {
- return IntentUtil.getVideoCallIntent(number, accountHandle);
+ return new CallIntentBuilder(number)
+ .setPhoneAccountHandle(accountHandle)
+ .setCallInitiationType(LogState.INITIATION_CALL_LOG)
+ .setIsVideoCall(true)
+ .build();
}
};
}
@@ -78,7 +85,9 @@ public abstract class IntentProvider {
return new IntentProvider() {
@Override
public Intent getIntent(Context context) {
- return IntentUtil.getVoicemailIntent();
+ return new CallIntentBuilder(CallUtil.getVoicemailUri())
+ .setCallInitiationType(LogState.INITIATION_CALL_LOG)
+ .build();
}
};
}
diff --git a/src/com/android/dialer/calllog/MissedCallNotificationReceiver.java b/src/com/android/dialer/calllog/MissedCallNotificationReceiver.java
new file mode 100644
index 000000000..86d6cb9fb
--- /dev/null
+++ b/src/com/android/dialer/calllog/MissedCallNotificationReceiver.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.calllog;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.telecom.TelecomManager;
+import android.util.Log;
+
+import com.android.dialer.calllog.CallLogNotificationsService;
+
+/**
+ * Receives broadcasts that should trigger a refresh of the missed call notification. This includes
+ * both an explicit broadcast from Telecom and a reboot.
+ */
+public class MissedCallNotificationReceiver extends BroadcastReceiver {
+ //TODO: Use compat class for these methods.
+ public static final String ACTION_SHOW_MISSED_CALLS_NOTIFICATION =
+ "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION";
+
+ public static final String EXTRA_NOTIFICATION_COUNT =
+ "android.telecom.extra.NOTIFICATION_COUNT";
+
+ public static final String EXTRA_NOTIFICATION_PHONE_NUMBER =
+ "android.telecom.extra.NOTIFICATION_PHONE_NUMBER";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (!ACTION_SHOW_MISSED_CALLS_NOTIFICATION.equals(action)) {
+ return;
+ }
+
+ int count = intent.getIntExtra(EXTRA_NOTIFICATION_COUNT,
+ CallLogNotificationsService.UNKNOWN_MISSED_CALL_COUNT);
+ String number = intent.getStringExtra(EXTRA_NOTIFICATION_PHONE_NUMBER);
+ CallLogNotificationsService.updateMissedCallNotifications(context, count, number);
+ }
+}
diff --git a/src/com/android/dialer/calllog/MissedCallNotifier.java b/src/com/android/dialer/calllog/MissedCallNotifier.java
new file mode 100644
index 000000000..f6830168b
--- /dev/null
+++ b/src/com/android/dialer/calllog/MissedCallNotifier.java
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.calllog;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.os.AsyncTask;
+import android.provider.CallLog.Calls;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.dialer.DialtactsActivity;
+import com.android.dialer.R;
+import com.android.dialer.calllog.CallLogNotificationsHelper.NewCall;
+import com.android.dialer.contactinfo.ContactPhotoLoader;
+import com.android.dialer.compat.UserManagerCompat;
+import com.android.dialer.list.ListsFragment;
+import com.android.dialer.util.DialerUtils;
+import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.IntentUtil.CallIntentBuilder;
+
+import java.util.List;
+
+/**
+ * Creates a notification for calls that the user missed (neither answered nor rejected).
+ *
+ */
+public class MissedCallNotifier {
+ public static final String TAG = "MissedCallNotifier";
+
+ /** The tag used to identify notifications from this class. */
+ private static final String NOTIFICATION_TAG = "MissedCallNotifier";
+ /** The identifier of the notification of new missed calls. */
+ private static final int NOTIFICATION_ID = 1;
+ /** Preference file key for number of missed calls. */
+ private static final String MISSED_CALL_COUNT = "missed_call_count";
+
+ private static MissedCallNotifier sInstance;
+ private Context mContext;
+
+ /** Returns the singleton instance of the {@link MissedCallNotifier}. */
+ public static MissedCallNotifier getInstance(Context context) {
+ if (sInstance == null) {
+ sInstance = new MissedCallNotifier(context);
+ }
+ return sInstance;
+ }
+
+ private MissedCallNotifier(Context context) {
+ mContext = context;
+ }
+
+ public void updateMissedCallNotification(int count, String number) {
+ final int titleResId;
+ final String expandedText; // The text in the notification's line 1 and 2.
+
+ final List<NewCall> newCalls =
+ CallLogNotificationsHelper.getInstance(mContext).getNewMissedCalls();
+
+ if (count == CallLogNotificationsService.UNKNOWN_MISSED_CALL_COUNT) {
+ if (newCalls == null) {
+ // If the intent did not contain a count, and we are unable to get a count from the
+ // call log, then no notification can be shown.
+ return;
+ }
+ count = newCalls.size();
+ }
+
+ if (count == 0) {
+ // No voicemails to notify about: clear the notification.
+ clearMissedCalls();
+ return;
+ }
+
+ // The call log has been updated, use that information preferentially.
+ boolean useCallLog = newCalls != null && newCalls.size() == count;
+ NewCall newestCall = useCallLog ? newCalls.get(0) : null;
+ long timeMs = useCallLog ? newestCall.dateMs : System.currentTimeMillis();
+
+ Notification.Builder builder = new Notification.Builder(mContext);
+ // Display the first line of the notification:
+ // 1 missed call: <caller name || handle>
+ // More than 1 missed call: <number of calls> + "missed calls"
+ if (count == 1) {
+ //TODO: look up caller ID that is not in contacts.
+ ContactInfo contactInfo = CallLogNotificationsHelper.getInstance(mContext)
+ .getContactInfo(useCallLog ? newestCall.number : number,
+ useCallLog ? newestCall.numberPresentation
+ : Calls.PRESENTATION_ALLOWED,
+ useCallLog ? newestCall.countryIso : null);
+
+ titleResId = contactInfo.userType == ContactsUtils.USER_TYPE_WORK
+ ? R.string.notification_missedWorkCallTitle
+ : R.string.notification_missedCallTitle;
+
+ expandedText = contactInfo.name;
+ ContactPhotoLoader loader = new ContactPhotoLoader(mContext, contactInfo);
+ Bitmap photoIcon = loader.loadPhotoIcon();
+ if (photoIcon != null) {
+ builder.setLargeIcon(photoIcon);
+ }
+ } else {
+ titleResId = R.string.notification_missedCallsTitle;
+ expandedText =
+ mContext.getString(R.string.notification_missedCallsMsg, count);
+ }
+
+ // Create a public viewable version of the notification, suitable for display when sensitive
+ // notification content is hidden.
+ Notification.Builder publicBuilder = new Notification.Builder(mContext);
+ publicBuilder.setSmallIcon(android.R.drawable.stat_notify_missed_call)
+ .setColor(mContext.getResources().getColor(R.color.dialer_theme_color))
+ // Show "Phone" for notification title.
+ .setContentTitle(mContext.getText(R.string.userCallActivityLabel))
+ // Notification details shows that there are missed call(s), but does not reveal
+ // the missed caller information.
+ .setContentText(mContext.getText(titleResId))
+ .setContentIntent(createCallLogPendingIntent())
+ .setAutoCancel(true)
+ .setWhen(timeMs)
+ .setDeleteIntent(createClearMissedCallsPendingIntent());
+
+ // Create the notification suitable for display when sensitive information is showing.
+ builder.setSmallIcon(android.R.drawable.stat_notify_missed_call)
+ .setColor(mContext.getResources().getColor(R.color.dialer_theme_color))
+ .setContentTitle(mContext.getText(titleResId))
+ .setContentText(expandedText)
+ .setContentIntent(createCallLogPendingIntent())
+ .setAutoCancel(true)
+ .setWhen(timeMs)
+ .setDeleteIntent(createClearMissedCallsPendingIntent())
+ // Include a public version of the notification to be shown when the missed call
+ // notification is shown on the user's lock screen and they have chosen to hide
+ // sensitive notification information.
+ .setPublicVersion(publicBuilder.build());
+
+ // Add additional actions when there is only 1 missed call and the user isn't locked
+ if (UserManagerCompat.isUserUnlocked(mContext) && count == 1) {
+ if (!TextUtils.isEmpty(number)
+ && !TextUtils.equals(
+ number, mContext.getString(R.string.handle_restricted))) {
+ builder.addAction(R.drawable.ic_phone_24dp,
+ mContext.getString(R.string.notification_missedCall_call_back),
+ createCallBackPendingIntent(number));
+
+ if (!PhoneNumberHelper.isUriNumber(number)) {
+ builder.addAction(R.drawable.ic_message_24dp,
+ mContext.getString(R.string.notification_missedCall_message),
+ createSendSmsFromNotificationPendingIntent(number));
+ }
+ }
+ }
+
+ Notification notification = builder.build();
+ configureLedOnNotification(notification);
+
+ Log.i(TAG, "Adding missed call notification.");
+ getNotificationMgr().notify(NOTIFICATION_TAG, NOTIFICATION_ID, notification);
+ }
+
+ private void clearMissedCalls() {
+ AsyncTask.execute(new Runnable() {
+ @Override
+ public void run() {
+ // Call log is only accessible when unlocked. If that's the case, clear the list of
+ // new missed calls from the call log.
+ if (UserManagerCompat.isUserUnlocked(mContext)) {
+ ContentValues values = new ContentValues();
+ values.put(Calls.NEW, 0);
+ values.put(Calls.IS_READ, 1);
+ StringBuilder where = new StringBuilder();
+ where.append(Calls.NEW);
+ where.append(" = 1 AND ");
+ where.append(Calls.TYPE);
+ where.append(" = ?");
+ try {
+ mContext.getContentResolver().update(Calls.CONTENT_URI, values,
+ where.toString(), new String[]{Integer.toString(Calls.
+ MISSED_TYPE)});
+ } catch (IllegalArgumentException e) {
+ Log.w(TAG, "ContactsProvider update command failed", e);
+ }
+ }
+ getNotificationMgr().cancel(NOTIFICATION_TAG, NOTIFICATION_ID);
+ }
+ });
+ }
+
+ /**
+ * Trigger an intent to make a call from a missed call number.
+ */
+ public void callBackFromMissedCall(String number) {
+ closeSystemDialogs(mContext);
+ CallLogNotificationsHelper.removeMissedCallNotifications(mContext);
+ DialerUtils.startActivityWithErrorToast(
+ mContext,
+ new CallIntentBuilder(number)
+ .build()
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ }
+
+ /**
+ * Trigger an intent to send an sms from a missed call number.
+ */
+ public void sendSmsFromMissedCall(String number) {
+ closeSystemDialogs(mContext);
+ CallLogNotificationsHelper.removeMissedCallNotifications(mContext);
+ DialerUtils.startActivityWithErrorToast(
+ mContext,
+ IntentUtil.getSendSmsIntent(number).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ }
+
+ /**
+ * Creates a new pending intent that sends the user to the call log.
+ *
+ * @return The pending intent.
+ */
+ private PendingIntent createCallLogPendingIntent() {
+ Intent contentIntent = new Intent(mContext, DialtactsActivity.class);
+ contentIntent.putExtra(DialtactsActivity.EXTRA_SHOW_TAB, ListsFragment.TAB_INDEX_HISTORY);
+ return PendingIntent.getActivity(
+ mContext, 0, contentIntent,PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ /** Creates a pending intent that marks all new missed calls as old. */
+ private PendingIntent createClearMissedCallsPendingIntent() {
+ Intent intent = new Intent(mContext, CallLogNotificationsService.class);
+ intent.setAction(CallLogNotificationsService.ACTION_MARK_NEW_MISSED_CALLS_AS_OLD);
+ return PendingIntent.getService(mContext, 0, intent, 0);
+ }
+
+ private PendingIntent createCallBackPendingIntent(String number) {
+ Intent intent = new Intent(mContext, CallLogNotificationsService.class);
+ intent.setAction(
+ CallLogNotificationsService.ACTION_CALL_BACK_FROM_MISSED_CALL_NOTIFICATION);
+ intent.putExtra(CallLogNotificationsService.EXTRA_MISSED_CALL_NUMBER, number);
+ // Use FLAG_UPDATE_CURRENT to make sure any previous pending intent is updated with the new
+ // extra.
+ return PendingIntent.getService(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ private PendingIntent createSendSmsFromNotificationPendingIntent(String number) {
+ Intent intent = new Intent(mContext, CallLogNotificationsService.class);
+ intent.setAction(
+ CallLogNotificationsService.ACTION_SEND_SMS_FROM_MISSED_CALL_NOTIFICATION);
+ intent.putExtra(CallLogNotificationsService.EXTRA_MISSED_CALL_NUMBER, number);
+ // Use FLAG_UPDATE_CURRENT to make sure any previous pending intent is updated with the new
+ // extra.
+ return PendingIntent.getService(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ }
+
+ /**
+ * Configures a notification to emit the blinky notification light.
+ */
+ private void configureLedOnNotification(Notification notification) {
+ notification.flags |= Notification.FLAG_SHOW_LIGHTS;
+ notification.defaults |= Notification.DEFAULT_LIGHTS;
+ }
+
+ /**
+ * Closes open system dialogs and the notification shade.
+ */
+ private void closeSystemDialogs(Context context) {
+ context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
+ }
+
+ private NotificationManager getNotificationMgr() {
+ return (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
+ }
+}
diff --git a/src/com/android/dialer/calllog/PhoneAccountUtils.java b/src/com/android/dialer/calllog/PhoneAccountUtils.java
index 143d13e86..b3ce18b3c 100644
--- a/src/com/android/dialer/calllog/PhoneAccountUtils.java
+++ b/src/com/android/dialer/calllog/PhoneAccountUtils.java
@@ -18,11 +18,14 @@ package com.android.dialer.calllog;
import android.content.ComponentName;
import android.content.Context;
+import android.support.annotation.Nullable;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
import android.text.TextUtils;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.util.TelecomUtil;
+
import java.util.ArrayList;
import java.util.List;
@@ -34,13 +37,11 @@ public class PhoneAccountUtils {
* Return a list of phone accounts that are subscription/SIM accounts.
*/
public static List<PhoneAccountHandle> getSubscriptionPhoneAccounts(Context context) {
- final TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
-
List<PhoneAccountHandle> subscriptionAccountHandles = new ArrayList<PhoneAccountHandle>();
- List<PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts();
+ final List<PhoneAccountHandle> accountHandles =
+ TelecomUtil.getCallCapablePhoneAccounts(context);
for (PhoneAccountHandle accountHandle : accountHandles) {
- PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
+ PhoneAccount account = TelecomUtil.getPhoneAccount(context, accountHandle);
if (account.hasCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION)) {
subscriptionAccountHandles.add(accountHandle);
}
@@ -51,18 +52,25 @@ public class PhoneAccountUtils {
/**
* Compose PhoneAccount object from component name and account id.
*/
- public static PhoneAccountHandle getAccount(String componentString, String accountId) {
+ @Nullable
+ public static PhoneAccountHandle getAccount(@Nullable String componentString,
+ @Nullable String accountId) {
if (TextUtils.isEmpty(componentString) || TextUtils.isEmpty(accountId)) {
return null;
}
final ComponentName componentName = ComponentName.unflattenFromString(componentString);
+ if (componentName == null) {
+ return null;
+ }
return new PhoneAccountHandle(componentName, accountId);
}
/**
* Extract account label from PhoneAccount object.
*/
- public static String getAccountLabel(Context context, PhoneAccountHandle accountHandle) {
+ @Nullable
+ public static String getAccountLabel(Context context,
+ @Nullable PhoneAccountHandle accountHandle) {
PhoneAccount account = getAccountOrNull(context, accountHandle);
if (account != null && account.getLabel() != null) {
return account.getLabel().toString();
@@ -73,10 +81,8 @@ public class PhoneAccountUtils {
/**
* Extract account color from PhoneAccount object.
*/
- public static int getAccountColor(Context context, PhoneAccountHandle accountHandle) {
- TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
- final PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
+ public static int getAccountColor(Context context, @Nullable PhoneAccountHandle accountHandle) {
+ final PhoneAccount account = TelecomUtil.getPhoneAccount(context, accountHandle);
// For single-sim devices the PhoneAccount will be NO_HIGHLIGHT_COLOR by default, so it is
// safe to always use the account highlight color.
@@ -89,10 +95,8 @@ public class PhoneAccountUtils {
* @return {@code true} if call subjects are supported, {@code false} otherwise.
*/
public static boolean getAccountSupportsCallSubject(Context context,
- PhoneAccountHandle accountHandle) {
- TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
- final PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
+ @Nullable PhoneAccountHandle accountHandle) {
+ final PhoneAccount account = TelecomUtil.getPhoneAccount(context, accountHandle);
return account == null ? false :
account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT);
@@ -102,14 +106,12 @@ public class PhoneAccountUtils {
* Retrieve the account metadata, but if the account does not exist or the device has only a
* single registered and enabled account, return null.
*/
- static PhoneAccount getAccountOrNull(Context context,
- PhoneAccountHandle accountHandle) {
- TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
- final PhoneAccount account = telecomManager.getPhoneAccount(accountHandle);
- if (telecomManager.getCallCapablePhoneAccounts().size() <= 1) {
+ @Nullable
+ private static PhoneAccount getAccountOrNull(Context context,
+ @Nullable PhoneAccountHandle accountHandle) {
+ if (TelecomUtil.getCallCapablePhoneAccounts(context).size() <= 1) {
return null;
}
- return account;
+ return TelecomUtil.getPhoneAccount(context, accountHandle);
}
}
diff --git a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
index df5fe0606..4f1c45503 100644
--- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
@@ -16,13 +16,15 @@
package com.android.dialer.calllog;
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.Lists;
+
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Typeface;
-import android.graphics.drawable.Drawable;
-import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.support.v4.content.ContextCompat;
import android.telecom.PhoneAccount;
import android.text.TextUtils;
import android.text.format.DateUtils;
@@ -33,17 +35,18 @@ import com.android.contacts.common.testing.NeededForTesting;
import com.android.contacts.common.util.PhoneNumberHelper;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.R;
+import com.android.dialer.calllog.calllogcache.CallLogCache;
import com.android.dialer.util.DialerUtils;
-import com.android.dialer.util.PhoneNumberUtil;
-
-import com.google.common.collect.Lists;
import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.concurrent.TimeUnit;
/**
* Helper class to fill in the views in {@link PhoneCallDetailsViews}.
*/
public class PhoneCallDetailsHelper {
+
/** The maximum number of icons will be shown to represent the call types in a group. */
private static final int MAX_CALL_TYPE_ICONS = 3;
@@ -51,7 +54,13 @@ public class PhoneCallDetailsHelper {
private final Resources mResources;
/** The injected current time in milliseconds since the epoch. Used only by tests. */
private Long mCurrentTimeMillisForTest;
- private final TelecomCallLogCache mTelecomCallLogCache;
+
+ private CharSequence mPhoneTypeLabelForTest;
+
+ private final CallLogCache mCallLogCache;
+
+ /** Calendar used to construct dates */
+ private final Calendar mCalendar;
/**
* List of items to be concatenated together for accessibility descriptions
@@ -68,10 +77,11 @@ public class PhoneCallDetailsHelper {
public PhoneCallDetailsHelper(
Context context,
Resources resources,
- TelecomCallLogCache telecomCallLogCache) {
+ CallLogCache callLogCache) {
mContext = context;
mResources = resources;
- mTelecomCallLogCache = telecomCallLogCache;
+ mCallLogCache = callLogCache;
+ mCalendar = Calendar.getInstance();
}
/** Fills the call details views with content. */
@@ -101,18 +111,24 @@ public class PhoneCallDetailsHelper {
callCount = null;
}
- CharSequence callLocationAndDate = getCallLocationAndDate(details);
-
- // Set the call count, location and date.
- setCallCountAndDate(views, callCount, callLocationAndDate);
+ // Set the call count, location, date and if voicemail, set the duration.
+ setDetailText(views, callCount, details);
// Set the account label if it exists.
- String accountLabel = mTelecomCallLogCache.getAccountLabel(details.accountHandle);
-
- if (accountLabel != null) {
+ String accountLabel = mCallLogCache.getAccountLabel(details.accountHandle);
+ if (!TextUtils.isEmpty(details.viaNumber)) {
+ if (!TextUtils.isEmpty(accountLabel)) {
+ accountLabel = mResources.getString(R.string.call_log_via_number_phone_account,
+ accountLabel, details.viaNumber);
+ } else {
+ accountLabel = mResources.getString(R.string.call_log_via_number,
+ details.viaNumber);
+ }
+ }
+ if (!TextUtils.isEmpty(accountLabel)) {
views.callAccountLabel.setVisibility(View.VISIBLE);
views.callAccountLabel.setText(accountLabel);
- int color = PhoneAccountUtils.getAccountColor(mContext, details.accountHandle);
+ int color = mCallLogCache.getAccountColor(details.accountHandle);
if (color == PhoneAccount.NO_HIGHLIGHT_COLOR) {
int defaultColor = R.color.dialtacts_secondary_text_color;
views.callAccountLabel.setTextColor(mContext.getResources().getColor(defaultColor));
@@ -125,22 +141,19 @@ public class PhoneCallDetailsHelper {
final CharSequence nameText;
final CharSequence displayNumber = details.displayNumber;
- if (TextUtils.isEmpty(details.name)) {
+ if (TextUtils.isEmpty(details.getPreferredName())) {
nameText = displayNumber;
// We have a real phone number as "nameView" so make it always LTR
views.nameView.setTextDirection(View.TEXT_DIRECTION_LTR);
} else {
- nameText = details.name;
+ nameText = details.getPreferredName();
}
views.nameView.setText(nameText);
- if (isVoicemail && !TextUtils.isEmpty(details.transcription)) {
- views.voicemailTranscriptionView.setText(details.transcription);
- views.voicemailTranscriptionView.setVisibility(View.VISIBLE);
- } else {
- views.voicemailTranscriptionView.setText(null);
- views.voicemailTranscriptionView.setVisibility(View.GONE);
+ if (isVoicemail) {
+ views.voicemailTranscriptionView.setText(TextUtils.isEmpty(details.transcription) ? null
+ : details.transcription);
}
// Bold if not read
@@ -148,10 +161,13 @@ public class PhoneCallDetailsHelper {
views.nameView.setTypeface(typeface);
views.voicemailTranscriptionView.setTypeface(typeface);
views.callLocationAndDate.setTypeface(typeface);
+ views.callLocationAndDate.setTextColor(ContextCompat.getColor(mContext, details.isRead ?
+ R.color.call_log_detail_color : R.color.call_log_unread_text_color));
}
/**
- * Builds a string containing the call location and date.
+ * Builds a string containing the call location and date. For voicemail logs only the call date
+ * is returned because location information is displayed in the call action button
*
* @param details The call details.
* @return The call location and date string.
@@ -159,15 +175,18 @@ public class PhoneCallDetailsHelper {
private CharSequence getCallLocationAndDate(PhoneCallDetails details) {
mDescriptionItems.clear();
- // Get type of call (ie mobile, home, etc) if known, or the caller's location.
- CharSequence callTypeOrLocation = getCallTypeOrLocation(details);
+ if (details.callTypes[0] != Calls.VOICEMAIL_TYPE) {
+ // Get type of call (ie mobile, home, etc) if known, or the caller's location.
+ CharSequence callTypeOrLocation = getCallTypeOrLocation(details);
- // Only add the call type or location if its not empty. It will be empty for unknown
- // callers.
- if (!TextUtils.isEmpty(callTypeOrLocation)) {
- mDescriptionItems.add(callTypeOrLocation);
+ // Only add the call type or location if its not empty. It will be empty for unknown
+ // callers.
+ if (!TextUtils.isEmpty(callTypeOrLocation)) {
+ mDescriptionItems.add(callTypeOrLocation);
+ }
}
- // The date of this call, relative to the current time.
+
+ // The date of this call
mDescriptionItems.add(getCallDate(details));
// Create a comma separated list from the call type or location, and call date.
@@ -178,6 +197,7 @@ public class PhoneCallDetailsHelper {
* For a call, if there is an associated contact for the caller, return the known call type
* (e.g. mobile, home, work). If there is no associated contact, attempt to use the caller's
* location if known.
+ *
* @param details Call details to use.
* @return Type of call (mobile/home) if known, or the location of the caller (if known).
*/
@@ -186,43 +206,94 @@ public class PhoneCallDetailsHelper {
// Only show a label if the number is shown and it is not a SIP address.
if (!TextUtils.isEmpty(details.number)
&& !PhoneNumberHelper.isUriNumber(details.number.toString())
- && !mTelecomCallLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
+ && !mCallLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
- if (TextUtils.isEmpty(details.name) && !TextUtils.isEmpty(details.geocode)) {
+ if (TextUtils.isEmpty(details.namePrimary) && !TextUtils.isEmpty(details.geocode)) {
numberFormattedLabel = details.geocode;
} else if (!(details.numberType == Phone.TYPE_CUSTOM
&& TextUtils.isEmpty(details.numberLabel))) {
// Get type label only if it will not be "Custom" because of an empty number label.
- numberFormattedLabel = Phone.getTypeLabel(
- mResources, details.numberType, details.numberLabel);
+ numberFormattedLabel = MoreObjects.firstNonNull(mPhoneTypeLabelForTest,
+ Phone.getTypeLabel(mResources, details.numberType, details.numberLabel));
}
}
- if (!TextUtils.isEmpty(details.name) && TextUtils.isEmpty(numberFormattedLabel)) {
+ if (!TextUtils.isEmpty(details.namePrimary) && TextUtils.isEmpty(numberFormattedLabel)) {
numberFormattedLabel = details.displayNumber;
}
return numberFormattedLabel;
}
+ @NeededForTesting
+ public void setPhoneTypeLabelForTest(CharSequence phoneTypeLabel) {
+ this.mPhoneTypeLabelForTest = phoneTypeLabel;
+ }
+
/**
- * Get the call date/time of the call, relative to the current time.
- * e.g. 3 minutes ago
+ * Get the call date/time of the call. For the call log this is relative to the current time.
+ * e.g. 3 minutes ago. For voicemail, see {@link #getGranularDateTime(PhoneCallDetails)}
+ *
* @param details Call details to use.
* @return String representing when the call occurred.
*/
public CharSequence getCallDate(PhoneCallDetails details) {
- return DateUtils.getRelativeTimeSpanString(details.date,
- getCurrentTimeMillis(),
- DateUtils.MINUTE_IN_MILLIS,
- DateUtils.FORMAT_ABBREV_RELATIVE);
+ if (details.callTypes[0] == Calls.VOICEMAIL_TYPE) {
+ return getGranularDateTime(details);
+ }
+
+ return DateUtils.getRelativeTimeSpanString(details.date, getCurrentTimeMillis(),
+ DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE);
+ }
+
+ /**
+ * Get the granular version of the call date/time of the call. The result is always in the form
+ * 'DATE at TIME'. The date value changes based on when the call was created.
+ *
+ * If created today, DATE is 'Today'
+ * If created this year, DATE is 'MMM dd'
+ * Otherwise, DATE is 'MMM dd, yyyy'
+ *
+ * TIME is the localized time format, e.g. 'hh:mm a' or 'HH:mm'
+ *
+ * @param details Call details to use
+ * @return String representing when the call occurred
+ */
+ public CharSequence getGranularDateTime(PhoneCallDetails details) {
+ return mResources.getString(R.string.voicemailCallLogDateTimeFormat,
+ getGranularDate(details.date),
+ DateUtils.formatDateTime(mContext, details.date, DateUtils.FORMAT_SHOW_TIME));
+ }
+
+ /**
+ * Get the granular version of the call date. See {@link #getGranularDateTime(PhoneCallDetails)}
+ */
+ private String getGranularDate(long date) {
+ if (DateUtils.isToday(date)) {
+ return mResources.getString(R.string.voicemailCallLogToday);
+ }
+ return DateUtils.formatDateTime(mContext, date, DateUtils.FORMAT_SHOW_DATE
+ | DateUtils.FORMAT_ABBREV_MONTH
+ | (shouldShowYear(date) ? DateUtils.FORMAT_SHOW_YEAR : DateUtils.FORMAT_NO_YEAR));
+ }
+
+ /**
+ * Determines whether the year should be shown for the given date
+ *
+ * @return {@code true} if date is within the current year, {@code false} otherwise
+ */
+ private boolean shouldShowYear(long date) {
+ mCalendar.setTimeInMillis(getCurrentTimeMillis());
+ int currentYear = mCalendar.get(Calendar.YEAR);
+ mCalendar.setTimeInMillis(date);
+ return currentYear != mCalendar.get(Calendar.YEAR);
}
/** Sets the text of the header view for the details page of a phone call. */
@NeededForTesting
public void setCallDetailsHeader(TextView nameView, PhoneCallDetails details) {
final CharSequence nameText;
- if (!TextUtils.isEmpty(details.name)) {
- nameText = details.name;
+ if (!TextUtils.isEmpty(details.namePrimary)) {
+ nameText = details.namePrimary;
} else if (!TextUtils.isEmpty(details.displayNumber)) {
nameText = details.displayNumber;
} else {
@@ -250,10 +321,11 @@ public class PhoneCallDetailsHelper {
}
}
- /** Sets the call count and date. */
- private void setCallCountAndDate(PhoneCallDetailsViews views, Integer callCount,
- CharSequence dateText) {
+ /** Sets the call count, date, and if it is a voicemail, sets the duration. */
+ private void setDetailText(PhoneCallDetailsViews views, Integer callCount,
+ PhoneCallDetails details) {
// Combine the count (if present) and the date.
+ CharSequence dateText = getCallLocationAndDate(details);
final CharSequence text;
if (callCount != null) {
text = mResources.getString(
@@ -262,6 +334,22 @@ public class PhoneCallDetailsHelper {
text = dateText;
}
- views.callLocationAndDate.setText(text);
+ if (details.callTypes[0] == Calls.VOICEMAIL_TYPE && details.duration > 0) {
+ views.callLocationAndDate.setText(mResources.getString(
+ R.string.voicemailCallLogDateTimeFormatWithDuration, text,
+ getVoicemailDuration(details)));
+ } else {
+ views.callLocationAndDate.setText(text);
+ }
+
+ }
+
+ private String getVoicemailDuration(PhoneCallDetails details) {
+ long minutes = TimeUnit.SECONDS.toMinutes(details.duration);
+ long seconds = details.duration - TimeUnit.MINUTES.toSeconds(minutes);
+ if (minutes > 99) {
+ minutes = 99;
+ }
+ return mResources.getString(R.string.voicemailDurationFormat, minutes, seconds);
}
}
diff --git a/src/com/android/dialer/calllog/PhoneNumberDisplayUtil.java b/src/com/android/dialer/calllog/PhoneNumberDisplayUtil.java
index 5030efd48..5b1fc9e3a 100644
--- a/src/com/android/dialer/calllog/PhoneNumberDisplayUtil.java
+++ b/src/com/android/dialer/calllog/PhoneNumberDisplayUtil.java
@@ -17,10 +17,8 @@
package com.android.dialer.calllog;
import android.content.Context;
-import android.content.res.Resources;
import android.provider.CallLog.Calls;
import android.text.TextUtils;
-import android.util.Log;
import com.android.dialer.R;
import com.android.dialer.util.PhoneNumberUtil;
@@ -67,6 +65,7 @@ public class PhoneNumberDisplayUtil {
CharSequence number,
int presentation,
CharSequence formattedNumber,
+ CharSequence postDialDigits,
boolean isVoicemail) {
final CharSequence displayName = getDisplayName(context, number, presentation, isVoicemail);
if (!TextUtils.isEmpty(displayName)) {
@@ -76,9 +75,9 @@ public class PhoneNumberDisplayUtil {
if (!TextUtils.isEmpty(formattedNumber)) {
return formattedNumber;
} else if (!TextUtils.isEmpty(number)) {
- return number;
+ return number.toString() + postDialDigits;
} else {
- return "";
+ return context.getResources().getString(R.string.unknown);
}
}
}
diff --git a/src/com/android/dialer/calllog/PhoneQuery.java b/src/com/android/dialer/calllog/PhoneQuery.java
index 719052204..f1f14c66e 100644
--- a/src/com/android/dialer/calllog/PhoneQuery.java
+++ b/src/com/android/dialer/calllog/PhoneQuery.java
@@ -16,14 +16,27 @@
package com.android.dialer.calllog;
+import android.net.Uri;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.PhoneLookup;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.PhoneLookupSdkCompat;
+import com.android.contacts.common.ContactsUtils;
+
/**
- * The query to look up the {@link ContactInfo} for a given number in the Call Log.
+ * The queries to look up the {@link ContactInfo} for a given number in the Call Log.
*/
final class PhoneQuery {
- public static final String[] _PROJECTION = new String[] {
- PhoneLookup._ID,
+
+ /**
+ * Projection to look up the ContactInfo. Does not include DISPLAY_NAME_ALTERNATIVE as that
+ * column isn't available in ContactsCommon.PhoneLookup.
+ * We should always use this projection starting from NYC onward.
+ */
+ private static final String[] PHONE_LOOKUP_PROJECTION = new String[] {
+ PhoneLookupSdkCompat.CONTACT_ID,
PhoneLookup.DISPLAY_NAME,
PhoneLookup.TYPE,
PhoneLookup.LABEL,
@@ -31,7 +44,36 @@ final class PhoneQuery {
PhoneLookup.NORMALIZED_NUMBER,
PhoneLookup.PHOTO_ID,
PhoneLookup.LOOKUP_KEY,
- PhoneLookup.PHOTO_URI};
+ PhoneLookup.PHOTO_URI
+ };
+
+ /**
+ * Similar to {@link PHONE_LOOKUP_PROJECTION}. In pre-N, contact id is stored in
+ * {@link PhoneLookup#_ID} in non-sip query.
+ */
+ private static final String[] BACKWARD_COMPATIBLE_NON_SIP_PHONE_LOOKUP_PROJECTION =
+ new String[] {
+ PhoneLookup._ID,
+ PhoneLookup.DISPLAY_NAME,
+ PhoneLookup.TYPE,
+ PhoneLookup.LABEL,
+ PhoneLookup.NUMBER,
+ PhoneLookup.NORMALIZED_NUMBER,
+ PhoneLookup.PHOTO_ID,
+ PhoneLookup.LOOKUP_KEY,
+ PhoneLookup.PHOTO_URI
+ };
+
+ public static String[] getPhoneLookupProjection(Uri phoneLookupUri) {
+ if (CompatUtils.isNCompatible()) {
+ return PHONE_LOOKUP_PROJECTION;
+ }
+ // Pre-N
+ boolean isSip = phoneLookupUri.getBooleanQueryParameter(
+ ContactsContract.PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, false);
+ return (isSip) ? PHONE_LOOKUP_PROJECTION
+ : BACKWARD_COMPATIBLE_NON_SIP_PHONE_LOOKUP_PROJECTION;
+ }
public static final int PERSON_ID = 0;
public static final int NAME = 1;
@@ -42,4 +84,13 @@ final class PhoneQuery {
public static final int PHOTO_ID = 6;
public static final int LOOKUP_KEY = 7;
public static final int PHOTO_URI = 8;
+
+ /**
+ * Projection to look up a contact's DISPLAY_NAME_ALTERNATIVE
+ */
+ public static final String[] DISPLAY_NAME_ALTERNATIVE_PROJECTION = new String[] {
+ Contacts.DISPLAY_NAME_ALTERNATIVE,
+ };
+
+ public static final int NAME_ALTERNATIVE = 0;
}
diff --git a/src/com/android/dialer/calllog/PromoCardViewHolder.java b/src/com/android/dialer/calllog/PromoCardViewHolder.java
index 4c9602759..f5a7501fc 100644
--- a/src/com/android/dialer/calllog/PromoCardViewHolder.java
+++ b/src/com/android/dialer/calllog/PromoCardViewHolder.java
@@ -15,14 +15,17 @@
*/
package com.android.dialer.calllog;
-import com.android.dialer.R;
-
+import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.View;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.R;
+
/**
- * View holder class for a promo card which will appear in the voicemail tab.
+ * Generic ViewHolder class for a promo card with a primary and secondary action.
+ * Example: the promo card which appears in the voicemail tab.
*/
public class PromoCardViewHolder extends RecyclerView.ViewHolder {
public static PromoCardViewHolder create(View rootView) {
@@ -30,14 +33,15 @@ public class PromoCardViewHolder extends RecyclerView.ViewHolder {
}
/**
- * The "Settings" button view.
+ * The primary action button view.
*/
- private View mSettingsTextView;
+ private View mPrimaryActionView;
/**
+ * The secondary action button view.
* The "Ok" button view.
*/
- private View mOkTextView;
+ private View mSecondaryActionView;
/**
* Creates an instance of the {@link ViewHolder}.
@@ -47,25 +51,33 @@ public class PromoCardViewHolder extends RecyclerView.ViewHolder {
private PromoCardViewHolder(View rootView) {
super(rootView);
- mSettingsTextView = rootView.findViewById(R.id.settings_action);
- mOkTextView = rootView.findViewById(R.id.ok_action);
+ mPrimaryActionView = rootView.findViewById(R.id.primary_action);
+ mSecondaryActionView = rootView.findViewById(R.id.secondary_action);
}
- /**
- * Retrieves the "Settings" button.
+ /**
+ * Retrieves the "primary" action button (eg. "OK").
*
* @return The view.
*/
- public View getSettingsTextView() {
- return mSettingsTextView;
+ public View getPrimaryActionView() {
+ return mPrimaryActionView;
}
/**
- * Retrieves the "Ok" button.
+ * Retrieves the "secondary" action button (eg. "Cancel" or "More Info").
*
* @return The view.
*/
- public View getOkTextView() {
- return mOkTextView;
+ public View getSecondaryActionView() {
+ return mSecondaryActionView;
+ }
+
+ @NeededForTesting
+ public static PromoCardViewHolder createForTest(Context context) {
+ PromoCardViewHolder viewHolder = new PromoCardViewHolder(new View(context));
+ viewHolder.mPrimaryActionView = new View(context);
+ viewHolder.mSecondaryActionView = new View(context);
+ return viewHolder;
}
}
diff --git a/src/com/android/dialer/calllog/ShowCallHistoryViewHolder.java b/src/com/android/dialer/calllog/ShowCallHistoryViewHolder.java
deleted file mode 100644
index af36a4d33..000000000
--- a/src/com/android/dialer/calllog/ShowCallHistoryViewHolder.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dialer.calllog;
-
-import android.content.Context;
-import android.content.Intent;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.dialer.R;
-
-public final class ShowCallHistoryViewHolder extends RecyclerView.ViewHolder {
-
- private ShowCallHistoryViewHolder(final Context context, View view) {
- super(view);
- view.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final Intent intent = new Intent(context, CallLogActivity.class);
- context.startActivity(intent);
- }
- });
- }
-
- public static ShowCallHistoryViewHolder create(Context context, ViewGroup parent) {
- LayoutInflater inflater = LayoutInflater.from(context);
- View view = inflater.inflate(R.layout.show_call_history_list_item, parent, false);
- return new ShowCallHistoryViewHolder(context, view);
- }
-}
diff --git a/src/com/android/dialer/calllog/VisualVoicemailCallLogFragment.java b/src/com/android/dialer/calllog/VisualVoicemailCallLogFragment.java
new file mode 100644
index 000000000..311ff7dc5
--- /dev/null
+++ b/src/com/android/dialer/calllog/VisualVoicemailCallLogFragment.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.calllog;
+
+import android.database.ContentObserver;
+import android.os.Bundle;
+import android.provider.CallLog;
+import android.provider.VoicemailContract;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.dialer.R;
+import com.android.dialer.list.ListsFragment;
+import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
+
+public class VisualVoicemailCallLogFragment extends CallLogFragment {
+
+ private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+ private final ContentObserver mVoicemailStatusObserver = new CustomContentObserver();
+
+ public VisualVoicemailCallLogFragment() {
+ super(CallLog.Calls.VOICEMAIL_TYPE);
+ }
+
+ @Override
+ public void onCreate(Bundle state) {
+ super.onCreate(state);
+ mVoicemailPlaybackPresenter = VoicemailPlaybackPresenter.getInstance(getActivity(), state);
+ getActivity().getContentResolver().registerContentObserver(
+ VoicemailContract.Status.CONTENT_URI, true, mVoicemailStatusObserver);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
+ View view = inflater.inflate(R.layout.call_log_fragment, container, false);
+ setupView(view, mVoicemailPlaybackPresenter);
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mVoicemailPlaybackPresenter.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ mVoicemailPlaybackPresenter.onPause();
+ super.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ mVoicemailPlaybackPresenter.onDestroy();
+ getActivity().getContentResolver().unregisterContentObserver(mVoicemailStatusObserver);
+ super.onDestroy();
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mVoicemailPlaybackPresenter.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public void fetchCalls() {
+ super.fetchCalls();
+ ((ListsFragment) getParentFragment()).updateTabUnreadCounts();
+ }
+}
diff --git a/src/com/android/dialer/calllog/VoicemailQueryHandler.java b/src/com/android/dialer/calllog/VoicemailQueryHandler.java
index 26f9bd172..c6e644c32 100644
--- a/src/com/android/dialer/calllog/VoicemailQueryHandler.java
+++ b/src/com/android/dialer/calllog/VoicemailQueryHandler.java
@@ -59,7 +59,8 @@ public class VoicemailQueryHandler extends AsyncQueryHandler {
if (token == UPDATE_MARK_VOICEMAILS_AS_OLD_TOKEN) {
if (mContext != null) {
Intent serviceIntent = new Intent(mContext, CallLogNotificationsService.class);
- serviceIntent.setAction(CallLogNotificationsService.ACTION_UPDATE_NOTIFICATIONS);
+ serviceIntent.setAction(
+ CallLogNotificationsService.ACTION_UPDATE_VOICEMAIL_NOTIFICATIONS);
mContext.startService(serviceIntent);
} else {
Log.w(TAG, "Unknown update completed: ignoring: " + token);
diff --git a/src/com/android/dialer/calllog/calllogcache/CallLogCache.java b/src/com/android/dialer/calllog/calllogcache/CallLogCache.java
new file mode 100644
index 000000000..dc1217cf5
--- /dev/null
+++ b/src/com/android/dialer/calllog/calllogcache/CallLogCache.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.calllog.calllogcache;
+
+import android.content.Context;
+import android.telecom.PhoneAccountHandle;
+
+import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.calllog.CallLogAdapter;
+
+/**
+ * This is the base class for the CallLogCaches.
+ *
+ * Keeps a cache of recently made queries to the Telecom/Telephony processes. The aim of this cache
+ * is to reduce the number of cross-process requests to TelecomManager, which can negatively affect
+ * performance.
+ *
+ * This is designed with the specific use case of the {@link CallLogAdapter} in mind.
+ */
+public abstract class CallLogCache {
+ // TODO: Dialer should be fixed so as not to check isVoicemail() so often but at the time of
+ // this writing, that was a much larger undertaking than creating this cache.
+
+ protected final Context mContext;
+
+ private boolean mHasCheckedForVideoEnabled;
+ private boolean mIsVideoEnabled;
+
+ public CallLogCache(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Return the most compatible version of the TelecomCallLogCache.
+ */
+ public static CallLogCache getCallLogCache(Context context) {
+ if (CompatUtils.isClassAvailable("android.telecom.PhoneAccountHandle")) {
+ return new CallLogCacheLollipopMr1(context);
+ }
+ return new CallLogCacheLollipop(context);
+ }
+
+ public void reset() {
+ mHasCheckedForVideoEnabled = false;
+ mIsVideoEnabled = false;
+ }
+
+ /**
+ * Returns true if the given number is the number of the configured voicemail. To be able to
+ * mock-out this, it is not a static method.
+ */
+ public abstract boolean isVoicemailNumber(PhoneAccountHandle accountHandle,
+ CharSequence number);
+
+ public boolean isVideoEnabled() {
+ if (!mHasCheckedForVideoEnabled) {
+ mIsVideoEnabled = CallUtil.isVideoEnabled(mContext);
+ mHasCheckedForVideoEnabled = true;
+ }
+ return mIsVideoEnabled;
+ }
+
+ /**
+ * Extract account label from PhoneAccount object.
+ */
+ public abstract String getAccountLabel(PhoneAccountHandle accountHandle);
+
+ /**
+ * Extract account color from PhoneAccount object.
+ */
+ public abstract int getAccountColor(PhoneAccountHandle accountHandle);
+
+ /**
+ * Determines if the PhoneAccount supports specifying a call subject (i.e. calling with a note)
+ * for outgoing calls.
+ *
+ * @param accountHandle The PhoneAccount handle.
+ * @return {@code true} if calling with a note is supported, {@code false} otherwise.
+ */
+ public abstract boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle);
+}
diff --git a/src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipop.java b/src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipop.java
new file mode 100644
index 000000000..770cc9d3e
--- /dev/null
+++ b/src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipop.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.calllog.calllogcache;
+
+import android.content.Context;
+import android.telecom.PhoneAccount;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+
+/**
+ * This is a compatibility class for the CallLogCache for versions of dialer before Lollipop Mr1
+ * (the introduction of phone accounts).
+ *
+ * This class should not be initialized directly and instead be acquired from
+ * {@link CallLogCache#getCallLogCache}.
+ */
+class CallLogCacheLollipop extends CallLogCache {
+ private String mVoicemailNumber;
+
+ /* package */ CallLogCacheLollipop(Context context) {
+ super(context);
+ }
+
+ @Override
+ public boolean isVoicemailNumber(PhoneAccountHandle accountHandle, CharSequence number) {
+ if (TextUtils.isEmpty(number)) {
+ return false;
+ }
+
+ String numberString = number.toString();
+
+ if (!TextUtils.isEmpty(mVoicemailNumber)) {
+ return PhoneNumberUtils.compare(numberString, mVoicemailNumber);
+ }
+
+ if (PhoneNumberUtils.isVoiceMailNumber(numberString)) {
+ mVoicemailNumber = numberString;
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public String getAccountLabel(PhoneAccountHandle accountHandle) {
+ return null;
+ }
+
+ @Override
+ public int getAccountColor(PhoneAccountHandle accountHandle) {
+ return PhoneAccount.NO_HIGHLIGHT_COLOR;
+ }
+
+ @Override
+ public boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) {
+ return false;
+ }
+}
diff --git a/src/com/android/dialer/calllog/TelecomCallLogCache.java b/src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipopMr1.java
index 7071669e5..d1e3f7bcf 100644
--- a/src/com/android/dialer/calllog/TelecomCallLogCache.java
+++ b/src/com/android/dialer/calllog/calllogcache/CallLogCacheLollipopMr1.java
@@ -14,67 +14,50 @@
* limitations under the License
*/
-package com.android.dialer.calllog;
+package com.android.dialer.calllog.calllogcache;
import android.content.Context;
-import android.provider.CallLog;
-import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
import android.text.TextUtils;
-import android.util.Log;
import android.util.Pair;
-import com.android.contacts.common.CallUtil;
-import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.dialer.calllog.PhoneAccountUtils;
import com.android.dialer.util.PhoneNumberUtil;
-import com.google.common.collect.Sets;
import java.util.HashMap;
import java.util.Map;
-import java.util.Set;
/**
- * Keeps a cache of recently made queries to the Telecom process. The aim of this cache is to
- * reduce the number of cross-process requests to TelecomManager, which can negatively affect
- * performance.
+ * This is the CallLogCache for versions of dialer Lollipop Mr1 and above with support for
+ * multi-SIM devices.
*
- * This is designed with the specific use case of the {@link CallLogAdapter} in mind.
+ * This class should not be initialized directly and instead be acquired from
+ * {@link CallLogCache#getCallLogCache}.
*/
-public class TelecomCallLogCache {
- private final Context mContext;
-
+class CallLogCacheLollipopMr1 extends CallLogCache {
// Maps from a phone-account/number pair to a boolean because multiple numbers could return true
// for the voicemail number if those numbers are not pre-normalized.
- // TODO: Dialer should be fixed so as not to check isVoicemail() so often but at the time of
- // this writing, that was a much larger undertaking than creating this cache.
private final Map<Pair<PhoneAccountHandle, CharSequence>, Boolean> mVoicemailQueryCache =
new HashMap<>();
private final Map<PhoneAccountHandle, String> mPhoneAccountLabelCache = new HashMap<>();
private final Map<PhoneAccountHandle, Integer> mPhoneAccountColorCache = new HashMap<>();
private final Map<PhoneAccountHandle, Boolean> mPhoneAccountCallWithNoteCache = new HashMap<>();
- private boolean mHasCheckedForVideoEnabled;
- private boolean mIsVideoEnabled;
-
- public TelecomCallLogCache(Context context) {
- mContext = context;
+ /* package */ CallLogCacheLollipopMr1(Context context) {
+ super(context);
}
+ @Override
public void reset() {
mVoicemailQueryCache.clear();
mPhoneAccountLabelCache.clear();
mPhoneAccountColorCache.clear();
mPhoneAccountCallWithNoteCache.clear();
- mHasCheckedForVideoEnabled = false;
- mIsVideoEnabled = false;
+ super.reset();
}
- /**
- * Returns true if the given number is the number of the configured voicemail. To be able to
- * mock-out this, it is not a static method.
- */
+ @Override
public boolean isVoicemailNumber(PhoneAccountHandle accountHandle, CharSequence number) {
if (TextUtils.isEmpty(number)) {
return false;
@@ -91,9 +74,7 @@ public class TelecomCallLogCache {
}
}
- /**
- * Extract account label from PhoneAccount object.
- */
+ @Override
public String getAccountLabel(PhoneAccountHandle accountHandle) {
if (mPhoneAccountLabelCache.containsKey(accountHandle)) {
return mPhoneAccountLabelCache.get(accountHandle);
@@ -104,9 +85,7 @@ public class TelecomCallLogCache {
}
}
- /**
- * Extract account color from PhoneAccount object.
- */
+ @Override
public int getAccountColor(PhoneAccountHandle accountHandle) {
if (mPhoneAccountColorCache.containsKey(accountHandle)) {
return mPhoneAccountColorCache.get(accountHandle);
@@ -117,20 +96,7 @@ public class TelecomCallLogCache {
}
}
- public boolean isVideoEnabled() {
- if (!mHasCheckedForVideoEnabled) {
- mIsVideoEnabled = CallUtil.isVideoEnabled(mContext);
- }
- return mIsVideoEnabled;
- }
-
- /**
- * Determines if the PhoneAccount supports specifying a call subject (i.e. calling with a note)
- * for outgoing calls.
- *
- * @param accountHandle The PhoneAccount handle.
- * @return {@code true} if calling with a note is supported, {@code false} otherwise.
- */
+ @Override
public boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) {
if (mPhoneAccountCallWithNoteCache.containsKey(accountHandle)) {
return mPhoneAccountCallWithNoteCache.get(accountHandle);
diff --git a/src/com/android/dialer/compat/DialerCompatUtils.java b/src/com/android/dialer/compat/DialerCompatUtils.java
new file mode 100644
index 000000000..a9c9c5319
--- /dev/null
+++ b/src/com/android/dialer/compat/DialerCompatUtils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.compat;
+
+import com.android.contacts.common.compat.CompatUtils;
+
+public final class DialerCompatUtils {
+ /**
+ * Determines if this version has access to the
+ * {@link android.provider.CallLog.Calls.CACHED_PHOTO_URI} column
+ *
+ * @return {@code true} if {@link android.provider.CallLog.Calls.CACHED_PHOTO_URI} is available,
+ * {@code false} otherwise
+ */
+ public static boolean isCallsCachedPhotoUriCompatible() {
+ return CompatUtils.isMarshmallowCompatible();
+ }
+} \ No newline at end of file
diff --git a/src/com/android/dialer/compat/FilteredNumberCompat.java b/src/com/android/dialer/compat/FilteredNumberCompat.java
new file mode 100644
index 000000000..008782d86
--- /dev/null
+++ b/src/com/android/dialer/compat/FilteredNumberCompat.java
@@ -0,0 +1,372 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.compat;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+
+import android.app.FragmentManager;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.UserManager;
+import android.preference.PreferenceManager;
+import android.support.annotation.Nullable;
+import android.telecom.TelecomManager;
+import android.telephony.PhoneNumberUtils;
+import android.util.Log;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.TelecomManagerUtil;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.DialerApplication;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment.Callback;
+import com.android.dialer.filterednumber.BlockedNumbersMigrator;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
+import com.android.dialer.filterednumber.MigrateBlockedNumbersDialogFragment;
+import com.android.dialerbind.ObjectFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Compatibility class to encapsulate logic to switch between call blocking using
+ * {@link com.android.dialer.database.FilteredNumberContract} and using
+ * {@link android.provider.BlockedNumberContract}. This class should be used rather than explicitly
+ * referencing columns from either contract class in situations where both blocking solutions may be
+ * used.
+ */
+public class FilteredNumberCompat {
+
+ private static final String TAG = "FilteredNumberCompat";
+
+ protected static final String HAS_MIGRATED_TO_NEW_BLOCKING_KEY = "migratedToNewBlocking";
+
+ private static Boolean isEnabledForTest;
+
+ private static Context contextForTest;
+
+ /**
+ * @return The column name for ID in the filtered number database.
+ */
+ public static String getIdColumnName() {
+ return useNewFiltering() ? BlockedNumbersSdkCompat._ID : FilteredNumberColumns._ID;
+ }
+
+ /**
+ * @return The column name for type in the filtered number database. Will be {@code null} for
+ * the framework blocking implementation.
+ */
+ @Nullable
+ public static String getTypeColumnName() {
+ return useNewFiltering() ? null : FilteredNumberColumns.TYPE;
+ }
+
+ /**
+ * @return The column name for source in the filtered number database. Will be {@code null} for
+ * the framework blocking implementation
+ */
+ @Nullable
+ public static String getSourceColumnName() {
+ return useNewFiltering() ? null : FilteredNumberColumns.SOURCE;
+ }
+
+ /**
+ * @return The column name for the original number in the filtered number database.
+ */
+ public static String getOriginalNumberColumnName() {
+ return useNewFiltering() ? BlockedNumbersSdkCompat.COLUMN_ORIGINAL_NUMBER
+ : FilteredNumberColumns.NUMBER;
+ }
+
+ /**
+ * @return The column name for country iso in the filtered number database. Will be {@code null}
+ * the framework blocking implementation
+ */
+ @Nullable
+ public static String getCountryIsoColumnName() {
+ return useNewFiltering() ? null : FilteredNumberColumns.COUNTRY_ISO;
+ }
+
+ /**
+ * @return The column name for the e164 formatted number in the filtered number database.
+ */
+ public static String getE164NumberColumnName() {
+ return useNewFiltering() ? BlockedNumbersSdkCompat.E164_NUMBER
+ : FilteredNumberColumns.NORMALIZED_NUMBER;
+ }
+
+ /**
+ * @return {@code true} if the current SDK version supports using new filtering, {@code false}
+ * otherwise.
+ */
+ public static boolean canUseNewFiltering() {
+ if (isEnabledForTest != null) {
+ return CompatUtils.isNCompatible() && isEnabledForTest;
+ }
+ return CompatUtils.isNCompatible() && ObjectFactory
+ .isNewBlockingEnabled(DialerApplication.getContext());
+ }
+
+ /**
+ * @return {@code true} if the new filtering should be used, i.e. it's enabled and any necessary
+ * migration has been performed, {@code false} otherwise.
+ */
+ public static boolean useNewFiltering() {
+ return canUseNewFiltering() && hasMigratedToNewBlocking();
+ }
+
+ /**
+ * @return {@code true} if the user has migrated to use
+ * {@link android.provider.BlockedNumberContract} blocking, {@code false} otherwise.
+ */
+ public static boolean hasMigratedToNewBlocking() {
+ return PreferenceManager.getDefaultSharedPreferences(DialerApplication.getContext())
+ .getBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false);
+ }
+
+ /**
+ * Called to inform this class whether the user has fully migrated to use
+ * {@link android.provider.BlockedNumberContract} blocking or not.
+ *
+ * @param hasMigrated {@code true} if the user has migrated, {@code false} otherwise.
+ */
+ @NeededForTesting
+ public static void setHasMigratedToNewBlocking(boolean hasMigrated) {
+ PreferenceManager.getDefaultSharedPreferences(
+ MoreObjects.firstNonNull(contextForTest, DialerApplication.getContext())).edit()
+ .putBoolean(HAS_MIGRATED_TO_NEW_BLOCKING_KEY, hasMigrated).apply();
+ }
+
+ @NeededForTesting
+ public static void setIsEnabledForTest(Boolean isEnabled) {
+ isEnabledForTest = isEnabled;
+ }
+
+ @NeededForTesting
+ public static void setContextForTest(Context context) {
+ contextForTest = context;
+ }
+
+ /**
+ * Gets the content {@link Uri} for number filtering.
+ *
+ * @param id The optional id to append with the base content uri.
+ * @return The Uri for number filtering.
+ */
+ public static Uri getContentUri(@Nullable Integer id) {
+ if (id == null) {
+ return getBaseUri();
+ }
+ return ContentUris.withAppendedId(getBaseUri(), id);
+ }
+
+
+ private static Uri getBaseUri() {
+ return useNewFiltering() ? BlockedNumbersSdkCompat.CONTENT_URI : FilteredNumber.CONTENT_URI;
+ }
+
+ /**
+ * Removes any null column names from the given projection array. This method is intended to be
+ * used to strip out any column names that aren't available in every version of number blocking.
+ * Example:
+ * {@literal
+ * getContext().getContentResolver().query(
+ * someUri,
+ * // Filtering ensures that no non-existant columns are queried
+ * FilteredNumberCompat.filter(new String[] {FilteredNumberCompat.getIdColumnName(),
+ * FilteredNumberCompat.getTypeColumnName()},
+ * FilteredNumberCompat.getE164NumberColumnName() + " = ?",
+ * new String[] {e164Number});
+ * }
+ *
+ * @param projection The projection array.
+ * @return The filtered projection array.
+ */
+ @Nullable
+ public static String[] filter(@Nullable String[] projection) {
+ if (projection == null) {
+ return null;
+ }
+ List<String> filtered = new ArrayList<>();
+ for (String column : projection) {
+ if (column != null) {
+ filtered.add(column);
+ }
+ }
+ return filtered.toArray(new String[filtered.size()]);
+ }
+
+ /**
+ * Creates a new {@link ContentValues} suitable for inserting in the filtered number table.
+ *
+ * @param number The unformatted number to insert.
+ * @param e164Number (optional) The number to insert formatted to E164 standard.
+ * @param countryIso (optional) The country iso to use to format the number.
+ * @return The ContentValues to insert.
+ * @throws NullPointerException If number is null.
+ */
+ public static ContentValues newBlockNumberContentValues(String number,
+ @Nullable String e164Number, @Nullable String countryIso) {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(getOriginalNumberColumnName(), Preconditions.checkNotNull(number));
+ if (!useNewFiltering()) {
+ if (e164Number == null) {
+ e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ }
+ contentValues.put(getE164NumberColumnName(), e164Number);
+ contentValues.put(getCountryIsoColumnName(), countryIso);
+ contentValues.put(getTypeColumnName(), FilteredNumberTypes.BLOCKED_NUMBER);
+ contentValues.put(getSourceColumnName(), FilteredNumberSources.USER);
+ }
+ return contentValues;
+ }
+
+ /**
+ * Shows the flow of {@link android.app.DialogFragment}s for blocking or unblocking numbers.
+ *
+ * @param blockId The id into the blocked numbers database.
+ * @param number The number to block or unblock.
+ * @param countryIso The countryIso used to format the given number.
+ * @param displayNumber The form of the number to block, suitable for displaying.
+ * @param parentViewId The id for the containing view of the Dialog.
+ * @param fragmentManager The {@link FragmentManager} used to show fragments.
+ * @param callback (optional) The {@link Callback} to call when the block or unblock operation
+ * is complete.
+ */
+ public static void showBlockNumberDialogFlow(final ContentResolver contentResolver,
+ final Integer blockId, final String number, final String countryIso,
+ final String displayNumber, final Integer parentViewId,
+ final FragmentManager fragmentManager, @Nullable final Callback callback) {
+ Log.i(TAG, "showBlockNumberDialogFlow - start");
+ // If the user is blocking a number and isn't using the framework solution when they
+ // should be, show the migration dialog
+ if (shouldShowMigrationDialog(blockId == null)) {
+ Log.i(TAG, "showBlockNumberDialogFlow - showing migration dialog");
+ MigrateBlockedNumbersDialogFragment
+ .newInstance(new BlockedNumbersMigrator(contentResolver), newMigrationListener(
+ DialerApplication.getContext().getContentResolver(), number, countryIso,
+ displayNumber, parentViewId, fragmentManager, callback))
+ .show(fragmentManager, "MigrateBlockedNumbers");
+ return;
+ }
+ Log.i(TAG, "showBlockNumberDialogFlow - showing block number dialog");
+ BlockNumberDialogFragment
+ .show(blockId, number, countryIso, displayNumber, parentViewId, fragmentManager,
+ callback);
+ }
+
+ private static boolean shouldShowMigrationDialog(boolean isBlocking) {
+ return isBlocking && canUseNewFiltering() && !hasMigratedToNewBlocking();
+ }
+
+ private static BlockedNumbersMigrator.Listener newMigrationListener(
+ final ContentResolver contentResolver, final String number, final String countryIso,
+ final String displayNumber, final Integer parentViewId,
+ final FragmentManager fragmentManager, @Nullable final Callback callback) {
+ return new BlockedNumbersMigrator.Listener() {
+ @Override
+ public void onComplete() {
+ Log.i(TAG, "showBlockNumberDialogFlow - listener showing block number dialog");
+ if (!hasMigratedToNewBlocking()) {
+ Log.i(TAG, "showBlockNumberDialogFlow - migration failed");
+ return;
+ }
+ /*
+ * Edge case to cover here: if the user initiated the migration workflow with a
+ * number that's already blocked in the framework, don't show the block number
+ * dialog. Doing so would allow them to block the same number twice, causing a
+ * crash.
+ */
+ new FilteredNumberAsyncQueryHandler(contentResolver).isBlockedNumber(
+ new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(Integer id) {
+ if (id != null) {
+ Log.i(TAG,
+ "showBlockNumberDialogFlow - number already blocked");
+ return;
+ }
+ Log.i(TAG, "showBlockNumberDialogFlow - need to block number");
+ BlockNumberDialogFragment
+ .show(null, number, countryIso, displayNumber, parentViewId,
+ fragmentManager, callback);
+ }
+ }, number, countryIso);
+ }
+ };
+ }
+
+ /**
+ * Creates the {@link Intent} which opens the blocked numbers management interface.
+ *
+ * @param context The {@link Context}.
+ * @return The intent.
+ */
+ public static Intent createManageBlockedNumbersIntent(Context context) {
+ if (canUseNewFiltering() && hasMigratedToNewBlocking()) {
+ return TelecomManagerUtil.createManageBlockedNumbersIntent(
+ (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE));
+ }
+ return new Intent(context, BlockedNumbersSettingsActivity.class);
+ }
+
+ /**
+ * Method used to determine if block operations are possible.
+ *
+ * @param context The {@link Context}.
+ * @return {@code true} if the app and user can block numbers, {@code false} otherwise.
+ */
+ public static boolean canAttemptBlockOperations(Context context) {
+ if (!CompatUtils.isNCompatible()) {
+ // Dialer blocking, must be primary user
+ return UserManagerCompat.isSystemUser(
+ (UserManager) context.getSystemService(Context.USER_SERVICE));
+ }
+
+ // Great Wall blocking, must be primary user and the default or system dialer
+ // TODO(maxwelb): check that we're the default or system Dialer
+ return BlockedNumbersSdkCompat.canCurrentUserBlockNumbers(context);
+ }
+
+ /**
+ * Used to determine if the call blocking settings can be opened.
+ *
+ * @param context The {@link Context}.
+ * @return {@code true} if the current user can open the call blocking settings, {@code false}
+ * otherwise.
+ */
+ public static boolean canCurrentUserOpenBlockSettings(Context context) {
+ if (!CompatUtils.isNCompatible()) {
+ // Dialer blocking, must be primary user
+ return UserManagerCompat.isSystemUser(
+ (UserManager) context.getSystemService(Context.USER_SERVICE));
+ }
+ // BlockedNumberContract blocking, verify through Contract API
+ return BlockedNumbersSdkCompat.canCurrentUserBlockNumbers(context);
+ }
+}
diff --git a/src/com/android/dialer/compat/SettingsCompat.java b/src/com/android/dialer/compat/SettingsCompat.java
new file mode 100644
index 000000000..474a600a4
--- /dev/null
+++ b/src/com/android/dialer/compat/SettingsCompat.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.compat;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
+import android.provider.Settings;
+
+import com.android.contacts.common.compat.SdkVersionOverride;
+
+/**
+ * Compatibility class for {@link android.provider.Settings}
+ */
+public class SettingsCompat {
+
+ public static class System {
+
+ /**
+ * Compatibility version of {@link android.provider.Settings.System#canWrite(Context)}
+ *
+ * Note: Since checking preferences at runtime started in M, this method always returns
+ * {@code true} for SDK versions prior to 23. In those versions, the app wouldn't be
+ * installed if it didn't have the proper permission
+ */
+ public static boolean canWrite(Context context) {
+ if (SdkVersionOverride.getSdkVersion(VERSION_CODES.LOLLIPOP) >= Build.VERSION_CODES.M) {
+ return Settings.System.canWrite(context);
+ }
+ return true;
+ }
+ }
+
+}
diff --git a/src/com/android/dialer/compat/UserManagerCompat.java b/src/com/android/dialer/compat/UserManagerCompat.java
new file mode 100644
index 000000000..576703364
--- /dev/null
+++ b/src/com/android/dialer/compat/UserManagerCompat.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.compat;
+
+import android.content.Context;
+import android.os.Process;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.contacts.common.compat.CompatUtils;
+
+/**
+ * Compatibility class for {@link UserManager}.
+ */
+public class UserManagerCompat {
+ /**
+ * A user id constant to indicate the "system" user of the device. Copied from
+ * {@link UserHandle}.
+ */
+ private static final int USER_SYSTEM = 0;
+ /**
+ * Range of uids allocated for a user.
+ */
+ private static final int PER_USER_RANGE = 100000;
+
+ /**
+ * Used to check if this process is running under the system user. The system user is the
+ * initial user that is implicitly created on first boot and hosts most of the system services.
+ *
+ * @return whether this process is running under the system user.
+ */
+ public static boolean isSystemUser(UserManager userManager) {
+ if (CompatUtils.isMarshmallowCompatible()) {
+ return userManager.isSystemUser();
+ }
+ // Adapted from {@link UserManager} and {@link UserHandle}.
+ return (Process.myUid() / PER_USER_RANGE) == USER_SYSTEM;
+ }
+
+ /**
+ * Return whether the calling user is running in an "unlocked" state. A user
+ * is unlocked only after they've entered their credentials (such as a lock
+ * pattern or PIN), and credential-encrypted private app data storage is
+ * available.
+ *
+ * TODO b/26688153
+ *
+ * @param context the current context
+ * @return {@code true} if the user is unlocked, {@code false} otherwise
+ * @throws NullPointerException if context is null
+ */
+ public static boolean isUserUnlocked(Context context) {
+ if (CompatUtils.isNCompatible()) {
+ return UserManagerSdkCompat.isUserUnlocked(context);
+ }
+ return true;
+ }
+}
diff --git a/src/com/android/dialer/contactinfo/ContactInfoCache.java b/src/com/android/dialer/contactinfo/ContactInfoCache.java
index 568f48886..1e2457957 100644
--- a/src/com/android/dialer/contactinfo/ContactInfoCache.java
+++ b/src/com/android/dialer/contactinfo/ContactInfoCache.java
@@ -162,7 +162,7 @@ public class ContactInfoCache {
// The contact info is no longer up to date, we should request it. However, we
// do not need to request them immediately.
enqueueRequest(number, countryIso, cachedContactInfo, false);
- } else if (!callLogInfoMatches(cachedContactInfo, info)) {
+ } else if (!callLogInfoMatches(cachedContactInfo, info)) {
// The call log information does not match the one we have, look it up again.
// We could simply update the call log directly, but that needs to be done in a
// background thread, so it is easier to simply request a new lookup, which will, as
@@ -309,8 +309,7 @@ public class ContactInfoCache {
* Checks whether the contact info from the call log matches the one from the contacts db.
*/
private boolean callLogInfoMatches(ContactInfo callLogInfo, ContactInfo info) {
- // The call log only contains a subset of the fields in the contacts db.
- // Only check those.
+ // The call log only contains a subset of the fields in the contacts db. Only check those.
return TextUtils.equals(callLogInfo.name, info.name)
&& callLogInfo.type == info.type
&& TextUtils.equals(callLogInfo.label, info.label);
diff --git a/src/com/android/dialer/contactinfo/ContactPhotoLoader.java b/src/com/android/dialer/contactinfo/ContactPhotoLoader.java
new file mode 100644
index 000000000..f36c438f6
--- /dev/null
+++ b/src/com/android/dialer/contactinfo/ContactPhotoLoader.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.contactinfo;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.provider.MediaStore;
+import android.support.annotation.Nullable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
+import android.util.Log;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.lettertiles.LetterTileDrawable;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.util.Assert;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import java.io.IOException;
+/**
+ * Class to create the appropriate contact icon from a ContactInfo.
+ * This class is for synchronous, blocking calls to generate bitmaps, while
+ * ContactCommons.ContactPhotoManager is to cache, manage and update a ImageView asynchronously.
+ */
+public class ContactPhotoLoader {
+
+ private static final String TAG = "ContactPhotoLoader";
+
+ private final Context mContext;
+ private final ContactInfo mContactInfo;
+
+ public ContactPhotoLoader(Context context, ContactInfo contactInfo) {
+ mContext = Preconditions.checkNotNull(context);
+ mContactInfo = Preconditions.checkNotNull(contactInfo);
+ }
+
+ /**
+ * Create a contact photo icon bitmap appropriate for the ContactInfo.
+ */
+ public Bitmap loadPhotoIcon() {
+ Assert.assertNotUiThread("ContactPhotoLoader#loadPhotoIcon called on UI thread");
+ int photoSize = mContext.getResources().getDimensionPixelSize(R.dimen.contact_photo_size);
+ return drawableToBitmap(getIcon(), photoSize, photoSize);
+ }
+
+ @VisibleForTesting
+ Drawable getIcon() {
+ Drawable drawable = createPhotoIconDrawable();
+ if (drawable == null) {
+ drawable = createLetterTileDrawable();
+ }
+ return drawable;
+ }
+
+ /**
+ * @return a {@link Drawable} of circular photo icon if the photo can be loaded, {@code null}
+ * otherwise.
+ */
+ @Nullable
+ private Drawable createPhotoIconDrawable() {
+ if (mContactInfo.photoUri == null) {
+ return null;
+ }
+ try {
+ Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(),
+ mContactInfo.photoUri);
+ final RoundedBitmapDrawable drawable =
+ RoundedBitmapDrawableFactory.create(mContext.getResources(), bitmap);
+ drawable.setAntiAlias(true);
+ drawable.setCornerRadius(bitmap.getHeight() / 2);
+ return drawable;
+ } catch (IOException e) {
+ Log.e(TAG, e.toString());
+ return null;
+ }
+ }
+
+ /**
+ * @return a {@link LetterTileDrawable} based on the ContactInfo.
+ */
+ private Drawable createLetterTileDrawable() {
+ LetterTileDrawable drawable = new LetterTileDrawable(mContext.getResources());
+ drawable.setIsCircular(true);
+ ContactInfoHelper helper =
+ new ContactInfoHelper(mContext, GeoUtil.getCurrentCountryIso(mContext));
+ if (helper.isBusiness(mContactInfo.sourceType)) {
+ drawable.setContactType(LetterTileDrawable.TYPE_BUSINESS);
+ }
+ drawable.setLetterAndColorFromContactDetails(mContactInfo.name, mContactInfo.lookupKey);
+ return drawable;
+ }
+
+ private static Bitmap drawableToBitmap(Drawable drawable, int width, int height) {
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ drawable.draw(canvas);
+ return bitmap;
+ }
+
+}
diff --git a/src/com/android/dialer/database/DialerDatabaseHelper.java b/src/com/android/dialer/database/DialerDatabaseHelper.java
index eec24f5bc..5edfb270d 100644
--- a/src/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/src/com/android/dialer/database/DialerDatabaseHelper.java
@@ -38,6 +38,8 @@ import android.util.Log;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.util.StopWatch;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.database.VoicemailArchiveContract.VoicemailArchive;
import com.android.dialer.R;
import com.android.dialer.dialpad.SmartDialNameMatcher;
import com.android.dialer.dialpad.SmartDialPrefix;
@@ -60,6 +62,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
public class DialerDatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "DialerDatabaseHelper";
private static final boolean DEBUG = false;
+ private boolean mIsTestInstance = false;
private static DialerDatabaseHelper sSingleton = null;
@@ -73,7 +76,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
* 0-98 KitKat
* </pre>
*/
- public static final int DATABASE_VERSION = 4;
+ public static final int DATABASE_VERSION = 9;
public static final String DATABASE_NAME = "dialer.db";
/**
@@ -86,10 +89,14 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
private static final int MAX_ENTRIES = 20;
public interface Tables {
+ /** Saves a list of numbers to be blocked.*/
+ static final String FILTERED_NUMBER_TABLE = "filtered_numbers_table";
/** Saves the necessary smart dial information of all contacts. */
static final String SMARTDIAL_TABLE = "smartdial_table";
/** Saves all possible prefixes to refer to a contacts.*/
static final String PREFIX_TABLE = "prefix_table";
+ /** Saves all archived voicemail information. */
+ static final String VOICEMAIL_ARCHIVE_TABLE = "voicemail_archive_table";
/** Database properties for internal use */
static final String PROPERTIES = "properties";
}
@@ -111,6 +118,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
static final String IS_SUPER_PRIMARY = "is_super_primary";
static final String IN_VISIBLE_GROUP = "in_visible_group";
static final String IS_PRIMARY = "is_primary";
+ static final String CARRIER_PRESENCE = "carrier_presence";
static final String LAST_SMARTDIAL_UPDATE_TIME = "last_smartdial_update_time";
}
@@ -147,6 +155,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
Data.IS_SUPER_PRIMARY, // 11
Contacts.IN_VISIBLE_GROUP, // 12
Data.IS_PRIMARY, // 13
+ Data.CARRIER_PRESENCE, // 14
};
static final int PHONE_ID = 0;
@@ -163,6 +172,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
static final int PHONE_IS_SUPER_PRIMARY = 11;
static final int PHONE_IN_VISIBLE_GROUP = 12;
static final int PHONE_IS_PRIMARY = 13;
+ static final int PHONE_CARRIER_PRESENCE = 14;
/** Selects only rows that have been updated after a certain time stamp.*/
static final String SELECT_UPDATED_CLAUSE =
@@ -180,6 +190,23 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
SELECT_IGNORE_LOOKUP_KEY_TOO_LONG_CLAUSE;
}
+ /**
+ * Query for all contacts that have been updated since the last time the smart dial database
+ * was updated.
+ */
+ public static interface UpdatedContactQuery {
+ static final Uri URI = ContactsContract.Contacts.CONTENT_URI;
+
+ static final String[] PROJECTION = new String[] {
+ ContactsContract.Contacts._ID // 0
+ };
+
+ static final int UPDATED_CONTACT_ID = 0;
+
+ static final String SELECT_UPDATED_CLAUSE =
+ ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP + " > ?";
+ }
+
/** Query options for querying the deleted contact database.*/
public static interface DeleteContactQuery {
static final Uri URI = ContactsContract.DeletedContacts.CONTENT_URI;
@@ -247,20 +274,23 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
public final String phoneNumber;
public final String lookupKey;
public final long photoId;
+ public final int carrierPresence;
public ContactNumber(long id, long dataID, String displayName, String phoneNumber,
- String lookupKey, long photoId) {
+ String lookupKey, long photoId, int carrierPresence) {
this.dataId = dataID;
this.id = id;
this.displayName = displayName;
this.phoneNumber = phoneNumber;
this.lookupKey = lookupKey;
this.photoId = photoId;
+ this.carrierPresence = carrierPresence;
}
@Override
public int hashCode() {
- return Objects.hashCode(id, dataId, displayName, phoneNumber, lookupKey, photoId);
+ return Objects.hashCode(id, dataId, displayName, phoneNumber, lookupKey, photoId,
+ carrierPresence);
}
@Override
@@ -275,7 +305,8 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
&& Objects.equal(this.displayName, that.displayName)
&& Objects.equal(this.phoneNumber, that.phoneNumber)
&& Objects.equal(this.lookupKey, that.lookupKey)
- && Objects.equal(this.photoId, that.photoId);
+ && Objects.equal(this.photoId, that.photoId)
+ && Objects.equal(this.carrierPresence, that.carrierPresence);
}
return false;
}
@@ -334,7 +365,12 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
*/
@VisibleForTesting
static DialerDatabaseHelper getNewInstanceForTest(Context context) {
- return new DialerDatabaseHelper(context, null);
+ return new DialerDatabaseHelper(context, null, true);
+ }
+
+ protected DialerDatabaseHelper(Context context, String databaseName, boolean isTestInstance) {
+ this(context, databaseName, DATABASE_VERSION);
+ mIsTestInstance = isTestInstance;
}
protected DialerDatabaseHelper(Context context, String databaseName) {
@@ -358,42 +394,63 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
private void setupTables(SQLiteDatabase db) {
dropTables(db);
- db.execSQL("CREATE TABLE " + Tables.SMARTDIAL_TABLE + " (" +
- SmartDialDbColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- SmartDialDbColumns.DATA_ID + " INTEGER, " +
- SmartDialDbColumns.NUMBER + " TEXT," +
- SmartDialDbColumns.CONTACT_ID + " INTEGER," +
- SmartDialDbColumns.LOOKUP_KEY + " TEXT," +
- SmartDialDbColumns.DISPLAY_NAME_PRIMARY + " TEXT, " +
- SmartDialDbColumns.PHOTO_ID + " INTEGER, " +
- SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME + " LONG, " +
- SmartDialDbColumns.LAST_TIME_USED + " LONG, " +
- SmartDialDbColumns.TIMES_USED + " INTEGER, " +
- SmartDialDbColumns.STARRED + " INTEGER, " +
- SmartDialDbColumns.IS_SUPER_PRIMARY + " INTEGER, " +
- SmartDialDbColumns.IN_VISIBLE_GROUP + " INTEGER, " +
- SmartDialDbColumns.IS_PRIMARY + " INTEGER" +
- ");");
-
- db.execSQL("CREATE TABLE " + Tables.PREFIX_TABLE + " (" +
- PrefixColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
- PrefixColumns.PREFIX + " TEXT COLLATE NOCASE, " +
- PrefixColumns.CONTACT_ID + " INTEGER" +
- ");");
-
- db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " (" +
- PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, " +
- PropertiesColumns.PROPERTY_VALUE + " TEXT " +
- ");");
-
+ db.execSQL("CREATE TABLE " + Tables.SMARTDIAL_TABLE + " ("
+ + SmartDialDbColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ + SmartDialDbColumns.DATA_ID + " INTEGER, "
+ + SmartDialDbColumns.NUMBER + " TEXT,"
+ + SmartDialDbColumns.CONTACT_ID + " INTEGER,"
+ + SmartDialDbColumns.LOOKUP_KEY + " TEXT,"
+ + SmartDialDbColumns.DISPLAY_NAME_PRIMARY + " TEXT, "
+ + SmartDialDbColumns.PHOTO_ID + " INTEGER, "
+ + SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME + " LONG, "
+ + SmartDialDbColumns.LAST_TIME_USED + " LONG, "
+ + SmartDialDbColumns.TIMES_USED + " INTEGER, "
+ + SmartDialDbColumns.STARRED + " INTEGER, "
+ + SmartDialDbColumns.IS_SUPER_PRIMARY + " INTEGER, "
+ + SmartDialDbColumns.IN_VISIBLE_GROUP + " INTEGER, "
+ + SmartDialDbColumns.IS_PRIMARY + " INTEGER, "
+ + SmartDialDbColumns.CARRIER_PRESENCE + " INTEGER NOT NULL DEFAULT 0"
+ + ");");
+
+ db.execSQL("CREATE TABLE " + Tables.PREFIX_TABLE + " ("
+ + PrefixColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ + PrefixColumns.PREFIX + " TEXT COLLATE NOCASE, "
+ + PrefixColumns.CONTACT_ID + " INTEGER"
+ + ");");
+
+ db.execSQL("CREATE TABLE " + Tables.PROPERTIES + " ("
+ + PropertiesColumns.PROPERTY_KEY + " TEXT PRIMARY KEY, "
+ + PropertiesColumns.PROPERTY_VALUE + " TEXT "
+ + ");");
+
+ // This will need to also be updated in setupTablesForFilteredNumberTest and onUpgrade.
+ // Hardcoded so we know on glance what columns are updated in setupTables,
+ // and to be able to guarantee the state of the DB at each upgrade step.
+ db.execSQL("CREATE TABLE " + Tables.FILTERED_NUMBER_TABLE + " ("
+ + FilteredNumberColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ + FilteredNumberColumns.NORMALIZED_NUMBER + " TEXT UNIQUE,"
+ + FilteredNumberColumns.NUMBER + " TEXT,"
+ + FilteredNumberColumns.COUNTRY_ISO + " TEXT,"
+ + FilteredNumberColumns.TIMES_FILTERED + " INTEGER,"
+ + FilteredNumberColumns.LAST_TIME_FILTERED + " LONG,"
+ + FilteredNumberColumns.CREATION_TIME + " LONG,"
+ + FilteredNumberColumns.TYPE + " INTEGER,"
+ + FilteredNumberColumns.SOURCE + " INTEGER"
+ + ");");
+
+ createVoicemailArchiveTable(db);
setProperty(db, DATABASE_VERSION_PROPERTY, String.valueOf(DATABASE_VERSION));
- resetSmartDialLastUpdatedTime();
+ if (!mIsTestInstance) {
+ resetSmartDialLastUpdatedTime();
+ }
}
public void dropTables(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + Tables.PREFIX_TABLE);
db.execSQL("DROP TABLE IF EXISTS " + Tables.SMARTDIAL_TABLE);
db.execSQL("DROP TABLE IF EXISTS " + Tables.PROPERTIES);
+ db.execSQL("DROP TABLE IF EXISTS " + Tables.FILTERED_NUMBER_TABLE);
+ db.execSQL("DROP TABLE IF EXISTS " + Tables.VOICEMAIL_ARCHIVE_TABLE);
}
@Override
@@ -414,6 +471,33 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
return;
}
+ if (oldVersion < 7) {
+ db.execSQL("DROP TABLE IF EXISTS " + Tables.FILTERED_NUMBER_TABLE);
+ db.execSQL("CREATE TABLE " + Tables.FILTERED_NUMBER_TABLE + " ("
+ + FilteredNumberColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ + FilteredNumberColumns.NORMALIZED_NUMBER + " TEXT UNIQUE,"
+ + FilteredNumberColumns.NUMBER + " TEXT,"
+ + FilteredNumberColumns.COUNTRY_ISO + " TEXT,"
+ + FilteredNumberColumns.TIMES_FILTERED + " INTEGER,"
+ + FilteredNumberColumns.LAST_TIME_FILTERED + " LONG,"
+ + FilteredNumberColumns.CREATION_TIME + " LONG,"
+ + FilteredNumberColumns.TYPE + " INTEGER,"
+ + FilteredNumberColumns.SOURCE + " INTEGER"
+ + ");");
+ oldVersion = 7;
+ }
+
+ if (oldVersion < 8) {
+ upgradeToVersion8(db);
+ oldVersion = 8;
+ }
+
+ if (oldVersion < 9) {
+ db.execSQL("DROP TABLE IF EXISTS " + Tables.VOICEMAIL_ARCHIVE_TABLE);
+ createVoicemailArchiveTable(db);
+ oldVersion = 9;
+ }
+
if (oldVersion != DATABASE_VERSION) {
throw new IllegalStateException(
"error upgrading the database to version " + DATABASE_VERSION);
@@ -422,6 +506,10 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
setProperty(db, DATABASE_VERSION_PROPERTY, String.valueOf(DATABASE_VERSION));
}
+ public void upgradeToVersion8(SQLiteDatabase db) {
+ db.execSQL("ALTER TABLE smartdial_table ADD carrier_presence INTEGER NOT NULL DEFAULT 0");
+ }
+
/**
* Stores a key-value pair in the {@link Tables#PROPERTIES} table.
*/
@@ -521,15 +609,11 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
* Removes rows in the smartdial database that matches the contacts that have been deleted
* by other apps since last update.
*
- * @param db Database pointer to the dialer database.
- * @param last_update_time Time stamp of last update on the smartdial database
+ * @param db Database to operate on.
+ * @param deletedContactCursor Cursor containing rows of deleted contacts
*/
- private void removeDeletedContacts(SQLiteDatabase db, String last_update_time) {
- final Cursor deletedContactCursor = mContext.getContentResolver().query(
- DeleteContactQuery.URI,
- DeleteContactQuery.PROJECTION,
- DeleteContactQuery.SELECT_UPDATED_CLAUSE,
- new String[] {last_update_time}, null);
+ @VisibleForTesting
+ void removeDeletedContacts(SQLiteDatabase db, Cursor deletedContactCursor) {
if (deletedContactCursor == null) {
return;
}
@@ -552,6 +636,15 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
}
}
+ private Cursor getDeletedContactCursor(String lastUpdateMillis) {
+ return mContext.getContentResolver().query(
+ DeleteContactQuery.URI,
+ DeleteContactQuery.PROJECTION,
+ DeleteContactQuery.SELECT_UPDATED_CLAUSE,
+ new String[] {lastUpdateMillis},
+ null);
+ }
+
/**
* Removes potentially corrupted entries in the database. These contacts may be added before
* the previous instance of the dialer was destroyed for some reason. For data integrity, we
@@ -572,6 +665,41 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
}
/**
+ * All columns excluding MIME_TYPE, _DATA, ARCHIVED, SERVER_ID, are the same as
+ * the columns in the {@link android.provider.CallLog.Calls} table.
+ *
+ * @param db Database pointer to the dialer database.
+ */
+ private void createVoicemailArchiveTable(SQLiteDatabase db) {
+ db.execSQL("CREATE TABLE " + Tables.VOICEMAIL_ARCHIVE_TABLE + " ("
+ + VoicemailArchive._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ + VoicemailArchive.NUMBER + " TEXT,"
+ + VoicemailArchive.DATE + " LONG,"
+ + VoicemailArchive.DURATION + " LONG,"
+ + VoicemailArchive.MIME_TYPE + " TEXT,"
+ + VoicemailArchive.COUNTRY_ISO + " TEXT,"
+ + VoicemailArchive._DATA + " TEXT,"
+ + VoicemailArchive.GEOCODED_LOCATION + " TEXT,"
+ + VoicemailArchive.CACHED_NAME + " TEXT,"
+ + VoicemailArchive.CACHED_NUMBER_TYPE + " INTEGER,"
+ + VoicemailArchive.CACHED_NUMBER_LABEL + " TEXT,"
+ + VoicemailArchive.CACHED_LOOKUP_URI + " TEXT,"
+ + VoicemailArchive.CACHED_MATCHED_NUMBER + " TEXT,"
+ + VoicemailArchive.CACHED_NORMALIZED_NUMBER + " TEXT,"
+ + VoicemailArchive.CACHED_PHOTO_ID + " LONG,"
+ + VoicemailArchive.CACHED_FORMATTED_NUMBER + " TEXT,"
+ + VoicemailArchive.ARCHIVED + " INTEGER,"
+ + VoicemailArchive.NUMBER_PRESENTATION + " INTEGER,"
+ + VoicemailArchive.ACCOUNT_COMPONENT_NAME + " TEXT,"
+ + VoicemailArchive.ACCOUNT_ID + " TEXT,"
+ + VoicemailArchive.FEATURES + " INTEGER,"
+ + VoicemailArchive.SERVER_ID + " INTEGER,"
+ + VoicemailArchive.TRANSCRIPTION + " TEXT,"
+ + VoicemailArchive.CACHED_PHOTO_URI + " TEXT"
+ + ");");
+ }
+
+ /**
* Removes all entries in the smartdial contact database.
*/
@VisibleForTesting
@@ -595,11 +723,14 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
* @param db Database pointer to the smartdial database
* @param updatedContactCursor Cursor pointing to the list of recently updated contacts.
*/
- private void removeUpdatedContacts(SQLiteDatabase db, Cursor updatedContactCursor) {
+ @VisibleForTesting
+ void removeUpdatedContacts(SQLiteDatabase db, Cursor updatedContactCursor) {
db.beginTransaction();
try {
+ updatedContactCursor.moveToPosition(-1);
while (updatedContactCursor.moveToNext()) {
- final Long contactId = updatedContactCursor.getLong(PhoneQuery.PHONE_CONTACT_ID);
+ final Long contactId =
+ updatedContactCursor.getLong(UpdatedContactQuery.UPDATED_CONTACT_ID);
db.delete(Tables.SMARTDIAL_TABLE, SmartDialDbColumns.CONTACT_ID + "=" +
contactId, null);
@@ -638,8 +769,9 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
SmartDialDbColumns.IS_SUPER_PRIMARY + ", " +
SmartDialDbColumns.IN_VISIBLE_GROUP+ ", " +
SmartDialDbColumns.IS_PRIMARY + ", " +
+ SmartDialDbColumns.CARRIER_PRESENCE + ", " +
SmartDialDbColumns.LAST_SMARTDIAL_UPDATE_TIME + ") " +
- " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
final SQLiteStatement insert = db.compileStatement(sqlInsert);
final String numberSqlInsert = "INSERT INTO " + Tables.PREFIX_TABLE + " (" +
@@ -686,7 +818,8 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
insert.bindLong(10, updatedContactCursor.getInt(PhoneQuery.PHONE_IS_SUPER_PRIMARY));
insert.bindLong(11, updatedContactCursor.getInt(PhoneQuery.PHONE_IN_VISIBLE_GROUP));
insert.bindLong(12, updatedContactCursor.getInt(PhoneQuery.PHONE_IS_PRIMARY));
- insert.bindLong(13, currentMillis);
+ insert.bindLong(13, updatedContactCursor.getInt(PhoneQuery.PHONE_CARRIER_PRESENCE));
+ insert.bindLong(14, currentMillis);
insert.executeInsert();
final String contactPhoneNumber =
updatedContactCursor.getString(PhoneQuery.PHONE_NUMBER);
@@ -772,59 +905,75 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
if (DEBUG) {
Log.v(TAG, "Last updated at " + lastUpdateMillis);
}
- /** Queries the contact database to get contacts that have been updated since the last
- * update time.
- */
- final Cursor updatedContactCursor = mContext.getContentResolver().query(PhoneQuery.URI,
- PhoneQuery.PROJECTION, PhoneQuery.SELECTION,
- new String[]{lastUpdateMillis}, null);
- if (updatedContactCursor == null) {
- if (DEBUG) {
- Log.e(TAG, "SmartDial query received null for cursor");
- }
- return;
- }
/** Sets the time after querying the database as the current update time. */
final Long currentMillis = System.currentTimeMillis();
- try {
- if (DEBUG) {
- stopWatch.lap("Queried the Contacts database");
- }
+ if (DEBUG) {
+ stopWatch.lap("Queried the Contacts database");
+ }
- /** Prevents the app from reading the dialer database when updating. */
- sInUpdate.getAndSet(true);
+ /** Prevents the app from reading the dialer database when updating. */
+ sInUpdate.getAndSet(true);
- /** Removes contacts that have been deleted. */
- removeDeletedContacts(db, lastUpdateMillis);
- removePotentiallyCorruptedContacts(db, lastUpdateMillis);
+ /** Removes contacts that have been deleted. */
+ removeDeletedContacts(db, getDeletedContactCursor(lastUpdateMillis));
+ removePotentiallyCorruptedContacts(db, lastUpdateMillis);
- if (DEBUG) {
- stopWatch.lap("Finished deleting deleted entries");
- }
+ if (DEBUG) {
+ stopWatch.lap("Finished deleting deleted entries");
+ }
- /** If the database did not exist before, jump through deletion as there is nothing
- * to delete.
+ /** If the database did not exist before, jump through deletion as there is nothing
+ * to delete.
+ */
+ if (!lastUpdateMillis.equals("0")) {
+ /** Removes contacts that have been updated. Updated contact information will be
+ * inserted later. Note that this has to use a separate result set from
+ * updatePhoneCursor, since it is possible for a contact to be updated (e.g.
+ * phone number deleted), but have no results show up in updatedPhoneCursor (since
+ * all of its phone numbers have been deleted).
*/
- if (!lastUpdateMillis.equals("0")) {
- /** Removes contacts that have been updated. Updated contact information will be
- * inserted later.
- */
+ final Cursor updatedContactCursor = mContext.getContentResolver().query(
+ UpdatedContactQuery.URI,
+ UpdatedContactQuery.PROJECTION,
+ UpdatedContactQuery.SELECT_UPDATED_CLAUSE,
+ new String[] {lastUpdateMillis},
+ null
+ );
+ if (updatedContactCursor == null) {
+ Log.e(TAG, "SmartDial query received null for cursor");
+ return;
+ }
+ try {
removeUpdatedContacts(db, updatedContactCursor);
- if (DEBUG) {
- stopWatch.lap("Finished deleting updated entries");
- }
+ } finally {
+ updatedContactCursor.close();
+ }
+ if (DEBUG) {
+ stopWatch.lap("Finished deleting entries belonging to updated contacts");
}
+ }
- /** Inserts recently updated contacts to the smartdial database.*/
- insertUpdatedContactsAndNumberPrefix(db, updatedContactCursor, currentMillis);
+ /** Queries the contact database to get all phone numbers that have been updated since the last
+ * update time.
+ */
+ final Cursor updatedPhoneCursor = mContext.getContentResolver().query(PhoneQuery.URI,
+ PhoneQuery.PROJECTION, PhoneQuery.SELECTION,
+ new String[]{lastUpdateMillis}, null);
+ if (updatedPhoneCursor == null) {
+ Log.e(TAG, "SmartDial query received null for cursor");
+ return;
+ }
+
+ try {
+ /** Inserts recently updated phone numbers to the smartdial database.*/
+ insertUpdatedContactsAndNumberPrefix(db, updatedPhoneCursor, currentMillis);
if (DEBUG) {
stopWatch.lap("Finished building the smart dial table");
}
} finally {
- /** Inserts prefixes of phone numbers into the prefix table.*/
- updatedContactCursor.close();
+ updatedPhoneCursor.close();
}
/** Gets a list of distinct contacts which have been updated, and adds the name prefixes
@@ -937,7 +1086,8 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
SmartDialDbColumns.PHOTO_ID + ", " +
SmartDialDbColumns.NUMBER + ", " +
SmartDialDbColumns.CONTACT_ID + ", " +
- SmartDialDbColumns.LOOKUP_KEY +
+ SmartDialDbColumns.LOOKUP_KEY + ", " +
+ SmartDialDbColumns.CARRIER_PRESENCE +
" FROM " + Tables.SMARTDIAL_TABLE + " WHERE " +
SmartDialDbColumns.CONTACT_ID + " IN " +
" (SELECT " + PrefixColumns.CONTACT_ID +
@@ -961,6 +1111,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
final int columnNumber = 3;
final int columnId = 4;
final int columnLookupKey = 5;
+ final int columnCarrierPresence = 6;
if (DEBUG) {
stopWatch.lap("Found column IDs");
}
@@ -978,6 +1129,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
final long id = cursor.getLong(columnId);
final long photoId = cursor.getLong(columnPhotoId);
final String lookupKey = cursor.getString(columnLookupKey);
+ final int carrierPresence = cursor.getInt(columnCarrierPresence);
/** If a contact already exists and another phone number of the contact is being
* processed, skip the second instance.
@@ -998,7 +1150,7 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
/** If a contact has not been added, add it to the result and the hash set.*/
duplicates.add(contactMatch);
result.add(new ContactNumber(id, dataID, displayName, phoneNumber, lookupKey,
- photoId));
+ photoId, carrierPresence));
counter++;
if (DEBUG) {
stopWatch.lap("Added one result: Name: " + displayName);
diff --git a/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
new file mode 100644
index 000000000..68a2e85d5
--- /dev/null
+++ b/src/com/android/dialer/database/FilteredNumberAsyncQueryHandler.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.content.AsyncQueryHandler;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.database.sqlite.SQLiteDatabaseCorruptException;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
+
+public class FilteredNumberAsyncQueryHandler extends AsyncQueryHandler {
+ private static final int NO_TOKEN = 0;
+
+ public FilteredNumberAsyncQueryHandler(ContentResolver cr) {
+ super(cr);
+ }
+
+ /**
+ * Methods for FilteredNumberAsyncQueryHandler result returns.
+ */
+ private static abstract class Listener {
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ }
+ protected void onInsertComplete(int token, Object cookie, Uri uri) {
+ }
+ protected void onUpdateComplete(int token, Object cookie, int result) {
+ }
+ protected void onDeleteComplete(int token, Object cookie, int result) {
+ }
+ }
+
+ public interface OnCheckBlockedListener {
+ /**
+ * Invoked after querying if a number is blocked.
+ * @param id The ID of the row if blocked, null otherwise.
+ */
+ void onCheckComplete(Integer id);
+ }
+
+ public interface OnBlockNumberListener {
+ /**
+ * Invoked after inserting a blocked number.
+ * @param uri The uri of the newly created row.
+ */
+ void onBlockComplete(Uri uri);
+ }
+
+ public interface OnUnblockNumberListener {
+ /**
+ * Invoked after removing a blocked number
+ * @param rows The number of rows affected (expected value 1).
+ * @param values The deleted data (used for restoration).
+ */
+ void onUnblockComplete(int rows, ContentValues values);
+ }
+
+ public interface OnHasBlockedNumbersListener {
+ /**
+ * @param hasBlockedNumbers {@code true} if any blocked numbers are stored.
+ * {@code false} otherwise.
+ */
+ void onHasBlockedNumbers(boolean hasBlockedNumbers);
+ }
+
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ if (cookie != null) {
+ ((Listener) cookie).onQueryComplete(token, cookie, cursor);
+ }
+ }
+
+ @Override
+ protected void onInsertComplete(int token, Object cookie, Uri uri) {
+ if (cookie != null) {
+ ((Listener) cookie).onInsertComplete(token, cookie, uri);
+ }
+ }
+
+ @Override
+ protected void onUpdateComplete(int token, Object cookie, int result) {
+ if (cookie != null) {
+ ((Listener) cookie).onUpdateComplete(token, cookie, result);
+ }
+ }
+
+ @Override
+ protected void onDeleteComplete(int token, Object cookie, int result) {
+ if (cookie != null) {
+ ((Listener) cookie).onDeleteComplete(token, cookie, result);
+ }
+ }
+
+ public final void incrementFilteredCount(Integer id) {
+ // No concept of counts with new filtering
+ if (FilteredNumberCompat.useNewFiltering()) {
+ return;
+ }
+ startUpdate(NO_TOKEN, null,
+ ContentUris.withAppendedId(FilteredNumber.CONTENT_URI_INCREMENT_FILTERED_COUNT, id),
+ null, null, null);
+ }
+
+ public void hasBlockedNumbers(final OnHasBlockedNumbersListener listener) {
+ startQuery(NO_TOKEN,
+ new Listener() {
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ listener.onHasBlockedNumbers(cursor != null && cursor.getCount() > 0);
+ }
+ },
+ FilteredNumberCompat.getContentUri(null),
+ new String[]{ FilteredNumberCompat.getIdColumnName() },
+ FilteredNumberCompat.useNewFiltering() ? null : FilteredNumberColumns.TYPE
+ + "=" + FilteredNumberTypes.BLOCKED_NUMBER,
+ null,
+ null);
+ }
+
+ /**
+ * Check if this number has been blocked.
+ *
+ * @return {@code false} if the number was invalid and couldn't be checked,
+ * {@code true} otherwise,
+ */
+ public boolean isBlockedNumber(
+ final OnCheckBlockedListener listener, String number, String countryIso) {
+ final String e164Number = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ if (TextUtils.isEmpty(e164Number)) {
+ return false;
+ }
+
+ startQuery(NO_TOKEN,
+ new Listener() {
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ /*
+ * In the frameworking blocking, numbers can be blocked in both e164 format
+ * and not, resulting in multiple rows being returned for this query. For
+ * example, both '16502530000' and '6502530000' can exist at the same time
+ * and will be returned by this query.
+ */
+ if (cursor == null || cursor.getCount() == 0) {
+ listener.onCheckComplete(null);
+ return;
+ }
+ cursor.moveToFirst();
+ // New filtering doesn't have a concept of type
+ if (!FilteredNumberCompat.useNewFiltering()
+ && cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns.TYPE))
+ != FilteredNumberTypes.BLOCKED_NUMBER) {
+ listener.onCheckComplete(null);
+ return;
+ }
+ listener.onCheckComplete(
+ cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID)));
+ }
+ },
+ FilteredNumberCompat.getContentUri(null),
+ FilteredNumberCompat.filter(new String[]{FilteredNumberCompat.getIdColumnName(),
+ FilteredNumberCompat.getTypeColumnName()}),
+ FilteredNumberCompat.getE164NumberColumnName() + " = ?",
+ new String[]{e164Number},
+ null);
+
+ return true;
+ }
+
+ public void blockNumber(
+ final OnBlockNumberListener listener, String number, @Nullable String countryIso) {
+ blockNumber(listener, null, number, countryIso);
+ }
+
+ /**
+ * Add a number manually blocked by the user.
+ */
+ public void blockNumber(
+ final OnBlockNumberListener listener,
+ @Nullable String normalizedNumber,
+ String number,
+ @Nullable String countryIso) {
+ blockNumber(listener, FilteredNumberCompat.newBlockNumberContentValues(number,
+ normalizedNumber, countryIso));
+ }
+
+ /**
+ * Block a number with specified ContentValues. Can be manually added or a restored row
+ * from performing the 'undo' action after unblocking.
+ */
+ public void blockNumber(final OnBlockNumberListener listener, ContentValues values) {
+ startInsert(NO_TOKEN,
+ new Listener() {
+ @Override
+ public void onInsertComplete(int token, Object cookie, Uri uri) {
+ if (listener != null ) {
+ listener.onBlockComplete(uri);
+ }
+ }
+ }, FilteredNumberCompat.getContentUri(null), values);
+ }
+
+ /**
+ * Unblocks the number with the given id.
+ *
+ * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
+ * unblocked.
+ * @param id The id of the number to unblock.
+ */
+ public void unblock(@Nullable final OnUnblockNumberListener listener, Integer id) {
+ if (id == null) {
+ throw new IllegalArgumentException("Null id passed into unblock");
+ }
+ unblock(listener, FilteredNumberCompat.getContentUri(id));
+ }
+
+ /**
+ * Removes row from database.
+ * @param listener (optional) The {@link OnUnblockNumberListener} called after the number is
+ * unblocked.
+ * @param uri The uri of row to remove, from
+ * {@link FilteredNumberAsyncQueryHandler#blockNumber}.
+ */
+ public void unblock(@Nullable final OnUnblockNumberListener listener, final Uri uri) {
+ startQuery(NO_TOKEN, new Listener() {
+ @Override
+ public void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ int rowsReturned = cursor == null ? 0 : cursor.getCount();
+ if (rowsReturned != 1) {
+ throw new SQLiteDatabaseCorruptException
+ ("Returned " + rowsReturned + " rows for uri "
+ + uri + "where 1 expected.");
+ }
+ cursor.moveToFirst();
+ final ContentValues values = new ContentValues();
+ DatabaseUtils.cursorRowToContentValues(cursor, values);
+ values.remove(FilteredNumberCompat.getIdColumnName());
+
+ startDelete(NO_TOKEN, new Listener() {
+ @Override
+ public void onDeleteComplete(int token, Object cookie, int result) {
+ if (listener != null) {
+ listener.onUnblockComplete(result, values);
+ }
+ }
+ }, uri, null, null);
+ }
+ }, uri, null, null, null, null);
+ }
+}
diff --git a/src/com/android/dialer/database/FilteredNumberContract.java b/src/com/android/dialer/database/FilteredNumberContract.java
new file mode 100644
index 000000000..f3966816c
--- /dev/null
+++ b/src/com/android/dialer/database/FilteredNumberContract.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+
+import com.android.dialerbind.ObjectFactory;
+
+/**
+ * <p>
+ * The contract between the filtered number provider and applications. Contains
+ * definitions for the supported URIs and columns.
+ * Currently only accessible within Dialer.
+ * </p>
+ */
+public final class FilteredNumberContract {
+
+ /** The authority for the filtered numbers provider */
+ public static final String AUTHORITY = ObjectFactory.getFilteredNumberProviderAuthority();
+
+ /** A content:// style uri to the authority for the filtered numbers provider */
+ public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
+
+ /** The type of filtering to be applied, e.g. block the number or whitelist the number. */
+ public interface FilteredNumberTypes {
+ static final int UNDEFINED = 0;
+ /**
+ * Dialer will disconnect the call without sending the caller to voicemail.
+ */
+ static final int BLOCKED_NUMBER = 1;
+ }
+
+ /** The original source of the filtered number, e.g. the user manually added it. */
+ public interface FilteredNumberSources {
+ static final int UNDEFINED = 0;
+ /**
+ * The user manually added this number through Dialer (e.g. from the call log or InCallUI).
+ */
+ static final int USER = 1;
+ }
+
+ public interface FilteredNumberColumns {
+ // TYPE: INTEGER
+ static final String _ID = "_id";
+ /**
+ * Represents the number to be filtered, normalized to compare phone numbers for equality.
+ *
+ * TYPE: TEXT
+ */
+ static final String NORMALIZED_NUMBER = "normalized_number";
+ /**
+ * Represents the number to be filtered, for formatting and
+ * used with country iso for contact lookups.
+ *
+ * TYPE: TEXT
+ */
+ static final String NUMBER = "number";
+ /**
+ * The country code representing the country detected when
+ * the phone number was added to the database.
+ * Most numbers don't have the country code, so a best guess is provided by
+ * the country detector system. The country iso is also needed in order to format
+ * phone numbers correctly.
+ *
+ * TYPE: TEXT
+ */
+ static final String COUNTRY_ISO = "country_iso";
+ /**
+ * The number of times the number has been filtered by Dialer.
+ * When this number is incremented, LAST_TIME_FILTERED should also be updated to
+ * the current time.
+ *
+ * TYPE: INTEGER
+ */
+ static final String TIMES_FILTERED = "times_filtered";
+ /**
+ * Set to the current time when the phone number is filtered.
+ * When this is updated, TIMES_FILTERED should also be incremented.
+ *
+ * TYPE: LONG
+ */
+ static final String LAST_TIME_FILTERED = "last_time_filtered";
+ // TYPE: LONG
+ static final String CREATION_TIME = "creation_time";
+ /**
+ * Indicates the type of filtering to be applied.
+ *
+ * TYPE: INTEGER
+ * See {@link FilteredNumberTypes}
+ */
+ static final String TYPE = "type";
+ /**
+ * Integer representing the original source of the filtered number.
+ *
+ * TYPE: INTEGER
+ * See {@link FilteredNumberSources}
+ */
+ static final String SOURCE = "source";
+ }
+
+ /**
+ * <p>
+ * Constants for the table of filtered numbers.
+ * </p>
+ * <h3>Operations</h3>
+ * <dl>
+ * <dt><b>Insert</b></dt>
+ * <dd>Required fields: NUMBER, NORMALIZED_NUMBER, TYPE, SOURCE.
+ * A default value will be used for the other fields if left null.</dd>
+ * <dt><b>Update</b></dt>
+ * <dt><b>Delete</b></dt>
+ * <dt><b>Query</b></dt>
+ * <dd>{@link #CONTENT_URI} can be used for any query, append an ID to
+ * retrieve a specific filtered number entry.</dd>
+ * </dl>
+ */
+ public static class FilteredNumber implements BaseColumns {
+
+ public static final String FILTERED_NUMBERS_TABLE = "filtered_numbers_table";
+ public static final String FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT =
+ "filtered_numbers_increment_filtered_count";
+
+ public static final Uri CONTENT_URI = Uri.withAppendedPath(
+ AUTHORITY_URI,
+ FILTERED_NUMBERS_TABLE);
+
+ public static final Uri CONTENT_URI_INCREMENT_FILTERED_COUNT = Uri.withAppendedPath(
+ AUTHORITY_URI,
+ FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT);
+
+ /**
+ * This utility class cannot be instantiated.
+ */
+ private FilteredNumber () {}
+
+ /**
+ * The MIME type of {@link #CONTENT_URI} providing a directory of
+ * filtered numbers.
+ */
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/filtered_numbers_table";
+
+ /**
+ * The MIME type of a {@link #CONTENT_URI} single filtered number.
+ */
+ public static final String CONTENT_ITEM_TYPE =
+ "vnd.android.cursor.item/filtered_numbers_table";
+ }
+}
diff --git a/src/com/android/dialer/database/FilteredNumberProvider.java b/src/com/android/dialer/database/FilteredNumberProvider.java
new file mode 100644
index 000000000..3b63d4b50
--- /dev/null
+++ b/src/com/android/dialer/database/FilteredNumberProvider.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.os.Binder;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialerbind.DatabaseHelperManager;
+import com.android.dialerbind.ObjectFactory;
+import com.google.common.annotations.VisibleForTesting;
+
+import java.util.Arrays;
+
+/**
+ * Filtered number content provider.
+ */
+public class FilteredNumberProvider extends ContentProvider {
+
+ private static String TAG = FilteredNumberProvider.class.getSimpleName();
+
+ private DialerDatabaseHelper mDialerDatabaseHelper;
+
+ private static final int FILTERED_NUMBERS_TABLE = 1;
+ private static final int FILTERED_NUMBERS_TABLE_ID = 2;
+ private static final int FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT = 3;
+
+ private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+
+ @Override
+ public boolean onCreate() {
+ mDialerDatabaseHelper = getDatabaseHelper(getContext());
+ if (mDialerDatabaseHelper == null) {
+ return false;
+ }
+ sUriMatcher.addURI(ObjectFactory.getFilteredNumberProviderAuthority(),
+ FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE,
+ FILTERED_NUMBERS_TABLE);
+ sUriMatcher.addURI(ObjectFactory.getFilteredNumberProviderAuthority(),
+ FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_TABLE + "/#",
+ FILTERED_NUMBERS_TABLE_ID);
+ sUriMatcher.addURI(ObjectFactory.getFilteredNumberProviderAuthority(),
+ FilteredNumberContract.FilteredNumber.FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT
+ + "/#",
+ FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT);
+ return true;
+ }
+
+ @VisibleForTesting
+ protected DialerDatabaseHelper getDatabaseHelper(Context context) {
+ return DatabaseHelperManager.getDatabaseHelper(context);
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ final SQLiteDatabase db = mDialerDatabaseHelper.getReadableDatabase();
+ SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+ qb.setTables(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE);
+ final int match = sUriMatcher.match(uri);
+ switch (match) {
+ case FILTERED_NUMBERS_TABLE:
+ break;
+ case FILTERED_NUMBERS_TABLE_ID:
+ qb.appendWhere(FilteredNumberColumns._ID + "=" + ContentUris.parseId(uri));
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown uri: " + uri);
+ }
+ final Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, null);
+ if (c != null) {
+ c.setNotificationUri(getContext().getContentResolver(),
+ FilteredNumberContract.FilteredNumber.CONTENT_URI);
+ } else {
+ Log.d(TAG, "CURSOR WAS NULL");
+ }
+ return c;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return FilteredNumberContract.FilteredNumber.CONTENT_ITEM_TYPE;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+ setDefaultValues(values);
+ long id = db.insert(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE, null, values);
+ if (id < 0) {
+ return null;
+ }
+ notifyChange(uri);
+ return ContentUris.withAppendedId(uri, id);
+ }
+
+ @VisibleForTesting
+ protected long getCurrentTimeMs() {
+ return System.currentTimeMillis();
+ }
+
+ private void setDefaultValues(ContentValues values) {
+ if (values.getAsString(FilteredNumberColumns.COUNTRY_ISO) == null) {
+ values.put(FilteredNumberColumns.COUNTRY_ISO,
+ GeoUtil.getCurrentCountryIso(getContext()));
+ }
+ if (values.getAsInteger(FilteredNumberColumns.TIMES_FILTERED) == null) {
+ values.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 0);
+ }
+ if (values.getAsLong(FilteredNumberColumns.CREATION_TIME) == null) {
+ values.put(FilteredNumberColumns.CREATION_TIME, getCurrentTimeMs());
+ }
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+ final int match = sUriMatcher.match(uri);
+ switch (match) {
+ case FILTERED_NUMBERS_TABLE:
+ break;
+ case FILTERED_NUMBERS_TABLE_ID:
+ selection = getSelectionWithId(selection, ContentUris.parseId(uri));
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown uri: " + uri);
+ }
+ int rows = db.delete(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE,
+ selection,
+ selectionArgs);
+ if (rows > 0) {
+ notifyChange(uri);
+ }
+ return rows;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+ final int match = sUriMatcher.match(uri);
+ switch (match) {
+ case FILTERED_NUMBERS_TABLE:
+ break;
+ case FILTERED_NUMBERS_TABLE_ID:
+ selection = getSelectionWithId(selection, ContentUris.parseId(uri));
+ break;
+ case FILTERED_NUMBERS_INCREMENT_FILTERED_COUNT:
+ final long id = ContentUris.parseId(uri);
+ try {
+ db.execSQL(" UPDATE " + DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE
+ + " SET" + FilteredNumberColumns.TIMES_FILTERED + "="
+ + FilteredNumberColumns.TIMES_FILTERED + "+1,"
+ + FilteredNumberColumns.LAST_TIME_FILTERED + "="
+ + getCurrentTimeMs()
+ + " WHERE " + FilteredNumberColumns._ID + "=" + id);
+ } catch (SQLException e) {
+ Log.d(TAG, "Could not update blocked statistics for " + id);
+ return 0;
+ }
+ return 1;
+ default:
+ throw new IllegalArgumentException("Unknown uri: " + uri);
+ }
+ int rows = db.update(DialerDatabaseHelper.Tables.FILTERED_NUMBER_TABLE,
+ values,
+ selection,
+ selectionArgs);
+ if (rows > 0 ) {
+ notifyChange(uri);
+ }
+ return rows;
+ }
+
+ private String getSelectionWithId(String selection, long id) {
+ if (TextUtils.isEmpty(selection)) {
+ return FilteredNumberContract.FilteredNumberColumns._ID + "=" + id;
+ } else {
+ return selection + "AND " + FilteredNumberContract.FilteredNumberColumns._ID + "=" + id;
+ }
+ }
+
+ private void notifyChange(Uri uri) {
+ getContext().getContentResolver().notifyChange(uri, null);
+ }
+}
diff --git a/src/com/android/dialer/database/VoicemailArchiveContract.java b/src/com/android/dialer/database/VoicemailArchiveContract.java
new file mode 100644
index 000000000..f332932c3
--- /dev/null
+++ b/src/com/android/dialer/database/VoicemailArchiveContract.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.net.Uri;
+import android.provider.BaseColumns;
+import android.provider.CallLog;
+import android.provider.OpenableColumns;
+
+import com.android.dialerbind.ObjectFactory;
+
+/**
+ * Contains definitions for the supported URIs and columns for the voicemail archive table.
+ * All the fields excluding MIME_TYPE, _DATA, ARCHIVED, SERVER_ID, mirror the fields in the
+ * contract provided in {@link CallLog.Calls}.
+ */
+public final class VoicemailArchiveContract {
+
+ /** The authority used by the voicemail archive provider. */
+ public static final String AUTHORITY = ObjectFactory.getVoicemailArchiveProviderAuthority();
+
+ /** A content:// style uri for the voicemail archive provider */
+ public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);
+
+ public static final class VoicemailArchive implements BaseColumns, OpenableColumns {
+
+ public static final String VOICEMAIL_ARCHIVE_TABLE = "voicemail_archive_table";
+
+ public static final Uri CONTENT_URI = Uri.withAppendedPath(
+ AUTHORITY_URI,
+ VOICEMAIL_ARCHIVE_TABLE);
+
+ /**
+ * @see android.provider.CallLog.Calls#NUMBER
+ * TYPE: TEXT
+ */
+ public static final String NUMBER = CallLog.Calls.NUMBER;
+
+ /**
+ * @see android.provider.CallLog.Calls#DATE
+ * TYPE: LONG
+ */
+ public static final String DATE = CallLog.Calls.DATE;
+
+ /**
+ * @see android.provider.CallLog.Calls#DURATION
+ * TYPE: LONG
+ */
+ public static final String DURATION = CallLog.Calls.DURATION;
+
+ /**
+ * The mime type of the archived voicemail file.
+ * TYPE: TEXT
+ */
+ public static final String MIME_TYPE = "mime_type";
+
+ /**
+ * @see android.provider.CallLog.Calls#COUNTRY_ISO
+ * TYPE: LONG
+ */
+ public static final String COUNTRY_ISO = CallLog.Calls.COUNTRY_ISO;
+
+ /**
+ * The path of the archived voicemail file.
+ * TYPE: TEXT
+ */
+ public static final String _DATA = "_data";
+
+ /**
+ * @see android.provider.CallLog.Calls#GEOCODED_LOCATION
+ * TYPE: TEXT
+ */
+ public static final String GEOCODED_LOCATION = CallLog.Calls.GEOCODED_LOCATION;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_NAME
+ * TYPE: TEXT
+ */
+ public static final String CACHED_NAME = CallLog.Calls.CACHED_NAME;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_NUMBER_TYPE
+ * TYPE: INTEGER
+ */
+ public static final String CACHED_NUMBER_TYPE = CallLog.Calls.CACHED_NUMBER_TYPE;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_NUMBER_LABEL
+ * TYPE: TEXT
+ */
+ public static final String CACHED_NUMBER_LABEL = CallLog.Calls.CACHED_NUMBER_LABEL;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_LOOKUP_URI
+ * TYPE: TEXT
+ */
+ public static final String CACHED_LOOKUP_URI = CallLog.Calls.CACHED_LOOKUP_URI;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_MATCHED_NUMBER
+ * TYPE: TEXT
+ */
+ public static final String CACHED_MATCHED_NUMBER = CallLog.Calls.CACHED_MATCHED_NUMBER;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_NORMALIZED_NUMBER
+ * TYPE: TEXT
+ */
+ public static final String CACHED_NORMALIZED_NUMBER =
+ CallLog.Calls.CACHED_NORMALIZED_NUMBER;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_PHOTO_ID
+ * TYPE: LONG
+ */
+ public static final String CACHED_PHOTO_ID = CallLog.Calls.CACHED_PHOTO_ID;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_FORMATTED_NUMBER
+ * TYPE: TEXT
+ */
+ public static final String CACHED_FORMATTED_NUMBER = CallLog.Calls.CACHED_FORMATTED_NUMBER;
+
+ /**
+ * If the voicemail was archived by the user by pressing the archive button, this is set to
+ * 1 (true). If the voicemail was archived for the purpose of forwarding to other
+ * applications, this is set to 0 (false).
+ * TYPE: INTEGER
+ */
+ public static final String ARCHIVED = "archived_by_user";
+
+ /**
+ * @see android.provider.CallLog.Calls#NUMBER_PRESENTATION
+ * TYPE: INTEGER
+ */
+ public static final String NUMBER_PRESENTATION = CallLog.Calls.NUMBER_PRESENTATION;
+
+ /**
+ * @see android.provider.CallLog.Calls#PHONE_ACCOUNT_COMPONENT_NAME
+ * TYPE: TEXT
+ */
+ public static final String ACCOUNT_COMPONENT_NAME =
+ CallLog.Calls.PHONE_ACCOUNT_COMPONENT_NAME;
+
+ /**
+ * @see android.provider.CallLog.Calls#PHONE_ACCOUNT_ID
+ * TYPE: TEXT
+ */
+ public static final String ACCOUNT_ID = CallLog.Calls.PHONE_ACCOUNT_ID;
+
+ /**
+ * @see android.provider.CallLog.Calls#FEATURES
+ * TYPE: INTEGER
+ */
+ public static final String FEATURES = CallLog.Calls.FEATURES;
+
+ /**
+ * The id of the voicemail on the server.
+ * TYPE: INTEGER
+ */
+ public static final String SERVER_ID = "server_id";
+
+ /**
+ * @see android.provider.CallLog.Calls#TRANSCRIPTION
+ * TYPE: TEXT
+ */
+ public static final String TRANSCRIPTION = CallLog.Calls.TRANSCRIPTION;
+
+ /**
+ * @see android.provider.CallLog.Calls#CACHED_PHOTO_URI
+ * TYPE: TEXT
+ */
+ public static final String CACHED_PHOTO_URI = CallLog.Calls.CACHED_PHOTO_URI;
+
+ /**
+ * The MIME type of a {@link #CONTENT_URI} single voicemail.
+ */
+ public static final String CONTENT_ITEM_TYPE =
+ "vnd.android.cursor.item/voicmail_archive_table";
+
+ public static final Uri buildWithId(int id) {
+ return Uri.withAppendedPath(CONTENT_URI, Integer.toString(id));
+ }
+
+ /** Not instantiable. */
+ private VoicemailArchive() {
+ }
+ }
+}
diff --git a/src/com/android/dialer/database/VoicemailArchiveProvider.java b/src/com/android/dialer/database/VoicemailArchiveProvider.java
new file mode 100644
index 000000000..b3306bc4c
--- /dev/null
+++ b/src/com/android/dialer/database/VoicemailArchiveProvider.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.webkit.MimeTypeMap;
+
+import com.android.dialerbind.DatabaseHelperManager;
+import com.google.common.annotations.VisibleForTesting;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+
+/**
+ * An implementation of the Voicemail Archive content provider. This class performs
+ * all database level operations on the voicemail_archive_table.
+ */
+public class VoicemailArchiveProvider extends ContentProvider {
+ private static final String TAG = "VMArchiveProvider";
+ private static final int VOICEMAIL_ARCHIVE_TABLE = 1;
+ private static final int VOICEMAIL_ARCHIVE_TABLE_ID = 2;
+ private static final String VOICEMAIL_FOLDER = "voicemails";
+
+ private DialerDatabaseHelper mDialerDatabaseHelper;
+ private final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+
+ @Override
+ public boolean onCreate() {
+ mDialerDatabaseHelper = getDatabaseHelper(getContext());
+ if (mDialerDatabaseHelper == null) {
+ return false;
+ }
+ mUriMatcher.addURI(VoicemailArchiveContract.AUTHORITY,
+ VoicemailArchiveContract.VoicemailArchive.VOICEMAIL_ARCHIVE_TABLE,
+ VOICEMAIL_ARCHIVE_TABLE);
+ mUriMatcher.addURI(VoicemailArchiveContract.AUTHORITY,
+ VoicemailArchiveContract.VoicemailArchive.VOICEMAIL_ARCHIVE_TABLE + "/#",
+ VOICEMAIL_ARCHIVE_TABLE_ID);
+ return true;
+ }
+
+ @VisibleForTesting
+ protected DialerDatabaseHelper getDatabaseHelper(Context context) {
+ return DatabaseHelperManager.getDatabaseHelper(context);
+ }
+
+ /**
+ * Used by the test class because it extends {@link android.test.ProviderTestCase2} in which the
+ * {@link android.test.IsolatedContext} returns /dev/null when getFilesDir() is called.
+ *
+ * @see android.test.IsolatedContext#getFilesDir
+ */
+ @VisibleForTesting
+ protected File getFilesDir() {
+ return getContext().getFilesDir();
+ }
+
+ @Nullable
+ @Override
+ public Cursor query(Uri uri,
+ @Nullable String[] projection,
+ @Nullable String selection,
+ @Nullable String[] selectionArgs,
+ @Nullable String sortOrder) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getReadableDatabase();
+ SQLiteQueryBuilder queryBuilder = getQueryBuilder(uri);
+ Cursor cursor = queryBuilder
+ .query(db, projection, selection, selectionArgs, null, null, sortOrder);
+ if (cursor != null) {
+ cursor.setNotificationUri(getContext().getContentResolver(),
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI);
+ }
+ return cursor;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return VoicemailArchiveContract.VoicemailArchive.CONTENT_ITEM_TYPE;
+ }
+
+ @Nullable
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+ long id = db.insert(DialerDatabaseHelper.Tables.VOICEMAIL_ARCHIVE_TABLE,
+ null, values);
+ if (id < 0) {
+ return null;
+ }
+ notifyChange(uri);
+ // Create the directory for archived voicemails if it doesn't already exist
+ File directory = new File(getFilesDir(), VOICEMAIL_FOLDER);
+ directory.mkdirs();
+ Uri newUri = ContentUris.withAppendedId(uri, id);
+
+ // Create new file only if path is not provided to one
+ if (!values.containsKey(VoicemailArchiveContract.VoicemailArchive._DATA)) {
+ String fileExtension = MimeTypeMap.getSingleton().getExtensionFromMimeType(
+ values.getAsString(VoicemailArchiveContract.VoicemailArchive.MIME_TYPE));
+ File voicemailFile = new File(directory,
+ TextUtils.isEmpty(fileExtension) ? Long.toString(id) :
+ id + "." + fileExtension);
+ values.put(VoicemailArchiveContract.VoicemailArchive._DATA, voicemailFile.getPath());
+ }
+ update(newUri, values, null, null);
+ return newUri;
+ }
+
+
+ @Override
+ public int delete(Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+ SQLiteQueryBuilder queryBuilder = getQueryBuilder(uri);
+ Cursor cursor = queryBuilder.query(db, null, selection, selectionArgs, null, null, null);
+
+ // Delete all the voicemail files related to the selected rows
+ while (cursor.moveToNext()) {
+ deleteFile(cursor.getString(cursor.getColumnIndex(
+ VoicemailArchiveContract.VoicemailArchive._DATA)));
+ }
+
+ int rows = db.delete(DialerDatabaseHelper.Tables.VOICEMAIL_ARCHIVE_TABLE,
+ getSelectionWithId(selection, uri),
+ selectionArgs);
+ if (rows > 0) {
+ notifyChange(uri);
+ }
+ return rows;
+ }
+
+ @Override
+ public int update(Uri uri,
+ ContentValues values,
+ @Nullable String selection,
+ @Nullable String[] selectionArgs) {
+ SQLiteDatabase db = mDialerDatabaseHelper.getWritableDatabase();
+ selection = getSelectionWithId(selection, uri);
+ int rows = db.update(DialerDatabaseHelper.Tables.VOICEMAIL_ARCHIVE_TABLE,
+ values,
+ selection,
+ selectionArgs);
+ if (rows > 0) {
+ notifyChange(uri);
+ }
+ return rows;
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ if (mUriMatcher.match(uri) != VOICEMAIL_ARCHIVE_TABLE_ID) {
+ throw new IllegalArgumentException("URI Invalid.");
+ }
+ return openFileHelper(uri, mode);
+ }
+
+ private void deleteFile(@Nullable String path) {
+ if (TextUtils.isEmpty(path)) {
+ return;
+ }
+ File file = new File(path);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+
+ private SQLiteQueryBuilder getQueryBuilder(Uri uri) {
+ SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
+ queryBuilder.setTables(DialerDatabaseHelper.Tables.VOICEMAIL_ARCHIVE_TABLE);
+ String selectionWithId = getSelectionWithId(null, uri);
+ if (!TextUtils.isEmpty(selectionWithId)) {
+ queryBuilder.appendWhere(selectionWithId);
+ }
+ return queryBuilder;
+ }
+
+ private String getSelectionWithId(String selection, Uri uri) {
+ int match = mUriMatcher.match(uri);
+ switch (match) {
+ case VOICEMAIL_ARCHIVE_TABLE:
+ return selection;
+ case VOICEMAIL_ARCHIVE_TABLE_ID:
+ String idStr = VoicemailArchiveContract.VoicemailArchive._ID + "=" +
+ ContentUris.parseId(uri);
+ return TextUtils.isEmpty(selection) ? idStr : selection + " AND " + idStr;
+ default:
+ throw new IllegalArgumentException("Unknown uri: " + uri);
+ }
+ }
+
+ private void notifyChange(Uri uri) {
+ getContext().getContentResolver().notifyChange(uri, null);
+ }
+}
diff --git a/src/com/android/dialer/dialpad/DialpadFragment.java b/src/com/android/dialer/dialpad/DialpadFragment.java
index 3792a1d9f..55d534676 100644
--- a/src/com/android/dialer/dialpad/DialpadFragment.java
+++ b/src/com/android/dialer/dialpad/DialpadFragment.java
@@ -16,6 +16,8 @@
package com.android.dialer.dialpad;
+import com.google.common.annotations.VisibleForTesting;
+
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -27,7 +29,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -42,7 +43,6 @@ import android.provider.Contacts.PhonesColumns;
import android.provider.Settings;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
import android.telephony.PhoneNumberUtils;
import android.telephony.TelephonyManager;
import android.text.Editable;
@@ -81,12 +81,13 @@ import com.android.dialer.R;
import com.android.dialer.SpecialCharSequenceMgr;
import com.android.dialer.calllog.PhoneAccountUtils;
import com.android.dialer.util.DialerUtils;
-import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.IntentUtil.CallIntentBuilder;
+import com.android.dialer.util.TelecomUtil;
+import com.android.incallui.Call.LogState;
import com.android.phone.common.CallLogAsync;
import com.android.phone.common.animation.AnimUtils;
import com.android.phone.common.dialpad.DialpadKeyButton;
import com.android.phone.common.dialpad.DialpadView;
-import com.google.common.annotations.VisibleForTesting;
import java.util.HashSet;
import java.util.List;
@@ -272,8 +273,9 @@ public class DialpadFragment extends Fragment
return (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
}
- private TelecomManager getTelecomManager() {
- return (TelecomManager) getActivity().getSystemService(Context.TELECOM_SERVICE);
+ @Override
+ public Context getContext() {
+ return getActivity();
}
@Override
@@ -417,6 +419,7 @@ public class DialpadFragment extends Fragment
return mDigits != null;
}
+ @VisibleForTesting
public EditText getDigitsWidget() {
return mDigits;
}
@@ -481,7 +484,10 @@ public class DialpadFragment extends Fragment
* @param intent The intent.
* @return {@literal true} if add call operation was requested. {@literal false} otherwise.
*/
- private static boolean isAddCallMode(Intent intent) {
+ public static boolean isAddCallMode(Intent intent) {
+ if (intent == null) {
+ return false;
+ }
final String action = intent.getAction();
if (Intent.ACTION_DIAL.equals(action) || Intent.ACTION_VIEW.equals(action)) {
// see if we are "adding a call" from the InCallScreen; false by default.
@@ -560,19 +566,48 @@ public class DialpadFragment extends Fragment
* Sets formatted digits to digits field.
*/
private void setFormattedDigits(String data, String normalizedNumber) {
- // strip the non-dialable numbers out of the data string.
- String dialString = PhoneNumberUtils.extractNetworkPortion(data);
- dialString =
- PhoneNumberUtils.formatNumber(dialString, normalizedNumber, mCurrentCountryIso);
- if (!TextUtils.isEmpty(dialString)) {
+ final String formatted = getFormattedDigits(data, normalizedNumber, mCurrentCountryIso);
+ if (!TextUtils.isEmpty(formatted)) {
Editable digits = mDigits.getText();
- digits.replace(0, digits.length(), dialString);
+ digits.replace(0, digits.length(), formatted);
// for some reason this isn't getting called in the digits.replace call above..
// but in any case, this will make sure the background drawable looks right
afterTextChanged(digits);
}
}
+ /**
+ * Format the provided string of digits into one that represents a properly formatted phone
+ * number.
+ *
+ * @param dialString String of characters to format
+ * @param normalizedNumber the E164 format number whose country code is used if the given
+ * phoneNumber doesn't have the country code.
+ * @param countryIso The country code representing the format to use if the provided normalized
+ * number is null or invalid.
+ * @return the provided string of digits as a formatted phone number, retaining any
+ * post-dial portion of the string.
+ */
+ @VisibleForTesting
+ static String getFormattedDigits(String dialString, String normalizedNumber, String countryIso) {
+ String number = PhoneNumberUtils.extractNetworkPortion(dialString);
+ // Also retrieve the post dial portion of the provided data, so that the entire dial
+ // string can be reconstituted later.
+ final String postDial = PhoneNumberUtils.extractPostDialPortion(dialString);
+
+ if (TextUtils.isEmpty(number)) {
+ return postDial;
+ }
+
+ number = PhoneNumberUtils.formatNumber(number, normalizedNumber, countryIso);
+
+ if (TextUtils.isEmpty(postDial)) {
+ return number;
+ }
+
+ return number.concat(postDial);
+ }
+
private void configureKeypadListeners(View fragmentView) {
final int[] buttonIds = new int[] {R.id.one, R.id.two, R.id.three, R.id.four, R.id.five,
R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.star, R.id.zero, R.id.pound};
@@ -787,13 +822,12 @@ public class DialpadFragment extends Fragment
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
- switch (view.getId()) {
- case R.id.digits:
- if (keyCode == KeyEvent.KEYCODE_ENTER) {
- handleDialButtonPressed();
- return true;
- }
- break;
+ if (view.getId() == R.id.digits) {
+ if (keyCode == KeyEvent.KEYCODE_ENTER) {
+ handleDialButtonPressed();
+ return true;
+ }
+
}
return false;
}
@@ -808,59 +842,33 @@ public class DialpadFragment extends Fragment
public void onPressed(View view, boolean pressed) {
if (DEBUG) Log.d(TAG, "onPressed(). view: " + view + ", pressed: " + pressed);
if (pressed) {
- switch (view.getId()) {
- case R.id.one: {
- keyPressed(KeyEvent.KEYCODE_1);
- break;
- }
- case R.id.two: {
- keyPressed(KeyEvent.KEYCODE_2);
- break;
- }
- case R.id.three: {
- keyPressed(KeyEvent.KEYCODE_3);
- break;
- }
- case R.id.four: {
- keyPressed(KeyEvent.KEYCODE_4);
- break;
- }
- case R.id.five: {
- keyPressed(KeyEvent.KEYCODE_5);
- break;
- }
- case R.id.six: {
- keyPressed(KeyEvent.KEYCODE_6);
- break;
- }
- case R.id.seven: {
- keyPressed(KeyEvent.KEYCODE_7);
- break;
- }
- case R.id.eight: {
- keyPressed(KeyEvent.KEYCODE_8);
- break;
- }
- case R.id.nine: {
- keyPressed(KeyEvent.KEYCODE_9);
- break;
- }
- case R.id.zero: {
- keyPressed(KeyEvent.KEYCODE_0);
- break;
- }
- case R.id.pound: {
- keyPressed(KeyEvent.KEYCODE_POUND);
- break;
- }
- case R.id.star: {
- keyPressed(KeyEvent.KEYCODE_STAR);
- break;
- }
- default: {
- Log.wtf(TAG, "Unexpected onTouch(ACTION_DOWN) event from: " + view);
- break;
- }
+ int resId = view.getId();
+ if (resId == R.id.one) {
+ keyPressed(KeyEvent.KEYCODE_1);
+ } else if (resId == R.id.two) {
+ keyPressed(KeyEvent.KEYCODE_2);
+ } else if (resId == R.id.three) {
+ keyPressed(KeyEvent.KEYCODE_3);
+ } else if (resId == R.id.four) {
+ keyPressed(KeyEvent.KEYCODE_4);
+ } else if (resId == R.id.five) {
+ keyPressed(KeyEvent.KEYCODE_5);
+ } else if (resId == R.id.six) {
+ keyPressed(KeyEvent.KEYCODE_6);
+ } else if (resId == R.id.seven) {
+ keyPressed(KeyEvent.KEYCODE_7);
+ } else if (resId == R.id.eight) {
+ keyPressed(KeyEvent.KEYCODE_8);
+ } else if (resId == R.id.nine) {
+ keyPressed(KeyEvent.KEYCODE_9);
+ } else if (resId == R.id.zero) {
+ keyPressed(KeyEvent.KEYCODE_0);
+ } else if (resId == R.id.pound) {
+ keyPressed(KeyEvent.KEYCODE_POUND);
+ } else if (resId == R.id.star) {
+ keyPressed(KeyEvent.KEYCODE_STAR);
+ } else {
+ Log.wtf(TAG, "Unexpected onTouch(ACTION_DOWN) event from: " + view);
}
mPressedDialpadKeys.add(view);
} else {
@@ -901,29 +909,21 @@ public class DialpadFragment extends Fragment
@Override
public void onClick(View view) {
- switch (view.getId()) {
- case R.id.dialpad_floating_action_button:
- view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
- handleDialButtonPressed();
- break;
- case R.id.deleteButton: {
- keyPressed(KeyEvent.KEYCODE_DEL);
- break;
- }
- case R.id.digits: {
- if (!isDigitsEmpty()) {
- mDigits.setCursorVisible(true);
- }
- break;
- }
- case R.id.dialpad_overflow: {
- mOverflowPopupMenu.show();
- break;
- }
- default: {
- Log.wtf(TAG, "Unexpected onClick() event from: " + view);
- return;
+ int resId = view.getId();
+ if (resId == R.id.dialpad_floating_action_button) {
+ view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+ handleDialButtonPressed();
+ } else if (resId == R.id.deleteButton) {
+ keyPressed(KeyEvent.KEYCODE_DEL);
+ } else if (resId == R.id.digits) {
+ if (!isDigitsEmpty()) {
+ mDigits.setCursorVisible(true);
}
+ } else if (resId == R.id.dialpad_overflow) {
+ mOverflowPopupMenu.show();
+ } else {
+ Log.wtf(TAG, "Unexpected onClick() event from: " + view);
+ return;
}
}
@@ -931,88 +931,86 @@ public class DialpadFragment extends Fragment
public boolean onLongClick(View view) {
final Editable digits = mDigits.getText();
final int id = view.getId();
- switch (id) {
- case R.id.deleteButton: {
- digits.clear();
- return true;
- }
- case R.id.one: {
- // '1' may be already entered since we rely on onTouch() event for numeric buttons.
- // Just for safety we also check if the digits field is empty or not.
- if (isDigitsEmpty() || TextUtils.equals(mDigits.getText(), "1")) {
- // We'll try to initiate voicemail and thus we want to remove irrelevant string.
- removePreviousDigitIfPossible();
-
- List<PhoneAccountHandle> subscriptionAccountHandles =
- PhoneAccountUtils.getSubscriptionPhoneAccounts(getActivity());
- boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
- getTelecomManager().getDefaultOutgoingPhoneAccount(
- PhoneAccount.SCHEME_VOICEMAIL));
- boolean needsAccountDisambiguation = subscriptionAccountHandles.size() > 1
- && !hasUserSelectedDefault;
-
- if (needsAccountDisambiguation || isVoicemailAvailable()) {
- // On a multi-SIM phone, if the user has not selected a default
- // subscription, initiate a call to voicemail so they can select an account
- // from the "Call with" dialog.
- callVoicemail();
- } else if (getActivity() != null) {
- // Voicemail is unavailable maybe because Airplane mode is turned on.
- // Check the current status and show the most appropriate error message.
- final boolean isAirplaneModeOn =
- Settings.System.getInt(getActivity().getContentResolver(),
- Settings.System.AIRPLANE_MODE_ON, 0) != 0;
- if (isAirplaneModeOn) {
- DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
- R.string.dialog_voicemail_airplane_mode_message);
- dialogFragment.show(getFragmentManager(),
- "voicemail_request_during_airplane_mode");
- } else {
- DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
- R.string.dialog_voicemail_not_ready_message);
- dialogFragment.show(getFragmentManager(), "voicemail_not_ready");
- }
+ if (id == R.id.deleteButton) {
+ digits.clear();
+ return true;
+ } else if (id == R.id.one) {
+ if (isDigitsEmpty() || TextUtils.equals(mDigits.getText(), "1")) {
+ // We'll try to initiate voicemail and thus we want to remove irrelevant string.
+ removePreviousDigitIfPossible('1');
+
+ List<PhoneAccountHandle> subscriptionAccountHandles =
+ PhoneAccountUtils.getSubscriptionPhoneAccounts(getActivity());
+ boolean hasUserSelectedDefault = subscriptionAccountHandles.contains(
+ TelecomUtil.getDefaultOutgoingPhoneAccount(getActivity(),
+ PhoneAccount.SCHEME_VOICEMAIL));
+ boolean needsAccountDisambiguation = subscriptionAccountHandles.size() > 1
+ && !hasUserSelectedDefault;
+
+ if (needsAccountDisambiguation || isVoicemailAvailable()) {
+ // On a multi-SIM phone, if the user has not selected a default
+ // subscription, initiate a call to voicemail so they can select an account
+ // from the "Call with" dialog.
+ callVoicemail();
+ } else if (getActivity() != null) {
+ // Voicemail is unavailable maybe because Airplane mode is turned on.
+ // Check the current status and show the most appropriate error message.
+ final boolean isAirplaneModeOn =
+ Settings.System.getInt(getActivity().getContentResolver(),
+ Settings.System.AIRPLANE_MODE_ON, 0) != 0;
+ if (isAirplaneModeOn) {
+ DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
+ R.string.dialog_voicemail_airplane_mode_message);
+ dialogFragment.show(getFragmentManager(),
+ "voicemail_request_during_airplane_mode");
+ } else {
+ DialogFragment dialogFragment = ErrorDialogFragment.newInstance(
+ R.string.dialog_voicemail_not_ready_message);
+ dialogFragment.show(getFragmentManager(), "voicemail_not_ready");
}
- return true;
}
- return false;
- }
- case R.id.zero: {
- // Remove tentative input ('0') done by onTouch().
- removePreviousDigitIfPossible();
- keyPressed(KeyEvent.KEYCODE_PLUS);
-
- // Stop tone immediately
- stopTone();
- mPressedDialpadKeys.remove(view);
-
return true;
}
- case R.id.digits: {
- // Right now EditText does not show the "paste" option when cursor is not visible.
- // To show that, make the cursor visible, and return false, letting the EditText
- // show the option by itself.
- mDigits.setCursorVisible(true);
- return false;
+ return false;
+ } else if (id == R.id.zero) {
+ if (mPressedDialpadKeys.contains(view)) {
+ // If the zero key is currently pressed, then the long press occurred by touch
+ // (and not via other means like certain accessibility input methods).
+ // Remove the '0' that was input when the key was first pressed.
+ removePreviousDigitIfPossible('0');
}
+ keyPressed(KeyEvent.KEYCODE_PLUS);
+ stopTone();
+ mPressedDialpadKeys.remove(view);
+ return true;
+ } else if (id == R.id.digits) {
+ mDigits.setCursorVisible(true);
+ return false;
}
return false;
}
/**
- * Remove the digit just before the current position. This can be used if we want to replace
- * the previous digit or cancel previously entered character.
+ * Remove the digit just before the current position of the cursor, iff the following conditions
+ * are true:
+ * 1) The cursor is not positioned at index 0.
+ * 2) The digit before the current cursor position matches the current digit.
+ *
+ * @param digit to remove from the digits view.
*/
- private void removePreviousDigitIfPossible() {
+ private void removePreviousDigitIfPossible(char digit) {
final int currentPosition = mDigits.getSelectionStart();
- if (currentPosition > 0) {
+ if (currentPosition > 0 && digit == mDigits.getText().charAt(currentPosition - 1)) {
mDigits.setSelection(currentPosition);
mDigits.getText().delete(currentPosition - 1, currentPosition);
}
}
public void callVoicemail() {
- DialerUtils.startActivityWithErrorToast(getActivity(), IntentUtil.getVoicemailIntent());
+ DialerUtils.startActivityWithErrorToast(getActivity(),
+ new CallIntentBuilder(CallUtil.getVoicemailUri())
+ .setCallInitiationType(LogState.INITIATION_DIALPAD)
+ .build());
hideAndClearDialpad(false);
}
@@ -1108,9 +1106,9 @@ public class DialpadFragment extends Fragment
// Clear the digits just in case.
clearDialpad();
} else {
- final Intent intent = IntentUtil.getCallIntent(number,
- (getActivity() instanceof DialtactsActivity ?
- ((DialtactsActivity) getActivity()).getCallOrigin() : null));
+ final Intent intent = new CallIntentBuilder(number).
+ setCallInitiationType(LogState.INITIATION_DIALPAD)
+ .build();
DialerUtils.startActivityWithErrorToast(getActivity(), intent);
hideAndClearDialpad(false);
}
@@ -1391,31 +1389,20 @@ public class DialpadFragment extends Fragment
DialpadChooserAdapter.ChoiceItem item =
(DialpadChooserAdapter.ChoiceItem) parent.getItemAtPosition(position);
int itemId = item.id;
- switch (itemId) {
- case DialpadChooserAdapter.DIALPAD_CHOICE_USE_DTMF_DIALPAD:
- // Log.i(TAG, "DIALPAD_CHOICE_USE_DTMF_DIALPAD");
- // Fire off an intent to go back to the in-call UI
- // with the dialpad visible.
- returnToInCallScreen(true);
- break;
-
- case DialpadChooserAdapter.DIALPAD_CHOICE_RETURN_TO_CALL:
- // Log.i(TAG, "DIALPAD_CHOICE_RETURN_TO_CALL");
- // Fire off an intent to go back to the in-call UI
- // (with the dialpad hidden).
- returnToInCallScreen(false);
- break;
-
- case DialpadChooserAdapter.DIALPAD_CHOICE_ADD_NEW_CALL:
- // Log.i(TAG, "DIALPAD_CHOICE_ADD_NEW_CALL");
- // Ok, guess the user really did want to be here (in the
- // regular Dialer) after all. Bring back the normal Dialer UI.
- showDialpadChooser(false);
- break;
-
- default:
- Log.w(TAG, "onItemClick: unexpected itemId: " + itemId);
- break;
+ if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_USE_DTMF_DIALPAD) {// Log.i(TAG, "DIALPAD_CHOICE_USE_DTMF_DIALPAD");
+ // Fire off an intent to go back to the in-call UI
+ // with the dialpad visible.
+ returnToInCallScreen(true);
+ } else if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_RETURN_TO_CALL) {// Log.i(TAG, "DIALPAD_CHOICE_RETURN_TO_CALL");
+ // Fire off an intent to go back to the in-call UI
+ // (with the dialpad hidden).
+ returnToInCallScreen(false);
+ } else if (itemId == DialpadChooserAdapter.DIALPAD_CHOICE_ADD_NEW_CALL) {// Log.i(TAG, "DIALPAD_CHOICE_ADD_NEW_CALL");
+ // Ok, guess the user really did want to be here (in the
+ // regular Dialer) after all. Bring back the normal Dialer UI.
+ showDialpadChooser(false);
+ } else {
+ Log.w(TAG, "onItemClick: unexpected itemId: " + itemId);
}
}
@@ -1425,7 +1412,7 @@ public class DialpadFragment extends Fragment
* or "return to call" from the dialpad chooser.
*/
private void returnToInCallScreen(boolean showDialpad) {
- getTelecomManager().showInCallScreen(showDialpad);
+ TelecomUtil.showInCallScreen(getActivity(), showDialpad);
// Finally, finish() ourselves so that we don't stay on the
// activity stack.
@@ -1442,8 +1429,12 @@ public class DialpadFragment extends Fragment
* @return true if the phone is "in use", meaning that at least one line
* is active (ie. off hook or ringing or dialing, or on hold).
*/
- public boolean isPhoneInUse() {
- return getTelecomManager().isInCall();
+ private boolean isPhoneInUse() {
+ final Context context = getActivity();
+ if (context != null) {
+ return TelecomUtil.isInCall(context);
+ }
+ return false;
}
/**
@@ -1455,19 +1446,19 @@ public class DialpadFragment extends Fragment
@Override
public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_2s_pause:
- updateDialString(PAUSE);
- return true;
- case R.id.menu_add_wait:
- updateDialString(WAIT);
- return true;
- case R.id.menu_call_with_note:
- CallSubjectDialog.start(getActivity(), mDigits.getText().toString());
- hideAndClearDialpad(false);
- return true;
- default:
- return false;
+ int resId = item.getItemId();
+ if (resId == R.id.menu_2s_pause) {
+ updateDialString(PAUSE);
+ return true;
+ } else if (resId == R.id.menu_add_wait) {
+ updateDialString(WAIT);
+ return true;
+ } else if (resId == R.id.menu_call_with_note) {
+ CallSubjectDialog.start(getActivity(), mDigits.getText().toString());
+ hideAndClearDialpad(false);
+ return true;
+ } else {
+ return false;
}
}
@@ -1538,20 +1529,19 @@ public class DialpadFragment extends Fragment
*
* @return true if voicemail is enabled and accessible. Note that this can be false
* "temporarily" after the app boot.
- * @see TelecomManager#getVoiceMailNumber(PhoneAccountHandle)
*/
private boolean isVoicemailAvailable() {
try {
PhoneAccountHandle defaultUserSelectedAccount =
- getTelecomManager().getDefaultOutgoingPhoneAccount(
+ TelecomUtil.getDefaultOutgoingPhoneAccount(getActivity(),
PhoneAccount.SCHEME_VOICEMAIL);
if (defaultUserSelectedAccount == null) {
// In a single-SIM phone, there is no default outgoing phone account selected by
// the user, so just call TelephonyManager#getVoicemailNumber directly.
return !TextUtils.isEmpty(getTelephonyManager().getVoiceMailNumber());
} else {
- return !TextUtils.isEmpty(
- getTelecomManager().getVoiceMailNumber(defaultUserSelectedAccount));
+ return !TextUtils.isEmpty(TelecomUtil.getVoicemailNumber(getActivity(),
+ defaultUserSelectedAccount));
}
} catch (SecurityException se) {
// Possibly no READ_PHONE_STATE privilege.
@@ -1635,7 +1625,7 @@ public class DialpadFragment extends Fragment
}
private Intent newFlashIntent() {
- final Intent intent = IntentUtil.getCallIntent(EMPTY_NUMBER);
+ final Intent intent = new CallIntentBuilder(EMPTY_NUMBER).build();
intent.putExtra(EXTRA_SEND_EMPTY_FLASH, true);
return intent;
}
diff --git a/src/com/android/dialer/dialpad/SmartDialCursorLoader.java b/src/com/android/dialer/dialpad/SmartDialCursorLoader.java
index f83f18cd7..93b649b6d 100644
--- a/src/com/android/dialer/dialpad/SmartDialCursorLoader.java
+++ b/src/com/android/dialer/dialpad/SmartDialCursorLoader.java
@@ -102,6 +102,7 @@ public class SmartDialCursorLoader extends AsyncTaskLoader<Cursor> {
row[PhoneQuery.LOOKUP_KEY] = contact.lookupKey;
row[PhoneQuery.PHOTO_ID] = contact.photoId;
row[PhoneQuery.DISPLAY_NAME] = contact.displayName;
+ row[PhoneQuery.CARRIER_PRESENCE] = contact.carrierPresence;
cursor.addRow(row);
}
return cursor;
diff --git a/src/com/android/dialer/dialpad/SmartDialNameMatcher.java b/src/com/android/dialer/dialpad/SmartDialNameMatcher.java
index 01268641d..a54fe1618 100644
--- a/src/com/android/dialer/dialpad/SmartDialNameMatcher.java
+++ b/src/com/android/dialer/dialpad/SmartDialNameMatcher.java
@@ -16,6 +16,7 @@
package com.android.dialer.dialpad;
+import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.android.dialer.dialpad.SmartDialPrefix.PhoneNumberTokens;
@@ -123,7 +124,11 @@ public class SmartDialNameMatcher {
* SmartDialMatchPosition with the matching positions otherwise
*/
@VisibleForTesting
+ @Nullable
public SmartDialMatchPosition matchesNumber(String phoneNumber, String query, boolean useNanp) {
+ if (TextUtils.isEmpty(phoneNumber)) {
+ return null;
+ }
StringBuilder builder = new StringBuilder();
constructEmptyMask(builder, phoneNumber.length());
mPhoneNumberMatchMask = builder.toString();
diff --git a/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
new file mode 100644
index 000000000..3c60a967b
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/BlockNumberDialogFragment.java
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.filterednumber;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.FragmentManager;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.design.widget.Snackbar;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.Toast;
+
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.R;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
+import com.android.dialer.voicemail.VisualVoicemailEnabledChecker;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+
+/**
+ * Fragment for confirming and enacting blocking/unblocking a number. Also invokes snackbar
+ * providing undo functionality.
+ */
+public class BlockNumberDialogFragment extends DialogFragment {
+
+ /**
+ * Use a callback interface to update UI after success/undo. Favor this approach over other
+ * more standard paradigms because of the variety of scenarios in which the DialogFragment
+ * can be invoked (by an Activity, by a fragment, by an adapter, by an adapter list item).
+ * Because of this, we do NOT support retaining state on rotation, and will dismiss the dialog
+ * upon rotation instead.
+ */
+ public interface Callback {
+ /**
+ * Called when a number is successfully added to the set of filtered numbers
+ */
+ void onFilterNumberSuccess();
+
+ /**
+ * Called when a number is successfully removed from the set of filtered numbers
+ */
+ void onUnfilterNumberSuccess();
+
+ /**
+ * Called when the action of filtering or unfiltering a number is undone
+ */
+ void onChangeFilteredNumberUndo();
+ }
+
+ private static final String BLOCK_DIALOG_FRAGMENT = "BlockNumberDialog";
+
+ private static final String ARG_BLOCK_ID = "argBlockId";
+ private static final String ARG_NUMBER = "argNumber";
+ private static final String ARG_COUNTRY_ISO = "argCountryIso";
+ private static final String ARG_DISPLAY_NUMBER = "argDisplayNumber";
+ private static final String ARG_PARENT_VIEW_ID = "parentViewId";
+
+ private String mNumber;
+ private String mDisplayNumber;
+ private String mCountryIso;
+
+ private FilteredNumberAsyncQueryHandler mHandler;
+ private View mParentView;
+ private VisualVoicemailEnabledChecker mVoicemailEnabledChecker;
+ private Callback mCallback;
+
+ public static void show(
+ Integer blockId,
+ String number,
+ String countryIso,
+ String displayNumber,
+ Integer parentViewId,
+ FragmentManager fragmentManager,
+ Callback callback) {
+ final BlockNumberDialogFragment newFragment = BlockNumberDialogFragment.newInstance(
+ blockId, number, countryIso, displayNumber, parentViewId);
+
+ newFragment.setCallback(callback);
+ newFragment.show(fragmentManager, BlockNumberDialogFragment.BLOCK_DIALOG_FRAGMENT);
+ }
+
+ private static BlockNumberDialogFragment newInstance(
+ Integer blockId,
+ String number,
+ String countryIso,
+ String displayNumber,
+ Integer parentViewId) {
+ final BlockNumberDialogFragment fragment = new BlockNumberDialogFragment();
+ final Bundle args = new Bundle();
+ if (blockId != null) {
+ args.putInt(ARG_BLOCK_ID, blockId.intValue());
+ }
+ if (parentViewId != null) {
+ args.putInt(ARG_PARENT_VIEW_ID, parentViewId.intValue());
+ }
+ args.putString(ARG_NUMBER, number);
+ args.putString(ARG_COUNTRY_ISO, countryIso);
+ args.putString(ARG_DISPLAY_NUMBER, displayNumber);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ super.onCreateDialog(savedInstanceState);
+ final boolean isBlocked = getArguments().containsKey(ARG_BLOCK_ID);
+
+ mNumber = getArguments().getString(ARG_NUMBER);
+ mDisplayNumber = getArguments().getString(ARG_DISPLAY_NUMBER);
+ mCountryIso = getArguments().getString(ARG_COUNTRY_ISO);
+
+ if (TextUtils.isEmpty(mDisplayNumber)) {
+ mDisplayNumber = mNumber;
+ }
+
+ mHandler = new FilteredNumberAsyncQueryHandler(getContext().getContentResolver());
+ mVoicemailEnabledChecker = new VisualVoicemailEnabledChecker(getActivity(), null);
+ /**
+ * Choose not to update VoicemailEnabledChecker, as checks should already been done in
+ * all current use cases.
+ */
+ mParentView = getActivity().findViewById(getArguments().getInt(ARG_PARENT_VIEW_ID));
+
+ CharSequence title;
+ String okText;
+ String message;
+ if (isBlocked) {
+ title = null;
+ okText = getString(R.string.unblock_number_ok);
+ message = ContactDisplayUtils.getTtsSpannedPhoneNumber(getResources(),
+ R.string.unblock_number_confirmation_title,
+ mDisplayNumber).toString();
+ } else {
+ title = ContactDisplayUtils.getTtsSpannedPhoneNumber(getResources(),
+ R.string.block_number_confirmation_title,
+ mDisplayNumber);
+ okText = getString(R.string.block_number_ok);
+ if (FilteredNumberCompat.useNewFiltering()) {
+ message = getString(R.string.block_number_confirmation_message_new_filtering);
+ } else if (mVoicemailEnabledChecker.isVisualVoicemailEnabled()) {
+ message = getString(R.string.block_number_confirmation_message_vvm);
+ } else {
+ message = getString(R.string.block_number_confirmation_message_no_vvm);
+ }
+ }
+
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
+ .setTitle(title)
+ .setMessage(message)
+ .setPositiveButton(okText, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ if (isBlocked) {
+ unblockNumber();
+ } else {
+ blockNumber();
+ }
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null);
+ return builder.create();
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ if (!FilteredNumbersUtil.canBlockNumber(getActivity(), mNumber, mCountryIso)) {
+ dismiss();
+ Toast.makeText(getContext(),
+ ContactDisplayUtils.getTtsSpannedPhoneNumber(
+ getResources(), R.string.invalidNumber, mDisplayNumber),
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ // Dismiss on rotation.
+ dismiss();
+ mCallback = null;
+
+ super.onPause();
+ }
+
+ public void setCallback(Callback callback) {
+ mCallback = callback;
+ }
+
+ private CharSequence getBlockedMessage() {
+ return ContactDisplayUtils.getTtsSpannedPhoneNumber(getResources(),
+ R.string.snackbar_number_blocked, mDisplayNumber);
+ }
+
+ private CharSequence getUnblockedMessage() {
+ return ContactDisplayUtils.getTtsSpannedPhoneNumber(getResources(),
+ R.string.snackbar_number_unblocked, mDisplayNumber);
+ }
+
+ private int getActionTextColor() {
+ return getContext().getResources().getColor(R.color.dialer_snackbar_action_text_color);
+ }
+
+ private void blockNumber() {
+ final CharSequence message = getBlockedMessage();
+ final CharSequence undoMessage = getUnblockedMessage();
+ final Callback callback = mCallback;
+ final int actionTextColor = getActionTextColor();
+ final Context context = getContext();
+
+ final OnUnblockNumberListener onUndoListener = new OnUnblockNumberListener() {
+ @Override
+ public void onUnblockComplete(int rows, ContentValues values) {
+ Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
+ if (callback != null) {
+ callback.onChangeFilteredNumberUndo();
+ }
+ }
+ };
+
+ final OnBlockNumberListener onBlockNumberListener = new OnBlockNumberListener() {
+ @Override
+ public void onBlockComplete(final Uri uri) {
+ final View.OnClickListener undoListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ // Delete the newly created row on 'undo'.
+ Logger.logInteraction(InteractionEvent.UNDO_BLOCK_NUMBER);
+ mHandler.unblock(onUndoListener, uri);
+ }
+ };
+
+ Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
+ .setAction(R.string.block_number_undo, undoListener)
+ .setActionTextColor(actionTextColor)
+ .show();
+
+ if (callback != null) {
+ callback.onFilterNumberSuccess();
+ }
+
+ if (context != null && FilteredNumbersUtil.hasRecentEmergencyCall(context)) {
+ FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(context);
+ }
+ }
+ };
+
+ mHandler.blockNumber(
+ onBlockNumberListener,
+ mNumber,
+ mCountryIso);
+ }
+
+ private void unblockNumber() {
+ final CharSequence message = getUnblockedMessage();
+ final CharSequence undoMessage = getBlockedMessage();
+ final Callback callback = mCallback;
+ final int actionTextColor = getActionTextColor();
+
+ final OnBlockNumberListener onUndoListener = new OnBlockNumberListener() {
+ @Override
+ public void onBlockComplete(final Uri uri) {
+ Snackbar.make(mParentView, undoMessage, Snackbar.LENGTH_LONG).show();
+ if (callback != null) {
+ callback.onChangeFilteredNumberUndo();
+ }
+ }
+ };
+
+ mHandler.unblock(new OnUnblockNumberListener() {
+ @Override
+ public void onUnblockComplete(int rows, final ContentValues values) {
+ final View.OnClickListener undoListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ // Re-insert the row on 'undo', with a new ID.
+ Logger.logInteraction(InteractionEvent.UNDO_UNBLOCK_NUMBER);
+ mHandler.blockNumber(onUndoListener, values);
+ }
+ };
+
+ Snackbar.make(mParentView, message, Snackbar.LENGTH_LONG)
+ .setAction(R.string.block_number_undo, undoListener)
+ .setActionTextColor(actionTextColor)
+ .show();
+
+ if (callback != null) {
+ callback.onUnfilterNumberSuccess();
+ }
+ }
+ }, getArguments().getInt(ARG_BLOCK_ID));
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
new file mode 100644
index 000000000..10a4f5abd
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersAdapter.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import android.app.FragmentManager;
+import android.content.Context;
+import android.database.Cursor;
+import android.telephony.PhoneNumberUtils;
+import android.view.View;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.GeoUtil;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+
+public class BlockedNumbersAdapter extends NumbersAdapter {
+
+ private BlockedNumbersAdapter(
+ Context context,
+ FragmentManager fragmentManager,
+ ContactInfoHelper contactInfoHelper,
+ ContactPhotoManager contactPhotoManager) {
+ super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
+ }
+
+ public static BlockedNumbersAdapter newBlockedNumbersAdapter(
+ Context context, FragmentManager fragmentManager) {
+ return new BlockedNumbersAdapter(
+ context,
+ fragmentManager,
+ new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
+ ContactPhotoManager.getInstance(context));
+ }
+
+ @Override
+ public void bindView(View view, final Context context, Cursor cursor) {
+ super.bindView(view, context, cursor);
+ final Integer id = cursor.getInt(cursor.getColumnIndex(FilteredNumberColumns._ID));
+ final String countryIso = cursor.getString(cursor.getColumnIndex(
+ FilteredNumberColumns.COUNTRY_ISO));
+ final String number = cursor.getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER));
+ final String normalizedNumber = cursor.getString(cursor.getColumnIndex(
+ FilteredNumberColumns.NORMALIZED_NUMBER));
+
+ final View deleteButton = view.findViewById(R.id.delete_button);
+ deleteButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ BlockNumberDialogFragment.show(
+ id,
+ number,
+ countryIso,
+ PhoneNumberUtils.formatNumber(number, countryIso),
+ R.id.blocked_numbers_activity_container,
+ getFragmentManager(),
+ new BlockNumberDialogFragment.Callback() {
+ @Override
+ public void onFilterNumberSuccess() {}
+
+ @Override
+ public void onUnfilterNumberSuccess() {
+ Logger.logInteraction(
+ InteractionEvent.UNBLOCK_NUMBER_MANAGEMENT_SCREEN);
+ }
+
+ @Override
+ public void onChangeFilteredNumberUndo() {}
+ });
+ }
+ });
+
+ updateView(view, number, countryIso);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ // Always return false, so that the header with blocking-related options always shows.
+ return false;
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigrator.java b/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigrator.java
new file mode 100644
index 000000000..ed0faabbe
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigrator.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import com.google.common.base.Preconditions;
+
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+
+/**
+ * Class responsible for checking if the user can be auto-migrated to {@link
+ * android.provider.BlockedNumberContract} blocking. In order for this to happen, the user cannot
+ * have any numbers that are blocked in the Dialer solution.
+ */
+public class BlockedNumbersAutoMigrator {
+
+ private static final String TAG = "BlockedNumbersAuto";
+
+ private static final String HAS_CHECKED_AUTO_MIGRATE_KEY = "checkedAutoMigrate";
+
+ private final SharedPreferences sharedPreferences;
+ private final FilteredNumberAsyncQueryHandler queryHandler;
+
+ /**
+ * Constructs the BlockedNumbersAutoMigrator with the given {@link SharedPreferences} and {@link
+ * FilteredNumberAsyncQueryHandler}.
+ *
+ * @param sharedPreferences The SharedPreferences used to persist information.
+ * @param queryHandler The FilteredNumberAsyncQueryHandler used to determine if there are
+ * blocked numbers.
+ * @throws NullPointerException if sharedPreferences or queryHandler are null.
+ */
+ public BlockedNumbersAutoMigrator(SharedPreferences sharedPreferences,
+ FilteredNumberAsyncQueryHandler queryHandler) {
+ this.sharedPreferences = Preconditions.checkNotNull(sharedPreferences);
+ this.queryHandler = Preconditions.checkNotNull(queryHandler);
+ }
+
+ /**
+ * Attempts to perform the auto-migration. Auto-migration will only be attempted once and can be
+ * performed only when the user has no blocked numbers. As a result of this method, the user
+ * will be migrated to the framework blocking solution, as determined by {@link
+ * FilteredNumberCompat#hasMigratedToNewBlocking()}.
+ */
+ public void autoMigrate() {
+ if (!shouldAttemptAutoMigrate()) {
+ return;
+ }
+
+ Log.i(TAG, "Attempting to auto-migrate.");
+ queryHandler.hasBlockedNumbers(new OnHasBlockedNumbersListener() {
+ @Override
+ public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
+ if (hasBlockedNumbers) {
+ Log.i(TAG, "Not auto-migrating: blocked numbers exist.");
+ return;
+ }
+ Log.i(TAG, "Auto-migrating: no blocked numbers.");
+ FilteredNumberCompat.setHasMigratedToNewBlocking(true);
+ }
+ });
+ }
+
+ private boolean shouldAttemptAutoMigrate() {
+ if (sharedPreferences.contains(HAS_CHECKED_AUTO_MIGRATE_KEY)) {
+ Log.d(TAG, "Not attempting auto-migrate: already checked once.");
+ return false;
+ }
+ Log.i(TAG, "Updating state as already checked for auto-migrate.");
+ sharedPreferences.edit().putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY, true).apply();
+
+ if (!FilteredNumberCompat.canUseNewFiltering()) {
+ Log.i(TAG, "Not attempting auto-migrate: not available.");
+ return false;
+ }
+
+ if (FilteredNumberCompat.hasMigratedToNewBlocking()) {
+ Log.i(TAG, "Not attempting auto-migrate: already migrated.");
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
new file mode 100644
index 000000000..b64f18691
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersFragment.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import com.google.common.base.MoreObjects;
+
+import android.app.ListFragment;
+import android.app.LoaderManager;
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import android.support.v4.app.ActivityCompat;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.contacts.common.lettertiles.LetterTileDrawable;
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.R;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberContract;
+import com.android.dialer.filterednumber.BlockedNumbersMigrator.Listener;
+import com.android.dialer.filterednumber.FilteredNumbersUtil.CheckForSendToVoicemailContactListener;
+import com.android.dialer.filterednumber.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
+import com.android.dialer.voicemail.VisualVoicemailEnabledChecker;
+
+public class BlockedNumbersFragment extends ListFragment
+ implements LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener,
+ VisualVoicemailEnabledChecker.Callback {
+ private static final char ADD_BLOCKED_NUMBER_ICON_LETTER = '+';
+
+ private BlockedNumbersMigrator blockedNumbersMigratorForTest;
+ protected View migratePromoView;
+ private TextView blockedNumbersText;
+ private TextView footerText;
+ private BlockedNumbersAdapter mAdapter;
+ private VisualVoicemailEnabledChecker mVoicemailEnabledChecker;
+ private View mImportSettings;
+ private View mBlockedNumbersDisabledForEmergency;
+ private View mBlockedNumberListDivider;
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ LayoutInflater inflater =
+ (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ getListView().addHeaderView(inflater.inflate(R.layout.blocked_number_header, null));
+ getListView().addFooterView(inflater.inflate(R.layout.blocked_number_footer, null));
+ //replace the icon for add number with LetterTileDrawable(), so it will have identical style
+ ImageView addNumberIcon = (ImageView) getActivity().findViewById(R.id.add_number_icon);
+ LetterTileDrawable drawable = new LetterTileDrawable(getResources());
+ drawable.setLetter(ADD_BLOCKED_NUMBER_ICON_LETTER);
+ drawable.setColor(ActivityCompat.getColor(getActivity(),
+ R.color.add_blocked_number_icon_color));
+ drawable.setIsCircular(true);
+ addNumberIcon.setImageDrawable(drawable);
+
+ if (mAdapter == null) {
+ mAdapter = BlockedNumbersAdapter.newBlockedNumbersAdapter(
+ getContext(), getActivity().getFragmentManager());
+ }
+ setListAdapter(mAdapter);
+
+ blockedNumbersText = (TextView) getListView().findViewById(R.id.blocked_number_text_view);
+ migratePromoView = getListView().findViewById(R.id.migrate_promo);
+ getListView().findViewById(R.id.migrate_promo_allow_button).setOnClickListener(this);
+ mImportSettings = getListView().findViewById(R.id.import_settings);
+ mBlockedNumbersDisabledForEmergency =
+ getListView().findViewById(R.id.blocked_numbers_disabled_for_emergency);
+ mBlockedNumberListDivider = getActivity().findViewById(R.id.blocked_number_list_divider);
+ getListView().findViewById(R.id.import_button).setOnClickListener(this);
+ getListView().findViewById(R.id.view_numbers_button).setOnClickListener(this);
+ getListView().findViewById(R.id.add_number_linear_layout).setOnClickListener(this);
+
+ footerText = (TextView) getActivity().findViewById(
+ R.id.blocked_number_footer_textview);
+ mVoicemailEnabledChecker = new VisualVoicemailEnabledChecker(getContext(),this);
+ mVoicemailEnabledChecker.asyncUpdate();
+ updateActiveVoicemailProvider();
+ }
+
+ @Override
+ public void onDestroy() {
+ setListAdapter(null);
+ super.onDestroy();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getLoaderManager().initLoader(0, null, this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
+ ColorDrawable backgroundDrawable = new ColorDrawable(
+ ActivityCompat.getColor(getActivity(), R.color.dialer_theme_color));
+ actionBar.setBackgroundDrawable(backgroundDrawable);
+ actionBar.setDisplayShowCustomEnabled(false);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setTitle(R.string.manage_blocked_numbers_label);
+
+ // If the device can use the framework blocking solution, users should not be able to add
+ // new blocked numbers from the Blocked Management UI. They will be shown a promo card
+ // asking them to migrate to new blocking instead.
+ if (FilteredNumberCompat.canUseNewFiltering()) {
+ migratePromoView.setVisibility(View.VISIBLE);
+ blockedNumbersText.setVisibility(View.GONE);
+ getListView().findViewById(R.id.add_number_linear_layout).setVisibility(View.GONE);
+ getListView().findViewById(R.id.add_number_linear_layout).setOnClickListener(null);
+ mBlockedNumberListDivider.setVisibility(View.GONE);
+ mImportSettings.setVisibility(View.GONE);
+ getListView().findViewById(R.id.import_button).setOnClickListener(null);
+ getListView().findViewById(R.id.view_numbers_button).setOnClickListener(null);
+ mBlockedNumbersDisabledForEmergency.setVisibility(View.GONE);
+ footerText.setVisibility(View.GONE);
+ } else {
+ FilteredNumbersUtil.checkForSendToVoicemailContact(
+ getActivity(), new CheckForSendToVoicemailContactListener() {
+ @Override
+ public void onComplete(boolean hasSendToVoicemailContact) {
+ final int visibility =
+ hasSendToVoicemailContact ? View.VISIBLE : View.GONE;
+ mImportSettings.setVisibility(visibility);
+ }
+ });
+ }
+
+ // All views except migrate and the block list are hidden when new filtering is available
+ if (!FilteredNumberCompat.canUseNewFiltering()
+ && FilteredNumbersUtil.hasRecentEmergencyCall(getContext())) {
+ mBlockedNumbersDisabledForEmergency.setVisibility(View.VISIBLE);
+ } else {
+ mBlockedNumbersDisabledForEmergency.setVisibility(View.GONE);
+ }
+
+ mVoicemailEnabledChecker.asyncUpdate();
+ }
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.blocked_number_fragment, container, false);
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ final String[] projection = {
+ FilteredNumberContract.FilteredNumberColumns._ID,
+ FilteredNumberContract.FilteredNumberColumns.COUNTRY_ISO,
+ FilteredNumberContract.FilteredNumberColumns.NUMBER,
+ FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER
+ };
+ final String selection = FilteredNumberContract.FilteredNumberColumns.TYPE
+ + "=" + FilteredNumberContract.FilteredNumberTypes.BLOCKED_NUMBER;
+ return new CursorLoader(
+ getContext(), FilteredNumberContract.FilteredNumber.CONTENT_URI, projection,
+ selection, null, null);
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ mAdapter.swapCursor(data);
+ if (FilteredNumberCompat.canUseNewFiltering() || data.getCount() == 0) {
+ mBlockedNumberListDivider.setVisibility(View.INVISIBLE);
+ } else {
+ mBlockedNumberListDivider.setVisibility(View.VISIBLE);
+ }
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ mAdapter.swapCursor(null);
+ }
+
+ @Override
+ public void onClick(final View view) {
+ final BlockedNumbersSettingsActivity activity =
+ (BlockedNumbersSettingsActivity) getActivity();
+ if (activity == null) {
+ return;
+ }
+
+ int resId = view.getId();
+ if (resId == R.id.add_number_linear_layout) {
+ activity.showSearchUi();
+ } else if (resId == R.id.view_numbers_button) {
+ activity.showNumbersToImportPreviewUi();
+ } else if (resId == R.id.import_button) {
+ FilteredNumbersUtil.importSendToVoicemailContacts(activity,
+ new ImportSendToVoicemailContactsListener() {
+ @Override
+ public void onImportComplete() {
+ mImportSettings.setVisibility(View.GONE);
+ }
+ });
+ } else if (resId == R.id.migrate_promo_allow_button) {
+ view.setEnabled(false);
+ MoreObjects.firstNonNull(blockedNumbersMigratorForTest,
+ new BlockedNumbersMigrator(getContext().getContentResolver()))
+ .migrate(new Listener() {
+ @Override
+ public void onComplete() {
+ getContext().startActivity(
+ FilteredNumberCompat.createManageBlockedNumbersIntent(getContext()));
+ // Remove this activity from the backstack
+ activity.finish();
+ }
+ });
+ }
+ }
+
+ @Override
+ public void onVisualVoicemailEnabledStatusChanged(boolean newStatus){
+ updateActiveVoicemailProvider();
+ }
+
+ private void updateActiveVoicemailProvider(){
+ if (getActivity() == null || getActivity().isFinishing()) {
+ return;
+ }
+ if (mVoicemailEnabledChecker.isVisualVoicemailEnabled()) {
+ footerText.setText(R.string.block_number_footer_message_vvm);
+ } else {
+ footerText.setText(R.string.block_number_footer_message_no_vvm);
+ }
+ }
+
+ @NeededForTesting
+ void setBlockedNumbersMigratorForTest(BlockedNumbersMigrator blockedNumbersMigrator) {
+ blockedNumbersMigratorForTest = blockedNumbersMigrator;
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersMigrator.java b/src/com/android/dialer/filterednumber/BlockedNumbersMigrator.java
new file mode 100644
index 000000000..373403046
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersMigrator.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import com.google.common.base.Preconditions;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.os.AsyncTask;
+
+import com.android.dialer.compat.BlockedNumbersSdkCompat;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberContract;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.incallui.Log;
+
+/**
+ * Class which should be used to migrate numbers from {@link FilteredNumberContract} blocking to
+ * {@link android.provider.BlockedNumberContract} blocking.
+ */
+public class BlockedNumbersMigrator {
+
+ private static final String TAG = "BlockedNumbersMigrator";
+
+ /**
+ * Listener for the operation to migrate from {@link FilteredNumberContract} blocking to
+ * {@link android.provider.BlockedNumberContract} blocking.
+ */
+ public interface Listener {
+
+ /**
+ * Called when the migration operation is finished.
+ */
+ void onComplete();
+ }
+
+ private final ContentResolver mContentResolver;
+
+ /**
+ * Creates a new BlockedNumbersMigrate, using the given {@link ContentResolver} to perform
+ * queries against the blocked numbers tables.
+ *
+ * @param contentResolver The ContentResolver
+ * @throws NullPointerException if contentResolver is null
+ */
+ public BlockedNumbersMigrator(ContentResolver contentResolver) {
+ mContentResolver = Preconditions.checkNotNull(contentResolver);
+ }
+
+ /**
+ * Copies all of the numbers in the {@link FilteredNumberContract} block list to the
+ * {@link android.provider.BlockedNumberContract} block list.
+ *
+ * @param listener {@link Listener} called once the migration is complete.
+ * @return {@code true} if the migrate can be attempted, {@code false} otherwise.
+ * @throws NullPointerException if listener is null
+ */
+ public boolean migrate(final Listener listener) {
+ Log.i(TAG, "migrate - start");
+ if (!FilteredNumberCompat.canUseNewFiltering()) {
+ Log.i(TAG, "migrate - can't use new filtering");
+ return false;
+ }
+ Preconditions.checkNotNull(listener);
+ new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ Log.i(TAG, "migrate - start background migration");
+ return migrateToNewBlockingInBackground(mContentResolver);
+ }
+
+ @Override
+ protected void onPostExecute(Boolean isSuccessful) {
+ Log.i(TAG, "migrate - marking migration complete");
+ FilteredNumberCompat.setHasMigratedToNewBlocking(isSuccessful);
+ Log.i(TAG, "migrate - calling listener");
+ listener.onComplete();
+ }
+ }.execute();
+ return true;
+ }
+
+ private static boolean migrateToNewBlockingInBackground(ContentResolver resolver) {
+ try (Cursor cursor = resolver.query(FilteredNumber.CONTENT_URI,
+ new String[]{FilteredNumberColumns.NUMBER}, null, null, null)) {
+ if (cursor == null) {
+ Log.i(TAG, "migrate - cursor was null");
+ return false;
+ }
+
+ Log.i(TAG, "migrate - attempting to migrate " + cursor.getCount() + "numbers");
+
+ int numMigrated = 0;
+ while (cursor.moveToNext()) {
+ String originalNumber = cursor
+ .getString(cursor.getColumnIndex(FilteredNumberColumns.NUMBER));
+ if (isNumberInNewBlocking(resolver, originalNumber)) {
+ Log.i(TAG, "migrate - number was already blocked in new blocking");
+ continue;
+ }
+ ContentValues values = new ContentValues();
+ values.put(BlockedNumbersSdkCompat.COLUMN_ORIGINAL_NUMBER, originalNumber);
+ resolver.insert(BlockedNumbersSdkCompat.CONTENT_URI, values);
+ ++numMigrated;
+ }
+ Log.i(TAG, "migrate - migration complete. " + numMigrated + " numbers migrated.");
+ return true;
+ }
+ }
+
+ private static boolean isNumberInNewBlocking(ContentResolver resolver, String originalNumber) {
+ try (Cursor cursor = resolver.query(BlockedNumbersSdkCompat.CONTENT_URI,
+ new String[]{BlockedNumbersSdkCompat._ID},
+ BlockedNumbersSdkCompat.COLUMN_ORIGINAL_NUMBER + " = ?",
+ new String[] {originalNumber}, null)) {
+ return cursor != null && cursor.getCount() != 0;
+ }
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
new file mode 100644
index 000000000..5ce9d21f1
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/BlockedNumbersSettingsActivity.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.MenuItem;
+import android.widget.FrameLayout;
+import android.widget.FrameLayout.LayoutParams;
+import android.widget.Toast;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.dialog.IndeterminateProgressDialog;
+import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
+import com.android.dialer.R;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.list.BlockedListSearchAdapter;
+import com.android.dialer.list.OnListFragmentScrolledListener;
+import com.android.dialer.list.BlockedListSearchFragment;
+import com.android.dialer.list.SearchFragment;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
+
+public class BlockedNumbersSettingsActivity extends AppCompatActivity
+ implements SearchFragment.HostInterface {
+
+ private static final String TAG_BLOCKED_MANAGEMENT_FRAGMENT = "blocked_management";
+ private static final String TAG_BLOCKED_SEARCH_FRAGMENT = "blocked_search";
+ private static final String TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT = "view_numbers_to_import";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.blocked_numbers_activity);
+
+ // If savedInstanceState != null, the Activity will automatically restore the last fragment.
+ if (savedInstanceState == null) {
+ showManagementUi();
+ }
+ }
+
+ /**
+ * Shows fragment with the list of currently blocked numbers and settings related to blocking.
+ */
+ public void showManagementUi() {
+ BlockedNumbersFragment fragment = (BlockedNumbersFragment) getFragmentManager()
+ .findFragmentByTag(TAG_BLOCKED_MANAGEMENT_FRAGMENT);
+ if (fragment == null) {
+ fragment = new BlockedNumbersFragment();
+ }
+
+ getFragmentManager().beginTransaction()
+ .replace(R.id.blocked_numbers_activity_container, fragment,
+ TAG_BLOCKED_MANAGEMENT_FRAGMENT)
+ .commit();
+
+ Logger.logScreenView(ScreenEvent.BLOCKED_NUMBER_MANAGEMENT, this);
+ }
+
+ /**
+ * Shows fragment with search UI for browsing/finding numbers to block.
+ */
+ public void showSearchUi() {
+ BlockedListSearchFragment fragment = (BlockedListSearchFragment) getFragmentManager()
+ .findFragmentByTag(TAG_BLOCKED_SEARCH_FRAGMENT);
+ if (fragment == null) {
+ fragment = new BlockedListSearchFragment();
+ fragment.setHasOptionsMenu(false);
+ fragment.setShowEmptyListForNullQuery(true);
+ fragment.setDirectorySearchEnabled(false);
+ }
+
+ getFragmentManager().beginTransaction()
+ .replace(R.id.blocked_numbers_activity_container, fragment,
+ TAG_BLOCKED_SEARCH_FRAGMENT)
+ .addToBackStack(null)
+ .commit();
+
+ Logger.logScreenView(ScreenEvent.BLOCKED_NUMBER_ADD_NUMBER, this);
+ }
+
+ /**
+ * Shows fragment with UI to preview the numbers of contacts currently marked as
+ * send-to-voicemail in Contacts. These numbers can be imported into Dialer's blocked number
+ * list.
+ */
+ public void showNumbersToImportPreviewUi() {
+ ViewNumbersToImportFragment fragment = (ViewNumbersToImportFragment) getFragmentManager()
+ .findFragmentByTag(TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT);
+ if (fragment == null) {
+ fragment = new ViewNumbersToImportFragment();
+ }
+
+ getFragmentManager().beginTransaction()
+ .replace(R.id.blocked_numbers_activity_container, fragment,
+ TAG_VIEW_NUMBERS_TO_IMPORT_FRAGMENT)
+ .addToBackStack(null)
+ .commit();
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onBackPressed() {
+ // TODO: Achieve back navigation without overriding onBackPressed.
+ if (getFragmentManager().getBackStackEntryCount() > 0) {
+ getFragmentManager().popBackStack();
+ } else {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ public boolean isActionBarShowing() {
+ return false;
+ }
+
+ @Override
+ public boolean isDialpadShown() {
+ return false;
+ }
+
+ @Override
+ public int getDialpadHeight() {
+ return 0;
+ }
+
+ @Override
+ public int getActionBarHideOffset() {
+ return 0;
+ }
+
+ @Override
+ public int getActionBarHeight() {
+ return 0;
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
new file mode 100644
index 000000000..498b10a45
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/FilteredNumbersUtil.java
@@ -0,0 +1,368 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.AsyncTask;
+import android.preference.PreferenceManager;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.Contacts;
+import android.provider.Settings;
+import android.telephony.PhoneNumberUtils;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.R;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Utility to help with tasks related to filtered numbers.
+ */
+public class FilteredNumbersUtil {
+
+ // Disable incoming call blocking if there was a call within the past 2 days.
+ private static final long RECENT_EMERGENCY_CALL_THRESHOLD_MS = 1000 * 60 * 60 * 24 * 2;
+
+ // Pref key for storing the time of end of the last emergency call in milliseconds after epoch.
+ protected static final String LAST_EMERGENCY_CALL_MS_PREF_KEY = "last_emergency_call_ms";
+
+ // Pref key for storing whether a notification has been dispatched to notify the user that call
+ // blocking has been disabled because of a recent emergency call.
+ protected static final String NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY =
+ "notified_call_blocking_disabled_by_emergency_call";
+
+ public static final String CALL_BLOCKING_NOTIFICATION_TAG = "call_blocking";
+ public static final int CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID = 10;
+
+ /**
+ * Used for testing to specify that a custom threshold should be used instead of the default.
+ * This custom threshold will only be used when setting this log tag to VERBOSE:
+ *
+ * adb shell setprop log.tag.DebugEmergencyCall VERBOSE
+ *
+ */
+ @NeededForTesting
+ private static final String DEBUG_EMERGENCY_CALL_TAG = "DebugEmergencyCall";
+
+ /**
+ * Used for testing to specify the custom threshold value, in milliseconds for whether an
+ * emergency call is "recent". The default value will be used if this custom threshold is less
+ * than zero. For example, to set this threshold to 60 seconds:
+ *
+ * adb shell settings put system dialer_emergency_call_threshold_ms 60000
+ *
+ */
+ @NeededForTesting
+ private static final String RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY =
+ "dialer_emergency_call_threshold_ms";
+
+ public interface CheckForSendToVoicemailContactListener {
+ public void onComplete(boolean hasSendToVoicemailContact);
+ }
+
+ public interface ImportSendToVoicemailContactsListener {
+ public void onImportComplete();
+ }
+
+ private static class ContactsQuery {
+ static final String[] PROJECTION = {
+ Contacts._ID
+ };
+
+ static final String SELECT_SEND_TO_VOICEMAIL_TRUE = Contacts.SEND_TO_VOICEMAIL + "=1";
+
+ static final int ID_COLUMN_INDEX = 0;
+ }
+
+ public static class PhoneQuery {
+ static final String[] PROJECTION = {
+ Contacts._ID,
+ Phone.NORMALIZED_NUMBER,
+ Phone.NUMBER
+ };
+
+ static final int ID_COLUMN_INDEX = 0;
+ static final int NORMALIZED_NUMBER_COLUMN_INDEX = 1;
+ static final int NUMBER_COLUMN_INDEX = 2;
+
+ static final String SELECT_SEND_TO_VOICEMAIL_TRUE = Contacts.SEND_TO_VOICEMAIL + "=1";
+ }
+
+ /**
+ * Checks if there exists a contact with {@code Contacts.SEND_TO_VOICEMAIL} set to true.
+ */
+ public static void checkForSendToVoicemailContact(
+ final Context context, final CheckForSendToVoicemailContactListener listener) {
+ final AsyncTask task = new AsyncTask<Object, Void, Boolean>() {
+ @Override
+ public Boolean doInBackground(Object[] params) {
+ if (context == null) {
+ return false;
+ }
+
+ final Cursor cursor = context.getContentResolver().query(
+ Contacts.CONTENT_URI,
+ ContactsQuery.PROJECTION,
+ ContactsQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
+ null,
+ null);
+
+ boolean hasSendToVoicemailContacts = false;
+ if (cursor != null) {
+ try {
+ hasSendToVoicemailContacts = cursor.getCount() > 0;
+ } finally {
+ cursor.close();
+ }
+ }
+
+ return hasSendToVoicemailContacts;
+ }
+
+ @Override
+ public void onPostExecute(Boolean hasSendToVoicemailContact) {
+ if (listener != null) {
+ listener.onComplete(hasSendToVoicemailContact);
+ }
+ }
+ };
+ task.execute();
+ }
+
+ /**
+ * Blocks all the phone numbers of any contacts marked as SEND_TO_VOICEMAIL, then clears the
+ * SEND_TO_VOICEMAIL flag on those contacts.
+ */
+ public static void importSendToVoicemailContacts(
+ final Context context, final ImportSendToVoicemailContactsListener listener) {
+ Logger.logInteraction(InteractionEvent.IMPORT_SEND_TO_VOICEMAIL);
+ final FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler =
+ new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+
+ final AsyncTask<Object, Void, Boolean> task = new AsyncTask<Object, Void, Boolean>() {
+ @Override
+ public Boolean doInBackground(Object[] params) {
+ if (context == null) {
+ return false;
+ }
+
+ // Get the phone number of contacts marked as SEND_TO_VOICEMAIL.
+ final Cursor phoneCursor = context.getContentResolver().query(
+ Phone.CONTENT_URI,
+ PhoneQuery.PROJECTION,
+ PhoneQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
+ null,
+ null);
+
+ if (phoneCursor == null) {
+ return false;
+ }
+
+ try {
+ while (phoneCursor.moveToNext()) {
+ final String normalizedNumber = phoneCursor.getString(
+ PhoneQuery.NORMALIZED_NUMBER_COLUMN_INDEX);
+ final String number = phoneCursor.getString(
+ PhoneQuery.NUMBER_COLUMN_INDEX);
+ if (normalizedNumber != null) {
+ // Block the phone number of the contact.
+ mFilteredNumberAsyncQueryHandler.blockNumber(
+ null, normalizedNumber, number, null);
+ }
+ }
+ } finally {
+ phoneCursor.close();
+ }
+
+ // Clear SEND_TO_VOICEMAIL on all contacts. The setting has been imported to Dialer.
+ ContentValues newValues = new ContentValues();
+ newValues.put(Contacts.SEND_TO_VOICEMAIL, 0);
+ context.getContentResolver().update(
+ Contacts.CONTENT_URI,
+ newValues,
+ ContactsQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
+ null);
+
+ return true;
+ }
+
+ @Override
+ public void onPostExecute(Boolean success) {
+ if (success) {
+ if (listener != null) {
+ listener.onImportComplete();
+ }
+ } else if (context != null) {
+ String toastStr = context.getString(R.string.send_to_voicemail_import_failed);
+ Toast.makeText(context, toastStr, Toast.LENGTH_SHORT).show();
+ }
+ }
+ };
+ task.execute();
+ }
+
+ /**
+ * WARNING: This method should NOT be executed on the UI thread.
+ * Use {@code FilteredNumberAsyncQueryHandler} to asynchronously check if a number is blocked.
+ */
+ public static boolean shouldBlockVoicemail(
+ Context context, String number, String countryIso, long voicemailDateMs) {
+ final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ if (TextUtils.isEmpty(normalizedNumber)) {
+ return false;
+ }
+
+ if (hasRecentEmergencyCall(context)) {
+ return false;
+ }
+
+ final Cursor cursor = context.getContentResolver().query(
+ FilteredNumber.CONTENT_URI,
+ new String[] {
+ FilteredNumberColumns.CREATION_TIME
+ },
+ FilteredNumberColumns.NORMALIZED_NUMBER + "=?",
+ new String[] { normalizedNumber },
+ null);
+ if (cursor == null) {
+ return false;
+ }
+ try {
+ /*
+ * Block if number is found and it was added before this voicemail was received.
+ * The VVM's date is reported with precision to the minute, even though its
+ * magnitude is in milliseconds, so we perform the comparison in minutes.
+ */
+ return cursor.moveToFirst() &&
+ TimeUnit.MINUTES.convert(voicemailDateMs, TimeUnit.MILLISECONDS) >=
+ TimeUnit.MINUTES.convert(cursor.getLong(0), TimeUnit.MILLISECONDS);
+ } finally {
+ cursor.close();
+ }
+ }
+
+ public static boolean hasRecentEmergencyCall(Context context) {
+ if (context == null) {
+ return false;
+ }
+
+ Long lastEmergencyCallTime = PreferenceManager.getDefaultSharedPreferences(context)
+ .getLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, 0);
+ if (lastEmergencyCallTime == 0) {
+ return false;
+ }
+
+ return (System.currentTimeMillis() - lastEmergencyCallTime)
+ < getRecentEmergencyCallThresholdMs(context);
+ }
+
+ public static void recordLastEmergencyCallTime(Context context) {
+ if (context == null) {
+ return;
+ }
+
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .putLong(LAST_EMERGENCY_CALL_MS_PREF_KEY, System.currentTimeMillis())
+ .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)
+ .apply();
+
+ maybeNotifyCallBlockingDisabled(context);
+ }
+
+ public static void maybeNotifyCallBlockingDisabled(final Context context) {
+ // The Dialer is not responsible for this notification after migrating
+ if (FilteredNumberCompat.useNewFiltering()) {
+ return;
+ }
+ // Skip if the user has already received a notification for the most recent emergency call.
+ if (PreferenceManager.getDefaultSharedPreferences(context)
+ .getBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, false)) {
+ return;
+ }
+
+ // If the user has blocked numbers, notify that call blocking is temporarily disabled.
+ FilteredNumberAsyncQueryHandler queryHandler =
+ new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+ queryHandler.hasBlockedNumbers(new OnHasBlockedNumbersListener() {
+ @Override
+ public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
+ if (context == null || !hasBlockedNumbers) {
+ return;
+ }
+
+ NotificationManager notificationManager = (NotificationManager)
+ context.getSystemService(Context.NOTIFICATION_SERVICE);
+ Notification.Builder builder = new Notification.Builder(context)
+ .setSmallIcon(R.drawable.ic_block_24dp)
+ .setContentTitle(context.getString(
+ R.string.call_blocking_disabled_notification_title))
+ .setContentText(context.getString(
+ R.string.call_blocking_disabled_notification_text))
+ .setAutoCancel(true);
+
+ final Intent contentIntent =
+ new Intent(context, BlockedNumbersSettingsActivity.class);
+ builder.setContentIntent(PendingIntent.getActivity(
+ context, 0, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+
+ notificationManager.notify(
+ CALL_BLOCKING_NOTIFICATION_TAG,
+ CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_NOTIFICATION_ID,
+ builder.build());
+
+ // Record that the user has been notified for this emergency call.
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit()
+ .putBoolean(NOTIFIED_CALL_BLOCKING_DISABLED_BY_EMERGENCY_CALL_PREF_KEY, true)
+ .apply();
+ }
+ });
+ }
+
+ public static boolean canBlockNumber(Context context, String number, String countryIso) {
+ final String normalizedNumber = PhoneNumberUtils.formatNumberToE164(number, countryIso);
+ return !TextUtils.isEmpty(normalizedNumber)
+ && !PhoneNumberUtils.isEmergencyNumber(normalizedNumber);
+ }
+
+ private static long getRecentEmergencyCallThresholdMs(Context context) {
+ if (android.util.Log.isLoggable(
+ DEBUG_EMERGENCY_CALL_TAG, android.util.Log.VERBOSE)) {
+ long thresholdMs = Settings.System.getLong(
+ context.getContentResolver(),
+ RECENT_EMERGENCY_CALL_THRESHOLD_SETTINGS_KEY, 0);
+ return thresholdMs > 0 ? thresholdMs : RECENT_EMERGENCY_CALL_THRESHOLD_MS;
+ } else {
+ return RECENT_EMERGENCY_CALL_THRESHOLD_MS;
+ }
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragment.java b/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragment.java
new file mode 100644
index 000000000..209665292
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragment.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import com.google.common.base.Preconditions;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnShowListener;
+import android.os.Bundle;
+import android.view.View;
+import com.android.dialer.R;
+import com.android.dialer.filterednumber.BlockedNumbersMigrator.Listener;
+
+/**
+ * Dialog fragment shown to users when they need to migrate to use
+ * {@link android.provider.BlockedNumberContract} for blocking.
+ */
+public class MigrateBlockedNumbersDialogFragment extends DialogFragment {
+
+ private BlockedNumbersMigrator mBlockedNumbersMigrator;
+ private BlockedNumbersMigrator.Listener mMigrationListener;
+
+ /**
+ * Creates a new MigrateBlockedNumbersDialogFragment.
+ *
+ * @param blockedNumbersMigrator The {@link BlockedNumbersMigrator} which will be used to
+ * migrate the numbers.
+ * @param migrationListener The {@link BlockedNumbersMigrator.Listener} to call when the
+ * migration is complete.
+ * @return The new MigrateBlockedNumbersDialogFragment.
+ * @throws NullPointerException if blockedNumbersMigrator or migrationListener are {@code null}.
+ */
+ public static DialogFragment newInstance(BlockedNumbersMigrator blockedNumbersMigrator,
+ BlockedNumbersMigrator.Listener migrationListener) {
+ MigrateBlockedNumbersDialogFragment fragment = new MigrateBlockedNumbersDialogFragment();
+ fragment.mBlockedNumbersMigrator = Preconditions.checkNotNull(blockedNumbersMigrator);
+ fragment.mMigrationListener = Preconditions.checkNotNull(migrationListener);
+ return fragment;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ super.onCreateDialog(savedInstanceState);
+ AlertDialog dialog = new AlertDialog.Builder(getActivity())
+ .setTitle(R.string.migrate_blocked_numbers_dialog_title)
+ .setMessage(R.string.migrate_blocked_numbers_dialog_message)
+ .setPositiveButton(R.string.migrate_blocked_numbers_dialog_allow_button, null)
+ .setNegativeButton(R.string.migrate_blocked_numbers_dialog_cancel_button, null)
+ .create();
+ // The Dialog's buttons aren't available until show is called, so an OnShowListener
+ // is used to set the positive button callback.
+ dialog.setOnShowListener(new OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialog) {
+ final AlertDialog alertDialog = (AlertDialog) dialog;
+ alertDialog.getButton(AlertDialog.BUTTON_POSITIVE)
+ .setOnClickListener(newPositiveButtonOnClickListener(alertDialog));
+ }
+ });
+ return dialog;
+ }
+
+ /*
+ * Creates a new View.OnClickListener to be used as the positive button in this dialog. The
+ * OnClickListener will grey out the dialog's positive and negative buttons while the migration
+ * is underway, and close the dialog once the migrate is complete.
+ */
+ private View.OnClickListener newPositiveButtonOnClickListener(final AlertDialog alertDialog) {
+ return new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
+ alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(false);
+ mBlockedNumbersMigrator.migrate(new Listener() {
+ @Override
+ public void onComplete() {
+ alertDialog.dismiss();
+ mMigrationListener.onComplete();
+ }
+ });
+ }
+ };
+ }
+
+ @Override
+ public void onPause() {
+ // The dialog is dismissed and state is cleaned up onPause, i.e. rotation.
+ dismiss();
+ mBlockedNumbersMigrator = null;
+ mMigrationListener = null;
+ super.onPause();
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/NumbersAdapter.java b/src/com/android/dialer/filterednumber/NumbersAdapter.java
new file mode 100644
index 000000000..17d5db343
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/NumbersAdapter.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import android.app.FragmentManager;
+import android.content.Context;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.text.BidiFormatter;
+import android.text.TextDirectionHeuristics;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.QuickContactBadge;
+import android.widget.SimpleCursorAdapter;
+import android.widget.TextView;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.ContactPhotoManager.DefaultImageRequest;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.util.UriUtils;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.util.PhoneNumberUtil;
+
+public class NumbersAdapter extends SimpleCursorAdapter {
+
+ private Context mContext;
+ private FragmentManager mFragmentManager;
+ private ContactInfoHelper mContactInfoHelper;
+ private BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
+ private ContactPhotoManager mContactPhotoManager;
+
+ public NumbersAdapter(
+ Context context,
+ FragmentManager fragmentManager,
+ ContactInfoHelper contactInfoHelper,
+ ContactPhotoManager contactPhotoManager) {
+ super(context, R.layout.blocked_number_item, null, new String[]{}, new int[]{}, 0);
+ mContext = context;
+ mFragmentManager = fragmentManager;
+ mContactInfoHelper = contactInfoHelper;
+ mContactPhotoManager = contactPhotoManager;
+ }
+
+ public void updateView(View view, String number, String countryIso) {
+ final TextView callerName = (TextView) view.findViewById(R.id.caller_name);
+ final TextView callerNumber = (TextView) view.findViewById(R.id.caller_number);
+ final QuickContactBadge quickContactBadge =
+ (QuickContactBadge) view.findViewById(R.id.quick_contact_photo);
+ quickContactBadge.setOverlay(null);
+ if (CompatUtils.hasPrioritizedMimeType()) {
+ quickContactBadge.setPrioritizedMimeType(Phone.CONTENT_ITEM_TYPE);
+ }
+
+ ContactInfo info = mContactInfoHelper.lookupNumber(number, countryIso);
+ if (info == null) {
+ info = new ContactInfo();
+ info.number = number;
+ }
+ final CharSequence locationOrType = getNumberTypeOrLocation(info);
+ final String displayNumber = getDisplayNumber(info);
+ final String displayNumberStr = mBidiFormatter.unicodeWrap(displayNumber,
+ TextDirectionHeuristics.LTR);
+
+ String nameForDefaultImage;
+ if (!TextUtils.isEmpty(info.name)) {
+ nameForDefaultImage = info.name;
+ callerName.setText(info.name);
+ callerNumber.setText(locationOrType + " " + displayNumberStr);
+ } else {
+ nameForDefaultImage = displayNumber;
+ callerName.setText(displayNumberStr);
+ if (!TextUtils.isEmpty(locationOrType)) {
+ callerNumber.setText(locationOrType);
+ callerNumber.setVisibility(View.VISIBLE);
+ } else {
+ callerNumber.setVisibility(View.GONE);
+ }
+ }
+ loadContactPhoto(info, nameForDefaultImage, quickContactBadge);
+ }
+
+ private void loadContactPhoto(ContactInfo info, String displayName, QuickContactBadge badge) {
+ final String lookupKey = info.lookupUri == null
+ ? null : UriUtils.getLookupKeyFromUri(info.lookupUri);
+ final int contactType = mContactInfoHelper.isBusiness(info.sourceType)
+ ? ContactPhotoManager.TYPE_BUSINESS : ContactPhotoManager.TYPE_DEFAULT;
+ final DefaultImageRequest request = new DefaultImageRequest(displayName, lookupKey,
+ contactType, true /* isCircular */);
+ badge.assignContactUri(info.lookupUri);
+ badge.setContentDescription(
+ mContext.getResources().getString(R.string.description_contact_details, displayName));
+ mContactPhotoManager.loadDirectoryPhoto(badge, info.photoUri,
+ false /* darkTheme */, true /* isCircular */, request);
+ }
+
+ private String getDisplayNumber(ContactInfo info) {
+ if (!TextUtils.isEmpty(info.formattedNumber)) {
+ return info.formattedNumber;
+ } else if (!TextUtils.isEmpty(info.number)) {
+ return info.number;
+ } else {
+ return "";
+ }
+ }
+
+ private CharSequence getNumberTypeOrLocation(ContactInfo info) {
+ if (!TextUtils.isEmpty(info.name)) {
+ return ContactsContract.CommonDataKinds.Phone.getTypeLabel(
+ mContext.getResources(), info.type, info.label);
+ } else {
+ return PhoneNumberUtil.getGeoDescription(mContext, info.number);
+ }
+ }
+
+ protected Context getContext() {
+ return mContext;
+ }
+
+ protected FragmentManager getFragmentManager() {
+ return mFragmentManager;
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
new file mode 100644
index 000000000..58fe1d46c
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportAdapter.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import android.app.FragmentManager;
+import android.database.Cursor;
+import android.content.Context;
+import android.view.View;
+
+import com.android.contacts.common.ContactPhotoManager;
+import com.android.contacts.common.GeoUtil;
+import com.android.dialer.R;
+import com.android.dialer.calllog.ContactInfoHelper;
+
+public class ViewNumbersToImportAdapter extends NumbersAdapter {
+
+ private ViewNumbersToImportAdapter(
+ Context context,
+ FragmentManager fragmentManager,
+ ContactInfoHelper contactInfoHelper,
+ ContactPhotoManager contactPhotoManager) {
+ super(context, fragmentManager, contactInfoHelper, contactPhotoManager);
+ }
+
+ public static ViewNumbersToImportAdapter newViewNumbersToImportAdapter(
+ Context context, FragmentManager fragmentManager) {
+ return new ViewNumbersToImportAdapter(
+ context,
+ fragmentManager,
+ new ContactInfoHelper(context, GeoUtil.getCurrentCountryIso(context)),
+ ContactPhotoManager.getInstance(context));
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ super.bindView(view, context, cursor);
+
+ final String number = cursor.getString(
+ FilteredNumbersUtil.PhoneQuery.NUMBER_COLUMN_INDEX);
+
+ view.findViewById(R.id.delete_button).setVisibility(View.GONE);
+ updateView(view, number, null /* countryIso */);
+ }
+}
diff --git a/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
new file mode 100644
index 000000000..8b24c06da
--- /dev/null
+++ b/src/com/android/dialer/filterednumber/ViewNumbersToImportFragment.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import android.app.ListFragment;
+import android.app.LoaderManager;
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.ContactsContract.Contacts;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.dialer.R;
+import com.android.dialer.database.FilteredNumberContract;
+import com.android.dialer.filterednumber.FilteredNumbersUtil.ImportSendToVoicemailContactsListener;
+
+public class ViewNumbersToImportFragment extends ListFragment
+ implements LoaderManager.LoaderCallbacks<Cursor>,
+ View.OnClickListener {
+
+ private ViewNumbersToImportAdapter mAdapter;
+
+ @Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ if (mAdapter == null) {
+ mAdapter = ViewNumbersToImportAdapter.newViewNumbersToImportAdapter(
+ getContext(), getActivity().getFragmentManager());
+ }
+ setListAdapter(mAdapter);
+ }
+
+ @Override
+ public void onDestroy() {
+ setListAdapter(null);
+ super.onDestroy();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getLoaderManager().initLoader(0, null, this);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
+ actionBar.setTitle(R.string.import_send_to_voicemail_numbers_label);
+ actionBar.setDisplayShowCustomEnabled(false);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+
+ getActivity().findViewById(R.id.cancel_button).setOnClickListener(this);
+ getActivity().findViewById(R.id.import_button).setOnClickListener(this);
+ }
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.view_numbers_to_import_fragment, container, false);
+ }
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int id, Bundle args) {
+ final CursorLoader cursorLoader = new CursorLoader(
+ getContext(),
+ Phone.CONTENT_URI,
+ FilteredNumbersUtil.PhoneQuery.PROJECTION,
+ FilteredNumbersUtil.PhoneQuery.SELECT_SEND_TO_VOICEMAIL_TRUE,
+ null,
+ null);
+ return cursorLoader;
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+ mAdapter.swapCursor(data);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> loader) {
+ mAdapter.swapCursor(null);
+ }
+
+ @Override
+ public void onClick(final View view) {
+ if (view.getId() == R.id.import_button) {
+ FilteredNumbersUtil.importSendToVoicemailContacts(getContext(),
+ new ImportSendToVoicemailContactsListener() {
+ @Override
+ public void onImportComplete() {
+ if (getActivity() != null) {
+ getActivity().onBackPressed();
+ }
+ }
+ });
+ } else if (view.getId() == R.id.cancel_button) {
+ getActivity().onBackPressed();
+ }
+ }
+}
diff --git a/src/com/android/dialer/interactions/PhoneNumberInteraction.java b/src/com/android/dialer/interactions/PhoneNumberInteraction.java
index 8455f2423..0c3ae510a 100644
--- a/src/com/android/dialer/interactions/PhoneNumberInteraction.java
+++ b/src/com/android/dialer/interactions/PhoneNumberInteraction.java
@@ -48,11 +48,13 @@ import android.widget.TextView;
import com.android.contacts.common.Collapser;
import com.android.contacts.common.Collapser.Collapsible;
import com.android.contacts.common.MoreContactUtils;
-import com.android.contacts.common.activity.TransactionSafeActivity;
import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.R;
+import com.android.dialer.TransactionSafeActivity;
import com.android.dialer.contact.ContactUpdateService;
import com.android.dialer.util.IntentUtil;
+import com.android.dialer.util.IntentUtil.CallIntentBuilder;
+import com.android.incallui.Call.LogState;
import com.android.dialer.util.DialerUtils;
import com.google.common.annotations.VisibleForTesting;
@@ -188,31 +190,38 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
private static final String ARG_PHONE_LIST = "phoneList";
private static final String ARG_INTERACTION_TYPE = "interactionType";
- private static final String ARG_CALL_ORIGIN = "callOrigin";
+ private static final String ARG_CALL_INITIATION_TYPE = "callInitiation";
+ private static final String ARG_IS_VIDEO_CALL = "is_video_call";
private int mInteractionType;
private ListAdapter mPhonesAdapter;
private List<PhoneItem> mPhoneList;
- private String mCallOrigin;
+ private int mCallInitiationType;
+ private boolean mIsVideoCall;
- public static void show(FragmentManager fragmentManager,
- ArrayList<PhoneItem> phoneList, int interactionType,
- String callOrigin) {
+ public static void show(FragmentManager fragmentManager, ArrayList<PhoneItem> phoneList,
+ int interactionType, boolean isVideoCall, int callInitiationType) {
PhoneDisambiguationDialogFragment fragment = new PhoneDisambiguationDialogFragment();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(ARG_PHONE_LIST, phoneList);
- bundle.putSerializable(ARG_INTERACTION_TYPE, interactionType);
- bundle.putString(ARG_CALL_ORIGIN, callOrigin);
+ bundle.putInt(ARG_INTERACTION_TYPE, interactionType);
+ bundle.putInt(ARG_CALL_INITIATION_TYPE, callInitiationType);
+ bundle.putBoolean(ARG_IS_VIDEO_CALL, isVideoCall);
fragment.setArguments(bundle);
fragment.show(fragmentManager, TAG);
}
+ public PhoneDisambiguationDialogFragment() {
+ super();
+ }
+
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Activity activity = getActivity();
mPhoneList = getArguments().getParcelableArrayList(ARG_PHONE_LIST);
mInteractionType = getArguments().getInt(ARG_INTERACTION_TYPE);
- mCallOrigin = getArguments().getString(ARG_CALL_ORIGIN);
+ mCallInitiationType = getArguments().getInt(ARG_CALL_INITIATION_TYPE);
+ mIsVideoCall = getArguments().getBoolean(ARG_IS_VIDEO_CALL);
mPhonesAdapter = new PhoneItemAdapter(activity, mPhoneList, mInteractionType);
final LayoutInflater inflater = activity.getLayoutInflater();
@@ -241,7 +250,7 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
}
PhoneNumberInteraction.performAction(activity, phoneItem.phoneNumber,
- mInteractionType, mCallOrigin);
+ mInteractionType, mIsVideoCall, mCallInitiationType);
} else {
dialog.dismiss();
}
@@ -280,13 +289,14 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
private final OnDismissListener mDismissListener;
private final int mInteractionType;
- private final String mCallOrigin;
+ private final int mCallInitiationType;
private boolean mUseDefault;
private static final int UNKNOWN_CONTACT_ID = -1;
private long mContactId = UNKNOWN_CONTACT_ID;
private CursorLoader mLoader;
+ private boolean mIsVideoCall;
/**
* Constructs a new {@link PhoneNumberInteraction}. The constructor takes in a {@link Context}
@@ -297,24 +307,28 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
@VisibleForTesting
/* package */ PhoneNumberInteraction(Context context, int interactionType,
DialogInterface.OnDismissListener dismissListener) {
- this(context, interactionType, dismissListener, null);
+ this(context, interactionType, dismissListener, false /*isVideoCall*/,
+ LogState.INITIATION_UNKNOWN);
}
private PhoneNumberInteraction(Context context, int interactionType,
- DialogInterface.OnDismissListener dismissListener, String callOrigin) {
+ DialogInterface.OnDismissListener dismissListener, boolean isVideoCall,
+ int callInitiationType) {
mContext = context;
mInteractionType = interactionType;
mDismissListener = dismissListener;
- mCallOrigin = callOrigin;
+ mCallInitiationType = callInitiationType;
+ mIsVideoCall = isVideoCall;
}
private void performAction(String phoneNumber) {
- PhoneNumberInteraction.performAction(mContext, phoneNumber, mInteractionType, mCallOrigin);
+ PhoneNumberInteraction.performAction(mContext, phoneNumber, mInteractionType, mIsVideoCall,
+ mCallInitiationType);
}
private static void performAction(
Context context, String phoneNumber, int interactionType,
- String callOrigin) {
+ boolean isVideoCall, int callInitiationType) {
Intent intent;
switch (interactionType) {
case ContactDisplayUtils.INTERACTION_SMS:
@@ -322,7 +336,10 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
Intent.ACTION_SENDTO, Uri.fromParts("sms", phoneNumber, null));
break;
default:
- intent = IntentUtil.getCallIntent(phoneNumber, callOrigin);
+ intent = new CallIntentBuilder(phoneNumber)
+ .setCallInitiationType(callInitiationType)
+ .setIsVideoCall(isVideoCall)
+ .build();
break;
}
DialerUtils.startActivityWithErrorToast(context, intent);
@@ -447,54 +464,16 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
}
/**
- * Start call action using given contact Uri. If there are multiple candidates for the phone
- * call, dialog is automatically shown and the user is asked to choose one.
- *
* @param activity that is calling this interaction. This must be of type
* {@link TransactionSafeActivity} because we need to check on the activity state after the
* phone numbers have been queried for.
- * @param uri contact Uri (built from {@link Contacts#CONTENT_URI}) or data Uri
- * (built from {@link Data#CONTENT_URI}). Contact Uri may show the disambiguation dialog while
- * data Uri won't.
- */
- public static void startInteractionForPhoneCall(TransactionSafeActivity activity, Uri uri) {
- (new PhoneNumberInteraction(activity, ContactDisplayUtils.INTERACTION_CALL, null))
- .startInteraction(uri, true);
- }
-
- /**
- * Start call action using given contact Uri. If there are multiple candidates for the phone
- * call, dialog is automatically shown and the user is asked to choose one.
- *
- * @param activity that is calling this interaction. This must be of type
- * {@link TransactionSafeActivity} because we need to check on the activity state after the
- * phone numbers have been queried for.
- * @param uri contact Uri (built from {@link Contacts#CONTENT_URI}) or data Uri
- * (built from {@link Data#CONTENT_URI}). Contact Uri may show the disambiguation dialog while
- * data Uri won't.
- * @param useDefault Whether or not to use the primary(default) phone number. If true, the
- * primary phone number will always be used by default if one is available. If false, a
- * disambiguation dialog will be shown regardless of whether or not a primary phone number
- * is available.
+ * @param isVideoCall {@code true} if the call is a video call, {@code false} otherwise.
+ * @param callInitiationType Indicates the UI affordance that was used to initiate the call.
*/
public static void startInteractionForPhoneCall(TransactionSafeActivity activity, Uri uri,
- boolean useDefault) {
- (new PhoneNumberInteraction(activity, ContactDisplayUtils.INTERACTION_CALL, null))
- .startInteraction(uri, useDefault);
- }
-
- /**
- * @param activity that is calling this interaction. This must be of type
- * {@link TransactionSafeActivity} because we need to check on the activity state after the
- * phone numbers have been queried for.
- * @param callOrigin If non null, {@link PhoneConstants#EXTRA_CALL_ORIGIN} will be
- * appended to the Intent initiating phone call. See comments in Phone package (PhoneApp)
- * for more detail.
- */
- public static void startInteractionForPhoneCall(TransactionSafeActivity activity, Uri uri,
- String callOrigin) {
- (new PhoneNumberInteraction(activity, ContactDisplayUtils.INTERACTION_CALL, null, callOrigin))
- .startInteraction(uri, true);
+ boolean isVideoCall, int callInitiationType) {
+ (new PhoneNumberInteraction(activity, ContactDisplayUtils.INTERACTION_CALL, null,
+ isVideoCall, callInitiationType)).startInteraction(uri, true);
}
/**
@@ -521,7 +500,17 @@ public class PhoneNumberInteraction implements OnLoadCompleteListener<Cursor> {
@VisibleForTesting
/* package */ void showDisambiguationDialog(ArrayList<PhoneItem> phoneList) {
- PhoneDisambiguationDialogFragment.show(((Activity)mContext).getFragmentManager(),
- phoneList, mInteractionType, mCallOrigin);
+ final Activity activity = (Activity) mContext;
+ if (activity.isDestroyed()) {
+ // Check whether the activity is still running
+ return;
+ }
+ try {
+ PhoneDisambiguationDialogFragment.show(activity.getFragmentManager(),
+ phoneList, mInteractionType, mIsVideoCall, mCallInitiationType);
+ } catch (IllegalStateException e) {
+ // ignore to be safe. Shouldn't happen because we checked the
+ // activity wasn't destroyed, but to be safe.
+ }
}
}
diff --git a/src/com/android/dialer/list/AllContactsFragment.java b/src/com/android/dialer/list/AllContactsFragment.java
index 0f31ff88f..7e76279d9 100644
--- a/src/com/android/dialer/list/AllContactsFragment.java
+++ b/src/com/android/dialer/list/AllContactsFragment.java
@@ -28,11 +28,13 @@ import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.QuickContact;
+import android.support.v13.app.FragmentCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
+import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.list.ContactEntryListAdapter;
import com.android.contacts.common.list.ContactEntryListFragment;
import com.android.contacts.common.list.ContactListFilter;
@@ -49,7 +51,8 @@ import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClicked
* Fragments to show all contacts with phone numbers.
*/
public class AllContactsFragment extends ContactEntryListFragment<ContactEntryListAdapter>
- implements OnEmptyViewActionButtonClickedListener {
+ implements OnEmptyViewActionButtonClickedListener,
+ FragmentCompat.OnRequestPermissionsResultCallback {
private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
@@ -150,8 +153,13 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final Uri uri = (Uri) view.getTag();
if (uri != null) {
- QuickContact.showQuickContact(getContext(), view, uri, null,
- Phone.CONTENT_ITEM_TYPE);
+ if (CompatUtils.hasPrioritizedMimeType()) {
+ QuickContact.showQuickContact(getContext(), view, uri, null,
+ Phone.CONTENT_ITEM_TYPE);
+ } else {
+ QuickContact.showQuickContact(getActivity(), view, uri, QuickContact.MODE_LARGE,
+ null);
+ }
}
}
@@ -168,7 +176,8 @@ public class AllContactsFragment extends ContactEntryListFragment<ContactEntryLi
}
if (!PermissionsUtil.hasPermission(activity, READ_CONTACTS)) {
- requestPermissions(new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE);
+ FragmentCompat.requestPermissions(this, new String[] {READ_CONTACTS},
+ READ_CONTACTS_PERMISSION_REQUEST_CODE);
} else {
// Add new contact
DialerUtils.startActivityWithErrorToast(activity, IntentUtil.getNewContactIntent(),
diff --git a/src/com/android/dialer/list/BlockedListSearchAdapter.java b/src/com/android/dialer/list/BlockedListSearchAdapter.java
new file mode 100644
index 000000000..1618826bd
--- /dev/null
+++ b/src/com/android/dialer/list/BlockedListSearchAdapter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.list;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.Color;
+import android.view.View;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.list.ContactListItemView;
+import com.android.dialer.R;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+
+/**
+ * List adapter to display search results for adding a blocked number.
+ */
+public class BlockedListSearchAdapter extends RegularSearchListAdapter {
+
+ private Resources mResources;
+ private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+
+ public BlockedListSearchAdapter(Context context) {
+ super(context);
+ mResources = context.getResources();
+ disableAllShortcuts();
+ setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, true);
+
+ mFilteredNumberAsyncQueryHandler =
+ new FilteredNumberAsyncQueryHandler(context.getContentResolver());
+ }
+
+ @Override
+ protected boolean isChanged(boolean showNumberShortcuts) {
+ return setShortcutEnabled(SHORTCUT_BLOCK_NUMBER, showNumberShortcuts || mIsQuerySipAddress);
+ }
+
+ public void setViewBlocked(ContactListItemView view, Integer id) {
+ view.setTag(R.id.block_id, id);
+ final int textColor = mResources.getColor(R.color.blocked_number_block_color);
+ view.getDataView().setTextColor(textColor);
+ view.getLabelView().setTextColor(textColor);
+ //TODO: Add icon
+ }
+
+ public void setViewUnblocked(ContactListItemView view) {
+ view.setTag(R.id.block_id, null);
+ final int textColor = mResources.getColor(R.color.dialtacts_secondary_text_color);
+ view.getDataView().setTextColor(textColor);
+ view.getLabelView().setTextColor(textColor);
+ //TODO: Remove icon
+ }
+
+ @Override
+ protected void bindView(View itemView, int partition, Cursor cursor, int position) {
+ super.bindView(itemView, partition, cursor, position);
+
+ final ContactListItemView view = (ContactListItemView) itemView;
+ // Reset view state to unblocked.
+ setViewUnblocked(view);
+
+ final String number = getPhoneNumber(position);
+ final String countryIso = GeoUtil.getCurrentCountryIso(mContext);
+ final FilteredNumberAsyncQueryHandler.OnCheckBlockedListener onCheckListener =
+ new FilteredNumberAsyncQueryHandler.OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(Integer id) {
+ if (id != null) {
+ setViewBlocked(view, id);
+ }
+ }
+ };
+ mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ onCheckListener, number, countryIso);
+ }
+}
diff --git a/src/com/android/dialer/list/BlockedListSearchFragment.java b/src/com/android/dialer/list/BlockedListSearchFragment.java
new file mode 100644
index 000000000..da6b42820
--- /dev/null
+++ b/src/com/android/dialer/list/BlockedListSearchFragment.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.list;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
+import android.telephony.PhoneNumberUtils;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.list.ContactEntryListAdapter;
+import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.R;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.filterednumber.BlockNumberDialogFragment;
+import com.android.dialer.logging.InteractionEvent;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.widget.SearchEditTextLayout;
+
+public class BlockedListSearchFragment extends RegularSearchFragment
+ implements BlockNumberDialogFragment.Callback {
+ private static final String TAG = BlockedListSearchFragment.class.getSimpleName();
+
+ private static final String KEY_SEARCH_QUERY = "search_query";
+
+ private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
+
+ private EditText mSearchView;
+
+ private final TextWatcher mPhoneSearchQueryTextListener = 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) {
+ setQueryString(s.toString(), false);
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {}
+ };
+
+ private final SearchEditTextLayout.Callback mSearchLayoutCallback =
+ new SearchEditTextLayout.Callback() {
+ @Override
+ public void onBackButtonClicked() {
+ getActivity().onBackPressed();
+ }
+
+ @Override
+ public void onSearchViewClicked() {
+ }
+ };
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setShowEmptyListForNullQuery(true);
+ /*
+ * Pass in the empty string here so ContactEntryListFragment#setQueryString interprets it as
+ * an empty search query, rather than as an uninitalized value. In the latter case, the
+ * adapter returned by #createListAdapter is used, which populates the view with contacts.
+ * Passing in the empty string forces ContactEntryListFragment to interpret it as an empty
+ * query, which results in showing an empty view
+ */
+ setQueryString(getQueryString() == null ? "" : getQueryString(), false);
+ mFilteredNumberAsyncQueryHandler = new FilteredNumberAsyncQueryHandler(
+ getContext().getContentResolver());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
+ actionBar.setCustomView(R.layout.search_edittext);
+ actionBar.setDisplayShowCustomEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(false);
+ actionBar.setDisplayShowHomeEnabled(false);
+
+ final SearchEditTextLayout searchEditTextLayout = (SearchEditTextLayout) actionBar
+ .getCustomView().findViewById(R.id.search_view_container);
+ searchEditTextLayout.expand(false, true);
+ searchEditTextLayout.setCallback(mSearchLayoutCallback);
+ searchEditTextLayout.setBackgroundDrawable(null);
+
+ mSearchView = (EditText) searchEditTextLayout.findViewById(R.id.search_view);
+ mSearchView.addTextChangedListener(mPhoneSearchQueryTextListener);
+ mSearchView.setHint(R.string.block_number_search_hint);
+
+ searchEditTextLayout.findViewById(R.id.search_box_expanded)
+ .setBackgroundColor(getContext().getResources().getColor(android.R.color.white));
+
+ if (!TextUtils.isEmpty(getQueryString())) {
+ mSearchView.setText(getQueryString());
+ }
+
+ // TODO: Don't set custom text size; use default search text size.
+ mSearchView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+ getResources().getDimension(R.dimen.blocked_number_search_text_size));
+ }
+
+ @Override
+ protected ContactEntryListAdapter createListAdapter() {
+ BlockedListSearchAdapter adapter = new BlockedListSearchAdapter(getActivity());
+ adapter.setDisplayPhotos(true);
+ // Don't show SIP addresses.
+ adapter.setUseCallableUri(false);
+ // Keep in sync with the queryString set in #onCreate
+ adapter.setQueryString(getQueryString() == null ? "" : getQueryString());
+ return adapter;
+ }
+
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ super.onItemClick(parent, view, position, id);
+ final int adapterPosition = position - getListView().getHeaderViewsCount();
+ final BlockedListSearchAdapter adapter = (BlockedListSearchAdapter) getAdapter();
+ final int shortcutType = adapter.getShortcutTypeFromPosition(adapterPosition);
+ final Integer blockId = (Integer) view.getTag(R.id.block_id);
+ final String number;
+ switch (shortcutType) {
+ case DialerPhoneNumberListAdapter.SHORTCUT_INVALID:
+ // Handles click on a search result, either contact or nearby places result.
+ number = adapter.getPhoneNumber(adapterPosition);
+ blockContactNumber(number, blockId);
+ break;
+ case DialerPhoneNumberListAdapter.SHORTCUT_BLOCK_NUMBER:
+ // Handles click on 'Block number' shortcut to add the user query as a number.
+ number = adapter.getQueryString();
+ blockNumber(number);
+ break;
+ default:
+ Log.w(TAG, "Ignoring unsupported shortcut type: " + shortcutType);
+ break;
+ }
+ }
+
+ @Override
+ protected void onItemClick(int position, long id) {
+ // Prevent SearchFragment.onItemClicked from being called.
+ }
+
+ private void blockNumber(final String number) {
+ final String countryIso = GeoUtil.getCurrentCountryIso(getContext());
+ final OnCheckBlockedListener onCheckListener = new OnCheckBlockedListener() {
+ @Override
+ public void onCheckComplete(Integer id) {
+ if (id == null) {
+ BlockNumberDialogFragment.show(
+ id,
+ number,
+ countryIso,
+ PhoneNumberUtils.formatNumber(number, countryIso),
+ R.id.blocked_numbers_activity_container,
+ getFragmentManager(),
+ BlockedListSearchFragment.this);
+ } else {
+ Toast.makeText(getContext(),
+ ContactDisplayUtils.getTtsSpannedPhoneNumber(getResources(),
+ R.string.alreadyBlocked, number),
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ };
+ final boolean success = mFilteredNumberAsyncQueryHandler.isBlockedNumber(
+ onCheckListener, number, countryIso);
+ if (!success) {
+ Toast.makeText(getContext(),
+ ContactDisplayUtils.getTtsSpannedPhoneNumber(
+ getResources(), R.string.invalidNumber, number),
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ @Override
+ public void onFilterNumberSuccess() {
+ Logger.logInteraction(InteractionEvent.BLOCK_NUMBER_MANAGEMENT_SCREEN);
+ goBack();
+ }
+
+ @Override
+ public void onUnfilterNumberSuccess() {
+ Log.wtf(TAG, "Unblocked a number from the BlockedListSearchFragment");
+ goBack();
+ }
+
+ private void goBack() {
+ Activity activity = getActivity();
+ if (activity == null) {
+ return;
+ }
+ activity.onBackPressed();
+ }
+
+ @Override
+ public void onChangeFilteredNumberUndo() {
+ getAdapter().notifyDataSetChanged();
+ }
+
+ private void blockContactNumber(final String number, final Integer blockId) {
+ if (blockId != null) {
+ Toast.makeText(getContext(), ContactDisplayUtils.getTtsSpannedPhoneNumber(
+ getResources(), R.string.alreadyBlocked, number),
+ Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ BlockNumberDialogFragment.show(
+ blockId,
+ number,
+ GeoUtil.getCurrentCountryIso(getContext()),
+ number,
+ R.id.blocked_numbers_activity_container,
+ getFragmentManager(),
+ this);
+ }
+}
diff --git a/src/com/android/dialer/list/ContentChangedFilter.java b/src/com/android/dialer/list/ContentChangedFilter.java
new file mode 100644
index 000000000..e552aa3f0
--- /dev/null
+++ b/src/com/android/dialer/list/ContentChangedFilter.java
@@ -0,0 +1,40 @@
+package com.android.dialer.list;
+
+import android.view.View;
+import android.view.View.AccessibilityDelegate;
+import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
+
+/**
+ * AccessibilityDelegate that will filter out TYPE_WINDOW_CONTENT_CHANGED
+ * Used to suppress "Showing items x of y" from firing of ListView whenever it's content changes.
+ * AccessibilityEvent can only be rejected at a view's parent once it is generated,
+ * use addToParent() to add this delegate to the parent.
+ */
+public class ContentChangedFilter extends AccessibilityDelegate {
+ //the view we don't want TYPE_WINDOW_CONTENT_CHANGED to fire.
+ private View mView;
+
+ /**
+ * Add this delegate to the parent of @param view to filter out TYPE_WINDOW_CONTENT_CHANGED
+ */
+ public static void addToParent(View view){
+ View parent = (View) view.getParent();
+ parent.setAccessibilityDelegate(new ContentChangedFilter(view));
+ }
+
+ private ContentChangedFilter(View view){
+ super();
+ mView = view;
+ }
+ @Override
+ public boolean onRequestSendAccessibilityEvent (ViewGroup host, View child, AccessibilityEvent event){
+ if(child == mView){
+ if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED){
+ return false;
+ }
+ }
+ return super.onRequestSendAccessibilityEvent(host,child,event);
+ }
+
+}
diff --git a/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java b/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
index 401b0b641..7164de2d7 100644
--- a/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
+++ b/src/com/android/dialer/list/DialerPhoneNumberListAdapter.java
@@ -2,15 +2,19 @@ package com.android.dialer.list;
import android.content.Context;
import android.content.res.Resources;
+import android.database.Cursor;
import android.telephony.PhoneNumberUtils;
import android.text.BidiFormatter;
import android.text.TextDirectionHeuristics;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
+import com.android.contacts.common.CallUtil;
import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.list.ContactListItemView;
import com.android.contacts.common.list.PhoneNumberListAdapter;
+import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.R;
/**
@@ -33,17 +37,20 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
public final static int SHORTCUT_ADD_TO_EXISTING_CONTACT = 2;
public final static int SHORTCUT_SEND_SMS_MESSAGE = 3;
public final static int SHORTCUT_MAKE_VIDEO_CALL = 4;
+ public final static int SHORTCUT_BLOCK_NUMBER = 5;
- public final static int SHORTCUT_COUNT = 5;
+ public final static int SHORTCUT_COUNT = 6;
private final boolean[] mShortcutEnabled = new boolean[SHORTCUT_COUNT];
private final BidiFormatter mBidiFormatter = BidiFormatter.getInstance();
+ private boolean mVideoCallingEnabled = false;
public DialerPhoneNumberListAdapter(Context context) {
super(context);
mCountryIso = GeoUtil.getCurrentCountryIso(context);
+ mVideoCallingEnabled = CallUtil.isVideoEnabled(context);
}
@Override
@@ -93,7 +100,8 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
assignShortcutToView((ContactListItemView) convertView, shortcutType);
return convertView;
} else {
- final ContactListItemView v = new ContactListItemView(getContext(), null);
+ final ContactListItemView v = new ContactListItemView(getContext(), null,
+ mVideoCallingEnabled);
assignShortcutToView(v, shortcutType);
return v;
}
@@ -102,6 +110,16 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
}
}
+ @Override
+ protected ContactListItemView newView(
+ Context context, int partition, Cursor cursor, int position, ViewGroup parent) {
+ final ContactListItemView view = super.newView(context, partition, cursor, position,
+ parent);
+
+ view.setSupportVideoCallIcon(mVideoCallingEnabled);
+ return view;
+ }
+
/**
* @param position The position of the item
* @return The enabled shortcut type matching the given position if the item is a
@@ -146,7 +164,7 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
final String number = getFormattedQueryString();
switch (shortcutType) {
case SHORTCUT_DIRECT_CALL:
- text = resources.getString(
+ text = ContactDisplayUtils.getTtsSpannedPhoneNumber(resources,
R.string.search_shortcut_call_number,
mBidiFormatter.unicodeWrap(number, TextDirectionHeuristics.LTR));
drawableId = R.drawable.ic_search_phone;
@@ -167,6 +185,10 @@ public class DialerPhoneNumberListAdapter extends PhoneNumberListAdapter {
text = resources.getString(R.string.search_shortcut_make_video_call);
drawableId = R.drawable.ic_videocam;
break;
+ case SHORTCUT_BLOCK_NUMBER:
+ text = resources.getString(R.string.search_shortcut_block_number);
+ drawableId = R.drawable.ic_not_interested_googblue_24dp;
+ break;
default:
throw new IllegalArgumentException("Invalid shortcut type");
}
diff --git a/src/com/android/dialer/list/DragDropController.java b/src/com/android/dialer/list/DragDropController.java
index 8cd1046e6..66ba513a8 100644
--- a/src/com/android/dialer/list/DragDropController.java
+++ b/src/com/android/dialer/list/DragDropController.java
@@ -3,6 +3,8 @@ package com.android.dialer.list;
import android.util.Log;
import android.view.View;
+import com.android.contacts.common.compat.CompatUtils;
+
import java.util.ArrayList;
import java.util.List;
@@ -33,13 +35,23 @@ public class DragDropController {
/**
* @return True if the drag is started, false if the drag is cancelled for some reason.
*/
- boolean handleDragStarted(int x, int y) {
- final PhoneFavoriteSquareTileView tileView = mDragItemContainer.getViewForLocation(x, y);
+ boolean handleDragStarted(View v, int x, int y) {
+ int screenX = x;
+ int screenY = y;
+ // The coordinates in dragEvent of DragEvent.ACTION_DRAG_STARTED before NYC is window-related.
+ // This is fixed in NYC.
+ if (CompatUtils.isNCompatible()) {
+ v.getLocationOnScreen(mLocationOnScreen);
+ screenX = x + mLocationOnScreen[0];
+ screenY = y + mLocationOnScreen[1];
+ }
+ final PhoneFavoriteSquareTileView tileView = mDragItemContainer.getViewForLocation(
+ screenX, screenY);
if (tileView == null) {
return false;
}
for (int i = 0; i < mOnDragDropListeners.size(); i++) {
- mOnDragDropListeners.get(i).onDragStarted(x, y, tileView);
+ mOnDragDropListeners.get(i).onDragStarted(screenX, screenY, tileView);
}
return true;
@@ -80,4 +92,4 @@ public class DragDropController {
}
}
-} \ No newline at end of file
+}
diff --git a/src/com/android/dialer/list/ListsFragment.java b/src/com/android/dialer/list/ListsFragment.java
index 33c977670..52bf3cbb5 100644
--- a/src/com/android/dialer/list/ListsFragment.java
+++ b/src/com/android/dialer/list/ListsFragment.java
@@ -1,10 +1,22 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.android.dialer.list;
-import android.animation.LayoutTransition;
-import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
-import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
@@ -14,28 +26,29 @@ import android.provider.CallLog.Calls;
import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
-import android.util.Log;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.AbsListView;
-import android.widget.ListView;
-import com.android.contacts.common.GeoUtil;
import com.android.contacts.common.list.ViewPagerTabs;
-import com.android.contacts.commonbind.analytics.AnalyticsUtil;
import com.android.dialer.DialtactsActivity;
import com.android.dialer.R;
import com.android.dialer.calllog.CallLogFragment;
+import com.android.dialer.calllog.CallLogNotificationsHelper;
import com.android.dialer.calllog.CallLogQueryHandler;
-import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.calllog.VisualVoicemailCallLogFragment;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.util.DialerUtils;
+import com.android.dialer.voicemail.VisualVoicemailEnabledChecker;
import com.android.dialer.voicemail.VoicemailStatusHelper;
import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
import com.android.dialer.widget.ActionBarController;
-import com.android.dialerbind.ObjectFactory;
import java.util.ArrayList;
+import java.util.List;
/**
* Fragment that is used as the main screen of the Dialer.
@@ -52,20 +65,13 @@ public class ListsFragment extends Fragment
private static final String TAG = "ListsFragment";
public static final int TAB_INDEX_SPEED_DIAL = 0;
- public static final int TAB_INDEX_RECENTS = 1;
+ public static final int TAB_INDEX_HISTORY = 1;
public static final int TAB_INDEX_ALL_CONTACTS = 2;
public static final int TAB_INDEX_VOICEMAIL = 3;
public static final int TAB_COUNT_DEFAULT = 3;
public static final int TAB_COUNT_WITH_VOICEMAIL = 4;
- private static final int MAX_RECENTS_ENTRIES = 20;
- // Oldest recents entry to display is 2 weeks old.
- private static final long OLDEST_RECENTS_DATE = 1000L * 60 * 60 * 24 * 14;
-
- private static final String PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER =
- "has_active_voicemail_provider";
-
public interface HostInterface {
public ActionBarController getActionBarController();
}
@@ -78,7 +84,7 @@ public class ListsFragment extends Fragment
private View mRemoveViewContent;
private SpeedDialFragment mSpeedDialFragment;
- private CallLogFragment mRecentsFragment;
+ private CallLogFragment mHistoryFragment;
private AllContactsFragment mAllContactsFragment;
private CallLogFragment mVoicemailFragment;
@@ -98,10 +104,16 @@ public class ListsFragment extends Fragment
* The position of the currently selected tab.
*/
private int mTabIndex = TAB_INDEX_SPEED_DIAL;
+ private CallLogQueryHandler mCallLogQueryHandler;
public class ViewPagerAdapter extends FragmentPagerAdapter {
+ private final List<Fragment> mFragments = new ArrayList<>();
+
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
+ for (int i = 0; i < TAB_COUNT_WITH_VOICEMAIL; i++) {
+ mFragments.add(null);
+ }
}
@Override
@@ -115,22 +127,21 @@ public class ListsFragment extends Fragment
case TAB_INDEX_SPEED_DIAL:
mSpeedDialFragment = new SpeedDialFragment();
return mSpeedDialFragment;
- case TAB_INDEX_RECENTS:
- mRecentsFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL,
- MAX_RECENTS_ENTRIES, System.currentTimeMillis() - OLDEST_RECENTS_DATE);
- return mRecentsFragment;
+ case TAB_INDEX_HISTORY:
+ mHistoryFragment = new CallLogFragment(CallLogQueryHandler.CALL_TYPE_ALL);
+ return mHistoryFragment;
case TAB_INDEX_ALL_CONTACTS:
mAllContactsFragment = new AllContactsFragment();
return mAllContactsFragment;
case TAB_INDEX_VOICEMAIL:
- mVoicemailFragment = new CallLogFragment(Calls.VOICEMAIL_TYPE);
+ mVoicemailFragment = new VisualVoicemailCallLogFragment();
return mVoicemailFragment;
}
throw new IllegalStateException("No fragment at position " + position);
}
@Override
- public Object instantiateItem(ViewGroup container, int position) {
+ public Fragment instantiateItem(ViewGroup container, int position) {
// On rotation the FragmentManager handles rotation. Therefore getItem() isn't called.
// Copy the fragments that the FragmentManager finds so that we can store them in
// instance variables for later.
@@ -138,16 +149,32 @@ public class ListsFragment extends Fragment
(Fragment) super.instantiateItem(container, position);
if (fragment instanceof SpeedDialFragment) {
mSpeedDialFragment = (SpeedDialFragment) fragment;
- } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_RECENTS) {
- mRecentsFragment = (CallLogFragment) fragment;
+ } else if (fragment instanceof CallLogFragment && position == TAB_INDEX_HISTORY) {
+ mHistoryFragment = (CallLogFragment) fragment;
} else if (fragment instanceof AllContactsFragment) {
mAllContactsFragment = (AllContactsFragment) fragment;
} else if (fragment instanceof CallLogFragment && position == TAB_INDEX_VOICEMAIL) {
mVoicemailFragment = (CallLogFragment) fragment;
}
+ mFragments.set(position, fragment);
return fragment;
}
+ /**
+ * When {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged} is called,
+ * this method is called on all pages to determine whether they need to be recreated.
+ * When the voicemail tab is removed, the view needs to be recreated by returning
+ * POSITION_NONE. If notifyDataSetChanged is called for some other reason, the voicemail
+ * tab is recreated only if it is active. All other tabs do not need to be recreated
+ * and POSITION_UNCHANGED is returned.
+ */
+ @Override
+ public int getItemPosition(Object object) {
+ return !mHasActiveVoicemailProvider &&
+ mFragments.indexOf(object) == TAB_INDEX_VOICEMAIL ? POSITION_NONE :
+ POSITION_UNCHANGED;
+ }
+
@Override
public int getCount() {
return mHasActiveVoicemailProvider ? TAB_COUNT_WITH_VOICEMAIL : TAB_COUNT_DEFAULT;
@@ -164,16 +191,12 @@ public class ListsFragment extends Fragment
Trace.beginSection(TAG + " onCreate");
super.onCreate(savedInstanceState);
- Trace.beginSection(TAG + " getCurrentCountryIso");
- final String currentCountryIso = GeoUtil.getCurrentCountryIso(getActivity());
- Trace.endSection();
-
mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
mHasFetchedVoicemailStatus = false;
mPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
mHasActiveVoicemailProvider = mPrefs.getBoolean(
- PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false);
+ VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, false);
Trace.endSection();
}
@@ -182,15 +205,17 @@ public class ListsFragment extends Fragment
public void onResume() {
Trace.beginSection(TAG + " onResume");
super.onResume();
- mActionBar = getActivity().getActionBar();
+
+ mActionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if (getUserVisibleHint()) {
sendScreenViewForCurrentPosition();
}
// Fetch voicemail status to determine if we should show the voicemail tab.
- CallLogQueryHandler callLogQueryHandler =
+ mCallLogQueryHandler =
new CallLogQueryHandler(getActivity(), getActivity().getContentResolver(), this);
- callLogQueryHandler.fetchVoicemailStatus();
+ mCallLogQueryHandler.fetchVoicemailStatus();
+ mCallLogQueryHandler.fetchMissedCallsUnreadCount();
Trace.endSection();
}
@@ -211,18 +236,18 @@ public class ListsFragment extends Fragment
mTabTitles = new String[TAB_COUNT_WITH_VOICEMAIL];
mTabTitles[TAB_INDEX_SPEED_DIAL] = getResources().getString(R.string.tab_speed_dial);
- mTabTitles[TAB_INDEX_RECENTS] = getResources().getString(R.string.tab_recents);
+ mTabTitles[TAB_INDEX_HISTORY] = getResources().getString(R.string.tab_history);
mTabTitles[TAB_INDEX_ALL_CONTACTS] = getResources().getString(R.string.tab_all_contacts);
mTabTitles[TAB_INDEX_VOICEMAIL] = getResources().getString(R.string.tab_voicemail);
mTabIcons = new int[TAB_COUNT_WITH_VOICEMAIL];
- mTabIcons[TAB_INDEX_SPEED_DIAL] = R.drawable.tab_speed_dial;
- mTabIcons[TAB_INDEX_RECENTS] = R.drawable.tab_recents;
- mTabIcons[TAB_INDEX_ALL_CONTACTS] = R.drawable.tab_contacts;
- mTabIcons[TAB_INDEX_VOICEMAIL] = R.drawable.tab_voicemail;
+ mTabIcons[TAB_INDEX_SPEED_DIAL] = R.drawable.ic_grade_24dp;
+ mTabIcons[TAB_INDEX_HISTORY] = R.drawable.ic_schedule_24dp;
+ mTabIcons[TAB_INDEX_ALL_CONTACTS] = R.drawable.ic_people_24dp;
+ mTabIcons[TAB_INDEX_VOICEMAIL] = R.drawable.ic_voicemail_24dp;
mViewPagerTabs = (ViewPagerTabs) parentView.findViewById(R.id.lists_pager_header);
- mViewPagerTabs.setTabIcons(mTabIcons);
+ mViewPagerTabs.configureTabIcons(mTabIcons);
mViewPagerTabs.setViewPager(mViewPager);
addOnPageChangeListener(mViewPagerTabs);
@@ -253,7 +278,7 @@ public class ListsFragment extends Fragment
// Try to show the voicemail tab after the voicemail status returns.
mShowVoicemailTabAfterVoicemailStatusIsFetched = true;
}
- } else {
+ } else if (index < getTabCount()){
mViewPager.setCurrentItem(getRtlPosition(index));
}
}
@@ -305,11 +330,22 @@ public class ListsFragment extends Fragment
if (hasActiveVoicemailProvider != mHasActiveVoicemailProvider) {
mHasActiveVoicemailProvider = hasActiveVoicemailProvider;
mViewPagerAdapter.notifyDataSetChanged();
- mViewPagerTabs.setViewPager(mViewPager);
+
+ if (hasActiveVoicemailProvider) {
+ mViewPagerTabs.updateTab(TAB_INDEX_VOICEMAIL);
+ } else {
+ mViewPagerTabs.removeTab(TAB_INDEX_VOICEMAIL);
+ removeVoicemailFragment();
+ }
mPrefs.edit()
- .putBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER, hasActiveVoicemailProvider)
- .commit();
+ .putBoolean(VisualVoicemailEnabledChecker.PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER,
+ hasActiveVoicemailProvider)
+ .commit();
+ }
+
+ if (hasActiveVoicemailProvider) {
+ mCallLogQueryHandler.fetchVoicemailUnreadCount();
}
if (mHasActiveVoicemailProvider && mShowVoicemailTabAfterVoicemailStatusIsFetched) {
@@ -319,6 +355,40 @@ public class ListsFragment extends Fragment
}
@Override
+ public void onVoicemailUnreadCountFetched(Cursor cursor) {
+ if (getActivity() == null || getActivity().isFinishing() || cursor == null) {
+ return;
+ }
+
+ int count = 0;
+ try {
+ count = cursor.getCount();
+ } finally {
+ cursor.close();
+ }
+
+ mViewPagerTabs.setUnreadCount(count, TAB_INDEX_VOICEMAIL);
+ mViewPagerTabs.updateTab(TAB_INDEX_VOICEMAIL);
+ }
+
+ @Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {
+ if (getActivity() == null || getActivity().isFinishing() || cursor == null) {
+ return;
+ }
+
+ int count = 0;
+ try {
+ count = cursor.getCount();
+ } finally {
+ cursor.close();
+ }
+
+ mViewPagerTabs.setUnreadCount(count, TAB_INDEX_HISTORY);
+ mViewPagerTabs.updateTab(TAB_INDEX_HISTORY);
+ }
+
+ @Override
public boolean onCallsFetched(Cursor statusCursor) {
// Return false; did not take ownership of cursor
return false;
@@ -328,6 +398,31 @@ public class ListsFragment extends Fragment
return mTabIndex;
}
+ /**
+ * External method to update unread count because the unread count changes when the user
+ * expands a voicemail in the call log or when the user expands an unread call in the call
+ * history tab.
+ */
+ public void updateTabUnreadCounts() {
+ if (mCallLogQueryHandler != null) {
+ mCallLogQueryHandler.fetchMissedCallsUnreadCount();
+ if (mHasActiveVoicemailProvider) {
+ mCallLogQueryHandler.fetchVoicemailUnreadCount();
+ }
+ }
+ }
+
+ /**
+ * External method to mark all missed calls as read.
+ */
+ public void markMissedCallsAsReadAndRemoveNotifications() {
+ if (mCallLogQueryHandler != null) {
+ mCallLogQueryHandler.markMissedCallsAsRead();
+ CallLogNotificationsHelper.removeMissedCallNotifications(getActivity());
+ }
+ }
+
+
public void showRemoveView(boolean show) {
mRemoveViewContent.setVisibility(show ? View.VISIBLE : View.GONE);
mRemoveView.setAlpha(show ? 0 : 1);
@@ -363,22 +458,30 @@ public class ListsFragment extends Fragment
return;
}
- String fragmentName;
+ int screenType;
switch (getCurrentTabIndex()) {
case TAB_INDEX_SPEED_DIAL:
- fragmentName = SpeedDialFragment.class.getSimpleName();
+ screenType = ScreenEvent.SPEED_DIAL;
break;
- case TAB_INDEX_RECENTS:
- fragmentName = CallLogFragment.class.getSimpleName() + "#Recents";
+ case TAB_INDEX_HISTORY:
+ screenType = ScreenEvent.CALL_LOG;
break;
case TAB_INDEX_ALL_CONTACTS:
- fragmentName = AllContactsFragment.class.getSimpleName();
+ screenType = ScreenEvent.ALL_CONTACTS;
break;
case TAB_INDEX_VOICEMAIL:
- fragmentName = CallLogFragment.class.getSimpleName() + "#Voicemail";
+ screenType = ScreenEvent.VOICEMAIL_LOG;
default:
return;
}
- AnalyticsUtil.sendScreenView(fragmentName, getActivity(), null);
+ Logger.logScreenView(screenType, getActivity());
+ }
+
+ private void removeVoicemailFragment() {
+ if (mVoicemailFragment != null) {
+ getChildFragmentManager().beginTransaction().remove(mVoicemailFragment)
+ .commitAllowingStateLoss();
+ mVoicemailFragment = null;
+ }
}
}
diff --git a/src/com/android/dialer/list/PhoneFavoriteListView.java b/src/com/android/dialer/list/PhoneFavoriteListView.java
index ec31bd31f..aad8ad58f 100644
--- a/src/com/android/dialer/list/PhoneFavoriteListView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteListView.java
@@ -155,7 +155,7 @@ public class PhoneFavoriteListView extends GridView implements OnDragDropListene
// on a {@link PhoneFavoriteTileView}
return false;
}
- if (!mDragDropController.handleDragStarted(eX, eY)) {
+ if (!mDragDropController.handleDragStarted(this, eX, eY)) {
return false;
}
break;
diff --git a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
index 05780c66a..69a230c8a 100644
--- a/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
+++ b/src/com/android/dialer/list/PhoneFavoriteSquareTileView.java
@@ -24,6 +24,7 @@ import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
+import com.android.contacts.common.compat.CompatUtils;
import com.android.contacts.common.list.ContactEntry;
import com.android.dialer.R;
@@ -63,8 +64,13 @@ public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView {
}
private void launchQuickContact() {
- QuickContact.showQuickContact(getContext(), PhoneFavoriteSquareTileView.this,
- getLookupUri(), null, Phone.CONTENT_ITEM_TYPE);
+ if (CompatUtils.hasPrioritizedMimeType()) {
+ QuickContact.showQuickContact(getContext(), PhoneFavoriteSquareTileView.this,
+ getLookupUri(), null, Phone.CONTENT_ITEM_TYPE);
+ } else {
+ QuickContact.showQuickContact(getContext(), PhoneFavoriteSquareTileView.this,
+ getLookupUri(), QuickContact.MODE_LARGE, null);
+ }
}
@Override
@@ -95,6 +101,11 @@ public class PhoneFavoriteSquareTileView extends PhoneFavoriteTileView {
setMeasuredDimension(width, height);
}
+ @Override
+ protected String getNameForView(ContactEntry contactEntry) {
+ return contactEntry.getPreferredDisplayName();
+ }
+
public ContactEntry getContactEntry() {
return mContactEntry;
}
diff --git a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
index e957c8321..77da7e937 100644
--- a/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
+++ b/src/com/android/dialer/list/PhoneFavoritesTileAdapter.java
@@ -38,13 +38,13 @@ import android.util.LongSparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
-import android.widget.FrameLayout;
import com.android.contacts.common.ContactPhotoManager;
import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.common.list.ContactEntry;
import com.android.contacts.common.list.ContactTileAdapter.DisplayType;
import com.android.contacts.common.list.ContactTileView;
+import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.R;
import java.util.ArrayList;
@@ -70,6 +70,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements
private Context mContext;
private Resources mResources;
+ private ContactsPreferences mContactsPreferences;
/** Contact data stored in cache. This is used to populate the associated view. */
protected ArrayList<ContactEntry> mContactEntries = null;
@@ -92,7 +93,8 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements
protected int mIdIndex;
protected int mLookupIndex;
protected int mPhotoUriIndex;
- protected int mNameIndex;
+ protected int mNamePrimaryIndex;
+ protected int mNameAlternativeIndex;
protected int mPresenceIndex;
protected int mStatusIndex;
@@ -124,9 +126,17 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements
public int compare(ContactEntry lhs, ContactEntry rhs) {
return ComparisonChain.start()
.compare(lhs.pinned, rhs.pinned)
- .compare(lhs.name, rhs.name)
+ .compare(getPreferredSortName(lhs), getPreferredSortName(rhs))
.result();
}
+
+ private String getPreferredSortName(ContactEntry contactEntry) {
+ if (mContactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
+ || TextUtils.isEmpty(contactEntry.nameAlternative)) {
+ return contactEntry.namePrimary;
+ }
+ return contactEntry.nameAlternative;
+ }
};
public interface OnDataSetChangedForAnimationListener {
@@ -140,6 +150,7 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements
mListener = listener;
mContext = context;
mResources = context.getResources();
+ mContactsPreferences = new ContactsPreferences(mContext);
mNumFrequents = 0;
mContactEntries = new ArrayList<ContactEntry>();
@@ -172,19 +183,26 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements
*/
protected void bindColumnIndices() {
mIdIndex = ContactTileLoaderFactory.CONTACT_ID;
- mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
- mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
- mNameIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+ mNamePrimaryIndex = ContactTileLoaderFactory.DISPLAY_NAME;
+ mNameAlternativeIndex = ContactTileLoaderFactory.DISPLAY_NAME_ALTERNATIVE;
mStarredIndex = ContactTileLoaderFactory.STARRED;
- mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
- mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
-
+ mPhotoUriIndex = ContactTileLoaderFactory.PHOTO_URI;
+ mLookupIndex = ContactTileLoaderFactory.LOOKUP_KEY;
mPhoneNumberIndex = ContactTileLoaderFactory.PHONE_NUMBER;
mPhoneNumberTypeIndex = ContactTileLoaderFactory.PHONE_NUMBER_TYPE;
mPhoneNumberLabelIndex = ContactTileLoaderFactory.PHONE_NUMBER_LABEL;
- mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
mPinnedIndex = ContactTileLoaderFactory.PINNED;
mContactIdIndex = ContactTileLoaderFactory.CONTACT_ID_FOR_DATA;
+
+
+ mPresenceIndex = ContactTileLoaderFactory.CONTACT_PRESENCE;
+ mStatusIndex = ContactTileLoaderFactory.CONTACT_STATUS;
+ mIsDefaultNumberIndex = ContactTileLoaderFactory.IS_DEFAULT_NUMBER;
+ }
+
+ public void refreshContactsPreferences() {
+ mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
+ mContactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
}
/**
@@ -261,15 +279,19 @@ public class PhoneFavoritesTileAdapter extends BaseAdapter implements
final String photoUri = cursor.getString(mPhotoUriIndex);
final String lookupKey = cursor.getString(mLookupIndex);
final int pinned = cursor.getInt(mPinnedIndex);
- final String name = cursor.getString(mNameIndex);
+ final String name = cursor.getString(mNamePrimaryIndex);
+ final String nameAlternative = cursor.getString(mNameAlternativeIndex);
final boolean isStarred = cursor.getInt(mStarredIndex) > 0;
final boolean isDefaultNumber = cursor.getInt(mIsDefaultNumberIndex) > 0;
final ContactEntry contact = new ContactEntry();
contact.id = id;
- contact.name = (!TextUtils.isEmpty(name)) ? name :
+ contact.namePrimary = (!TextUtils.isEmpty(name)) ? name :
+ mResources.getString(R.string.missing_name);
+ contact.nameAlternative = (!TextUtils.isEmpty(nameAlternative)) ? nameAlternative :
mResources.getString(R.string.missing_name);
+ contact.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
contact.lookupKey = lookupKey;
contact.lookupUri = ContentUris.withAppendedId(
diff --git a/src/com/android/dialer/list/RegularSearchFragment.java b/src/com/android/dialer/list/RegularSearchFragment.java
index b7e26d690..df18af044 100644
--- a/src/com/android/dialer/list/RegularSearchFragment.java
+++ b/src/com/android/dialer/list/RegularSearchFragment.java
@@ -15,11 +15,11 @@
*/
package com.android.dialer.list;
-import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import static android.Manifest.permission.READ_CONTACTS;
import android.app.Activity;
import android.content.pm.PackageManager;
+import android.support.v13.app.FragmentCompat;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@@ -28,30 +28,34 @@ import com.android.contacts.common.list.PinnedHeaderListView;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.commonbind.analytics.AnalyticsUtil;
import com.android.dialerbind.ObjectFactory;
+import com.android.incallui.Call.LogState;
import com.android.dialer.R;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.service.CachedNumberLookupService;
import com.android.dialer.widget.EmptyContentView;
import com.android.dialer.widget.EmptyContentView.OnEmptyViewActionButtonClickedListener;
public class RegularSearchFragment extends SearchFragment
- implements OnEmptyViewActionButtonClickedListener {
+ implements OnEmptyViewActionButtonClickedListener,
+ FragmentCompat.OnRequestPermissionsResultCallback {
- private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
+ public static final int PERMISSION_REQUEST_CODE = 1;
private static final int SEARCH_DIRECTORY_RESULT_LIMIT = 5;
private static final CachedNumberLookupService mCachedNumberLookupService =
ObjectFactory.newCachedNumberLookupService();
- public RegularSearchFragment() {
- configureDirectorySearch();
+ public interface CapabilityChecker {
+ public boolean isNearbyPlacesSearchEnabled();
}
- @Override
- public void onStart() {
- super.onStart();
- AnalyticsUtil.sendScreenView(this);
+ protected String mPermissionToRequest;
+
+ public RegularSearchFragment() {
+ configureDirectorySearch();
}
public void configureDirectorySearch() {
@@ -65,10 +69,12 @@ public class RegularSearchFragment extends SearchFragment
((PinnedHeaderListView) getListView()).setScrollToSectionOnHeaderTouch(true);
}
+ @Override
protected ContactEntryListAdapter createListAdapter() {
RegularSearchListAdapter adapter = new RegularSearchListAdapter(getActivity());
adapter.setDisplayPhotos(true);
adapter.setUseCallableUri(usesCallableUri());
+ adapter.setListener(this);
return adapter;
}
@@ -85,15 +91,29 @@ public class RegularSearchFragment extends SearchFragment
@Override
protected void setupEmptyView() {
if (mEmptyView != null && getActivity() != null) {
+ final int imageResource;
+ final int actionLabelResource;
+ final int descriptionResource;
+ final OnEmptyViewActionButtonClickedListener listener;
if (!PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) {
- mEmptyView.setImage(R.drawable.empty_contacts);
- mEmptyView.setActionLabel(R.string.permission_single_turn_on);
- mEmptyView.setDescription(R.string.permission_no_search);
- mEmptyView.setActionClickedListener(this);
+ imageResource = R.drawable.empty_contacts;
+ actionLabelResource = R.string.permission_single_turn_on;
+ descriptionResource = R.string.permission_no_search;
+ listener = this;
+ mPermissionToRequest = READ_CONTACTS;
} else {
- mEmptyView.setImage(EmptyContentView.NO_IMAGE);
- mEmptyView.setActionLabel(EmptyContentView.NO_LABEL);
- mEmptyView.setDescription(EmptyContentView.NO_LABEL);
+ imageResource = EmptyContentView.NO_IMAGE;
+ actionLabelResource = EmptyContentView.NO_LABEL;
+ descriptionResource = EmptyContentView.NO_LABEL;
+ listener = null;
+ mPermissionToRequest = null;
+ }
+
+ mEmptyView.setImage(imageResource);
+ mEmptyView.setActionLabel(actionLabelResource);
+ mEmptyView.setDescription(descriptionResource);
+ if (listener != null) {
+ mEmptyView.setActionClickedListener(listener);
}
}
}
@@ -105,14 +125,27 @@ public class RegularSearchFragment extends SearchFragment
return;
}
- requestPermissions(new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE);
+ if (READ_CONTACTS.equals(mPermissionToRequest)) {
+ FragmentCompat.requestPermissions(this, new String[] {mPermissionToRequest},
+ PERMISSION_REQUEST_CODE);
+ }
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
- if (requestCode == READ_CONTACTS_PERMISSION_REQUEST_CODE) {
+ if (requestCode == PERMISSION_REQUEST_CODE) {
setupEmptyView();
+ if (grantResults != null && grantResults.length == 1
+ && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
+ PermissionsUtil.notifyPermissionGranted(getActivity(), mPermissionToRequest);
+ }
}
}
+
+ @Override
+ protected int getCallInitiationType(boolean isRemoteDirectory) {
+ return isRemoteDirectory ? LogState.INITIATION_REMOTE_DIRECTORY
+ : LogState.INITIATION_REGULAR_SEARCH;
+ }
}
diff --git a/src/com/android/dialer/list/RegularSearchListAdapter.java b/src/com/android/dialer/list/RegularSearchListAdapter.java
index 2be8a1dd7..afc621cf5 100644
--- a/src/com/android/dialer/list/RegularSearchListAdapter.java
+++ b/src/com/android/dialer/list/RegularSearchListAdapter.java
@@ -21,6 +21,8 @@ import android.net.Uri;
import android.text.TextUtils;
import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.compat.DirectoryCompat;
import com.android.contacts.common.list.DirectoryPartition;
import com.android.contacts.common.util.PhoneNumberHelper;
import com.android.dialer.calllog.ContactInfo;
@@ -31,7 +33,7 @@ import com.android.dialer.service.CachedNumberLookupService.CachedContactInfo;
* List adapter to display regular search results.
*/
public class RegularSearchListAdapter extends DialerPhoneNumberListAdapter {
- private boolean mIsQuerySipAddress;
+ protected boolean mIsQuerySipAddress;
public RegularSearchListAdapter(Context context) {
super(context);
@@ -45,21 +47,33 @@ public class RegularSearchListAdapter extends DialerPhoneNumberListAdapter {
CachedContactInfo cacheInfo = lookupService.buildCachedContactInfo(info);
final Cursor item = (Cursor) getItem(position);
if (item != null) {
+ final DirectoryPartition partition =
+ (DirectoryPartition) getPartition(getPartitionForPosition(position));
+ final long directoryId = partition.getDirectoryId();
+ final boolean isExtendedDirectory = isExtendedDirectory(directoryId);
+
info.name = item.getString(PhoneQuery.DISPLAY_NAME);
info.type = item.getInt(PhoneQuery.PHONE_TYPE);
info.label = item.getString(PhoneQuery.PHONE_LABEL);
info.number = item.getString(PhoneQuery.PHONE_NUMBER);
final String photoUriStr = item.getString(PhoneQuery.PHOTO_URI);
info.photoUri = photoUriStr == null ? null : Uri.parse(photoUriStr);
+ /*
+ * An extended directory is custom directory in the app, but not a directory provided by
+ * framework. So it can't be USER_TYPE_WORK.
+ *
+ * When a search result is selected, RegularSearchFragment calls getContactInfo and
+ * cache the resulting @{link ContactInfo} into local db. Set usertype to USER_TYPE_WORK
+ * only if it's NOT extended directory id and is enterprise directory.
+ */
+ info.userType = !isExtendedDirectory
+ && DirectoryCompat.isEnterpriseDirectoryId(directoryId)
+ ? ContactsUtils.USER_TYPE_WORK : ContactsUtils.USER_TYPE_CURRENT;
cacheInfo.setLookupKey(item.getString(PhoneQuery.LOOKUP_KEY));
- final int partitionIndex = getPartitionForPosition(position);
- final DirectoryPartition partition =
- (DirectoryPartition) getPartition(partitionIndex);
- final long directoryId = partition.getDirectoryId();
final String sourceName = partition.getLabel();
- if (isExtendedDirectory(directoryId)) {
+ if (isExtendedDirectory) {
cacheInfo.setExtendedSource(sourceName, directoryId);
} else {
cacheInfo.setDirectorySource(sourceName, directoryId);
@@ -82,18 +96,22 @@ public class RegularSearchListAdapter extends DialerPhoneNumberListAdapter {
// Don't show actions if the query string contains a letter.
final boolean showNumberShortcuts = !TextUtils.isEmpty(getFormattedQueryString())
&& hasDigitsInQueryString();
- // Email addresses that could be SIP addresses are an exception.
mIsQuerySipAddress = PhoneNumberHelper.isUriNumber(queryString);
+
+ if (isChanged(showNumberShortcuts)) {
+ notifyDataSetChanged();
+ }
+ super.setQueryString(queryString);
+ }
+
+ protected boolean isChanged(boolean showNumberShortcuts) {
boolean changed = false;
changed |= setShortcutEnabled(SHORTCUT_DIRECT_CALL,
showNumberShortcuts || mIsQuerySipAddress);
changed |= setShortcutEnabled(SHORTCUT_SEND_SMS_MESSAGE, showNumberShortcuts);
changed |= setShortcutEnabled(SHORTCUT_MAKE_VIDEO_CALL,
showNumberShortcuts && CallUtil.isVideoEnabled(getContext()));
- if (changed) {
- notifyDataSetChanged();
- }
- super.setQueryString(queryString);
+ return changed;
}
/**
diff --git a/src/com/android/dialer/list/RemoveView.java b/src/com/android/dialer/list/RemoveView.java
index fdb08f6f5..41f41752e 100644
--- a/src/com/android/dialer/list/RemoveView.java
+++ b/src/com/android/dialer/list/RemoveView.java
@@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.DragEvent;
+import android.view.accessibility.AccessibilityEvent;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -53,6 +54,9 @@ public class RemoveView extends FrameLayout {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_ENTERED:
+ // TODO: This is temporary solution and should be removed once accessibility for
+ // drag and drop is supported by framework(b/26871588).
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
setAppearanceHighlighted();
break;
case DragEvent.ACTION_DRAG_EXITED:
@@ -65,6 +69,7 @@ public class RemoveView extends FrameLayout {
}
break;
case DragEvent.ACTION_DROP:
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
if (mDragDropController != null) {
mDragDropController.handleDragFinished((int) event.getX(), (int) event.getY(),
true);
diff --git a/src/com/android/dialer/list/SearchFragment.java b/src/com/android/dialer/list/SearchFragment.java
index 315cfb914..82395b6f8 100644
--- a/src/com/android/dialer/list/SearchFragment.java
+++ b/src/com/android/dialer/list/SearchFragment.java
@@ -15,8 +15,6 @@
*/
package com.android.dialer.list;
-import static android.Manifest.permission.READ_CONTACTS;
-
import android.animation.Animator;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
@@ -25,13 +23,10 @@ import android.app.DialogFragment;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.net.Uri;
import android.os.Bundle;
-import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
@@ -47,9 +42,8 @@ import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.common.list.PhoneNumberPickerFragment;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.contacts.common.util.ViewUtil;
-import com.android.contacts.commonbind.analytics.AnalyticsUtil;
-import com.android.dialer.dialpad.DialpadFragment.ErrorDialogFragment;
import com.android.dialer.R;
+import com.android.dialer.dialpad.DialpadFragment.ErrorDialogFragment;
import com.android.dialer.util.DialerUtils;
import com.android.dialer.util.IntentUtil;
import com.android.dialer.widget.EmptyContentView;
@@ -105,8 +99,8 @@ public class SearchFragment extends PhoneNumberPickerFragment {
try {
mActivityScrollListener = (OnListFragmentScrolledListener) activity;
} catch (ClassCastException e) {
- throw new ClassCastException(activity.toString()
- + " must implement OnListFragmentScrolledListener");
+ Log.d(TAG, activity.toString() + " doesn't implement OnListFragmentScrolledListener. " +
+ "Ignoring.");
}
}
@@ -140,10 +134,17 @@ public class SearchFragment extends PhoneNumberPickerFragment {
listView.setBackgroundColor(res.getColor(R.color.background_dialer_results));
listView.setClipToPadding(false);
setVisibleScrollbarEnabled(false);
+
+ //Turn of accessibility live region as the list constantly update itself and spam messages.
+ listView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_NONE);
+ ContentChangedFilter.addToParent(listView);
+
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
- mActivityScrollListener.onListFragmentScrollStateChange(scrollState);
+ if (mActivityScrollListener != null) {
+ mActivityScrollListener.onListFragmentScrollStateChange(scrollState);
+ }
}
@Override
@@ -229,6 +230,7 @@ public class SearchFragment extends PhoneNumberPickerFragment {
DialerPhoneNumberListAdapter adapter = new DialerPhoneNumberListAdapter(getActivity());
adapter.setDisplayPhotos(true);
adapter.setUseCallableUri(super.usesCallableUri());
+ adapter.setListener(this);
return adapter;
}
@@ -250,7 +252,8 @@ public class SearchFragment extends PhoneNumberPickerFragment {
number = adapter.getQueryString();
listener = getOnPhoneNumberPickerListener();
if (listener != null && !checkForProhibitedPhoneNumber(number)) {
- listener.onCallNumberDirectly(number);
+ listener.onPickPhoneNumber(number, false /* isVideoCall */,
+ getCallInitiationType(false /* isRemoteDirectory */));
}
break;
case DialerPhoneNumberListAdapter.SHORTCUT_CREATE_NEW_CONTACT:
@@ -272,10 +275,12 @@ public class SearchFragment extends PhoneNumberPickerFragment {
DialerUtils.startActivityWithErrorToast(getActivity(), intent);
break;
case DialerPhoneNumberListAdapter.SHORTCUT_MAKE_VIDEO_CALL:
- number = adapter.getQueryString();
+ number = TextUtils.isEmpty(mAddToContactNumber) ?
+ adapter.getQueryString() : mAddToContactNumber;
listener = getOnPhoneNumberPickerListener();
if (listener != null && !checkForProhibitedPhoneNumber(number)) {
- listener.onCallNumberDirectly(number, true /* isVideoCall */);
+ listener.onPickPhoneNumber(number, true /* isVideoCall */,
+ getCallInitiationType(false /* isRemoteDirectory */));
}
break;
}
@@ -289,12 +294,12 @@ public class SearchFragment extends PhoneNumberPickerFragment {
public void updatePosition(boolean animate) {
// Use negative shadow height instead of 0 to account for the 9-patch's shadow.
int startTranslationValue =
- mActivity.isDialpadShown() ? mActionBarHeight - mShadowHeight: -mShadowHeight;
+ mActivity.isDialpadShown() ? mActionBarHeight - mShadowHeight : -mShadowHeight;
int endTranslationValue = 0;
// Prevents ListView from being translated down after a rotation when the ActionBar is up.
if (animate || mActivity.isActionBarShowing()) {
endTranslationValue =
- mActivity.isDialpadShown() ? 0 : mActionBarHeight -mShadowHeight;
+ mActivity.isDialpadShown() ? 0 : mActionBarHeight - mShadowHeight;
}
if (animate) {
// If the dialpad will be shown, then this animation involves sliding the list up.
@@ -353,7 +358,11 @@ public class SearchFragment extends PhoneNumberPickerFragment {
@Override
protected void startLoading() {
- if (PermissionsUtil.hasPermission(getActivity(), READ_CONTACTS)) {
+ if (getActivity() == null) {
+ return;
+ }
+
+ if (PermissionsUtil.hasContactsPermissions(getActivity())) {
super.startLoading();
} else if (TextUtils.isEmpty(getQueryString())) {
// Clear out any existing call shortcuts.
diff --git a/src/com/android/dialer/list/SmartDialSearchFragment.java b/src/com/android/dialer/list/SmartDialSearchFragment.java
index 72d3abf68..fcb61ffe0 100644
--- a/src/com/android/dialer/list/SmartDialSearchFragment.java
+++ b/src/com/android/dialer/list/SmartDialSearchFragment.java
@@ -22,14 +22,18 @@ import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v13.app.FragmentCompat;
import android.util.Log;
import android.view.View;
import com.android.contacts.common.list.ContactEntryListAdapter;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.dialpad.SmartDialCursorLoader;
+import com.android.dialer.logging.Logger;
+import com.android.dialer.logging.ScreenEvent;
import com.android.dialer.R;
import com.android.dialer.widget.EmptyContentView;
+import com.android.incallui.Call.LogState;
import java.util.ArrayList;
@@ -37,7 +41,8 @@ import java.util.ArrayList;
* Implements a fragment to load and display SmartDial search results.
*/
public class SmartDialSearchFragment extends SearchFragment
- implements EmptyContentView.OnEmptyViewActionButtonClickedListener {
+ implements EmptyContentView.OnEmptyViewActionButtonClickedListener,
+ FragmentCompat.OnRequestPermissionsResultCallback {
private static final String TAG = SmartDialSearchFragment.class.getSimpleName();
private static final int CALL_PHONE_PERMISSION_REQUEST_CODE = 1;
@@ -52,6 +57,7 @@ public class SmartDialSearchFragment extends SearchFragment
adapter.setQuickContactEnabled(true);
// Set adapter's query string to restore previous instance state.
adapter.setQueryString(getQueryString());
+ adapter.setListener(this);
return adapter;
}
@@ -105,7 +111,8 @@ public class SmartDialSearchFragment extends SearchFragment
return;
}
- requestPermissions(new String[] {CALL_PHONE}, CALL_PHONE_PERMISSION_REQUEST_CODE);
+ FragmentCompat.requestPermissions(this, new String[] {CALL_PHONE},
+ CALL_PHONE_PERMISSION_REQUEST_CODE);
}
@Override
@@ -116,6 +123,11 @@ public class SmartDialSearchFragment extends SearchFragment
}
}
+ @Override
+ protected int getCallInitiationType(boolean isRemoteDirectory) {
+ return LogState.INITIATION_SMART_DIAL;
+ }
+
public boolean isShowingPermissionRequest() {
return mEmptyView != null && mEmptyView.isShowingContent();
}
diff --git a/src/com/android/dialer/list/SpeedDialFragment.java b/src/com/android/dialer/list/SpeedDialFragment.java
index 324caefb6..7e10297d0 100644
--- a/src/com/android/dialer/list/SpeedDialFragment.java
+++ b/src/com/android/dialer/list/SpeedDialFragment.java
@@ -31,6 +31,7 @@ import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Trace;
+import android.support.v13.app.FragmentCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -52,8 +53,8 @@ import com.android.contacts.common.list.ContactTileView;
import com.android.contacts.common.list.OnPhoneNumberPickerActionListener;
import com.android.contacts.common.util.PermissionsUtil;
import com.android.dialer.R;
-import com.android.dialer.util.DialerUtils;
import com.android.dialer.widget.EmptyContentView;
+import com.android.incallui.Call.LogState;
import java.util.ArrayList;
import java.util.HashMap;
@@ -63,7 +64,8 @@ import java.util.HashMap;
*/
public class SpeedDialFragment extends Fragment implements OnItemClickListener,
PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener,
- EmptyContentView.OnEmptyViewActionButtonClickedListener {
+ EmptyContentView.OnEmptyViewActionButtonClickedListener,
+ FragmentCompat.OnRequestPermissionsResultCallback {
private static final int READ_CONTACTS_PERMISSION_REQUEST_CODE = 1;
@@ -115,14 +117,16 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener,
@Override
public void onContactSelected(Uri contactUri, Rect targetRect) {
if (mPhoneNumberPickerActionListener != null) {
- mPhoneNumberPickerActionListener.onPickPhoneNumberAction(contactUri);
+ mPhoneNumberPickerActionListener.onPickDataUri(contactUri,
+ false /* isVideoCall */, LogState.INITIATION_SPEED_DIAL);
}
}
@Override
public void onCallNumberDirectly(String phoneNumber) {
if (mPhoneNumberPickerActionListener != null) {
- mPhoneNumberPickerActionListener.onCallNumberDirectly(phoneNumber);
+ mPhoneNumberPickerActionListener.onPickPhoneNumber(phoneNumber,
+ false /* isVideoCall */, LogState.INITIATION_SPEED_DIAL);
}
}
@@ -200,7 +204,9 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener,
public void onResume() {
Trace.beginSection(TAG + " onResume");
super.onResume();
-
+ if (mContactTileAdapter != null) {
+ mContactTileAdapter.refreshContactsPreferences();
+ }
if (PermissionsUtil.hasContactsPermissions(getActivity())) {
if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null,
@@ -251,6 +257,11 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener,
mListView.setOnScrollListener(mScrollListener);
mListView.setFastScrollEnabled(false);
mListView.setFastScrollAlwaysVisible(false);
+
+ //prevent content changes of the list from firing accessibility events.
+ mListView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_NONE);
+ ContentChangedFilter.addToParent(mListView);
+
Trace.endSection();
return mParentView;
}
@@ -473,7 +484,8 @@ public class SpeedDialFragment extends Fragment implements OnItemClickListener,
}
if (!PermissionsUtil.hasPermission(activity, READ_CONTACTS)) {
- requestPermissions(new String[] {READ_CONTACTS}, READ_CONTACTS_PERMISSION_REQUEST_CODE);
+ FragmentCompat.requestPermissions(this, new String[] {READ_CONTACTS},
+ READ_CONTACTS_PERMISSION_REQUEST_CODE);
} else {
// Switch tabs
((HostInterface) activity).showAllContactsTab();
diff --git a/src/com/android/dialer/logging/InteractionEvent.java b/src/com/android/dialer/logging/InteractionEvent.java
new file mode 100644
index 000000000..88518b47c
--- /dev/null
+++ b/src/com/android/dialer/logging/InteractionEvent.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.logging;
+
+/**
+ * Class holding constants for Dialer interactions
+ */
+public class InteractionEvent {
+
+ public static final int UNKNOWN = 0;
+
+ /**
+ * An incoming call was blocked
+ */
+ public static final int CALL_BLOCKED = 15;
+
+ /**
+ * The user blocked a number from the Call Log screen
+ */
+ public static final int BLOCK_NUMBER_CALL_LOG = 16;
+
+ /**
+ * The user blocked a number from the Call details screen
+ */
+ public static final int BLOCK_NUMBER_CALL_DETAIL = 17;
+
+ /**
+ * The user blocked a number from the Management screen
+ */
+ public static final int BLOCK_NUMBER_MANAGEMENT_SCREEN = 18;
+
+ /**
+ * The user unblocked a number from the Call Log screen
+ */
+ public static final int UNBLOCK_NUMBER_CALL_LOG = 19;
+
+ /**
+ * The user unblocked a number from the Call details screen
+ */
+ public static final int UNBLOCK_NUMBER_CALL_DETAIL = 20;
+
+ /**
+ * The user unblocked a number from the Management screen
+ */
+ public static final int UNBLOCK_NUMBER_MANAGEMENT_SCREEN = 21;
+
+ /**
+ * The user blocked numbers from contacts marked as send to voicemail
+ */
+ public static final int IMPORT_SEND_TO_VOICEMAIL = 22;
+
+ /**
+ * The user blocked a number then undid the block
+ */
+ public static final int UNDO_BLOCK_NUMBER = 23;
+
+ /**
+ * The user unblocked a number then undid the unblock
+ */
+ public static final int UNDO_UNBLOCK_NUMBER = 24;
+
+}
diff --git a/src/com/android/dialer/logging/Logger.java b/src/com/android/dialer/logging/Logger.java
new file mode 100644
index 000000000..25b7268ad
--- /dev/null
+++ b/src/com/android/dialer/logging/Logger.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.logging;
+
+import android.app.Activity;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.contacts.commonbind.analytics.AnalyticsUtil;
+import com.android.dialerbind.ObjectFactory;
+import com.android.incallui.Call;
+
+/**
+ * Single entry point for all logging/analytics-related work for all user interactions.
+ */
+public abstract class Logger {
+ public static final String TAG = "Logger";
+
+ public static Logger getInstance() {
+ return ObjectFactory.getLoggerInstance();
+ }
+
+ /**
+ * Logs a call event. PII like the call's number or caller details should never be logged.
+ *
+ * @param call to log.
+ */
+ public static void logCall(Call call) {
+ final Logger logger = getInstance();
+ if (logger != null) {
+ logger.logCallImpl(call);
+ }
+ }
+
+ /**
+ * Logs an event indicating that a screen was displayed.
+ *
+ * @param screenType integer identifier of the displayed screen
+ * @param activity Parent activity of the displayed screen.
+ */
+ public static void logScreenView(int screenType, Activity activity) {
+ final Logger logger = getInstance();
+ if (logger != null) {
+ logger.logScreenViewImpl(screenType);
+ }
+
+ final String screenName = ScreenEvent.getScreenName(screenType);
+ if (!TextUtils.isEmpty(screenName)) {
+ AnalyticsUtil.sendScreenView(screenName, activity, null);
+ } else {
+ Log.w(TAG, "Unknown screenType: " + screenType);
+ }
+ }
+
+ /**
+ * Logs an interaction that occurred
+ *
+ * @param interaction an integer representing what interaction occurred.
+ * {@see com.android.dialer.logging.InteractionEvent}
+ */
+ public static void logInteraction(int interaction) {
+ final Logger logger = getInstance();
+ if (logger != null) {
+ logger.logInteractionImpl(interaction);
+ }
+ }
+
+ public abstract void logCallImpl(Call call);
+ public abstract void logScreenViewImpl(int screenType);
+ public abstract void logInteractionImpl(int dialerInteraction);
+}
diff --git a/src/com/android/dialer/logging/ScreenEvent.java b/src/com/android/dialer/logging/ScreenEvent.java
new file mode 100644
index 000000000..e0d7b0026
--- /dev/null
+++ b/src/com/android/dialer/logging/ScreenEvent.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.logging;
+
+import android.text.TextUtils;
+
+import com.android.contacts.common.dialog.ClearFrequentsDialog;
+import com.android.contacts.common.interactions.ImportExportDialogFragment;
+import com.android.dialer.calllog.CallLogFragment;
+import com.android.dialer.dialpad.DialpadFragment;
+import com.android.dialer.filterednumber.BlockedNumbersFragment;
+import com.android.dialer.list.AllContactsFragment;
+import com.android.dialer.list.BlockedListSearchFragment;
+import com.android.dialer.list.RegularSearchFragment;
+import com.android.dialer.list.SmartDialSearchFragment;
+import com.android.dialer.list.SpeedDialFragment;
+import com.android.dialer.settings.DialerSettingsActivity;
+import com.android.incallui.AnswerFragment;
+import com.android.incallui.CallCardFragment;
+import com.android.incallui.ConferenceManagerFragment;
+import com.android.incallui.InCallActivity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Stores constants identifying individual screens/dialogs/fragments in the application, and also
+ * provides a mapping of integer id -> screen name mappings for analytics purposes.
+ */
+public class ScreenEvent {
+ private static final Map<Integer, String> sScreenNameMap = new HashMap<>();
+
+ public static final String FRAGMENT_TAG_SEPARATOR = "#";
+
+ public static final int UNKNOWN = 0;
+
+ // The dialpad in the main Dialer activity
+ public static final int DIALPAD = 1;
+
+ // The speed dial tab in the main Dialer activity
+ public static final int SPEED_DIAL = 2;
+
+ // The recents tab in the main Dialer activity
+ public static final int CALL_LOG = 3;
+
+ // The voicemail tab in the main Dialer activity
+ public static final int VOICEMAIL_LOG = 4;
+
+ // The all contacts tab in the main Dialer activity
+ public static final int ALL_CONTACTS = 5;
+
+ // List of search results returned by typing into the search box.
+ public static final int REGULAR_SEARCH = 6;
+
+ // List of search results returned by typing into the dialpad.
+ public static final int SMART_DIAL_SEARCH = 7;
+
+ // The All and Missed call log tabs in CallLogActivity
+ public static final int CALL_LOG_FILTER = 8;
+
+ // Dialer settings screen.
+ public static final int SETTINGS = 9;
+
+ // The "Import/export contacts" dialog launched via the overflow menu.
+ public static final int IMPORT_EXPORT_CONTACTS = 10;
+
+ // The "Clear frequents" dialog launched via the overflow menu.
+ public static final int CLEAR_FREQUENTS = 11;
+
+ // The "Send feedback" dialog launched via the overflow menu.
+ public static final int SEND_FEEDBACK = 12;
+
+ // The main in call screen that displays caller details and contact photos
+ public static final int INCALL = 13;
+
+ // The screen that displays the glowpad widget (slide right to answer,
+ // slide left to dismiss).
+ public static final int INCOMING_CALL = 14;
+
+ // Conference management fragment displayed for conferences that support
+ // management of individual calls within the conference.
+ public static final int CONFERENCE_MANAGEMENT = 15;
+
+ // The dialpad displayed in-call that is used to send dtmf tones.
+ public static final int INCALL_DIALPAD = 16;
+
+ // Menu options displayed when long pressing on a call log entry.
+ public static final int CALL_LOG_CONTEXT_MENU = 17;
+
+ // Screen displayed to allow the user to see an overview of all blocked
+ // numbers.
+ public static final int BLOCKED_NUMBER_MANAGEMENT = 18;
+
+ // Screen displayed to allow the user to add a new blocked number.
+ public static final int BLOCKED_NUMBER_ADD_NUMBER = 19;
+
+ static {
+ sScreenNameMap.put(ScreenEvent.DIALPAD,
+ getScreenNameWithTag(DialpadFragment.class.getSimpleName(), "Dialer"));
+ sScreenNameMap.put(ScreenEvent.SPEED_DIAL, SpeedDialFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.CALL_LOG,
+ getScreenNameWithTag(CallLogFragment.class.getSimpleName(), "History"));
+ sScreenNameMap.put(ScreenEvent.VOICEMAIL_LOG,
+ getScreenNameWithTag(CallLogFragment.class.getSimpleName(), "Voicemail"));
+ sScreenNameMap.put(ScreenEvent.ALL_CONTACTS, AllContactsFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.REGULAR_SEARCH,
+ RegularSearchFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.SMART_DIAL_SEARCH,
+ SmartDialSearchFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.CALL_LOG_FILTER,
+ getScreenNameWithTag(CallLogFragment.class.getSimpleName(), "Filtered"));
+ sScreenNameMap.put(ScreenEvent.SETTINGS,
+ DialerSettingsActivity.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.IMPORT_EXPORT_CONTACTS,
+ ImportExportDialogFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.CLEAR_FREQUENTS,
+ ClearFrequentsDialog.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.SEND_FEEDBACK, "SendFeedback");
+ sScreenNameMap.put(ScreenEvent.INCALL, InCallActivity.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.INCOMING_CALL, AnswerFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.CONFERENCE_MANAGEMENT,
+ ConferenceManagerFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.INCALL_DIALPAD,
+ getScreenNameWithTag(DialpadFragment.class.getSimpleName(), "InCall"));
+ sScreenNameMap.put(ScreenEvent.CALL_LOG_CONTEXT_MENU, "CallLogContextMenu");
+ sScreenNameMap.put(ScreenEvent.BLOCKED_NUMBER_MANAGEMENT,
+ BlockedNumbersFragment.class.getSimpleName());
+ sScreenNameMap.put(ScreenEvent.BLOCKED_NUMBER_ADD_NUMBER,
+ BlockedListSearchFragment.class.getSimpleName());
+ }
+
+ /**
+ * For a given screen type, returns the actual screen name that is used for logging/analytics
+ * purposes.
+ *
+ * @param screenType unique ID of a type of screen
+ *
+ * @return the tagged version of the screen name corresponding to the provided screenType,
+ * or {@null} if the provided screenType is unknown.
+ */
+ public static String getScreenName(int screenType) {
+ return sScreenNameMap.get(screenType);
+ }
+
+ /**
+ * Build a tagged version of the provided screenName if the tag is non-empty.
+ *
+ * @param screenName Name of the screen.
+ * @param tag Optional tag describing the screen.
+ * @return the unchanged screenName if the tag is {@code null} or empty, the tagged version of
+ * the screenName otherwise.
+ */
+ public static String getScreenNameWithTag(String screenName, String tag) {
+ if (TextUtils.isEmpty(tag)) {
+ return screenName;
+ }
+ return screenName + FRAGMENT_TAG_SEPARATOR + tag;
+ }
+}
diff --git a/src/com/android/dialer/service/CachedNumberLookupService.java b/src/com/android/dialer/service/CachedNumberLookupService.java
index e91d458ce..018ada93f 100644
--- a/src/com/android/dialer/service/CachedNumberLookupService.java
+++ b/src/com/android/dialer/service/CachedNumberLookupService.java
@@ -1,9 +1,13 @@
package com.android.dialer.service;
import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.Nullable;
import com.android.dialer.calllog.ContactInfo;
+import java.io.InputStream;
+
public interface CachedNumberLookupService {
public interface CachedContactInfo {
@@ -42,7 +46,10 @@ public interface CachedNumberLookupService {
public boolean isBusiness(int sourceType);
public boolean canReportAsInvalid(int sourceType, String objectId);
- public boolean addPhoto(Context context, String number, byte[] photo);
+ /**
+ * @return return {@link Uri} to the photo or return {@code null} when failing to add photo
+ */
+ public @Nullable Uri addPhoto(Context context, String number, InputStream in);
/**
* Remove all cached phone number entries from the cache, regardless of how old they
diff --git a/src/com/android/dialer/service/ExtendedBlockingButtonRenderer.java b/src/com/android/dialer/service/ExtendedBlockingButtonRenderer.java
new file mode 100644
index 000000000..f8d5ea048
--- /dev/null
+++ b/src/com/android/dialer/service/ExtendedBlockingButtonRenderer.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.service;
+
+import android.support.annotation.Nullable;
+import android.view.View;
+import android.view.ViewStub;
+import android.widget.QuickContactBadge;
+import android.widget.TextView;
+
+import java.util.List;
+
+/**
+ * Interface responsible for rendering spam buttons.
+ */
+public interface ExtendedBlockingButtonRenderer {
+
+ final class ViewHolderInfo {
+
+ public final List<View> completeListItemViews;
+ public final List<View> extendedBlockedViews;
+ public final List<View> blockedNumberViews;
+ public final String phoneNumber;
+ public final String countryIso;
+ public final String nameOrNumber;
+ public final String displayNumber;
+
+ public ViewHolderInfo(
+ /* All existing views amongst the list item actions, even if invisible */
+ List<View> completeListItemViews,
+ /* Views that should be seen if the number is in the blacklist */
+ List<View> extendedBlockedViews,
+ /* Views that should be seen if the number is in the extended blacklist */
+ List<View> blockedNumberViews,
+ String phoneNumber,
+ String countryIso,
+ String nameOrNumber,
+ String displayNumber) {
+
+ this.completeListItemViews = completeListItemViews;
+ this.extendedBlockedViews = extendedBlockedViews;
+ this.blockedNumberViews = blockedNumberViews;
+ this.phoneNumber = phoneNumber;
+ this.countryIso = countryIso;
+ this.nameOrNumber = nameOrNumber;
+ this.displayNumber = displayNumber;
+ }
+ }
+
+ interface Listener {
+ void onBlockedNumber(String number, @Nullable String countryIso);
+ void onUnblockedNumber(String number, @Nullable String countryIso);
+ }
+
+ /**
+ * Renders buttons for a phone number.
+ */
+ void render(ViewStub viewStub);
+
+ void setViewHolderInfo(ViewHolderInfo info);
+
+ /**
+ * Updates the photo and label for the given phone number and country iso.
+ *
+ * @param number Phone number for which the rendering occurs.
+ * @param countryIso Two-letter country code.
+ * @param badge {@link QuickContactBadge} in which the photo should be rendered.
+ * @param view Textview that will hold the new label.
+ */
+ void updatePhotoAndLabelIfNecessary(
+ String number, String countryIso, QuickContactBadge badge, TextView view);
+}
diff --git a/src/com/android/dialer/settings/AppCompatPreferenceActivity.java b/src/com/android/dialer/settings/AppCompatPreferenceActivity.java
new file mode 100644
index 000000000..4e5d9c90e
--- /dev/null
+++ b/src/com/android/dialer/settings/AppCompatPreferenceActivity.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.settings;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.support.v7.app.ActionBar;
+import android.support.v7.app.AppCompatDelegate;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
+ * to be used with AppCompat.
+ */
+public class AppCompatPreferenceActivity extends PreferenceActivity {
+ private AppCompatDelegate mDelegate;
+
+ private boolean mIsSafeToCommitTransactions;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ getDelegate().installViewFactory();
+ getDelegate().onCreate(savedInstanceState);
+ super.onCreate(savedInstanceState);
+ mIsSafeToCommitTransactions = true;
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ getDelegate().onPostCreate(savedInstanceState);
+ }
+
+ public ActionBar getSupportActionBar() {
+ return getDelegate().getSupportActionBar();
+ }
+
+ public void setSupportActionBar(Toolbar toolbar) {
+ getDelegate().setSupportActionBar(toolbar);
+ }
+
+ @Override
+ public MenuInflater getMenuInflater() {
+ return getDelegate().getMenuInflater();
+ }
+
+ @Override
+ public void setContentView(int layoutResID) {
+ getDelegate().setContentView(layoutResID);
+ }
+
+ @Override
+ public void setContentView(View view) {
+ getDelegate().setContentView(view);
+ }
+
+ @Override
+ public void setContentView(View view, ViewGroup.LayoutParams params) {
+ getDelegate().setContentView(view, params);
+ }
+
+ @Override
+ public void addContentView(View view, ViewGroup.LayoutParams params) {
+ getDelegate().addContentView(view, params);
+ }
+
+ @Override
+ protected void onPostResume() {
+ super.onPostResume();
+ getDelegate().onPostResume();
+ }
+
+ @Override
+ protected void onTitleChanged(CharSequence title, int color) {
+ super.onTitleChanged(title, color);
+ getDelegate().setTitle(title);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ getDelegate().onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ getDelegate().onStop();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ getDelegate().onDestroy();
+ }
+
+ @Override
+ public void invalidateOptionsMenu() {
+ getDelegate().invalidateOptionsMenu();
+ }
+
+ private AppCompatDelegate getDelegate() {
+ if (mDelegate == null) {
+ mDelegate = AppCompatDelegate.create(this, null);
+ }
+ return mDelegate;
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mIsSafeToCommitTransactions = true;
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mIsSafeToCommitTransactions = true;
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mIsSafeToCommitTransactions = false;
+ }
+
+ /**
+ * Returns true if it is safe to commit {@link FragmentTransaction}s at this time, based on
+ * whether {@link Activity#onSaveInstanceState} has been called or not.
+ *
+ * Make sure that the current activity calls into
+ * {@link super.onSaveInstanceState(Bundle outState)} (if that method is overridden),
+ * so the flag is properly set.
+ */
+ public boolean isSafeToCommitTransactions() {
+ return mIsSafeToCommitTransactions;
+ }
+}
diff --git a/src/com/android/dialer/settings/DefaultRingtonePreference.java b/src/com/android/dialer/settings/DefaultRingtonePreference.java
index a1743814a..a8a23fddf 100644
--- a/src/com/android/dialer/settings/DefaultRingtonePreference.java
+++ b/src/com/android/dialer/settings/DefaultRingtonePreference.java
@@ -16,17 +16,16 @@
package com.android.dialer.settings;
-import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.preference.RingtonePreference;
-import android.provider.Settings;
import android.util.AttributeSet;
import android.widget.Toast;
import com.android.dialer.R;
+import com.android.dialer.compat.SettingsCompat;
/**
* RingtonePreference which doesn't show default ringtone setting.
@@ -49,7 +48,7 @@ public class DefaultRingtonePreference extends RingtonePreference {
@Override
protected void onSaveRingtone(Uri ringtoneUri) {
- if (!Settings.System.canWrite(getContext())) {
+ if (!SettingsCompat.System.canWrite(getContext())) {
Toast.makeText(
getContext(),
getContext().getResources().getString(R.string.toast_cannot_write_system_settings),
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index c459d35c5..fbdb4f9f5 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -1,29 +1,45 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.android.dialer.settings;
-import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
-import android.os.Process;
import android.os.UserManager;
-import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.provider.Settings;
+import android.support.v4.os.BuildCompat;
import android.telecom.TelecomManager;
import android.telephony.TelephonyManager;
-import android.util.Log;
import android.view.MenuItem;
import android.widget.Toast;
-import com.android.contacts.common.util.PermissionsUtil;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.TelephonyManagerCompat;
import com.android.dialer.R;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.compat.SettingsCompat;
+import com.android.dialer.compat.UserManagerCompat;
import java.util.List;
-public class DialerSettingsActivity extends PreferenceActivity {
-
+public class DialerSettingsActivity extends AppCompatPreferenceActivity {
protected SharedPreferences mPreferences;
+ private boolean migrationStatusOnBuildHeaders;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -32,6 +48,18 @@ public class DialerSettingsActivity extends PreferenceActivity {
}
@Override
+ protected void onResume() {
+ super.onResume();
+ /*
+ * The headers need to be recreated if the migration status changed between when the headers
+ * were created and now.
+ */
+ if (migrationStatusOnBuildHeaders != FilteredNumberCompat.hasMigratedToNewBlocking()) {
+ invalidateHeaders();
+ }
+ }
+
+ @Override
public void onBuildHeaders(List<Header> target) {
Header displayOptionsHeader = new Header();
displayOptionsHeader.titleRes = R.string.display_options_title;
@@ -44,47 +72,58 @@ public class DialerSettingsActivity extends PreferenceActivity {
soundSettingsHeader.id = R.id.settings_header_sounds_and_vibration;
target.add(soundSettingsHeader);
- Header quickResponseSettingsHeader = new Header();
- Intent quickResponseSettingsIntent =
- new Intent(TelecomManager.ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS);
- quickResponseSettingsHeader.titleRes = R.string.respond_via_sms_setting_title;
- quickResponseSettingsHeader.intent = quickResponseSettingsIntent;
- target.add(quickResponseSettingsHeader);
+ if (CompatUtils.isMarshmallowCompatible()) {
+ Header quickResponseSettingsHeader = new Header();
+ Intent quickResponseSettingsIntent =
+ new Intent(TelecomManager.ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS);
+ quickResponseSettingsHeader.titleRes = R.string.respond_via_sms_setting_title;
+ quickResponseSettingsHeader.intent = quickResponseSettingsIntent;
+ target.add(quickResponseSettingsHeader);
+ }
TelephonyManager telephonyManager =
(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- // Only show call setting menus if the current user is the primary/owner user.
- if (isPrimaryUser()) {
- // Show "Call Settings" if there is one SIM and "Phone Accounts" if there are more.
- if (telephonyManager.getPhoneCount() <= 1) {
- Header callSettingsHeader = new Header();
- Intent callSettingsIntent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
- callSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-
- callSettingsHeader.titleRes = R.string.call_settings_label;
- callSettingsHeader.intent = callSettingsIntent;
- target.add(callSettingsHeader);
- } else {
- Header phoneAccountSettingsHeader = new Header();
- Intent phoneAccountSettingsIntent =
- new Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS);
- phoneAccountSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-
- phoneAccountSettingsHeader.titleRes = R.string.phone_account_settings_label;
- phoneAccountSettingsHeader.intent = phoneAccountSettingsIntent;
- target.add(phoneAccountSettingsHeader);
- }
-
- if (telephonyManager.isTtyModeSupported()
- || telephonyManager.isHearingAidCompatibilitySupported()) {
- Header accessibilitySettingsHeader = new Header();
- Intent accessibilitySettingsIntent =
- new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
- accessibilitySettingsHeader.titleRes = R.string.accessibility_settings_title;
- accessibilitySettingsHeader.intent = accessibilitySettingsIntent;
- target.add(accessibilitySettingsHeader);
- }
+ // "Call Settings" (full settings) is shown if the current user is primary user and there
+ // is only one SIM. Before N, "Calling accounts" setting is shown if the current user is
+ // primary user and there are multiple SIMs. In N+, "Calling accounts" is shown whenever
+ // "Call Settings" is not shown.
+ boolean isPrimaryUser = isPrimaryUser();
+ if (isPrimaryUser
+ && TelephonyManagerCompat.getPhoneCount(telephonyManager) <= 1) {
+ Header callSettingsHeader = new Header();
+ Intent callSettingsIntent = new Intent(TelecomManager.ACTION_SHOW_CALL_SETTINGS);
+ callSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+
+ callSettingsHeader.titleRes = R.string.call_settings_label;
+ callSettingsHeader.intent = callSettingsIntent;
+ target.add(callSettingsHeader);
+ } else if (BuildCompat.isAtLeastN() || isPrimaryUser) {
+ Header phoneAccountSettingsHeader = new Header();
+ Intent phoneAccountSettingsIntent =
+ new Intent(TelecomManager.ACTION_CHANGE_PHONE_ACCOUNTS);
+ phoneAccountSettingsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+
+ phoneAccountSettingsHeader.titleRes = R.string.phone_account_settings_label;
+ phoneAccountSettingsHeader.intent = phoneAccountSettingsIntent;
+ target.add(phoneAccountSettingsHeader);
+ }
+ if (FilteredNumberCompat.canCurrentUserOpenBlockSettings(this)) {
+ Header blockedCallsHeader = new Header();
+ blockedCallsHeader.titleRes = R.string.manage_blocked_numbers_label;
+ blockedCallsHeader.intent = FilteredNumberCompat.createManageBlockedNumbersIntent(this);
+ target.add(blockedCallsHeader);
+ migrationStatusOnBuildHeaders = FilteredNumberCompat.hasMigratedToNewBlocking();
+ }
+ if (isPrimaryUser
+ && (TelephonyManagerCompat.isTtyModeSupported(telephonyManager)
+ || TelephonyManagerCompat.isHearingAidCompatibilitySupported(telephonyManager))) {
+ Header accessibilitySettingsHeader = new Header();
+ Intent accessibilitySettingsIntent =
+ new Intent(TelecomManager.ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS);
+ accessibilitySettingsHeader.titleRes = R.string.accessibility_settings_title;
+ accessibilitySettingsHeader.intent = accessibilitySettingsIntent;
+ target.add(accessibilitySettingsHeader);
}
}
@@ -94,7 +133,7 @@ public class DialerSettingsActivity extends PreferenceActivity {
// If we don't have the permission to write to system settings, go to system sound
// settings instead. Otherwise, perform the super implementation (which launches our
// own preference fragment.
- if (!Settings.System.canWrite(this)) {
+ if (!SettingsCompat.System.canWrite(this)) {
Toast.makeText(
this,
getResources().getString(R.string.toast_cannot_write_system_settings),
@@ -116,6 +155,14 @@ public class DialerSettingsActivity extends PreferenceActivity {
}
@Override
+ public void onBackPressed() {
+ if (!isSafeToCommitTransactions()) {
+ return;
+ }
+ super.onBackPressed();
+ }
+
+ @Override
protected boolean isValidFragment(String fragmentName) {
return true;
}
@@ -124,7 +171,6 @@ public class DialerSettingsActivity extends PreferenceActivity {
* @return Whether the current user is the primary user.
*/
private boolean isPrimaryUser() {
- final UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
- return userManager.isSystemUser();
+ return UserManagerCompat.isSystemUser((UserManager) getSystemService(Context.USER_SERVICE));
}
}
diff --git a/src/com/android/dialer/settings/SoundSettingsFragment.java b/src/com/android/dialer/settings/SoundSettingsFragment.java
index 83847004d..59f8798c3 100644
--- a/src/com/android/dialer/settings/SoundSettingsFragment.java
+++ b/src/com/android/dialer/settings/SoundSettingsFragment.java
@@ -16,10 +16,9 @@
package com.android.dialer.settings;
-import android.app.AppOpsManager;
import android.content.Context;
-import android.content.Intent;
import android.media.RingtoneManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -32,21 +31,13 @@ import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.TelephonyManager;
-import android.view.MenuItem;
import android.widget.Toast;
-import com.android.contacts.common.util.PermissionsUtil;
+import com.android.contacts.common.compat.SdkVersionOverride;
import com.android.dialer.R;
+import com.android.dialer.compat.SettingsCompat;
import com.android.phone.common.util.SettingsUtil;
-import java.lang.Boolean;
-import java.lang.CharSequence;
-import java.lang.Object;
-import java.lang.Override;
-import java.lang.Runnable;
-import java.lang.String;
-import java.lang.Thread;
-
public class SoundSettingsFragment extends PreferenceFragment
implements Preference.OnPreferenceChangeListener {
@@ -88,6 +79,11 @@ public class SoundSettingsFragment extends PreferenceFragment
};
@Override
+ public Context getContext() {
+ return getActivity();
+ }
+
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -115,7 +111,8 @@ public class SoundSettingsFragment extends PreferenceFragment
TelephonyManager telephonyManager =
(TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
- if (telephonyManager.canChangeDtmfToneLength()
+ if (SdkVersionOverride.getSdkVersion(Build.VERSION_CODES.M) >= Build.VERSION_CODES.M
+ && telephonyManager.canChangeDtmfToneLength()
&& (telephonyManager.isWorldPhone() || !shouldHideCarrierSettings())) {
mDtmfToneLength.setOnPreferenceChangeListener(this);
mDtmfToneLength.setValueIndex(
@@ -132,7 +129,7 @@ public class SoundSettingsFragment extends PreferenceFragment
public void onResume() {
super.onResume();
- if (!Settings.System.canWrite(getContext())) {
+ if (!SettingsCompat.System.canWrite(getContext())) {
// If the user launches this setting fragment, then toggles the WRITE_SYSTEM_SETTINGS
// AppOp, then close the fragment since there is nothing useful to do.
getActivity().onBackPressed();
@@ -155,7 +152,7 @@ public class SoundSettingsFragment extends PreferenceFragment
*/
@Override
public boolean onPreferenceChange(Preference preference, Object objValue) {
- if (!Settings.System.canWrite(getContext())) {
+ if (!SettingsCompat.System.canWrite(getContext())) {
// A user shouldn't be able to get here, but this protects against monkey crashes.
Toast.makeText(
getContext(),
@@ -181,7 +178,7 @@ public class SoundSettingsFragment extends PreferenceFragment
*/
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
- if (!Settings.System.canWrite(getContext())) {
+ if (!SettingsCompat.System.canWrite(getContext())) {
Toast.makeText(
getContext(),
getResources().getString(R.string.toast_cannot_write_system_settings),
diff --git a/src/com/android/dialer/util/AppCompatConstants.java b/src/com/android/dialer/util/AppCompatConstants.java
new file mode 100644
index 000000000..1d52eee1d
--- /dev/null
+++ b/src/com/android/dialer/util/AppCompatConstants.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.util;
+
+import android.provider.CallLog.Calls;
+
+public final class AppCompatConstants {
+
+ public static final int CALLS_INCOMING_TYPE = Calls.INCOMING_TYPE;
+ public static final int CALLS_OUTGOING_TYPE = Calls.OUTGOING_TYPE;
+ public static final int CALLS_MISSED_TYPE = Calls.MISSED_TYPE;
+ public static final int CALLS_VOICEMAIL_TYPE = Calls.VOICEMAIL_TYPE;
+ // Added to android.provider.CallLog.Calls in N+.
+ public static final int CALLS_REJECTED_TYPE = 5;
+ // Added to android.provider.CallLog.Calls in N+.
+ public static final int CALLS_BLOCKED_TYPE = 6;
+}
diff --git a/src/com/android/dialer/util/Assert.java b/src/com/android/dialer/util/Assert.java
new file mode 100644
index 000000000..ec0a6ccb6
--- /dev/null
+++ b/src/com/android/dialer/util/Assert.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.util;
+
+import android.os.Looper;
+
+public class Assert {
+ public static void assertNotUiThread(String msg) {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ throw new AssertionError(msg);
+ }
+ }
+
+ public static void assertNotNull(Object object, String msg) {
+ if (object == null) {
+ throw new AssertionError(object);
+ }
+ }
+
+ public static void assertNotNull(Object object) {
+ assertNotNull(object, null);
+ }
+}
diff --git a/src/com/android/dialer/util/DialerUtils.java b/src/com/android/dialer/util/DialerUtils.java
index e25ada59d..95d6a81b6 100644
--- a/src/com/android/dialer/util/DialerUtils.java
+++ b/src/com/android/dialer/util/DialerUtils.java
@@ -33,18 +33,12 @@ import android.text.TextDirectionHeuristics;
import android.text.TextUtils;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
-import android.widget.ImageView;
-import android.widget.TextView;
import android.widget.Toast;
import com.android.contacts.common.ContactsUtils;
import com.android.contacts.common.interactions.TouchPointManager;
import com.android.dialer.R;
-import com.android.dialer.widget.EmptyContentView;
-import com.android.incallui.CallCardFragment;
-import com.android.incallui.Log;
-import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@@ -81,13 +75,25 @@ public class DialerUtils {
// All dialer-initiated calls should pass the touch point to the InCallUI
Point touchPoint = TouchPointManager.getInstance().getPoint();
if (touchPoint.x != 0 || touchPoint.y != 0) {
- Bundle extras = new Bundle();
+ Bundle extras;
+ // Make sure to not accidentally clobber any existing extras
+ if (intent.hasExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS)) {
+ extras = intent.getParcelableExtra(
+ TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS);
+ } else {
+ extras = new Bundle();
+ }
extras.putParcelable(TouchPointManager.TOUCH_POINT, touchPoint);
intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, extras);
}
- final TelecomManager tm =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
- tm.placeCall(intent.getData(), intent.getExtras());
+
+ final boolean hasCallPermission = TelecomUtil.placeCall((Activity) context, intent);
+ if (!hasCallPermission) {
+ // TODO: Make calling activity show request permission dialog and handle
+ // callback results appropriately.
+ Toast.makeText(context, "Cannot place call without Phone permission",
+ Toast.LENGTH_SHORT);
+ }
} else {
context.startActivity(intent);
}
diff --git a/src/com/android/dialer/util/IntentUtil.java b/src/com/android/dialer/util/IntentUtil.java
index 2ce3bd1f8..5a4a80bb1 100644
--- a/src/com/android/dialer/util/IntentUtil.java
+++ b/src/com/android/dialer/util/IntentUtil.java
@@ -18,14 +18,13 @@ package com.android.dialer.util;
import android.content.Intent;
import android.net.Uri;
+import android.os.Bundle;
import android.provider.ContactsContract;
-import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
import com.android.contacts.common.CallUtil;
-import com.android.phone.common.PhoneConstants;
/**
* Utilities for creation of intents in Dialer, such as {@link Intent#ACTION_CALL}.
@@ -36,108 +35,65 @@ public class IntentUtil {
private static final String SMS_URI_PREFIX = "sms:";
private static final int NO_PHONE_TYPE = -1;
- /**
- * Return an Intent for making a phone call. Scheme (e.g. tel, sip) will be determined
- * automatically.
- */
- public static Intent getCallIntent(String number) {
- return getCallIntent(number, null, null);
- }
-
- /**
- * Return an Intent for making a phone call. A given Uri will be used as is (without any
- * sanity check).
- */
- public static Intent getCallIntent(Uri uri) {
- return getCallIntent(uri, null, null);
- }
+ public static final String EXTRA_CALL_INITIATION_TYPE
+ = "com.android.dialer.EXTRA_CALL_INITIATION_TYPE";
- /**
- * A variant of {@link #getCallIntent(String)} but also accept a call origin.
- * For more information about call origin, see comments in Phone package (PhoneApp).
- */
- public static Intent getCallIntent(String number, String callOrigin) {
- return getCallIntent(CallUtil.getCallUri(number), callOrigin, null);
- }
+ public static class CallIntentBuilder {
+ private Uri mUri;
+ private int mCallInitiationType;
+ private PhoneAccountHandle mPhoneAccountHandle;
+ private boolean mIsVideoCall = false;
- /**
- * A variant of {@link #getCallIntent(String)} but also include {@code Account}.
- */
- public static Intent getCallIntent(String number, PhoneAccountHandle accountHandle) {
- return getCallIntent(number, null, accountHandle);
- }
-
- /**
- * A variant of {@link #getCallIntent(android.net.Uri)} but also include {@code Account}.
- */
- public static Intent getCallIntent(Uri uri, PhoneAccountHandle accountHandle) {
- return getCallIntent(uri, null, accountHandle);
- }
-
- /**
- * A variant of {@link #getCallIntent(String, String)} but also include {@code Account}.
- */
- public static Intent getCallIntent(
- String number, String callOrigin, PhoneAccountHandle accountHandle) {
- return getCallIntent(CallUtil.getCallUri(number), callOrigin, accountHandle);
- }
+ public CallIntentBuilder(Uri uri) {
+ mUri = uri;
+ }
- /**
- * A variant of {@link #getCallIntent(android.net.Uri)} but also accept a call
- * origin and {@code Account}.
- * For more information about call origin, see comments in Phone package (PhoneApp).
- */
- public static Intent getCallIntent(
- Uri uri, String callOrigin, PhoneAccountHandle accountHandle) {
- return getCallIntent(uri, callOrigin, accountHandle,
- VideoProfile.STATE_AUDIO_ONLY);
- }
+ public CallIntentBuilder(String number) {
+ this(CallUtil.getCallUri(number));
+ }
- /**
- * A variant of {@link #getCallIntent(String, String)} for starting a video call.
- */
- public static Intent getVideoCallIntent(String number, String callOrigin) {
- return getCallIntent(CallUtil.getCallUri(number), callOrigin, null,
- VideoProfile.STATE_BIDIRECTIONAL);
- }
+ public CallIntentBuilder setCallInitiationType(int initiationType) {
+ mCallInitiationType = initiationType;
+ return this;
+ }
- /**
- * A variant of {@link #getCallIntent(String, String, android.telecom.PhoneAccountHandle)} for
- * starting a video call.
- */
- public static Intent getVideoCallIntent(
- String number, String callOrigin, PhoneAccountHandle accountHandle) {
- return getCallIntent(CallUtil.getCallUri(number), callOrigin, accountHandle,
- VideoProfile.STATE_BIDIRECTIONAL);
- }
+ public CallIntentBuilder setPhoneAccountHandle(PhoneAccountHandle accountHandle) {
+ mPhoneAccountHandle = accountHandle;
+ return this;
+ }
- /**
- * A variant of {@link #getCallIntent(String, String, android.telecom.PhoneAccountHandle)} for
- * starting a video call.
- */
- public static Intent getVideoCallIntent(String number, PhoneAccountHandle accountHandle) {
- return getVideoCallIntent(number, null, accountHandle);
- }
+ public CallIntentBuilder setIsVideoCall(boolean isVideoCall) {
+ mIsVideoCall = isVideoCall;
+ return this;
+ }
- /**
- * A variant of {@link #getCallIntent(android.net.Uri)} for calling Voicemail.
- */
- public static Intent getVoicemailIntent() {
- return getCallIntent(Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null));
+ public Intent build() {
+ return getCallIntent(
+ mUri,
+ mPhoneAccountHandle,
+ mIsVideoCall ? VideoProfile.STATE_BIDIRECTIONAL : VideoProfile.STATE_AUDIO_ONLY,
+ mCallInitiationType);
+ }
}
/**
- * A variant of {@link #getCallIntent(android.net.Uri)} but also accept a call
- * origin and {@code Account} and {@code VideoCallProfile} state.
- * For more information about call origin, see comments in Phone package (PhoneApp).
+ * Create a call intent that can be used to place a call.
+ *
+ * @param uri Address to place the call to.
+ * @param accountHandle {@link PhoneAccountHandle} to place the call with.
+ * @param videoState Initial video state of the call.
+ * @param callIntiationType The UI affordance the call was initiated by.
+ * @return Call intent with provided extras and data.
*/
public static Intent getCallIntent(
- Uri uri, String callOrigin, PhoneAccountHandle accountHandle, int videoState) {
+ Uri uri, PhoneAccountHandle accountHandle, int videoState, int callIntiationType) {
final Intent intent = new Intent(CALL_ACTION, uri);
intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, videoState);
- if (callOrigin != null) {
- intent.putExtra(PhoneConstants.EXTRA_CALL_ORIGIN, callOrigin);
- }
+
+ final Bundle b = new Bundle();
+ b.putInt(EXTRA_CALL_INITIATION_TYPE, callIntiationType);
+ intent.putExtra(TelecomManager.EXTRA_OUTGOING_CALL_EXTRAS, b);
+
if (accountHandle != null) {
intent.putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, accountHandle);
}
diff --git a/src/com/android/dialer/util/MoreStrings.java b/src/com/android/dialer/util/MoreStrings.java
new file mode 100644
index 000000000..68956f25c
--- /dev/null
+++ b/src/com/android/dialer/util/MoreStrings.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.util;
+
+/**
+ * Static utility methods for Strings.
+ */
+public class MoreStrings {
+
+ public static String toSafeString(String value) {
+ if (value == null) {
+ return null;
+ }
+
+ // Do exactly same thing as Uri#toSafeString() does, which will enable us to compare
+ // sanitized phone numbers.
+ final StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < value.length(); i++) {
+ final char c = value.charAt(i);
+ if (c == '-' || c == '@' || c == '.') {
+ builder.append(c);
+ } else {
+ builder.append('x');
+ }
+ }
+ return builder.toString();
+ }
+
+}
diff --git a/src/com/android/dialer/util/PhoneLookupUtil.java b/src/com/android/dialer/util/PhoneLookupUtil.java
new file mode 100644
index 000000000..1a7239642
--- /dev/null
+++ b/src/com/android/dialer/util/PhoneLookupUtil.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.util;
+
+import android.net.Uri;
+import android.provider.ContactsContract;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.PhoneLookupSdkCompat;
+
+public final class PhoneLookupUtil {
+ /**
+ * @return the column name that stores contact id for phone lookup query.
+ */
+ public static String getContactIdColumnNameForUri(Uri phoneLookupUri) {
+ if (CompatUtils.isNCompatible()) {
+ return PhoneLookupSdkCompat.CONTACT_ID;
+ }
+ // In pre-N, contact id is stored in {@link PhoneLookup#_ID} in non-sip query.
+ boolean isSip = phoneLookupUri.getBooleanQueryParameter(
+ ContactsContract.PhoneLookup.QUERY_PARAMETER_SIP_ADDRESS, false);
+ return (isSip) ? PhoneLookupSdkCompat.CONTACT_ID : ContactsContract.PhoneLookup._ID;
+ }
+
+ private PhoneLookupUtil() {}
+}
diff --git a/src/com/android/dialer/util/PhoneNumberUtil.java b/src/com/android/dialer/util/PhoneNumberUtil.java
index 84f58aa85..33f987359 100644
--- a/src/com/android/dialer/util/PhoneNumberUtil.java
+++ b/src/com/android/dialer/util/PhoneNumberUtil.java
@@ -19,19 +19,24 @@ package com.android.dialer.util;
import android.content.Context;
import android.provider.CallLog;
import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import com.android.contacts.common.util.PhoneNumberHelper;
+import com.android.contacts.common.util.TelephonyManagerUtils;
import com.google.common.collect.Sets;
+import com.google.i18n.phonenumbers.NumberParseException;
+import com.google.i18n.phonenumbers.Phonenumber;
+import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
public class PhoneNumberUtil {
+ private static final String TAG = "PhoneNumberUtil";
private static final Set<String> LEGACY_UNKNOWN_NUMBERS = Sets.newHashSet("-1", "-2", "-3");
/** Returns true if it is possible to place a call to the given number. */
@@ -49,10 +54,7 @@ public class PhoneNumberUtil {
if (TextUtils.isEmpty(number)) {
return false;
}
-
- final TelecomManager telecomManager =
- (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
- return telecomManager.isVoiceMailNumber(accountHandle, number.toString());
+ return TelecomUtil.isVoicemailNumber(context, accountHandle, number.toString());
}
/**
@@ -92,4 +94,45 @@ public class PhoneNumberUtil {
public static boolean isLegacyUnknownNumbers(CharSequence number) {
return number != null && LEGACY_UNKNOWN_NUMBERS.contains(number.toString());
}
+
+ /**
+ * @return a geographical description string for the specified number.
+ * @see com.android.i18n.phonenumbers.PhoneNumberOfflineGeocoder
+ */
+ public static String getGeoDescription(Context context, String number) {
+ Log.v(TAG, "getGeoDescription('" + pii(number) + "')...");
+
+ if (TextUtils.isEmpty(number)) {
+ return null;
+ }
+
+ com.google.i18n.phonenumbers.PhoneNumberUtil util =
+ com.google.i18n.phonenumbers.PhoneNumberUtil.getInstance();
+ PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();
+
+ Locale locale = context.getResources().getConfiguration().locale;
+ String countryIso = TelephonyManagerUtils.getCurrentCountryIso(context, locale);
+ Phonenumber.PhoneNumber pn = null;
+ try {
+ Log.v(TAG, "parsing '" + pii(number)
+ + "' for countryIso '" + countryIso + "'...");
+ pn = util.parse(number, countryIso);
+ Log.v(TAG, "- parsed number: " + pii(pn));
+ } catch (NumberParseException e) {
+ Log.v(TAG, "getGeoDescription: NumberParseException for incoming number '" +
+ pii(number) + "'");
+ }
+
+ if (pn != null) {
+ String description = geocoder.getDescriptionForNumber(pn, locale);
+ Log.v(TAG, "- got description: '" + description + "'");
+ return description;
+ }
+
+ return null;
+ }
+
+ private static String pii(Object pii) {
+ return com.android.incallui.Log.pii(pii);
+ }
}
diff --git a/src/com/android/dialer/util/TelecomUtil.java b/src/com/android/dialer/util/TelecomUtil.java
index 1cd270c9b..bd201c459 100644
--- a/src/com/android/dialer/util/TelecomUtil.java
+++ b/src/com/android/dialer/util/TelecomUtil.java
@@ -17,23 +17,54 @@
package com.android.dialer.util;
import android.Manifest;
+import android.app.Activity;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.CallLog.Calls;
+import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
+import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
+import com.android.dialer.compat.DialerCompatUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Performs permission checks before calling into TelecomManager. Each method is self-explanatory -
+ * perform the required check and return the fallback default if the permission is missing,
+ * otherwise return the value from TelecomManager.
+ *
+ */
public class TelecomUtil {
private static final String TAG = "TelecomUtil";
private static boolean sWarningLogged = false;
+ public static void showInCallScreen(Context context, boolean showDialpad) {
+ if (hasReadPhoneStatePermission(context)) {
+ try {
+ getTelecomManager(context).showInCallScreen(showDialpad);
+ } catch (SecurityException e) {
+ // Just in case
+ Log.w(TAG, "TelecomManager.showInCallScreen called without permission.");
+ }
+ }
+ }
+
public static void silenceRinger(Context context) {
if (hasModifyPhoneStatePermission(context)) {
try {
- getTelecomManager(context).silenceRinger();
+ TelecomManagerCompat.silenceRinger(getTelecomManager(context));
} catch (SecurityException e) {
// Just in case
Log.w(TAG, "TelecomManager.silenceRinger called without permission.");
@@ -54,7 +85,8 @@ public class TelecomUtil {
public static Uri getAdnUriForPhoneAccount(Context context, PhoneAccountHandle handle) {
if (hasModifyPhoneStatePermission(context)) {
try {
- return getTelecomManager(context).getAdnUriForPhoneAccount(handle);
+ return TelecomManagerCompat.getAdnUriForPhoneAccount(
+ getTelecomManager(context), handle);
} catch (SecurityException e) {
Log.w(TAG, "TelecomManager.getAdnUriForPhoneAccount called without permission.");
}
@@ -66,11 +98,8 @@ public class TelecomUtil {
PhoneAccountHandle handle) {
if (hasModifyPhoneStatePermission(context)) {
try {
- if (handle == null) {
- return getTelecomManager(context).handleMmi(dialString);
- } else {
- return getTelecomManager(context).handleMmi(dialString, handle);
- }
+ return TelecomManagerCompat.handleMmi(
+ getTelecomManager(context), dialString, handle);
} catch (SecurityException e) {
Log.w(TAG, "TelecomManager.handleMmi called without permission.");
}
@@ -78,6 +107,69 @@ public class TelecomUtil {
return false;
}
+ @Nullable
+ public static PhoneAccountHandle getDefaultOutgoingPhoneAccount(Context context,
+ String uriScheme) {
+ if (hasReadPhoneStatePermission(context)) {
+ return TelecomManagerCompat.getDefaultOutgoingPhoneAccount(
+ getTelecomManager(context), uriScheme);
+ }
+ return null;
+ }
+
+ public static PhoneAccount getPhoneAccount(Context context, PhoneAccountHandle handle) {
+ return TelecomManagerCompat.getPhoneAccount(getTelecomManager(context), handle);
+ }
+
+ public static List<PhoneAccountHandle> getCallCapablePhoneAccounts(Context context) {
+ if (hasReadPhoneStatePermission(context)) {
+ return TelecomManagerCompat.getCallCapablePhoneAccounts(getTelecomManager(context));
+ }
+ return new ArrayList<>();
+ }
+
+ public static boolean isInCall(Context context) {
+ if (hasReadPhoneStatePermission(context)) {
+ return getTelecomManager(context).isInCall();
+ }
+ return false;
+ }
+
+ public static boolean isVoicemailNumber(Context context, PhoneAccountHandle accountHandle,
+ String number) {
+ if (hasReadPhoneStatePermission(context)) {
+ return TelecomManagerCompat.isVoiceMailNumber(getTelecomManager(context),
+ accountHandle, number);
+ }
+ return false;
+ }
+
+ @Nullable
+ public static String getVoicemailNumber(Context context, PhoneAccountHandle accountHandle) {
+ if (hasReadPhoneStatePermission(context)) {
+ return TelecomManagerCompat.getVoiceMailNumber(getTelecomManager(context),
+ getTelephonyManager(context), accountHandle);
+ }
+ return null;
+ }
+
+ /**
+ * Tries to place a call using the {@link TelecomManager}.
+ *
+ * @param activity a valid activity.
+ * @param intent the call intent.
+ *
+ * @return {@code true} if we successfully attempted to place the call, {@code false} if it
+ * failed due to a permission check.
+ */
+ public static boolean placeCall(Activity activity, Intent intent) {
+ if (hasCallPhonePermission(activity)) {
+ TelecomManagerCompat.placeCall(activity, getTelecomManager(activity), intent);
+ return true;
+ }
+ return false;
+ }
+
public static Uri getCallLogUri(Context context) {
return hasReadWriteVoicemailPermissions(context) ? Calls.CONTENT_URI_WITH_VOICEMAIL
: Calls.CONTENT_URI;
@@ -94,14 +186,24 @@ public class TelecomUtil {
|| hasPermission(context, Manifest.permission.MODIFY_PHONE_STATE);
}
+ public static boolean hasReadPhoneStatePermission(Context context) {
+ return isDefaultDialer(context)
+ || hasPermission(context, Manifest.permission.READ_PHONE_STATE);
+ }
+
+ public static boolean hasCallPhonePermission(Context context) {
+ return isDefaultDialer(context)
+ || hasPermission(context, Manifest.permission.CALL_PHONE);
+ }
+
private static boolean hasPermission(Context context, String permission) {
- return context.checkSelfPermission(permission)
+ return ContextCompat.checkSelfPermission(context, permission)
== PackageManager.PERMISSION_GRANTED;
}
public static boolean isDefaultDialer(Context context) {
final boolean result = TextUtils.equals(context.getPackageName(),
- getTelecomManager(context).getDefaultDialerPackage());
+ TelecomManagerCompat.getDefaultDialerPackage(getTelecomManager(context)));
if (result) {
sWarningLogged = false;
} else {
@@ -117,4 +219,8 @@ public class TelecomUtil {
private static TelecomManager getTelecomManager(Context context) {
return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
}
+
+ private static TelephonyManager getTelephonyManager(Context context) {
+ return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+ }
}
diff --git a/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java b/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java
new file mode 100644
index 000000000..80a0368bd
--- /dev/null
+++ b/src/com/android/dialer/voicemail/VisualVoicemailEnabledChecker.java
@@ -0,0 +1,103 @@
+package com.android.dialer.voicemail;
+
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.preference.PreferenceManager;
+import android.support.annotation.Nullable;
+
+import com.android.dialer.calllog.CallLogQueryHandler;
+
+/**
+ * Helper class to check whether visual voicemail is enabled.
+ *
+ * Call isVisualVoicemailEnabled() to retrieve the result.
+ *
+ * The result is cached and saved in a SharedPreferences, stored as a boolean in
+ * PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER. Every time a new instance is created, it will try to
+ * restore the cached result from the SharedPreferences.
+ *
+ * Call asyncUpdate() to make a CallLogQuery to check the actual status. This is a async call so
+ * isVisualVoicemailEnabled() will not be affected immediately.
+ *
+ * If the status has changed as a result of asyncUpdate(),
+ * Callback.onVisualVoicemailEnabledStatusChanged() will be called with the new value.
+ */
+public class VisualVoicemailEnabledChecker implements CallLogQueryHandler.Listener {
+
+ public static final String PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER =
+ "has_active_voicemail_provider";
+ private SharedPreferences mPrefs;
+ private boolean mHasActiveVoicemailProvider;
+ private CallLogQueryHandler mCallLogQueryHandler;
+ private VoicemailStatusHelper mVoicemailStatusHelper;
+ private Context mContext;
+
+ public interface Callback {
+
+ /**
+ * Callback to notify enabled status has changed to the @param newValue
+ */
+ void onVisualVoicemailEnabledStatusChanged(boolean newValue);
+ }
+
+ private Callback mCallback;
+
+ public VisualVoicemailEnabledChecker(Context context, @Nullable Callback callback) {
+ mContext = context;
+ mCallback = callback;
+ mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
+ mVoicemailStatusHelper = new VoicemailStatusHelperImpl();
+ mHasActiveVoicemailProvider = mPrefs.getBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER,
+ false);
+ }
+
+ /**
+ * @return whether visual voicemail is enabled. Result is cached, call asyncUpdate() to
+ * update the result.
+ */
+ public boolean isVisualVoicemailEnabled() {
+ return mHasActiveVoicemailProvider;
+ }
+
+ /**
+ * Perform an async query into the system to check the status of visual voicemail.
+ * If the status has changed, Callback.onVisualVoicemailEnabledStatusChanged() will be called.
+ */
+ public void asyncUpdate() {
+ mCallLogQueryHandler =
+ new CallLogQueryHandler(mContext, mContext.getContentResolver(), this);
+ mCallLogQueryHandler.fetchVoicemailStatus();
+ }
+
+ @Override
+ public void onVoicemailStatusFetched(Cursor statusCursor) {
+ boolean hasActiveVoicemailProvider =
+ mVoicemailStatusHelper.getNumberActivityVoicemailSources(statusCursor) > 0;
+ if (hasActiveVoicemailProvider != mHasActiveVoicemailProvider) {
+ mHasActiveVoicemailProvider = hasActiveVoicemailProvider;
+ mPrefs.edit().putBoolean(PREF_KEY_HAS_ACTIVE_VOICEMAIL_PROVIDER,
+ mHasActiveVoicemailProvider);
+ if (mCallback != null) {
+ mCallback.onVisualVoicemailEnabledStatusChanged(mHasActiveVoicemailProvider);
+ }
+ }
+ }
+
+ @Override
+ public void onVoicemailUnreadCountFetched(Cursor cursor) {
+ // Do nothing
+ }
+
+ @Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {
+ // Do nothing
+ }
+
+ @Override
+ public boolean onCallsFetched(Cursor combinedCursor) {
+ // Do nothing
+ return false;
+ }
+}
diff --git a/src/com/android/dialer/voicemail/VoicemailArchiveActivity.java b/src/com/android/dialer/voicemail/VoicemailArchiveActivity.java
new file mode 100644
index 000000000..16b947cd3
--- /dev/null
+++ b/src/com/android/dialer/voicemail/VoicemailArchiveActivity.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.voicemail;
+
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.support.v7.app.ActionBar;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.MenuItem;
+import android.view.View;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.dialer.DialtactsActivity;
+import com.android.dialer.R;
+import com.android.dialer.TransactionSafeActivity;
+import com.android.dialer.calllog.CallLogAdapter;
+import com.android.dialer.calllog.CallLogQueryHandler;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.widget.EmptyContentView;
+import com.android.dialerbind.ObjectFactory;
+
+/**
+ * This activity manages all the voicemails archived by the user.
+ */
+public class VoicemailArchiveActivity extends TransactionSafeActivity
+ implements CallLogAdapter.CallFetcher, CallLogQueryHandler.Listener {
+ private RecyclerView mRecyclerView;
+ private LinearLayoutManager mLayoutManager;
+ private EmptyContentView mEmptyListView;
+ private CallLogAdapter mAdapter;
+ private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+ private CallLogQueryHandler mCallLogQueryHandler;
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (!isSafeToCommitTransactions()) {
+ return true;
+ }
+
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ Intent intent = new Intent(this, DialtactsActivity.class);
+ // Clears any activities between VoicemailArchiveActivity and DialtactsActivity
+ // on the activity stack and reuses the existing instance of DialtactsActivity
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.call_log_fragment);
+
+ // Make window opaque to reduce overdraw
+ getWindow().setBackgroundDrawable(null);
+
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setDisplayShowHomeEnabled(true);
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setElevation(0);
+
+ mCallLogQueryHandler = new CallLogQueryHandler(this, getContentResolver(), this);
+ mVoicemailPlaybackPresenter = VoicemailArchivePlaybackPresenter
+ .getInstance(this, savedInstanceState);
+
+ mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+ mRecyclerView.setHasFixedSize(true);
+ mLayoutManager = new LinearLayoutManager(this);
+ mRecyclerView.setLayoutManager(mLayoutManager);
+ mEmptyListView = (EmptyContentView) findViewById(R.id.empty_list_view);
+ mEmptyListView.setDescription(R.string.voicemail_archive_empty);
+ mEmptyListView.setImage(R.drawable.empty_call_log);
+
+ mAdapter = ObjectFactory.newCallLogAdapter(
+ this,
+ this,
+ new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this)),
+ mVoicemailPlaybackPresenter,
+ CallLogAdapter.ACTIVITY_TYPE_ARCHIVE);
+ mRecyclerView.setAdapter(mAdapter);
+ fetchCalls();
+ }
+
+ @Override
+ protected void onPause() {
+ mVoicemailPlaybackPresenter.onPause();
+ mAdapter.onPause();
+ super.onPause();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mAdapter.onResume();
+ mVoicemailPlaybackPresenter.onResume();
+ }
+
+ @Override
+ public void onDestroy() {
+ mVoicemailPlaybackPresenter.onDestroy();
+ mAdapter.changeCursor(null);
+ super.onDestroy();
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ mVoicemailPlaybackPresenter.onSaveInstanceState(outState);
+ }
+
+ @Override
+ public void fetchCalls() {
+ mCallLogQueryHandler.fetchVoicemailArchive();
+ }
+
+ @Override
+ public void onVoicemailStatusFetched(Cursor statusCursor) {
+ // Do nothing
+ }
+
+ @Override
+ public void onVoicemailUnreadCountFetched(Cursor cursor) {
+ // Do nothing
+ }
+
+ @Override
+ public void onMissedCallsUnreadCountFetched(Cursor cursor) {
+ // Do nothing
+ }
+
+ @Override
+ public boolean onCallsFetched(Cursor cursor) {
+ mAdapter.changeCursorVoicemail(cursor);
+ boolean showListView = cursor != null && cursor.getCount() > 0;
+ mRecyclerView.setVisibility(showListView ? View.VISIBLE : View.GONE);
+ mEmptyListView.setVisibility(!showListView ? View.VISIBLE : View.GONE);
+ return true;
+ }
+}
diff --git a/src/com/android/dialer/voicemail/VoicemailArchivePlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailArchivePlaybackPresenter.java
new file mode 100644
index 000000000..5f73d1689
--- /dev/null
+++ b/src/com/android/dialer/voicemail/VoicemailArchivePlaybackPresenter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.voicemail;
+
+import android.app.Activity;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.database.VoicemailArchiveContract;
+import java.io.FileNotFoundException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Similar to the {@link VoicemailPlaybackPresenter}, but for the archive voicemail tab. It checks
+ * whether the voicemail file exists locally before preparing it.
+ */
+public class VoicemailArchivePlaybackPresenter extends VoicemailPlaybackPresenter {
+ private static final String TAG = "VMPlaybackPresenter";
+ private static VoicemailPlaybackPresenter sInstance;
+
+ public VoicemailArchivePlaybackPresenter(Activity activity) {
+ super(activity);
+ }
+
+ public static VoicemailPlaybackPresenter getInstance(
+ Activity activity, Bundle savedInstanceState) {
+ if (sInstance == null) {
+ sInstance = new VoicemailArchivePlaybackPresenter(activity);
+ }
+
+ sInstance.init(activity, savedInstanceState);
+ return sInstance;
+ }
+
+ @Override
+ protected void checkForContent(final OnContentCheckedListener callback) {
+ mAsyncTaskExecutor.submit(Tasks.CHECK_FOR_CONTENT, new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ public Boolean doInBackground(Void... params) {
+ try {
+ // Check if the _data column of the archived voicemail is valid
+ if (mVoicemailUri != null) {
+ mContext.getContentResolver().openInputStream(mVoicemailUri);
+ return true;
+ }
+ } catch (FileNotFoundException e) {
+ Log.d(TAG, "Voicemail file not found for " + mVoicemailUri);
+ }
+ return false;
+ }
+
+ @Override
+ public void onPostExecute(Boolean hasContent) {
+ callback.onContentChecked(hasContent);
+ }
+ });
+ }
+
+ @Override
+ protected void startArchiveVoicemailTask(final Uri voicemailUri, final boolean archivedByUser) {
+ // If a user wants to share an archived voicemail, no need for archiving, just go straight
+ // to share intent.
+ if (!archivedByUser) {
+ sendShareIntent(voicemailUri);
+ }
+ }
+
+ @Override
+ protected boolean requestContent(int code) {
+ handleError(new FileNotFoundException("Voicemail archive file does not exist"));
+ return false; // No way for archive tab to request content
+ }
+}
diff --git a/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtil.java b/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtil.java
new file mode 100644
index 000000000..7abf9a72c
--- /dev/null
+++ b/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtil.java
@@ -0,0 +1,346 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.voicemail;
+
+import com.android.contacts.common.testing.NeededForTesting;
+import com.android.dialer.calllog.CallLogQuery;
+import com.android.dialer.database.VoicemailArchiveContract;
+import com.android.dialer.util.AsyncTaskExecutor;
+import com.android.dialer.util.AsyncTaskExecutors;
+import com.google.common.base.Preconditions;
+import com.google.common.io.ByteStreams;
+
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.provider.CallLog;
+import android.provider.VoicemailContract;
+import android.util.Log;
+import com.android.common.io.MoreCloseables;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.annotation.Nullable;
+
+/**
+ * Class containing asynchronous tasks for voicemails.
+ */
+@NeededForTesting
+public class VoicemailAsyncTaskUtil {
+ private static final String TAG = "VoicemailAsyncTaskUtil";
+
+ /** The enumeration of {@link AsyncTask} objects we use in this class. */
+ public enum Tasks {
+ GET_VOICEMAIL_FILE_PATH,
+ SET_VOICEMAIL_ARCHIVE_STATUS,
+ ARCHIVE_VOICEMAIL_CONTENT
+ }
+
+ @NeededForTesting
+ public interface OnArchiveVoicemailListener {
+ /**
+ * Called after the voicemail has been archived.
+ *
+ * @param archivedVoicemailUri the URI of the archived voicemail
+ */
+ void onArchiveVoicemail(@Nullable Uri archivedVoicemailUri);
+ }
+
+ @NeededForTesting
+ public interface OnSetVoicemailArchiveStatusListener {
+ /**
+ * Called after the voicemail archived_by_user column is updated.
+ *
+ * @param success whether the update was successful or not
+ */
+ void onSetVoicemailArchiveStatus(boolean success);
+ }
+
+ @NeededForTesting
+ public interface OnGetArchivedVoicemailFilePathListener {
+ /**
+ * Called after the voicemail file path is obtained.
+ *
+ * @param filePath the file path of the archived voicemail
+ */
+ void onGetArchivedVoicemailFilePath(@Nullable String filePath);
+ }
+
+ private final ContentResolver mResolver;
+ private final AsyncTaskExecutor mAsyncTaskExecutor;
+
+ @NeededForTesting
+ public VoicemailAsyncTaskUtil(ContentResolver contentResolver) {
+ mResolver = Preconditions.checkNotNull(contentResolver);
+ mAsyncTaskExecutor = AsyncTaskExecutors.createThreadPoolExecutor();
+ }
+
+ /**
+ * Returns the archived voicemail file path.
+ */
+ @NeededForTesting
+ public void getVoicemailFilePath(
+ final OnGetArchivedVoicemailFilePathListener listener,
+ final Uri voicemailUri) {
+ Preconditions.checkNotNull(listener);
+ Preconditions.checkNotNull(voicemailUri);
+ mAsyncTaskExecutor.submit(Tasks.GET_VOICEMAIL_FILE_PATH,
+ new AsyncTask<Void, Void, String>() {
+ @Nullable
+ @Override
+ protected String doInBackground(Void... params) {
+ try (Cursor cursor = mResolver.query(voicemailUri,
+ new String[]{VoicemailArchiveContract.VoicemailArchive._DATA},
+ null, null, null)) {
+ if (hasContent(cursor)) {
+ return cursor.getString(cursor.getColumnIndex(
+ VoicemailArchiveContract.VoicemailArchive._DATA));
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(String filePath) {
+ listener.onGetArchivedVoicemailFilePath(filePath);
+ }
+ });
+ }
+
+ /**
+ * Updates the archived_by_user flag of the archived voicemail.
+ */
+ @NeededForTesting
+ public void setVoicemailArchiveStatus(
+ final OnSetVoicemailArchiveStatusListener listener,
+ final Uri voicemailUri,
+ final boolean archivedByUser) {
+ Preconditions.checkNotNull(listener);
+ Preconditions.checkNotNull(voicemailUri);
+ mAsyncTaskExecutor.submit(Tasks.SET_VOICEMAIL_ARCHIVE_STATUS,
+ new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ ContentValues values = new ContentValues(1);
+ values.put(VoicemailArchiveContract.VoicemailArchive.ARCHIVED,
+ archivedByUser);
+ return mResolver.update(voicemailUri, values, null, null) > 0;
+ }
+
+ @Override
+ protected void onPostExecute(Boolean success) {
+ listener.onSetVoicemailArchiveStatus(success);
+ }
+ });
+ }
+
+ /**
+ * Checks if a voicemail has already been archived, if so, return the previously archived URI.
+ * Otherwise, copy the voicemail information to the local dialer database. If archive was
+ * successful, archived voicemail URI is returned to listener, otherwise null.
+ */
+ @NeededForTesting
+ public void archiveVoicemailContent(
+ final OnArchiveVoicemailListener listener,
+ final Uri voicemailUri) {
+ Preconditions.checkNotNull(listener);
+ Preconditions.checkNotNull(voicemailUri);
+ mAsyncTaskExecutor.submit(Tasks.ARCHIVE_VOICEMAIL_CONTENT,
+ new AsyncTask<Void, Void, Uri>() {
+ @Nullable
+ @Override
+ protected Uri doInBackground(Void... params) {
+ Uri archivedVoicemailUri = getArchivedVoicemailUri(voicemailUri);
+
+ // If previously archived, return uri, otherwise archive everything.
+ if (archivedVoicemailUri != null) {
+ return archivedVoicemailUri;
+ }
+
+ // Combine call log and voicemail content info.
+ ContentValues values = getVoicemailContentValues(voicemailUri);
+ if (values == null) {
+ return null;
+ }
+
+ Uri insertedVoicemailUri = mResolver.insert(
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI, values);
+ if (insertedVoicemailUri == null) {
+ return null;
+ }
+
+ // Copy voicemail content to a new file.
+ boolean copiedFile = false;
+ try (InputStream inputStream = mResolver.openInputStream(voicemailUri);
+ OutputStream outputStream =
+ mResolver.openOutputStream(insertedVoicemailUri)) {
+ if (inputStream != null && outputStream != null) {
+ ByteStreams.copy(inputStream, outputStream);
+ copiedFile = true;
+ return insertedVoicemailUri;
+ }
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to copy voicemail content to new file: "
+ + e.toString());
+ } finally {
+ if (!copiedFile) {
+ // Roll back insert if the voicemail content was not copied.
+ mResolver.delete(insertedVoicemailUri, null, null);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Uri archivedVoicemailUri) {
+ listener.onArchiveVoicemail(archivedVoicemailUri);
+ }
+ });
+ }
+
+ /**
+ * Helper method to get the archived URI of a voicemail.
+ *
+ * @param voicemailUri a {@link android.provider.VoicemailContract.Voicemails#CONTENT_URI} URI.
+ * @return the URI of the archived voicemail or {@code null}
+ */
+ @Nullable
+ private Uri getArchivedVoicemailUri(Uri voicemailUri) {
+ try (Cursor cursor = getArchiveExistsCursor(voicemailUri)) {
+ if (hasContent(cursor)) {
+ return VoicemailArchiveContract.VoicemailArchive
+ .buildWithId(cursor.getInt(cursor.getColumnIndex(
+ VoicemailArchiveContract.VoicemailArchive._ID)));
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Helper method to make a copy of all the values needed to display a voicemail.
+ *
+ * @param voicemailUri a {@link VoicemailContract.Voicemails#CONTENT_URI} URI.
+ * @return the combined call log and voicemail values for the given URI, or {@code null}
+ */
+ @Nullable
+ private ContentValues getVoicemailContentValues(Uri voicemailUri) {
+ try (Cursor callLogInfo = getCallLogInfoCursor(voicemailUri);
+ Cursor contentInfo = getContentInfoCursor(voicemailUri)) {
+
+ if (hasContent(callLogInfo) && hasContent(contentInfo)) {
+ // Create values to insert into database.
+ ContentValues values = new ContentValues();
+
+ // Insert voicemail call log info.
+ values.put(VoicemailArchiveContract.VoicemailArchive.COUNTRY_ISO,
+ callLogInfo.getString(CallLogQuery.COUNTRY_ISO));
+ values.put(VoicemailArchiveContract.VoicemailArchive.GEOCODED_LOCATION,
+ callLogInfo.getString(CallLogQuery.GEOCODED_LOCATION));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NAME,
+ callLogInfo.getString(CallLogQuery.CACHED_NAME));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NUMBER_TYPE,
+ callLogInfo.getInt(CallLogQuery.CACHED_NUMBER_TYPE));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NUMBER_LABEL,
+ callLogInfo.getString(CallLogQuery.CACHED_NUMBER_LABEL));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_LOOKUP_URI,
+ callLogInfo.getString(CallLogQuery.CACHED_LOOKUP_URI));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_MATCHED_NUMBER,
+ callLogInfo.getString(CallLogQuery.CACHED_MATCHED_NUMBER));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NORMALIZED_NUMBER,
+ callLogInfo.getString(CallLogQuery.CACHED_NORMALIZED_NUMBER));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_FORMATTED_NUMBER,
+ callLogInfo.getString(CallLogQuery.CACHED_FORMATTED_NUMBER));
+ values.put(VoicemailArchiveContract.VoicemailArchive.NUMBER_PRESENTATION,
+ callLogInfo.getInt(CallLogQuery.NUMBER_PRESENTATION));
+ values.put(VoicemailArchiveContract.VoicemailArchive.ACCOUNT_COMPONENT_NAME,
+ callLogInfo.getString(CallLogQuery.ACCOUNT_COMPONENT_NAME));
+ values.put(VoicemailArchiveContract.VoicemailArchive.ACCOUNT_ID,
+ callLogInfo.getString(CallLogQuery.ACCOUNT_ID));
+ values.put(VoicemailArchiveContract.VoicemailArchive.FEATURES,
+ callLogInfo.getInt(CallLogQuery.FEATURES));
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_PHOTO_URI,
+ callLogInfo.getString(CallLogQuery.CACHED_PHOTO_URI));
+
+ // Insert voicemail content info.
+ values.put(VoicemailArchiveContract.VoicemailArchive.SERVER_ID,
+ contentInfo.getInt(contentInfo.getColumnIndex(
+ VoicemailContract.Voicemails._ID)));
+ values.put(VoicemailArchiveContract.VoicemailArchive.NUMBER,
+ contentInfo.getString(contentInfo.getColumnIndex(
+ VoicemailContract.Voicemails.NUMBER)));
+ values.put(VoicemailArchiveContract.VoicemailArchive.DATE,
+ contentInfo.getLong(contentInfo.getColumnIndex(
+ VoicemailContract.Voicemails.DATE)));
+ values.put(VoicemailArchiveContract.VoicemailArchive.DURATION,
+ contentInfo.getLong(contentInfo.getColumnIndex(
+ VoicemailContract.Voicemails.DURATION)));
+ values.put(VoicemailArchiveContract.VoicemailArchive.MIME_TYPE,
+ contentInfo.getString(contentInfo.getColumnIndex(
+ VoicemailContract.Voicemails.MIME_TYPE)));
+ values.put(VoicemailArchiveContract.VoicemailArchive.TRANSCRIPTION,
+ contentInfo.getString(contentInfo.getColumnIndex(
+ VoicemailContract.Voicemails.TRANSCRIPTION)));
+
+ // Achived is false by default because it is updated after insertion.
+ values.put(VoicemailArchiveContract.VoicemailArchive.ARCHIVED, false);
+
+ return values;
+ }
+ }
+ return null;
+ }
+
+ private boolean hasContent(@Nullable Cursor cursor) {
+ return cursor != null && cursor.moveToFirst();
+ }
+
+ @Nullable
+ private Cursor getCallLogInfoCursor(Uri voicemailUri) {
+ return mResolver.query(
+ ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL,
+ ContentUris.parseId(voicemailUri)),
+ CallLogQuery._PROJECTION, null, null, null);
+ }
+
+ @Nullable
+ private Cursor getContentInfoCursor(Uri voicemailUri) {
+ return mResolver.query(voicemailUri,
+ new String[] {
+ VoicemailContract.Voicemails._ID,
+ VoicemailContract.Voicemails.NUMBER,
+ VoicemailContract.Voicemails.DATE,
+ VoicemailContract.Voicemails.DURATION,
+ VoicemailContract.Voicemails.MIME_TYPE,
+ VoicemailContract.Voicemails.TRANSCRIPTION,
+ }, null, null, null);
+ }
+
+ @Nullable
+ private Cursor getArchiveExistsCursor(Uri voicemailUri) {
+ return mResolver.query(VoicemailArchiveContract.VoicemailArchive.CONTENT_URI,
+ new String[] {VoicemailArchiveContract.VoicemailArchive._ID},
+ VoicemailArchiveContract.VoicemailArchive.SERVER_ID + "="
+ + ContentUris.parseId(voicemailUri),
+ null,
+ null);
+ }
+}
diff --git a/src/com/android/dialer/voicemail/VoicemailAudioManager.java b/src/com/android/dialer/voicemail/VoicemailAudioManager.java
new file mode 100644
index 000000000..fe6cf5f45
--- /dev/null
+++ b/src/com/android/dialer/voicemail/VoicemailAudioManager.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.voicemail;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
+import android.telecom.CallAudioState;
+import android.util.Log;
+
+import java.util.concurrent.RejectedExecutionException;
+
+/**
+ * This class manages all audio changes for voicemail playback.
+ */
+final class VoicemailAudioManager implements OnAudioFocusChangeListener,
+ WiredHeadsetManager.Listener {
+ private static final String TAG = VoicemailAudioManager.class.getSimpleName();
+
+ public static final int PLAYBACK_STREAM = AudioManager.STREAM_VOICE_CALL;
+
+ private AudioManager mAudioManager;
+ private VoicemailPlaybackPresenter mVoicemailPlaybackPresenter;
+ private WiredHeadsetManager mWiredHeadsetManager;
+ private boolean mWasSpeakerOn;
+ private CallAudioState mCallAudioState;
+
+ public VoicemailAudioManager(Context context,
+ VoicemailPlaybackPresenter voicemailPlaybackPresenter) {
+ mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ mVoicemailPlaybackPresenter = voicemailPlaybackPresenter;
+ mWiredHeadsetManager = new WiredHeadsetManager(context);
+ mWiredHeadsetManager.setListener(this);
+
+ mCallAudioState = getInitialAudioState();
+ Log.i(TAG, "Initial audioState = " + mCallAudioState);
+ }
+
+ public void requestAudioFocus() {
+ int result = mAudioManager.requestAudioFocus(
+ this,
+ PLAYBACK_STREAM,
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+ if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ throw new RejectedExecutionException("Could not capture audio focus.");
+ }
+ }
+
+ public void abandonAudioFocus() {
+ mAudioManager.abandonAudioFocus(this);
+ }
+
+ @Override
+ public void onAudioFocusChange(int focusChange) {
+ Log.d(TAG, "onAudioFocusChange: focusChange=" + focusChange);
+ mVoicemailPlaybackPresenter.onAudioFocusChange(focusChange == AudioManager.AUDIOFOCUS_GAIN);
+ }
+
+ @Override
+ public void onWiredHeadsetPluggedInChanged(boolean oldIsPluggedIn, boolean newIsPluggedIn) {
+ Log.i(TAG, "wired headset was plugged in changed: " + oldIsPluggedIn
+ + " -> "+ newIsPluggedIn);
+
+ if (oldIsPluggedIn == newIsPluggedIn) {
+ return;
+ }
+
+ int newRoute = mCallAudioState.getRoute(); // start out with existing route
+ if (newIsPluggedIn) {
+ newRoute = CallAudioState.ROUTE_WIRED_HEADSET;
+ } else {
+ if (mWasSpeakerOn) {
+ newRoute = CallAudioState.ROUTE_SPEAKER;
+ } else {
+ newRoute = CallAudioState.ROUTE_EARPIECE;
+ }
+ }
+
+ mVoicemailPlaybackPresenter.setSpeakerphoneOn(newRoute == CallAudioState.ROUTE_SPEAKER);
+
+ // We need to call this every time even if we do not change the route because the supported
+ // routes changed either to include or not include WIRED_HEADSET.
+ setSystemAudioState(
+ new CallAudioState(false /* muted */, newRoute, calculateSupportedRoutes()));
+ }
+
+ public void setSpeakerphoneOn(boolean on) {
+ setAudioRoute(on ? CallAudioState.ROUTE_SPEAKER : CallAudioState.ROUTE_WIRED_OR_EARPIECE);
+ }
+
+ public boolean isWiredHeadsetPluggedIn() {
+ return mWiredHeadsetManager.isPluggedIn();
+ }
+
+ public void registerReceivers() {
+ // Receivers is plural because we expect to add bluetooth support.
+ mWiredHeadsetManager.registerReceiver();
+ }
+
+ public void unregisterReceivers() {
+ mWiredHeadsetManager.unregisterReceiver();
+ }
+
+ /**
+ * Change the audio route, for example from earpiece to speakerphone.
+ *
+ * @param route The new audio route to use. See {@link CallAudioState}.
+ */
+ void setAudioRoute(int route) {
+ Log.v(TAG, "setAudioRoute, route: " + CallAudioState.audioRouteToString(route));
+
+ // Change ROUTE_WIRED_OR_EARPIECE to a single entry.
+ int newRoute = selectWiredOrEarpiece(route, mCallAudioState.getSupportedRouteMask());
+
+ // If route is unsupported, do nothing.
+ if ((mCallAudioState.getSupportedRouteMask() | newRoute) == 0) {
+ Log.w(TAG, "Asking to set to a route that is unsupported: " + newRoute);
+ return;
+ }
+
+ if (mCallAudioState.getRoute() != newRoute) {
+ // Remember the new speaker state so it can be restored when the user plugs and unplugs
+ // a headset.
+ mWasSpeakerOn = newRoute == CallAudioState.ROUTE_SPEAKER;
+ setSystemAudioState(new CallAudioState(false /* muted */, newRoute,
+ mCallAudioState.getSupportedRouteMask()));
+ }
+ }
+
+ private CallAudioState getInitialAudioState() {
+ int supportedRouteMask = calculateSupportedRoutes();
+ int route = selectWiredOrEarpiece(CallAudioState.ROUTE_WIRED_OR_EARPIECE,
+ supportedRouteMask);
+ return new CallAudioState(false /* muted */, route, supportedRouteMask);
+ }
+
+ private int calculateSupportedRoutes() {
+ int routeMask = CallAudioState.ROUTE_SPEAKER;
+ if (mWiredHeadsetManager.isPluggedIn()) {
+ routeMask |= CallAudioState.ROUTE_WIRED_HEADSET;
+ } else {
+ routeMask |= CallAudioState.ROUTE_EARPIECE;
+ }
+ return routeMask;
+ }
+
+ private int selectWiredOrEarpiece(int route, int supportedRouteMask) {
+ // Since they are mutually exclusive and one is ALWAYS valid, we allow a special input of
+ // ROUTE_WIRED_OR_EARPIECE so that callers don't have to make a call to check which is
+ // supported before calling setAudioRoute.
+ if (route == CallAudioState.ROUTE_WIRED_OR_EARPIECE) {
+ route = CallAudioState.ROUTE_WIRED_OR_EARPIECE & supportedRouteMask;
+ if (route == 0) {
+ Log.wtf(TAG, "One of wired headset or earpiece should always be valid.");
+ // assume earpiece in this case.
+ route = CallAudioState.ROUTE_EARPIECE;
+ }
+ }
+ return route;
+ }
+
+ private void setSystemAudioState(CallAudioState callAudioState) {
+ CallAudioState oldAudioState = mCallAudioState;
+ mCallAudioState = callAudioState;
+
+ Log.i(TAG, "setSystemAudioState: changing from " + oldAudioState + " to "
+ + mCallAudioState);
+
+ // Audio route.
+ if (mCallAudioState.getRoute() == CallAudioState.ROUTE_SPEAKER) {
+ turnOnSpeaker(true);
+ } else if (mCallAudioState.getRoute() == CallAudioState.ROUTE_EARPIECE ||
+ mCallAudioState.getRoute() == CallAudioState.ROUTE_WIRED_HEADSET) {
+ // Just handle turning off the speaker, the system will handle switching between wired
+ // headset and earpiece.
+ turnOnSpeaker(false);
+ }
+ }
+
+ private void turnOnSpeaker(boolean on) {
+ if (mAudioManager.isSpeakerphoneOn() != on) {
+ Log.i(TAG, "turning speaker phone on: " + on);
+ mAudioManager.setSpeakerphoneOn(on);
+ }
+ }
+}
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java b/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java
index 158ed5834..521671a13 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackLayout.java
@@ -16,35 +16,46 @@
package com.android.dialer.voicemail;
-import android.app.Activity;
-import android.app.Fragment;
+import android.content.ContentUris;
import android.content.Context;
-import android.media.MediaPlayer;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.Bundle;
-import android.os.PowerManager;
-import android.provider.VoicemailContract;
+import android.os.AsyncTask;
+import android.os.Handler;
import android.util.AttributeSet;
-import android.util.Log;
+import android.support.design.widget.Snackbar;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
+import android.widget.Space;
import android.widget.TextView;
+import android.widget.Toast;
import com.android.common.io.MoreCloseables;
+import com.android.dialer.PhoneCallDetails;
import com.android.dialer.R;
import com.android.dialer.calllog.CallLogAsyncTaskUtil;
-import com.google.common.base.Preconditions;
+import com.android.dialer.database.VoicemailArchiveContract;
+import com.android.dialer.database.VoicemailArchiveContract.VoicemailArchive;
+import com.android.dialer.util.AsyncTaskExecutor;
+import com.android.dialer.util.AsyncTaskExecutors;
+import com.android.dialerbind.ObjectFactory;
+import com.google.common.annotations.VisibleForTesting;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledExecutorService;
+import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.NotThreadSafe;
import javax.annotation.concurrent.ThreadSafe;
@@ -58,8 +69,16 @@ import javax.annotation.concurrent.ThreadSafe;
*/
@NotThreadSafe
public class VoicemailPlaybackLayout extends LinearLayout
- implements VoicemailPlaybackPresenter.PlaybackView {
+ implements VoicemailPlaybackPresenter.PlaybackView,
+ CallLogAsyncTaskUtil.CallLogAsyncTaskListener {
private static final String TAG = VoicemailPlaybackLayout.class.getSimpleName();
+ private static final int VOICEMAIL_DELETE_DELAY_MS = 3000;
+ private static final int VOICEMAIL_ARCHIVE_DELAY_MS = 3000;
+
+ /** The enumeration of {@link AsyncTask} objects we use in this class. */
+ public enum Tasks {
+ QUERY_ARCHIVED_STATUS
+ }
/**
* Controls the animation of the playback slider.
@@ -144,6 +163,11 @@ public class VoicemailPlaybackLayout extends LinearLayout
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
setClipPosition(progress, seekBar.getMax());
+ // Update the seek position if user manually changed it. This makes sure position gets
+ // updated when user use volume button to seek playback in talkback mode.
+ if (fromUser) {
+ mPresenter.seek(progress);
+ }
}
};
@@ -154,7 +178,7 @@ public class VoicemailPlaybackLayout extends LinearLayout
@Override
public void onClick(View v) {
if (mPresenter != null) {
- onSpeakerphoneOn(!mPresenter.isSpeakerphoneOn());
+ mPresenter.toggleSpeakerphone();
}
}
};
@@ -184,26 +208,96 @@ public class VoicemailPlaybackLayout extends LinearLayout
return;
}
mPresenter.pausePlayback();
- CallLogAsyncTaskUtil.deleteVoicemail(mContext, mVoicemailUri, null);
mPresenter.onVoicemailDeleted();
+
+ final Uri deleteUri = mVoicemailUri;
+ final Runnable deleteCallback = new Runnable() {
+ @Override
+ public void run() {
+ if (Objects.equals(deleteUri, mVoicemailUri)) {
+ CallLogAsyncTaskUtil.deleteVoicemail(mContext, deleteUri,
+ VoicemailPlaybackLayout.this);
+ }
+ }
+ };
+
+ final Handler handler = new Handler();
+ // Add a little buffer time in case the user clicked "undo" at the end of the delay
+ // window.
+ handler.postDelayed(deleteCallback, VOICEMAIL_DELETE_DELAY_MS + 50);
+
+ Snackbar.make(VoicemailPlaybackLayout.this, R.string.snackbar_voicemail_deleted,
+ Snackbar.LENGTH_LONG)
+ .setDuration(VOICEMAIL_DELETE_DELAY_MS)
+ .setAction(R.string.snackbar_voicemail_deleted_undo,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ mPresenter.onVoicemailDeleteUndo();
+ handler.removeCallbacks(deleteCallback);
+ }
+ })
+ .setActionTextColor(
+ mContext.getResources().getColor(
+ R.color.dialer_snackbar_action_text_color))
+ .show();
+ }
+ };
+
+ private final View.OnClickListener mArchiveButtonListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mPresenter == null || isArchiving(mVoicemailUri)) {
+ return;
+ }
+ mIsArchiving.add(mVoicemailUri);
+ mPresenter.pausePlayback();
+ updateArchiveUI(mVoicemailUri);
+ disableUiElements();
+ mPresenter.archiveContent(mVoicemailUri, true);
+ }
+ };
+
+ private final View.OnClickListener mShareButtonListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mPresenter == null || isArchiving(mVoicemailUri)) {
+ return;
+ }
+ disableUiElements();
+ mPresenter.archiveContent(mVoicemailUri, false);
}
};
private Context mContext;
private VoicemailPlaybackPresenter mPresenter;
private Uri mVoicemailUri;
-
+ private final AsyncTaskExecutor mAsyncTaskExecutor =
+ AsyncTaskExecutors.createAsyncTaskExecutor();
private boolean mIsPlaying = false;
+ /**
+ * Keeps track of which voicemails are currently being archived in order to update the voicemail
+ * card UI every time a user opens a new card.
+ */
+ private static final ArrayList<Uri> mIsArchiving = new ArrayList<>();
private SeekBar mPlaybackSeek;
private ImageButton mStartStopButton;
private ImageButton mPlaybackSpeakerphone;
private ImageButton mDeleteButton;
+ private ImageButton mArchiveButton;
+ private ImageButton mShareButton;
+
+ private Space mArchiveSpace;
+ private Space mShareSpace;
+
private TextView mStateText;
private TextView mPositionText;
private TextView mTotalDurationText;
private PositionUpdater mPositionUpdater;
+ private Drawable mVoicemailSeekHandleEnabled;
+ private Drawable mVoicemailSeekHandleDisabled;
public VoicemailPlaybackLayout(Context context) {
this(context, null);
@@ -211,7 +305,6 @@ public class VoicemailPlaybackLayout extends LinearLayout
public VoicemailPlaybackLayout(Context context, AttributeSet attrs) {
super(context, attrs);
-
mContext = context;
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@@ -222,6 +315,16 @@ public class VoicemailPlaybackLayout extends LinearLayout
public void setPresenter(VoicemailPlaybackPresenter presenter, Uri voicemailUri) {
mPresenter = presenter;
mVoicemailUri = voicemailUri;
+ if (ObjectFactory.isVoicemailArchiveEnabled(mContext)) {
+ updateArchiveUI(mVoicemailUri);
+ updateArchiveButton(mVoicemailUri);
+ }
+
+ if (ObjectFactory.isVoicemailShareEnabled(mContext)) {
+ // Show share button and space before it
+ mShareSpace.setVisibility(View.VISIBLE);
+ mShareButton.setVisibility(View.VISIBLE);
+ }
}
@Override
@@ -232,6 +335,12 @@ public class VoicemailPlaybackLayout extends LinearLayout
mStartStopButton = (ImageButton) findViewById(R.id.playback_start_stop);
mPlaybackSpeakerphone = (ImageButton) findViewById(R.id.playback_speakerphone);
mDeleteButton = (ImageButton) findViewById(R.id.delete_voicemail);
+ mArchiveButton =(ImageButton) findViewById(R.id.archive_voicemail);
+ mShareButton = (ImageButton) findViewById(R.id.share_voicemail);
+
+ mArchiveSpace = (Space) findViewById(R.id.space_before_archive_voicemail);
+ mShareSpace = (Space) findViewById(R.id.space_before_share_voicemail);
+
mStateText = (TextView) findViewById(R.id.playback_state_text);
mPositionText = (TextView) findViewById(R.id.playback_position_text);
mTotalDurationText = (TextView) findViewById(R.id.total_duration_text);
@@ -240,6 +349,16 @@ public class VoicemailPlaybackLayout extends LinearLayout
mStartStopButton.setOnClickListener(mStartStopButtonListener);
mPlaybackSpeakerphone.setOnClickListener(mSpeakerphoneListener);
mDeleteButton.setOnClickListener(mDeleteButtonListener);
+ mArchiveButton.setOnClickListener(mArchiveButtonListener);
+ mShareButton.setOnClickListener(mShareButtonListener);
+
+ mPositionText.setText(formatAsMinutesAndSeconds(0));
+ mTotalDurationText.setText(formatAsMinutesAndSeconds(0));
+
+ mVoicemailSeekHandleEnabled = getResources().getDrawable(
+ R.drawable.ic_voicemail_seek_handle, mContext.getTheme());
+ mVoicemailSeekHandleDisabled = getResources().getDrawable(
+ R.drawable.ic_voicemail_seek_handle_disabled, mContext.getTheme());
}
@Override
@@ -248,10 +367,6 @@ public class VoicemailPlaybackLayout extends LinearLayout
mStartStopButton.setImageResource(R.drawable.ic_pause);
- if (mPresenter != null) {
- onSpeakerphoneOn(mPresenter.isSpeakerphoneOn());
- }
-
if (mPositionUpdater != null) {
mPositionUpdater.stopUpdating();
mPositionUpdater = null;
@@ -282,12 +397,8 @@ public class VoicemailPlaybackLayout extends LinearLayout
mStateText.setText(getString(R.string.voicemail_playback_error));
}
-
+ @Override
public void onSpeakerphoneOn(boolean on) {
- if (mPresenter != null) {
- mPresenter.setSpeakerphoneOn(on);
- }
-
if (on) {
mPlaybackSpeakerphone.setImageResource(R.drawable.ic_volume_up_24dp);
// Speaker is now on, tapping button will turn it off.
@@ -313,13 +424,11 @@ public class VoicemailPlaybackLayout extends LinearLayout
mPositionText.setText(formatAsMinutesAndSeconds(seekBarPositionMs));
mTotalDurationText.setText(formatAsMinutesAndSeconds(durationMs));
- mStateText.setText(null);
}
@Override
- public void setIsBuffering() {
- disableUiElements();
- mStateText.setText(getString(R.string.voicemail_buffering));
+ public void setSuccess() {
+ mStateText.setText(null);
}
@Override
@@ -330,7 +439,7 @@ public class VoicemailPlaybackLayout extends LinearLayout
@Override
public void setFetchContentTimeout() {
- disableUiElements();
+ mStartStopButton.setEnabled(true);
mStateText.setText(getString(R.string.voicemail_fetching_timout));
}
@@ -342,21 +451,35 @@ public class VoicemailPlaybackLayout extends LinearLayout
@Override
public void disableUiElements() {
mStartStopButton.setEnabled(false);
- mPlaybackSpeakerphone.setEnabled(false);
- mPlaybackSeek.setProgress(0);
- mPlaybackSeek.setEnabled(false);
-
- mPositionText.setText(formatAsMinutesAndSeconds(0));
- mTotalDurationText.setText(formatAsMinutesAndSeconds(0));
+ resetSeekBar();
}
@Override
public void enableUiElements() {
+ mDeleteButton.setEnabled(true);
mStartStopButton.setEnabled(true);
- mPlaybackSpeakerphone.setEnabled(true);
mPlaybackSeek.setEnabled(true);
+ mPlaybackSeek.setThumb(mVoicemailSeekHandleEnabled);
+ }
+
+ @Override
+ public void resetSeekBar() {
+ mPlaybackSeek.setProgress(0);
+ mPlaybackSeek.setEnabled(false);
+ mPlaybackSeek.setThumb(mVoicemailSeekHandleDisabled);
}
+ @Override
+ public void onDeleteCall() {}
+
+ @Override
+ public void onDeleteVoicemail() {
+ mPresenter.onVoicemailDeletedInDatabase();
+ }
+
+ @Override
+ public void onGetCallDetails(PhoneCallDetails[] details) {}
+
private String getString(int resId) {
return mContext.getString(resId);
}
@@ -376,4 +499,139 @@ public class VoicemailPlaybackLayout extends LinearLayout
}
return String.format("%02d:%02d", minutes, seconds);
}
+
+ /**
+ * Called when a voicemail archive succeeded. If the expanded voicemail was being
+ * archived, update the card UI. Either way, display a snackbar linking user to archive.
+ */
+ @Override
+ public void onVoicemailArchiveSucceded(Uri voicemailUri) {
+ if (isArchiving(voicemailUri)) {
+ mIsArchiving.remove(voicemailUri);
+ if (Objects.equals(voicemailUri, mVoicemailUri)) {
+ onVoicemailArchiveResult();
+ hideArchiveButton();
+ }
+ }
+
+ Snackbar.make(this, R.string.snackbar_voicemail_archived,
+ Snackbar.LENGTH_LONG)
+ .setDuration(VOICEMAIL_ARCHIVE_DELAY_MS)
+ .setAction(R.string.snackbar_voicemail_archived_goto,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intent = new Intent(mContext,
+ VoicemailArchiveActivity.class);
+ mContext.startActivity(intent);
+ }
+ })
+ .setActionTextColor(
+ mContext.getResources().getColor(R.color.dialer_snackbar_action_text_color))
+ .show();
+ }
+
+ /**
+ * If a voicemail archive failed, and the expanded card was being archived, update the card UI.
+ * Either way, display a toast saying the voicemail archive failed.
+ */
+ @Override
+ public void onVoicemailArchiveFailed(Uri voicemailUri) {
+ if (isArchiving(voicemailUri)) {
+ mIsArchiving.remove(voicemailUri);
+ if (Objects.equals(voicemailUri, mVoicemailUri)) {
+ onVoicemailArchiveResult();
+ }
+ }
+ String toastStr = mContext.getString(R.string.voicemail_archive_failed);
+ Toast.makeText(mContext, toastStr, Toast.LENGTH_SHORT).show();
+ }
+
+ public void hideArchiveButton() {
+ mArchiveSpace.setVisibility(View.GONE);
+ mArchiveButton.setVisibility(View.GONE);
+ mArchiveButton.setClickable(false);
+ mArchiveButton.setEnabled(false);
+ }
+
+ /**
+ * Whenever a voicemail archive succeeds or fails, clear the text displayed in the voicemail
+ * card.
+ */
+ private void onVoicemailArchiveResult() {
+ enableUiElements();
+ mStateText.setText(null);
+ mArchiveButton.setColorFilter(null);
+ }
+
+ /**
+ * Whether or not the voicemail with the given uri is being archived.
+ */
+ private boolean isArchiving(@Nullable Uri uri) {
+ return uri != null && mIsArchiving.contains(uri);
+ }
+
+ /**
+ * Show the proper text and hide the archive button if the voicemail is still being archived.
+ */
+ private void updateArchiveUI(@Nullable Uri voicemailUri) {
+ if (!Objects.equals(voicemailUri, mVoicemailUri)) {
+ return;
+ }
+ if (isArchiving(voicemailUri)) {
+ // If expanded card was in the middle of archiving, disable buttons and display message
+ disableUiElements();
+ mDeleteButton.setEnabled(false);
+ mArchiveButton.setColorFilter(getResources().getColor(R.color.setting_disabled_color));
+ mStateText.setText(getString(R.string.voicemail_archiving_content));
+ } else {
+ onVoicemailArchiveResult();
+ }
+ }
+
+ /**
+ * Hides the archive button if the voicemail has already been archived, shows otherwise.
+ * @param voicemailUri the URI of the voicemail for which the archive button needs to be updated
+ */
+ private void updateArchiveButton(@Nullable final Uri voicemailUri) {
+ if (voicemailUri == null ||
+ !Objects.equals(voicemailUri, mVoicemailUri) || isArchiving(voicemailUri) ||
+ Objects.equals(voicemailUri.getAuthority(),VoicemailArchiveContract.AUTHORITY)) {
+ return;
+ }
+ mAsyncTaskExecutor.submit(Tasks.QUERY_ARCHIVED_STATUS,
+ new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ public Boolean doInBackground(Void... params) {
+ Cursor cursor = mContext.getContentResolver().query(VoicemailArchive.CONTENT_URI,
+ null, VoicemailArchive.SERVER_ID + "=" + ContentUris.parseId(mVoicemailUri)
+ + " AND " + VoicemailArchive.ARCHIVED + "= 1", null, null);
+ boolean archived = cursor != null && cursor.getCount() > 0;
+ cursor.close();
+ return archived;
+ }
+
+ @Override
+ public void onPostExecute(Boolean archived) {
+ if (!Objects.equals(voicemailUri, mVoicemailUri)) {
+ return;
+ }
+
+ if (archived) {
+ hideArchiveButton();
+ } else {
+ mArchiveSpace.setVisibility(View.VISIBLE);
+ mArchiveButton.setVisibility(View.VISIBLE);
+ mArchiveButton.setClickable(true);
+ mArchiveButton.setEnabled(true);
+ }
+
+ }
+ });
+ }
+
+ @VisibleForTesting
+ public String getStateText() {
+ return mStateText.getText().toString();
+ }
}
diff --git a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
index ed6cc8b43..e224ddc2a 100644
--- a/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
+++ b/src/com/android/dialer/voicemail/VoicemailPlaybackPresenter.java
@@ -16,14 +16,14 @@
package com.android.dialer.voicemail;
+import com.google.common.annotations.VisibleForTesting;
+
import android.app.Activity;
import android.content.Context;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
-import android.media.AudioManager;
-import android.media.AudioManager.OnAudioFocusChangeListener;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.AsyncTask;
@@ -31,25 +31,24 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.provider.VoicemailContract;
+import android.support.v4.content.FileProvider;
import android.util.Log;
-import android.view.View;
import android.view.WindowManager.LayoutParams;
-import android.widget.SeekBar;
import com.android.dialer.R;
+import com.android.dialer.calllog.CallLogAsyncTaskUtil;
import com.android.dialer.util.AsyncTaskExecutor;
import com.android.dialer.util.AsyncTaskExecutors;
-
import com.android.common.io.MoreCloseables;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
+import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@@ -62,7 +61,7 @@ import javax.annotation.concurrent.ThreadSafe;
* {@link CallLogFragment} and {@link CallLogAdapter}.
* <p>
* This controls a single {@link com.android.dialer.voicemail.VoicemailPlaybackLayout}. A single
- * instance can be reused for different such layouts, using {@link #setVoicemailPlaybackView}. This
+ * instance can be reused for different such layouts, using {@link #setPlaybackView}. This
* is to facilitate reuse across different voicemail call log entries.
* <p>
* This class is not thread safe. The thread policy for this class is thread-confinement, all calls
@@ -70,11 +69,10 @@ import javax.annotation.concurrent.ThreadSafe;
*/
@NotThreadSafe
@VisibleForTesting
-public class VoicemailPlaybackPresenter
- implements OnAudioFocusChangeListener, MediaPlayer.OnPreparedListener,
+public class VoicemailPlaybackPresenter implements MediaPlayer.OnPreparedListener,
MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
- private static final String TAG = VoicemailPlaybackPresenter.class.getSimpleName();
+ private static final String TAG = "VmPlaybackPresenter";
/** Contract describing the behaviour we need from the ui we are controlling. */
public interface PlaybackView {
@@ -86,27 +84,37 @@ public class VoicemailPlaybackPresenter
void onPlaybackStopped();
void onSpeakerphoneOn(boolean on);
void setClipPosition(int clipPositionInMillis, int clipLengthInMillis);
+ void setSuccess();
void setFetchContentTimeout();
- void setIsBuffering();
void setIsFetchingContent();
+ void onVoicemailArchiveSucceded(Uri voicemailUri);
+ void onVoicemailArchiveFailed(Uri voicemailUri);
void setPresenter(VoicemailPlaybackPresenter presenter, Uri voicemailUri);
+ void resetSeekBar();
}
public interface OnVoicemailDeletedListener {
void onVoicemailDeleted(Uri uri);
+ void onVoicemailDeleteUndo();
+ void onVoicemailDeletedInDatabase();
}
/** The enumeration of {@link AsyncTask} objects we use in this class. */
public enum Tasks {
CHECK_FOR_CONTENT,
CHECK_CONTENT_AFTER_CHANGE,
+ ARCHIVE_VOICEMAIL
+ }
+
+ protected interface OnContentCheckedListener {
+ void onContentChecked(boolean hasContent);
}
private static final String[] HAS_CONTENT_PROJECTION = new String[] {
VoicemailContract.Voicemails.HAS_CONTENT,
+ VoicemailContract.Voicemails.DURATION
};
- public static final int PLAYBACK_STREAM = AudioManager.STREAM_VOICE_CALL;
private static final int NUMBER_OF_THREADS_IN_POOL = 2;
// Time to wait for content to be fetched before timing out.
private static final long FETCH_CONTENT_TIMEOUT_MS = 20000;
@@ -121,6 +129,11 @@ public class VoicemailPlaybackPresenter
// If present in the saved instance bundle, indicates where to set the playback slider.
private static final String CLIP_POSITION_KEY =
VoicemailPlaybackPresenter.class.getName() + ".CLIP_POSITION_KEY";
+ private static final String IS_SPEAKERPHONE_ON_KEY =
+ VoicemailPlaybackPresenter.class.getName() + ".IS_SPEAKER_PHONE_ON";
+ public static final int PLAYBACK_REQUEST = 0;
+ public static final int ARCHIVE_REQUEST = 1;
+ public static final int SHARE_REQUEST = 2;
/**
* The most recently cached duration. We cache this since we don't want to keep requesting it
@@ -132,22 +145,23 @@ public class VoicemailPlaybackPresenter
private static VoicemailPlaybackPresenter sInstance;
private Activity mActivity;
- private Context mContext;
+ protected Context mContext;
private PlaybackView mView;
- private Uri mVoicemailUri;
+ protected Uri mVoicemailUri;
- private MediaPlayer mMediaPlayer;
+ protected MediaPlayer mMediaPlayer;
private int mPosition;
private boolean mIsPlaying;
// MediaPlayer crashes on some method calls if not prepared but does not have a method which
// exposes its prepared state. Store this locally, so we can check and prevent crashes.
private boolean mIsPrepared;
+ private boolean mIsSpeakerphoneOn;
private boolean mShouldResumePlaybackAfterSeeking;
private int mInitialOrientation;
// Used to run async tasks that need to interact with the UI.
- private AsyncTaskExecutor mAsyncTaskExecutor;
+ protected AsyncTaskExecutor mAsyncTaskExecutor;
private static ScheduledExecutorService mScheduledExecutorService;
/**
* Used to handle the result of a successful or time-out fetch result.
@@ -155,11 +169,13 @@ public class VoicemailPlaybackPresenter
* This variable is thread-contained, accessed only on the ui thread.
*/
private FetchResultHandler mFetchResultHandler;
+ private final List<FetchResultHandler> mArchiveResultHandlers = new ArrayList<>();
private Handler mHandler = new Handler();
private PowerManager.WakeLock mProximityWakeLock;
- private AudioManager mAudioManager;
+ private VoicemailAudioManager mVoicemailAudioManager;
private OnVoicemailDeletedListener mOnVoicemailDeletedListener;
+ private final VoicemailAsyncTaskUtil mVoicemailAsyncTaskUtil;
/**
* Obtain singleton instance of this class. Use a single instance to provide a consistent
@@ -183,11 +199,11 @@ public class VoicemailPlaybackPresenter
/**
* Initialize variables which are activity-independent and state-independent.
*/
- private VoicemailPlaybackPresenter(Activity activity) {
+ protected VoicemailPlaybackPresenter(Activity activity) {
Context context = activity.getApplicationContext();
mAsyncTaskExecutor = AsyncTaskExecutors.createAsyncTaskExecutor();
- mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-
+ mVoicemailAudioManager = new VoicemailAudioManager(context, this);
+ mVoicemailAsyncTaskUtil = new VoicemailAsyncTaskUtil(context.getContentResolver());
PowerManager powerManager =
(PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
@@ -199,12 +215,12 @@ public class VoicemailPlaybackPresenter
/**
* Update variables which are activity-dependent or state-dependent.
*/
- private void init(Activity activity, Bundle savedInstanceState) {
+ protected void init(Activity activity, Bundle savedInstanceState) {
mActivity = activity;
mContext = activity;
mInitialOrientation = mContext.getResources().getConfiguration().orientation;
- mActivity.setVolumeControlStream(VoicemailPlaybackPresenter.PLAYBACK_STREAM);
+ mActivity.setVolumeControlStream(VoicemailAudioManager.PLAYBACK_STREAM);
if (savedInstanceState != null) {
// Restores playback state when activity is recreated, such as after rotation.
@@ -212,6 +228,7 @@ public class VoicemailPlaybackPresenter
mIsPrepared = savedInstanceState.getBoolean(IS_PREPARED_KEY);
mPosition = savedInstanceState.getInt(CLIP_POSITION_KEY, 0);
mIsPlaying = savedInstanceState.getBoolean(IS_PLAYING_STATE_KEY, false);
+ mIsSpeakerphoneOn = savedInstanceState.getBoolean(IS_SPEAKERPHONE_ON_KEY, false);
}
if (mMediaPlayer == null) {
@@ -229,6 +246,7 @@ public class VoicemailPlaybackPresenter
outState.putBoolean(IS_PREPARED_KEY, mIsPrepared);
outState.putInt(CLIP_POSITION_KEY, mView.getDesiredClipPosition());
outState.putBoolean(IS_PLAYING_STATE_KEY, mIsPlaying);
+ outState.putBoolean(IS_SPEAKERPHONE_ON_KEY, mIsSpeakerphoneOn);
}
}
@@ -240,28 +258,48 @@ public class VoicemailPlaybackPresenter
mView = view;
mView.setPresenter(this, voicemailUri);
- if (mMediaPlayer != null && voicemailUri.equals(mVoicemailUri)) {
- // Handles case where MediaPlayer was retained after an orientation change.
+ // Handles cases where the same entry is binded again when scrolling in list, or where
+ // the MediaPlayer was retained after an orientation change.
+ if (mMediaPlayer != null && mIsPrepared && voicemailUri.equals(mVoicemailUri)) {
+ // If the voicemail card was rebinded, we need to set the position to the appropriate
+ // point. Since we retain the media player, we can just set it to the position of the
+ // media player.
+ mPosition = mMediaPlayer.getCurrentPosition();
onPrepared(mMediaPlayer);
- mView.onSpeakerphoneOn(isSpeakerphoneOn());
} else {
if (!voicemailUri.equals(mVoicemailUri)) {
+ mVoicemailUri = voicemailUri;
mPosition = 0;
+ // Default to earpiece.
+ setSpeakerphoneOn(false);
+ mVoicemailAudioManager.setSpeakerphoneOn(false);
+ } else {
+ // Update the view to the current speakerphone state.
+ mView.onSpeakerphoneOn(mIsSpeakerphoneOn);
}
-
- mVoicemailUri = voicemailUri;
- mDuration.set(0);
+ /*
+ * Check to see if the content field in the DB is set. If set, we proceed to
+ * prepareContent() method. We get the duration of the voicemail from the query and set
+ * it if the content is not available.
+ */
+ checkForContent(new OnContentCheckedListener() {
+ @Override
+ public void onContentChecked(boolean hasContent) {
+ if (hasContent) {
+ prepareContent();
+ } else if (mView != null) {
+ mView.resetSeekBar();
+ mView.setClipPosition(0, mDuration.get());
+ }
+ }
+ });
if (startPlayingImmediately) {
// Since setPlaybackView can get called during the view binding process, we don't
// want to reset mIsPlaying to false if the user is currently playing the
// voicemail and the view is rebound.
mIsPlaying = startPlayingImmediately;
- checkForContent();
}
-
- // Default to earpiece.
- mView.onSpeakerphoneOn(false);
}
}
@@ -269,16 +307,20 @@ public class VoicemailPlaybackPresenter
* Reset the presenter for playback back to its original state.
*/
public void resetAll() {
- reset();
+ pausePresenter(true);
mView = null;
mVoicemailUri = null;
}
/**
- * Reset the presenter such that it is as if the voicemail has not been played.
+ * When navigating away from voicemail playback, we need to release the media player,
+ * pause the UI and save the position.
+ *
+ * @param reset {@code true} if we want to reset the position of the playback, {@code false} if
+ * we want to retain the current position (in case we return to the voicemail).
*/
- public void reset() {
+ public void pausePresenter(boolean reset) {
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
@@ -288,19 +330,35 @@ public class VoicemailPlaybackPresenter
mIsPrepared = false;
mIsPlaying = false;
- mPosition = 0;
- mDuration.set(0);
+
+ if (reset) {
+ // We want to reset the position whether or not the view is valid.
+ mPosition = 0;
+ }
if (mView != null) {
mView.onPlaybackStopped();
- mView.setClipPosition(0, mDuration.get());
+ if (reset) {
+ mView.setClipPosition(0, mDuration.get());
+ } else {
+ mPosition = mView.getDesiredClipPosition();
+ }
}
}
/**
+ * Must be invoked when the parent activity is resumed.
+ */
+ public void onResume() {
+ mVoicemailAudioManager.registerReceivers();
+ }
+
+ /**
* Must be invoked when the parent activity is paused.
*/
public void onPause() {
+ mVoicemailAudioManager.unregisterReceivers();
+
if (mContext != null && mIsPrepared
&& mInitialOrientation != mContext.getResources().getConfiguration().orientation) {
// If an orientation change triggers the pause, retain the MediaPlayer.
@@ -309,11 +367,12 @@ public class VoicemailPlaybackPresenter
}
// Release the media player, otherwise there may be failures.
- reset();
+ pausePresenter(false);
if (mActivity != null) {
mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
}
+
}
/**
@@ -329,6 +388,13 @@ public class VoicemailPlaybackPresenter
mScheduledExecutorService = null;
}
+ if (!mArchiveResultHandlers.isEmpty()) {
+ for (FetchResultHandler fetchResultHandler : mArchiveResultHandlers) {
+ fetchResultHandler.destroy();
+ }
+ mArchiveResultHandlers.clear();
+ }
+
if (mFetchResultHandler != null) {
mFetchResultHandler.destroy();
mFetchResultHandler = null;
@@ -337,16 +403,8 @@ public class VoicemailPlaybackPresenter
/**
* Checks to see if we have content available for this voicemail.
- * <p>
- * This method will be called once, after the fragment has been created, before we know if the
- * voicemail we've been asked to play has any content available.
- * <p>
- * Notify the user that we are fetching the content, then check to see if the content field in
- * the DB is set. If set, we proceed to {@link #prepareContent()} method. If not set, make
- * a request to fetch the content asynchronously via {@link #requestContent()}.
*/
- private void checkForContent() {
- mView.setIsFetchingContent();
+ protected void checkForContent(final OnContentCheckedListener callback) {
mAsyncTaskExecutor.submit(Tasks.CHECK_FOR_CONTENT, new AsyncTask<Void, Void, Boolean>() {
@Override
public Boolean doInBackground(Void... params) {
@@ -355,11 +413,7 @@ public class VoicemailPlaybackPresenter
@Override
public void onPostExecute(Boolean hasContent) {
- if (hasContent) {
- prepareContent();
- } else {
- requestContent();
- }
+ callback.onContentChecked(hasContent);
}
});
}
@@ -371,10 +425,14 @@ public class VoicemailPlaybackPresenter
ContentResolver contentResolver = mContext.getContentResolver();
Cursor cursor = contentResolver.query(
- voicemailUri, HAS_CONTENT_PROJECTION, null, null, null);
+ voicemailUri, null, null, null, null);
try {
if (cursor != null && cursor.moveToNext()) {
- return cursor.getInt(cursor.getColumnIndexOrThrow(
+ int duration = cursor.getInt(cursor.getColumnIndex(
+ VoicemailContract.Voicemails.DURATION));
+ // Convert database duration (seconds) into mDuration (milliseconds)
+ mDuration.set(duration > 0 ? duration * 1000 : 0);
+ return cursor.getInt(cursor.getColumnIndex(
VoicemailContract.Voicemails.HAS_CONTENT)) == 1;
}
} finally {
@@ -395,31 +453,51 @@ public class VoicemailPlaybackPresenter
* proceed to {@link #prepareContent()}. If the has_content field does not
* become true within the allowed time, we will update the ui to reflect the fact that content
* was not available.
+ *
+ * @return whether issued request to fetch content
*/
- private void requestContent() {
- if (mFetchResultHandler != null) {
- mFetchResultHandler.destroy();
+ protected boolean requestContent(int code) {
+ if (mContext == null || mVoicemailUri == null) {
+ return false;
}
- mFetchResultHandler = new FetchResultHandler(new Handler(), mVoicemailUri);
+ FetchResultHandler tempFetchResultHandler =
+ new FetchResultHandler(new Handler(), mVoicemailUri, code);
+
+ switch (code) {
+ case ARCHIVE_REQUEST:
+ mArchiveResultHandlers.add(tempFetchResultHandler);
+ break;
+ default:
+ if (mFetchResultHandler != null) {
+ mFetchResultHandler.destroy();
+ }
+ mView.setIsFetchingContent();
+ mFetchResultHandler = tempFetchResultHandler;
+ break;
+ }
// Send voicemail fetch request.
Intent intent = new Intent(VoicemailContract.ACTION_FETCH_VOICEMAIL, mVoicemailUri);
mContext.sendBroadcast(intent);
+ return true;
}
@ThreadSafe
private class FetchResultHandler extends ContentObserver implements Runnable {
private AtomicBoolean mIsWaitingForResult = new AtomicBoolean(true);
private final Handler mFetchResultHandler;
+ private final Uri mVoicemailUri;
+ private final int mRequestCode;
- public FetchResultHandler(Handler handler, Uri voicemailUri) {
+ public FetchResultHandler(Handler handler, Uri uri, int code) {
super(handler);
mFetchResultHandler = handler;
-
+ mRequestCode = code;
+ mVoicemailUri = uri;
if (mContext != null) {
mContext.getContentResolver().registerContentObserver(
- voicemailUri, false, this);
+ mVoicemailUri, false, this);
mFetchResultHandler.postDelayed(this, FETCH_CONTENT_TIMEOUT_MS);
}
}
@@ -448,6 +526,7 @@ public class VoicemailPlaybackPresenter
public void onChange(boolean selfChange) {
mAsyncTaskExecutor.submit(Tasks.CHECK_CONTENT_AFTER_CHANGE,
new AsyncTask<Void, Void, Boolean>() {
+
@Override
public Boolean doInBackground(Void... params) {
return queryHasContent(mVoicemailUri);
@@ -459,6 +538,11 @@ public class VoicemailPlaybackPresenter
mContext.getContentResolver().unregisterContentObserver(
FetchResultHandler.this);
prepareContent();
+ if (mRequestCode == ARCHIVE_REQUEST) {
+ startArchiveVoicemailTask(mVoicemailUri, true /* archivedByUser */);
+ } else if (mRequestCode == SHARE_REQUEST) {
+ startArchiveVoicemailTask(mVoicemailUri, false /* archivedByUser */);
+ }
}
}
});
@@ -473,7 +557,7 @@ public class VoicemailPlaybackPresenter
* media player. If preparation is successful, the media player will {@link #onPrepared()},
* and it will call {@link #onError()} otherwise.
*/
- private void prepareContent() {
+ protected void prepareContent() {
if (mView == null) {
return;
}
@@ -485,7 +569,7 @@ public class VoicemailPlaybackPresenter
mMediaPlayer = null;
}
- mView.setIsBuffering();
+ mView.disableUiElements();
mIsPrepared = false;
try {
@@ -496,7 +580,7 @@ public class VoicemailPlaybackPresenter
mMediaPlayer.reset();
mMediaPlayer.setDataSource(mContext, mVoicemailUri);
- mMediaPlayer.setAudioStreamType(PLAYBACK_STREAM);
+ mMediaPlayer.setAudioStreamType(VoicemailAudioManager.PLAYBACK_STREAM);
mMediaPlayer.prepareAsync();
} catch (IOException e) {
handleError(e);
@@ -514,12 +598,16 @@ public class VoicemailPlaybackPresenter
Log.d(TAG, "onPrepared");
mIsPrepared = true;
+ // Update the duration in the database if it was not previously retrieved
+ CallLogAsyncTaskUtil.updateVoicemailDuration(mContext, mVoicemailUri,
+ TimeUnit.MILLISECONDS.toSeconds(mMediaPlayer.getDuration()));
+
mDuration.set(mMediaPlayer.getDuration());
- mPosition = mMediaPlayer.getCurrentPosition();
- mView.enableUiElements();
Log.d(TAG, "onPrepared: mPosition=" + mPosition);
mView.setClipPosition(mPosition, mDuration.get());
+ mView.enableUiElements();
+ mView.setSuccess();
mMediaPlayer.seekTo(mPosition);
if (mIsPlaying) {
@@ -539,7 +627,7 @@ public class VoicemailPlaybackPresenter
return true;
}
- private void handleError(Exception e) {
+ protected void handleError(Exception e) {
Log.d(TAG, "handleError: Could not play voicemail " + e);
if (mIsPrepared) {
@@ -570,15 +658,22 @@ public class VoicemailPlaybackPresenter
}
}
- @Override
- public void onAudioFocusChange(int focusChange) {
- Log.d(TAG, "onAudioFocusChange: focusChange=" + focusChange);
- boolean lostFocus = focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT
- || focusChange == AudioManager.AUDIOFOCUS_LOSS;
- if (mIsPlaying && focusChange == AudioManager.AUDIOFOCUS_LOSS) {
- pausePlayback();
- } else if (!mIsPlaying && focusChange == AudioManager.AUDIOFOCUS_GAIN) {
+ /**
+ * Only play voicemail when audio focus is granted. When it is lost (usually by another
+ * application requesting focus), pause playback.
+ *
+ * @param gainedFocus {@code true} if the audio focus was gained, {@code} false otherwise.
+ */
+ public void onAudioFocusChange(boolean gainedFocus) {
+ if (mIsPlaying == gainedFocus) {
+ // Nothing new here, just exit.
+ return;
+ }
+
+ if (!mIsPlaying) {
resumePlayback();
+ } else {
+ pausePlayback();
}
}
@@ -587,15 +682,30 @@ public class VoicemailPlaybackPresenter
* playing.
*/
public void resumePlayback() {
- if (mView == null || mContext == null) {
+ if (mView == null) {
return;
}
if (!mIsPrepared) {
- // If we haven't downloaded the voicemail yet, attempt to download it.
- checkForContent();
- mIsPlaying = true;
-
+ /*
+ * Check content before requesting content to avoid duplicated requests. It is possible
+ * that the UI doesn't know content has arrived if the fetch took too long causing a
+ * timeout, but succeeded.
+ */
+ checkForContent(new OnContentCheckedListener() {
+ @Override
+ public void onContentChecked(boolean hasContent) {
+ if (!hasContent) {
+ // No local content, download from server. Queue playing if the request was
+ // issued,
+ mIsPlaying = requestContent(PLAYBACK_REQUEST);
+ } else {
+ // Queue playing once the media play loaded the content.
+ mIsPlaying = true;
+ prepareContent();
+ }
+ }
+ });
return;
}
@@ -604,20 +714,15 @@ public class VoicemailPlaybackPresenter
if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
// Clamp the start position between 0 and the duration.
mPosition = Math.max(0, Math.min(mPosition, mDuration.get()));
+
mMediaPlayer.seekTo(mPosition);
try {
// Grab audio focus.
- int result = mAudioManager.requestAudioFocus(
- this,
- PLAYBACK_STREAM,
- AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
- if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
- throw new RejectedExecutionException("Could not capture audio focus.");
- }
-
// Can throw RejectedExecutionException.
+ mVoicemailAudioManager.requestAudioFocus();
mMediaPlayer.start();
+ setSpeakerphoneOn(mIsSpeakerphoneOn);
} catch (RejectedExecutionException e) {
handleError(e);
}
@@ -625,11 +730,6 @@ public class VoicemailPlaybackPresenter
Log.d(TAG, "Resumed playback at " + mPosition + ".");
mView.onPlaybackStarted(mDuration.get(), getScheduledExecutorServiceInstance());
- if (isSpeakerphoneOn()) {
- mActivity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
- } else {
- enableProximitySensor();
- }
}
/**
@@ -653,7 +753,8 @@ public class VoicemailPlaybackPresenter
if (mView != null) {
mView.onPlaybackStopped();
}
- mAudioManager.abandonAudioFocus(this);
+
+ mVoicemailAudioManager.abandonAudioFocus();
if (mActivity != null) {
mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
@@ -680,8 +781,17 @@ public class VoicemailPlaybackPresenter
}
}
+ /**
+ * Seek to position. This is called when user manually seek the playback. It could be either
+ * by touch or volume button while in talkback mode.
+ * @param position
+ */
+ public void seek(int position) {
+ mPosition = position;
+ }
+
private void enableProximitySensor() {
- if (mProximityWakeLock == null || isSpeakerphoneOn() || !mIsPrepared
+ if (mProximityWakeLock == null || mIsSpeakerphoneOn || !mIsPrepared
|| mMediaPlayer == null || !mMediaPlayer.isPlaying()) {
return;
}
@@ -707,26 +817,46 @@ public class VoicemailPlaybackPresenter
}
}
+ /**
+ * This is for use by UI interactions only. It simplifies UI logic.
+ */
+ public void toggleSpeakerphone() {
+ mVoicemailAudioManager.setSpeakerphoneOn(!mIsSpeakerphoneOn);
+ setSpeakerphoneOn(!mIsSpeakerphoneOn);
+ }
+
+ /**
+ * This method only handles app-level changes to the speakerphone. Audio layer changes should
+ * be handled separately. This is so that the VoicemailAudioManager can trigger changes to
+ * the presenter without the presenter triggering the audio manager and duplicating actions.
+ */
public void setSpeakerphoneOn(boolean on) {
- mAudioManager.setSpeakerphoneOn(on);
+ if (mView == null) {
+ return;
+ }
- if (on) {
- disableProximitySensor(false /* waitForFarState */);
- if (mIsPrepared && mMediaPlayer != null && mMediaPlayer.isPlaying()) {
- mActivity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
- }
- } else {
- enableProximitySensor();
- if (mActivity != null) {
- mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+ mView.onSpeakerphoneOn(on);
+
+ mIsSpeakerphoneOn = on;
+
+ // This should run even if speakerphone is not being toggled because we may be switching
+ // from earpiece to headphone and vise versa. Also upon initial setup the default audio
+ // source is the earpiece, so we want to trigger the proximity sensor.
+ if (mIsPlaying) {
+ if (on || mVoicemailAudioManager.isWiredHeadsetPluggedIn()) {
+ disableProximitySensor(false /* waitForFarState */);
+ if (mIsPrepared && mMediaPlayer != null && mMediaPlayer.isPlaying()) {
+ mActivity.getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+ } else {
+ enableProximitySensor();
+ if (mActivity != null) {
+ mActivity.getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
}
}
}
- public boolean isSpeakerphoneOn() {
- return mAudioManager.isSpeakerphoneOn();
- }
-
public void setOnVoicemailDeletedListener(OnVoicemailDeletedListener listener) {
mOnVoicemailDeletedListener = listener;
}
@@ -735,13 +865,38 @@ public class VoicemailPlaybackPresenter
return mIsPrepared && mMediaPlayer != null ? mMediaPlayer.getCurrentPosition() : 0;
}
+ public void notifyUiOfArchiveResult(Uri voicemailUri, boolean archived) {
+ if (mView == null) {
+ return;
+ }
+ if (archived) {
+ mView.onVoicemailArchiveSucceded(voicemailUri);
+ } else {
+ mView.onVoicemailArchiveFailed(voicemailUri);
+ }
+ }
+
/* package */ void onVoicemailDeleted() {
- // Trampoline the event notification to the interested listener
+ // Trampoline the event notification to the interested listener.
if (mOnVoicemailDeletedListener != null) {
mOnVoicemailDeletedListener.onVoicemailDeleted(mVoicemailUri);
}
}
+ /* package */ void onVoicemailDeleteUndo() {
+ // Trampoline the event notification to the interested listener.
+ if (mOnVoicemailDeletedListener != null) {
+ mOnVoicemailDeletedListener.onVoicemailDeleteUndo();
+ }
+ }
+
+ /* package */ void onVoicemailDeletedInDatabase() {
+ // Trampoline the event notification to the interested listener.
+ if (mOnVoicemailDeletedListener != null) {
+ mOnVoicemailDeletedListener.onVoicemailDeletedInDatabase();
+ }
+ }
+
private static synchronized ScheduledExecutorService getScheduledExecutorServiceInstance() {
if (mScheduledExecutorService == null) {
mScheduledExecutorService = Executors.newScheduledThreadPool(NUMBER_OF_THREADS_IN_POOL);
@@ -749,8 +904,107 @@ public class VoicemailPlaybackPresenter
return mScheduledExecutorService;
}
+ /**
+ * If voicemail has already been downloaded, go straight to archiving. Otherwise, request
+ * the voicemail content first.
+ */
+ public void archiveContent(final Uri voicemailUri, final boolean archivedByUser) {
+ checkForContent(new OnContentCheckedListener() {
+ @Override
+ public void onContentChecked(boolean hasContent) {
+ if (!hasContent) {
+ requestContent(archivedByUser ? ARCHIVE_REQUEST : SHARE_REQUEST);
+ } else {
+ startArchiveVoicemailTask(voicemailUri, archivedByUser);
+ }
+ }
+ });
+ }
+
+ /**
+ * Asynchronous task used to archive a voicemail given its uri.
+ */
+ protected void startArchiveVoicemailTask(final Uri voicemailUri, final boolean archivedByUser) {
+ mVoicemailAsyncTaskUtil.archiveVoicemailContent(
+ new VoicemailAsyncTaskUtil.OnArchiveVoicemailListener() {
+ @Override
+ public void onArchiveVoicemail(final Uri archivedVoicemailUri) {
+ if (archivedVoicemailUri == null) {
+ notifyUiOfArchiveResult(voicemailUri, false);
+ return;
+ }
+
+ if (archivedByUser) {
+ setArchivedVoicemailStatusAndUpdateUI(voicemailUri,
+ archivedVoicemailUri, true);
+ } else {
+ sendShareIntent(archivedVoicemailUri);
+ }
+ }
+ }, voicemailUri);
+ }
+
+ /**
+ * Sends the intent for sharing the voicemail file.
+ */
+ protected void sendShareIntent(final Uri voicemailUri) {
+ mVoicemailAsyncTaskUtil.getVoicemailFilePath(
+ new VoicemailAsyncTaskUtil.OnGetArchivedVoicemailFilePathListener() {
+ @Override
+ public void onGetArchivedVoicemailFilePath(String filePath) {
+ mView.enableUiElements();
+ if (filePath == null) {
+ mView.setFetchContentTimeout();
+ return;
+ }
+ Uri voicemailFileUri = FileProvider.getUriForFile(
+ mContext,
+ mContext.getString(R.string.contacts_file_provider_authority),
+ new File(filePath));
+ mContext.startActivity(Intent.createChooser(
+ getShareIntent(voicemailFileUri),
+ mContext.getResources().getText(
+ R.string.call_log_share_voicemail)));
+ }
+ }, voicemailUri);
+ }
+
+ /** Sets archived_by_user field to the given boolean and updates the URI. */
+ private void setArchivedVoicemailStatusAndUpdateUI(
+ final Uri voicemailUri,
+ final Uri archivedVoicemailUri,
+ boolean status) {
+ mVoicemailAsyncTaskUtil.setVoicemailArchiveStatus(
+ new VoicemailAsyncTaskUtil.OnSetVoicemailArchiveStatusListener() {
+ @Override
+ public void onSetVoicemailArchiveStatus(boolean success) {
+ notifyUiOfArchiveResult(voicemailUri, success);
+ }
+ }, archivedVoicemailUri, status);
+ }
+
+ private Intent getShareIntent(Uri voicemailFileUri) {
+ Intent shareIntent = new Intent();
+ shareIntent.setAction(Intent.ACTION_SEND);
+ shareIntent.putExtra(Intent.EXTRA_STREAM, voicemailFileUri);
+ shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ shareIntent.setType(mContext.getContentResolver()
+ .getType(voicemailFileUri));
+ return shareIntent;
+ }
+
@VisibleForTesting
public boolean isPlaying() {
return mIsPlaying;
}
+
+ @VisibleForTesting
+ public boolean isSpeakerphoneOn() {
+ return mIsSpeakerphoneOn;
+ }
+
+ @VisibleForTesting
+ public void clearInstance() {
+ sInstance = null;
+ }
}
diff --git a/src/com/android/dialer/voicemail/WiredHeadsetManager.java b/src/com/android/dialer/voicemail/WiredHeadsetManager.java
new file mode 100644
index 000000000..7351f4f01
--- /dev/null
+++ b/src/com/android/dialer/voicemail/WiredHeadsetManager.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.voicemail;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.util.Log;
+
+/** Listens for and caches headset state. */
+class WiredHeadsetManager {
+ private static final String TAG = WiredHeadsetManager.class.getSimpleName();
+
+ interface Listener {
+ void onWiredHeadsetPluggedInChanged(boolean oldIsPluggedIn, boolean newIsPluggedIn);
+ }
+
+ /** Receiver for wired headset plugged and unplugged events. */
+ private class WiredHeadsetBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (AudioManager.ACTION_HEADSET_PLUG.equals(intent.getAction())) {
+ boolean isPluggedIn = intent.getIntExtra("state", 0) == 1;
+ Log.v(TAG, "ACTION_HEADSET_PLUG event, plugged in: " + isPluggedIn);
+ onHeadsetPluggedInChanged(isPluggedIn);
+ }
+ }
+ }
+
+ private final WiredHeadsetBroadcastReceiver mReceiver;
+ private boolean mIsPluggedIn;
+ private Listener mListener;
+ private Context mContext;
+
+ WiredHeadsetManager(Context context) {
+ mContext = context;
+ mReceiver = new WiredHeadsetBroadcastReceiver();
+
+ AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ mIsPluggedIn = audioManager.isWiredHeadsetOn();
+
+ }
+
+ void setListener(Listener listener) {
+ mListener = listener;
+ }
+
+ boolean isPluggedIn() {
+ return mIsPluggedIn;
+ }
+
+ void registerReceiver() {
+ // Register for misc other intent broadcasts.
+ IntentFilter intentFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
+ mContext.registerReceiver(mReceiver, intentFilter);
+ }
+
+ void unregisterReceiver() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
+ private void onHeadsetPluggedInChanged(boolean isPluggedIn) {
+ if (mIsPluggedIn != isPluggedIn) {
+ Log.v(TAG, "onHeadsetPluggedInChanged, mIsPluggedIn: " + mIsPluggedIn + " -> "
+ + isPluggedIn);
+ boolean oldIsPluggedIn = mIsPluggedIn;
+ mIsPluggedIn = isPluggedIn;
+ if (mListener != null) {
+ mListener.onWiredHeadsetPluggedInChanged(oldIsPluggedIn, mIsPluggedIn);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/com/android/dialer/widget/ActionBarController.java b/src/com/android/dialer/widget/ActionBarController.java
index b9923d186..edf57b163 100644
--- a/src/com/android/dialer/widget/ActionBarController.java
+++ b/src/com/android/dialer/widget/ActionBarController.java
@@ -1,15 +1,28 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package com.android.dialer.widget;
import com.google.common.annotations.VisibleForTesting;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.app.ActionBar;
import android.os.Bundle;
import android.util.Log;
import com.android.dialer.DialtactsActivity;
-import com.android.phone.common.animation.AnimUtils;
import com.android.phone.common.animation.AnimUtils.AnimationCallback;
/**
diff --git a/src/com/android/dialer/widget/EmptyContentView.java b/src/com/android/dialer/widget/EmptyContentView.java
index f248967de..719fd3ff8 100644
--- a/src/com/android/dialer/widget/EmptyContentView.java
+++ b/src/com/android/dialer/widget/EmptyContentView.java
@@ -80,10 +80,11 @@ public class EmptyContentView extends LinearLayout implements View.OnClickListen
}
public void setImage(int resourceId) {
- mImageView.setImageResource(resourceId);
if (resourceId == NO_LABEL) {
+ mImageView.setImageDrawable(null);
mImageView.setVisibility(View.GONE);
} else {
+ mImageView.setImageResource(resourceId);
mImageView.setVisibility(View.VISIBLE);
}
}
diff --git a/src/com/android/dialer/widget/SearchEditTextLayout.java b/src/com/android/dialer/widget/SearchEditTextLayout.java
index 544749f33..4f100dc44 100644
--- a/src/com/android/dialer/widget/SearchEditTextLayout.java
+++ b/src/com/android/dialer/widget/SearchEditTextLayout.java
@@ -230,7 +230,6 @@ public class SearchEditTextLayout extends FrameLayout {
setElevation(0);
setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom);
- setElevation(0);
if (requestFocus) {
mSearchView.requestFocus();
}
diff --git a/src/com/android/dialerbind/ObjectFactory.java b/src/com/android/dialerbind/ObjectFactory.java
index 1a36b05d6..303610f30 100644
--- a/src/com/android/dialerbind/ObjectFactory.java
+++ b/src/com/android/dialerbind/ObjectFactory.java
@@ -19,10 +19,14 @@ package com.android.dialerbind;
import static com.android.dialer.calllog.CallLogAdapter.CallFetcher;
import android.content.Context;
+import android.support.annotation.Nullable;
import com.android.dialer.calllog.CallLogAdapter;
import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.list.RegularSearchFragment;
+import com.android.dialer.logging.Logger;
import com.android.dialer.service.CachedNumberLookupService;
+import com.android.dialer.service.ExtendedBlockingButtonRenderer;
import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
/**
@@ -35,6 +39,32 @@ public class ObjectFactory {
return null;
}
+ public static String getFilteredNumberProviderAuthority() {
+ return "com.android.dialer.database.filterednumberprovider";
+ }
+
+ public static String getVoicemailArchiveProviderAuthority() {
+ return "com.android.dialer.database.voicemailarchiveprovider";
+ }
+
+ public static boolean isVoicemailArchiveEnabled(Context context) {
+ return false;
+ }
+
+ public static boolean isVoicemailShareEnabled(Context context) {
+ return false;
+ }
+
+ public static boolean isNewBlockingEnabled(Context context) {
+ return true;
+ }
+
+ @Nullable
+ public static ExtendedBlockingButtonRenderer newExtendedBlockingButtonRenderer(
+ Context context, ExtendedBlockingButtonRenderer.Listener listener) {
+ return null;
+ }
+
/**
* Create a new instance of the call log adapter.
* @param context The context to use.
@@ -47,12 +77,21 @@ public class ObjectFactory {
CallFetcher callFetcher,
ContactInfoHelper contactInfoHelper,
VoicemailPlaybackPresenter voicemailPlaybackPresenter,
- boolean isShowingRecentsTab) {
+ int activityType) {
return new CallLogAdapter(
context,
callFetcher,
contactInfoHelper,
voicemailPlaybackPresenter,
- isShowingRecentsTab);
+ activityType);
+ }
+
+ public static Logger getLoggerInstance() {
+ // no-op
+ return null;
+ }
+
+ public static RegularSearchFragment newRegularSearchFragment() {
+ return new RegularSearchFragment();
}
}
diff --git a/tests/Android.mk b/tests/Android.mk
index 30c6286c6..07f4f00d9 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -5,7 +5,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := tests
LOCAL_CERTIFICATE := shared
-LOCAL_JAVA_LIBRARIES := android.test.runner
+LOCAL_STATIC_JAVA_LIBRARIES := android-support-test
# Include all test java files.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -16,8 +16,13 @@ src_dirs := src \
# Include all test java files.
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
+LOCAL_STATIC_JAVA_LIBRARIES += \
+ mockito-target
+
LOCAL_PACKAGE_NAME := DialerTests
LOCAL_INSTRUMENTATION_FOR := Dialer
+LOCAL_SDK_VERSION := current
+
include $(BUILD_PACKAGE)
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 94aa3aada..40c5502da 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -18,6 +18,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.dialer.tests">
+ <uses-sdk
+ android:minSdkVersion="23"
+ android:targetSdkVersion="23" />
+
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
@@ -35,6 +39,8 @@
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
+ <uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
+
<application>
<uses-library android:name="android.test.runner" />
<meta-data android:name="com.android.dialer.iconset" android:resource="@xml/iconset" />
diff --git a/tests/res/layout/fill_call_log_test.xml b/tests/res/layout/fill_call_log_test.xml
index 2359f2cde..43f475b52 100644
--- a/tests/res/layout/fill_call_log_test.xml
+++ b/tests/res/layout/fill_call_log_test.xml
@@ -59,7 +59,7 @@
android:text="@string/add_custom_entry"
/>
<LinearLayout
- android:orientation="horizontal"
+ android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
@@ -86,6 +86,24 @@
android:layout_height="wrap_content"
android:text="@string/call_type_outgoing"
android:textSize="9sp" />
+ <RadioButton
+ android:id="@+id/call_type_voicemail"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/call_type_voicemail"
+ android:textSize="9sp" />
+ <RadioButton
+ android:id="@+id/call_type_custom"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Custom"
+ android:textSize="9sp" />
+ <EditText
+ android:id="@+id/call_type_custom_text"
+ android:layout_width="90dp"
+ android:layout_height="wrap_content"
+ android:text=""
+ android:inputType="number" />
</RadioGroup>
<CheckBox
android:id="@+id/call_type_video"
diff --git a/tests/res/values/donottranslate_strings.xml b/tests/res/values/donottranslate_strings.xml
index d4b48a6cd..2f8017cd2 100644
--- a/tests/res/values/donottranslate_strings.xml
+++ b/tests/res/values/donottranslate_strings.xml
@@ -42,6 +42,7 @@
<string name="call_type_missed">Missed</string>
<string name="call_type_outgoing">Outgoing</string>
<string name="call_type_video">Video</string>
+ <string name="call_type_voicemail">Voicemail</string>
<string name="call_date">Call date</string>
<string name="call_time">Call time</string>
<string name="edit">Edit</string>
diff --git a/tests/src/com/android/dialer/CallDetailActivityTest.java b/tests/src/com/android/dialer/CallDetailActivityTest.java
index 3b6b61141..fec25f655 100644
--- a/tests/src/com/android/dialer/CallDetailActivityTest.java
+++ b/tests/src/com/android/dialer/CallDetailActivityTest.java
@@ -16,7 +16,7 @@
package com.android.dialer;
-import static com.android.dialer.calllog.CallLogAsyncTaskUtil.Tasks.GET_CALL_DETAILS;
+import static com.android.dialer.calllog.CallLogAsyncTaskUtil.Tasks;
import android.content.ContentResolver;
import android.content.ContentUris;
@@ -29,12 +29,13 @@ import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.Suppress;
import android.view.Menu;
+import android.widget.PopupMenu;
import android.widget.TextView;
import com.android.dialer.calllog.CallLogAsyncTaskUtil;
+import com.android.dialer.util.AppCompatConstants;
import com.android.dialer.util.AsyncTaskExecutors;
import com.android.dialer.util.FakeAsyncTaskExecutor;
-import com.android.internal.view.menu.ContextMenuBuilder;
/**
* Unit tests for the {@link CallDetailActivity}. NOTE: The screen needs to be on for the
@@ -83,35 +84,49 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2<Cal
}
/**
- * Test for bug where voicemails should not have remove-from-call-log entry.
- * <p>
- * See http://b/5054103.
+ * Verifies the trash menu item is present and a voicemail URI is set.
*/
- public void testVoicemailDoesNotHaveRemoveFromCallLog() throws Throwable {
+ @Suppress
+ public void testVoicemailDeleteButton() throws Throwable {
setActivityIntentForTestVoicemailEntry();
startActivityUnderTest();
- mFakeAsyncTaskExecutor.runTask(GET_CALL_DETAILS);
-
- Menu menu = new ContextMenuBuilder(mActivityUnderTest);
- mActivityUnderTest.onCreateOptionsMenu(menu);
- mActivityUnderTest.onPrepareOptionsMenu(menu);
- assertFalse(menu.findItem(R.id.menu_remove_from_call_log).isVisible());
- assertTrue(menu.findItem(R.id.menu_trash).isVisible());
+ mFakeAsyncTaskExecutor.runTask(Tasks.GET_CALL_DETAILS);
+
+ Menu optionsMenu = (new PopupMenu(mActivityUnderTest, null)).getMenu();
+ mActivityUnderTest.onCreateOptionsMenu(optionsMenu);
+ mActivityUnderTest.onPrepareOptionsMenu(optionsMenu);
+
+ assertTrue(mActivityUnderTest.hasVoicemail());
+ mActivityUnderTest.runOnUiThread(new Runnable() {
+ public void run() {
+ mActivityUnderTest.findViewById(R.id.call_detail_delete_menu_item).performClick();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ mFakeAsyncTaskExecutor.runTask(Tasks.DELETE_VOICEMAIL);
}
/**
- * Test to check that I haven't broken the remove-from-call-log entry from regular calls.
+ * Verifies the trash menu item is present and a voicemail URI is not set.
*/
+ @Suppress
public void testRegularCallDoesHaveRemoveFromCallLog() throws Throwable {
setActivityIntentForTestCallEntry();
startActivityUnderTest();
- mFakeAsyncTaskExecutor.runTask(GET_CALL_DETAILS);
-
- Menu menu = new ContextMenuBuilder(mActivityUnderTest);
- mActivityUnderTest.onCreateOptionsMenu(menu);
- mActivityUnderTest.onPrepareOptionsMenu(menu);
- assertTrue(menu.findItem(R.id.menu_remove_from_call_log).isVisible());
- assertFalse(menu.findItem(R.id.menu_trash).isVisible());
+ mFakeAsyncTaskExecutor.runTask(Tasks.GET_CALL_DETAILS);
+
+ Menu optionsMenu = (new PopupMenu(mActivityUnderTest, null)).getMenu();
+ mActivityUnderTest.onCreateOptionsMenu(optionsMenu);
+ mActivityUnderTest.onPrepareOptionsMenu(optionsMenu);
+
+ assertFalse(mActivityUnderTest.hasVoicemail());
+ mActivityUnderTest.runOnUiThread(new Runnable() {
+ public void run() {
+ mActivityUnderTest.findViewById(R.id.call_detail_delete_menu_item).performClick();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ mFakeAsyncTaskExecutor.runTask(Tasks.DELETE_CALL);
}
private void setActivityIntentForTestCallEntry() {
@@ -121,7 +136,7 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2<Cal
ContentValues values = new ContentValues();
values.put(CallLog.Calls.NUMBER, CONTACT_NUMBER);
values.put(CallLog.Calls.NUMBER_PRESENTATION, CallLog.Calls.PRESENTATION_ALLOWED);
- values.put(CallLog.Calls.TYPE, CallLog.Calls.INCOMING_TYPE);
+ values.put(CallLog.Calls.TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
mCallLogUri = contentResolver.insert(CallLog.Calls.CONTENT_URI, values);
setActivityIntent(new Intent(Intent.ACTION_VIEW, mCallLogUri));
}
@@ -132,7 +147,8 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2<Cal
ContentValues values = new ContentValues();
values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1);
- values.put(VoicemailContract.Voicemails._DATA, VOICEMAIL_FILE_LOCATION);
+ // VoicemailContract.Voicemails._DATA
+ values.put("_data", VOICEMAIL_FILE_LOCATION);
mVoicemailUri = contentResolver.insert(VoicemailContract.Voicemails.CONTENT_URI, values);
Uri callLogUri = ContentUris.withAppendedId(CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL,
diff --git a/tests/src/com/android/dialer/DialerLaunchPerformance.java b/tests/src/com/android/dialer/DialerLaunchPerformance.java
index cf64f9449..c409cc60b 100644
--- a/tests/src/com/android/dialer/DialerLaunchPerformance.java
+++ b/tests/src/com/android/dialer/DialerLaunchPerformance.java
@@ -20,7 +20,8 @@ import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
-import android.test.LaunchPerformanceBase;
+
+import com.android.contacts.common.test.LaunchPerformanceBase;
/**
* Instrumentation class for Address Book launch performance testing.
diff --git a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
index b4162e166..3b1dd2c7d 100644
--- a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
@@ -16,41 +16,81 @@
package com.android.dialer.calllog;
+import com.google.common.collect.Lists;
+
+import android.content.ContentUris;
import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
import android.database.MatrixCursor;
-import android.support.v7.widget.RecyclerView.ViewHolder;
+import android.net.Uri;
+import android.provider.CallLog.Calls;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.provider.VoicemailContract;
+import android.telephony.PhoneNumberUtils;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.MediumTest;
+import android.text.TextUtils;
import android.view.View;
-import android.widget.LinearLayout;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.contactinfo.ContactInfoCache;
-import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener;
-import com.google.common.collect.Lists;
+import com.android.dialer.database.VoicemailArchiveContract;
+import com.android.dialer.util.AppCompatConstants;
+import com.android.dialer.util.TestConstants;
+import com.android.dialer.R;
+import java.util.Date;
import java.util.List;
+import java.util.Random;
/**
* Unit tests for {@link CallLogAdapter}.
+ *
+ * adb shell am instrument \
+ * -e com.android.dialer.calllog.CallLogAdapterTest \
+ * -w com.android.dialer.tests/android.test.InstrumentationTestRunner
*/
-@SmallTest
public class CallLogAdapterTest extends AndroidTestCase {
- private static final String TEST_NUMBER = "12345678";
- private static final String TEST_NAME = "name";
- private static final String TEST_NUMBER_LABEL = "label";
- private static final int TEST_NUMBER_TYPE = 1;
+ private static final String EMPTY_STRING = "";
+ private static final int NO_VALUE_SET = -1;
+ private static final int ARCHIVE_TYPE = -2;
+
+ private static final String TEST_CACHED_NAME_PRIMARY = "Cached Name";
+ private static final String TEST_CACHED_NAME_ALTERNATIVE = "Name Cached";
+ private static final String CONTACT_NAME_PRIMARY = "Contact Name";
+ private static final String CONTACT_NAME_ALTERNATIVE = "Name, Contact";
+ private static final String TEST_CACHED_NUMBER_LABEL = "label";
+ private static final int TEST_CACHED_NUMBER_TYPE = 1;
private static final String TEST_COUNTRY_ISO = "US";
-
- /** The object under test. */
+ private static final String TEST_DEFAULT_CUSTOM_LABEL = "myLabel";
+ private static final Uri TEST_LOOKUP_URI = Uri.parse("content://contacts/2");
+ private static final String TEST_ACCOUNT_ID_LABEL = "label";
+
+ private static final String TEST_NUMBER = "12125551000";
+ private static final String TEST_NUMBER_1 = "12345678";
+ private static final String TEST_NUMBER_2 = "87654321";
+ private static final String TEST_NUMBER_3 = "18273645";
+ private static final String TEST_POST_DIAL_DIGITS = ";12345";
+ private static final String TEST_VIA_NUMBER = "+16505551234";
+ private static final String TEST_FORMATTED_NUMBER = "1 212-555-1000";
+
+ // The object under test.
private TestCallLogAdapter mAdapter;
private MatrixCursor mCursor;
- private View mView;
- private ViewHolder mViewHolder;
+ private Resources mResources;
+
+ private CallLogListItemViewHolder mViewHolder;
+ private final Random mRandom = new Random();
@Override
protected void setUp() throws Exception {
super.setUp();
+ mContext = getContext();
+ mResources = mContext.getResources();
+
// Use a call fetcher that does not do anything.
CallLogAdapter.CallFetcher fakeCallFetcher = new CallLogAdapter.CallFetcher() {
@Override
@@ -68,63 +108,313 @@ public class CallLogAdapterTest extends AndroidTestCase {
}
};
- mAdapter = new TestCallLogAdapter(getContext(), fakeCallFetcher, fakeContactInfoHelper);
+ mAdapter = new TestCallLogAdapter(getContext(), fakeCallFetcher, fakeContactInfoHelper,
+ CallLogAdapter.ACTIVITY_TYPE_DIALTACTS);
+
// The cursor used in the tests to store the entries to display.
mCursor = new MatrixCursor(CallLogQuery._PROJECTION);
mCursor.moveToFirst();
+
// The views into which to store the data.
- mView = new LinearLayout(getContext());
mViewHolder = CallLogListItemViewHolder.createForTest(getContext());
- mView.setTag(mViewHolder);
}
- @Override
- protected void tearDown() throws Exception {
- mAdapter = null;
- mCursor = null;
- mView = null;
- super.tearDown();
+ @MediumTest
+ public void testBindView_NumberOnlyNoCache() {
+ createCallLogEntry();
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, TEST_NUMBER);
}
- public void testBindView_NoCallLogCacheNorMemoryCache_EnqueueRequest() {
- mCursor.addRow(createCallLogEntry());
+ @MediumTest
+ public void testBindView_PrivateCall() {
+ createPrivateCallLogEntry();
- // Bind the views of a single row.
mAdapter.changeCursor(mCursor);
mAdapter.onBindViewHolder(mViewHolder, 0);
- // There is one request for contact details.
- assertEquals(1, mAdapter.getContactInfoCache().requests.size());
+ assertEquals(Calls.PRESENTATION_RESTRICTED, mViewHolder.numberPresentation);
+ assertNull(mViewHolder.primaryActionButtonView.getTag());
+ // QC should be disabled since there are no actions to be performed on this
+ // call.
+ assertFalse(mViewHolder.quickContactView.isEnabled());
+ }
- TestContactInfoCache.Request request = mAdapter.getContactInfoCache().requests.get(0);
- // It is for the number we need to show.
- assertEquals(TEST_NUMBER, request.number);
- // It has the right country.
- assertEquals(TEST_COUNTRY_ISO, request.countryIso);
- // Since there is nothing in the cache, it is an immediate request.
- assertTrue("should be immediate", request.immediate);
+ @MediumTest
+ public void testBindView_UnknownCall() {
+ createUnknownCallLogEntry();
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertEquals(Calls.PRESENTATION_UNKNOWN, mViewHolder.numberPresentation);
+ assertNull(mViewHolder.primaryActionButtonView.getTag());
+ // QC should be disabled since there are no actions to be performed on this
+ // call.
+ assertFalse(mViewHolder.quickContactView.isEnabled());
}
- public void testBindView_CallLogCacheButNoMemoryCache_EnqueueRequest() {
- mCursor.addRow(createCallLogEntryWithCachedValues());
+ @MediumTest
+ public void testBindView_WithoutQuickContactBadge() {
+ createCallLogEntry();
- // Bind the views of a single row.
mAdapter.changeCursor(mCursor);
mAdapter.onBindViewHolder(mViewHolder, 0);
+ //assertFalse(mViewHolder.quickContactView.isEnabled());
+ }
+
+ @MediumTest
+ public void testBindView_CallButton() {
+ createCallLogEntry();
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ // The primaryActionView tag is set when the ViewHolder is binded. If it is possible
+ // to place a call to the phone number, a call intent will have been created which
+ // starts a phone call to the entry's number.
+ assertHasCallAction(mViewHolder);
+ }
+
+ @MediumTest
+ public void testBindView_FirstNameFirstOrder() {
+ createCallLogEntry();
+
+ mAdapter.getContactInfoCache()
+ .mockGetValue(createContactInfo(CONTACT_NAME_PRIMARY, CONTACT_NAME_ALTERNATIVE));
+
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+ assertEquals(CONTACT_NAME_PRIMARY, mViewHolder.phoneCallDetailsViews.nameView.getText());
+ }
+
+ @MediumTest
+ public void testBindView_LastNameFirstOrder() {
+ createCallLogEntry();
+
+ mAdapter.getContactInfoCache()
+ .mockGetValue(createContactInfo(CONTACT_NAME_PRIMARY, CONTACT_NAME_ALTERNATIVE));
+
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+ assertEquals(CONTACT_NAME_ALTERNATIVE,
+ mViewHolder.phoneCallDetailsViews.nameView.getText());
+ }
+
+ @MediumTest
+ public void testBindView_NameOrderCorrectOnChange() {
+ createCallLogEntry();
+
+ mAdapter.getContactInfoCache()
+ .mockGetValue(createContactInfo(CONTACT_NAME_PRIMARY, CONTACT_NAME_ALTERNATIVE));
+
+ Context context = getContext();
+ setNameDisplayOrder(context, ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+ assertEquals(CONTACT_NAME_PRIMARY,
+ mViewHolder.phoneCallDetailsViews.nameView.getText());
+
+ setNameDisplayOrder(context, ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+ mAdapter.onResume();
+
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+ assertEquals(CONTACT_NAME_ALTERNATIVE,
+ mViewHolder.phoneCallDetailsViews.nameView.getText());
+ }
+
+ private void setNameDisplayOrder(Context context, int displayOrder) {
+ context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit().putInt(
+ ContactsPreferences.DISPLAY_ORDER_KEY, displayOrder).commit();
+ }
+
+ @MediumTest
+ public void testBindView_CallButtonWithPostDialDigits() {
+ createCallLogEntry(TEST_NUMBER, TEST_POST_DIAL_DIGITS, NO_VALUE_SET, NO_VALUE_SET);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ if (CompatUtils.isNCompatible()) {
+ assertHasCallActionToGivenNumber(mViewHolder, TEST_NUMBER + TEST_POST_DIAL_DIGITS);
+ }
+ }
+
+ @MediumTest
+ public void testBindView_VoicemailUri() {
+ createVoicemailCallLogEntry();
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertEquals(Uri.parse(mViewHolder.voicemailUri),
+ ContentUris.withAppendedId(VoicemailContract.Voicemails.CONTENT_URI, 0));
+ assertNull(mViewHolder.primaryActionButtonView.getTag());
+ }
+
+ @MediumTest
+ public void testBindView_NumberWithPostDialDigits() {
+ createCallLogEntry(TEST_NUMBER, TEST_POST_DIAL_DIGITS, NO_VALUE_SET, NO_VALUE_SET);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ if (CompatUtils.isNCompatible()) {
+ assertNameIs(mViewHolder, TEST_NUMBER + TEST_POST_DIAL_DIGITS);
+ }
+ }
+
+ @MediumTest
+ public void testBindView_ContactWithPostDialDigits() {
+ createCallLogEntry(TEST_NUMBER, TEST_POST_DIAL_DIGITS, NO_VALUE_SET, NO_VALUE_SET);
+ mAdapter.injectContactInfoForTest(TEST_NUMBER + TEST_POST_DIAL_DIGITS, TEST_COUNTRY_ISO,
+ createContactInfo());
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ if (CompatUtils.isNCompatible()) {
+ assertNameIs(mViewHolder, TEST_CACHED_NAME_PRIMARY);
+ }
+ }
+
+ @MediumTest
+ public void testBindView_CallLogWithViaNumber() {
+ createCallLogEntry(TEST_NUMBER, EMPTY_STRING, TEST_VIA_NUMBER, NO_VALUE_SET, NO_VALUE_SET);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ // Copy format of Resource String
+ String formattedNumber = mResources.getString(R.string.description_via_number,
+ TEST_VIA_NUMBER);
+
+ if (CompatUtils.isNCompatible()) {
+ assertEquals(formattedNumber,
+ mViewHolder.phoneCallDetailsViews.callAccountLabel.getText());
+ }
+ }
+
+ @MediumTest
+ public void testBindView_CallLogWithoutViaNumber() {
+ createCallLogEntry(TEST_NUMBER, EMPTY_STRING, EMPTY_STRING, NO_VALUE_SET, NO_VALUE_SET);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ if (CompatUtils.isNCompatible()) {
+ assertEquals(View.GONE,
+ mViewHolder.phoneCallDetailsViews.callAccountLabel.getVisibility());
+ }
+ }
+
+ @MediumTest
+ public void testPresentationAfterRebindingViewHolders() {
+ final int increment = 10;
+ final int size = increment * 4;
+
+ // Instantiate list of ViewHolders.
+ CallLogListItemViewHolder[] holders = new CallLogListItemViewHolder[size];
+ for (int i = 0; i < size; i++) {
+ holders[i] = CallLogListItemViewHolder.createForTest(getContext());
+ }
+
+ // Add first set of entries to the cursor.
+ for (int i = 0; i < increment; i++) {
+ createCallLogEntry();
+ createPrivateCallLogEntry();
+ createCallLogEntry();
+ createUnknownCallLogEntry();
+ }
+
+ mAdapter.changeCursor(mCursor);
+
+ // Verify correct appearance for presentation.
+ for (int i = 0; i < size; i++) {
+ mAdapter.onBindViewHolder(holders[i], i);
+ if (holders[i].numberPresentation == Calls.PRESENTATION_ALLOWED) {
+ assertHasCallAction(holders[i]);
+ } else {
+ assertNull(holders[i].primaryActionButtonView.getTag());
+ assertEquals(holders[i].number, EMPTY_STRING);
+ }
+ }
+
+ // Append the rest of the entries to the cursor. Keep the first set of ViewHolders
+ // so they are updated and not buitl from scratch. This checks for bugs which may
+ // be evident only after the call log is updated.
+ for (int i = 0; i < increment; i++) {
+ createPrivateCallLogEntry();
+ createCallLogEntry();
+ createUnknownCallLogEntry();
+ createCallLogEntry();
+ }
+
+ mCursor.move(size);
+
+ // Verify correct appearnce for presentation.
+ for (int i = 0; i < size; i++) {
+ mAdapter.onBindViewHolder(holders[i], i + size);
+ if (holders[i].numberPresentation == Calls.PRESENTATION_ALLOWED) {
+ assertHasCallAction(holders[i]);
+ } else {
+ assertNull(holders[i].primaryActionButtonView.getTag());
+ assertEquals(holders[i].number, EMPTY_STRING);
+ }
+ }
+ }
+
+ @MediumTest
+ public void testBindView_NoCallLogCacheNorMemoryCache_EnqueueRequest() {
+ createCallLogEntry();
+
+ // Bind the views of a single row.
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ // There is one request for contact details.
+ assertEquals(1, mAdapter.getContactInfoCache().requests.size());
+
+ TestContactInfoCache.Request request = mAdapter.getContactInfoCache().requests.get(0);
+ // It is for the number we need to show.
+ assertEquals(TEST_NUMBER, request.number);
+ // It has the right country.
+ assertEquals(TEST_COUNTRY_ISO, request.countryIso);
+ // Since there is nothing in the cache, it is an immediate request.
+ assertTrue("should be immediate", request.immediate);
+ }
+
+ @MediumTest
+ public void testBindView_CallLogCacheButNoMemoryCache_EnqueueRequest() {
+ createCallLogEntryWithCachedValues(false);
+
+ // Bind the views of a single row.
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
// There is one request for contact details.
assertEquals(1, mAdapter.getContactInfoCache().requests.size());
TestContactInfoCache.Request request = mAdapter.getContactInfoCache().requests.get(0);
+
// The values passed to the request, match the ones in the call log cache.
- assertEquals(TEST_NAME, request.callLogInfo.name);
- assertEquals(1, request.callLogInfo.type);
- assertEquals(TEST_NUMBER_LABEL, request.callLogInfo.label);
+ assertEquals(TEST_CACHED_NAME_PRIMARY, request.callLogInfo.name);
+ assertEquals(TEST_CACHED_NUMBER_TYPE, request.callLogInfo.type);
+ assertEquals(TEST_CACHED_NUMBER_LABEL, request.callLogInfo.label);
}
-
+ @MediumTest
public void testBindView_NoCallLogButMemoryCache_EnqueueRequest() {
- mCursor.addRow(createCallLogEntry());
+ createCallLogEntry();
mAdapter.injectContactInfoForTest(TEST_NUMBER, TEST_COUNTRY_ISO, createContactInfo());
// Bind the views of a single row.
@@ -139,9 +429,9 @@ public class CallLogAdapterTest extends AndroidTestCase {
assertFalse("should not be immediate", request.immediate);
}
+ @MediumTest
public void testBindView_BothCallLogAndMemoryCache_NoEnqueueRequest() {
- mCursor.addRow(createCallLogEntryWithCachedValues());
- mAdapter.injectContactInfoForTest(TEST_NUMBER, TEST_COUNTRY_ISO, createContactInfo());
+ createCallLogEntryWithCachedValues(true);
// Bind the views of a single row.
mAdapter.changeCursor(mCursor);
@@ -151,8 +441,9 @@ public class CallLogAdapterTest extends AndroidTestCase {
assertEquals(0, mAdapter.getContactInfoCache().requests.size());
}
- public void testBindView_MismatchBetwenCallLogAndMemoryCache_EnqueueRequest() {
- mCursor.addRow(createCallLogEntryWithCachedValues());
+ @MediumTest
+ public void testBindView_MismatchBetweenCallLogAndMemoryCache_EnqueueRequest() {
+ createCallLogEntryWithCachedValues(false);
// Contact info contains a different name.
ContactInfo info = createContactInfo();
@@ -171,40 +462,393 @@ public class CallLogAdapterTest extends AndroidTestCase {
assertFalse("should not be immediate", request.immediate);
}
- /** Returns a contact info with default values. */
+ @MediumTest
+ public void testBindView_WithCachedName() {
+ createCallLogEntryWithCachedValues(
+ "John Doe",
+ Phone.TYPE_HOME,
+ TEST_CACHED_NUMBER_LABEL);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, "John Doe");
+ assertLabel(mViewHolder, TEST_FORMATTED_NUMBER, getTypeLabel(Phone.TYPE_HOME));
+ }
+
+ @MediumTest
+ public void testBindView_UriNumber() {
+ createCallLogEntryWithCachedValues(
+ "sip:johndoe@gmail.com",
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ "John Doe",
+ Phone.TYPE_HOME,
+ TEST_DEFAULT_CUSTOM_LABEL,
+ EMPTY_STRING,
+ false /* inject */);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, "John Doe");
+ assertLabel(mViewHolder, "sip:johndoe@gmail.com", "sip:johndoe@gmail.com");
+ }
+
+ @MediumTest
+ public void testBindView_HomeLabel() {
+ createCallLogEntryWithCachedValues(
+ "John Doe",
+ Phone.TYPE_HOME,
+ TEST_CACHED_NUMBER_LABEL);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, "John Doe");
+ assertLabel(mViewHolder, TEST_FORMATTED_NUMBER, getTypeLabel(Phone.TYPE_HOME));
+ }
+
+ @MediumTest
+ public void testBindView_WorkLabel() {
+ createCallLogEntryWithCachedValues(
+ "John Doe",
+ Phone.TYPE_WORK,
+ TEST_CACHED_NUMBER_LABEL);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, "John Doe");
+ assertLabel(mViewHolder, TEST_FORMATTED_NUMBER, getTypeLabel(Phone.TYPE_WORK));
+ }
+
+ @MediumTest
+ public void testBindView_CustomLabel() {
+ createCallLogEntryWithCachedValues(
+ "John Doe",
+ Phone.TYPE_CUSTOM,
+ TEST_DEFAULT_CUSTOM_LABEL);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, "John Doe");
+ assertLabel(mViewHolder, TEST_FORMATTED_NUMBER, TEST_DEFAULT_CUSTOM_LABEL);
+ }
+
+ @MediumTest
+ public void testBindView_NumberOnlyDbCachedFormattedNumber() {
+ createCallLogEntryWithCachedValues(
+ TEST_NUMBER,
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ EMPTY_STRING,
+ TEST_CACHED_NUMBER_TYPE,
+ TEST_CACHED_NUMBER_LABEL,
+ TEST_FORMATTED_NUMBER,
+ false /* inject */);
+
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertNameIs(mViewHolder, TEST_FORMATTED_NUMBER);
+ }
+
+ @MediumTest
+ public void testBindVoicemailPromoCard() {
+ createCallLogEntry(TEST_NUMBER_1);
+ createCallLogEntry(TEST_NUMBER_1);
+ createCallLogEntry(TEST_NUMBER_2);
+ createCallLogEntry(TEST_NUMBER_2);
+ createCallLogEntry(TEST_NUMBER_2);
+ createCallLogEntry(TEST_NUMBER_3);
+
+ // Bind the voicemail promo card.
+ mAdapter.showVoicemailPromoCard(true);
+ mAdapter.changeCursor(mCursor);
+ mAdapter.onBindViewHolder(PromoCardViewHolder.createForTest(getContext()), 0);
+
+ // Check that displaying the promo card does not affect the grouping or list display.
+ mAdapter.onBindViewHolder(mViewHolder, 1);
+ assertEquals(2, mAdapter.getGroupSize(1));
+ assertEquals(TEST_NUMBER_1, mViewHolder.number);
+
+ mAdapter.onBindViewHolder(mViewHolder, 2);
+ assertEquals(3, mAdapter.getGroupSize(2));
+ assertEquals(TEST_NUMBER_2, mViewHolder.number);
+
+ mAdapter.onBindViewHolder(mViewHolder, 3);
+ assertEquals(1, mAdapter.getGroupSize(3));
+ assertEquals(TEST_NUMBER_3, mViewHolder.number);
+ }
+
+ public void testVoicemailArchive() {
+ setUpArchiveAdapter();
+ createVoicemailArchiveCallLogEntry();
+
+ mAdapter.changeCursorVoicemail(mCursor);
+ mAdapter.onBindViewHolder(mViewHolder, 0);
+
+ assertEquals(Uri.parse(mViewHolder.voicemailUri),
+ ContentUris.withAppendedId(
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI, 0));
+ assertNull(mViewHolder.primaryActionButtonView.getTag());
+ }
+
+ private void createCallLogEntry() {
+ createCallLogEntry(TEST_NUMBER);
+ }
+
+ private void createCallLogEntry(String testNumber) {
+ createCallLogEntry(testNumber, EMPTY_STRING, NO_VALUE_SET, NO_VALUE_SET);
+ }
+
+ private void createPrivateCallLogEntry() {
+ createCallLogEntry(
+ EMPTY_STRING,
+ EMPTY_STRING,
+ Calls.PRESENTATION_RESTRICTED,
+ AppCompatConstants.CALLS_INCOMING_TYPE);
+ }
+
+ private void createUnknownCallLogEntry() {
+ createCallLogEntry(
+ EMPTY_STRING,
+ EMPTY_STRING,
+ Calls.PRESENTATION_UNKNOWN,
+ AppCompatConstants.CALLS_INCOMING_TYPE);
+ }
+
+ private void createVoicemailCallLogEntry() {
+ createCallLogEntry(TEST_NUMBER, EMPTY_STRING, NO_VALUE_SET, Calls.VOICEMAIL_TYPE);
+ }
+
+ private void createVoicemailArchiveCallLogEntry() {
+ createCallLogEntry(TEST_NUMBER, EMPTY_STRING, NO_VALUE_SET, ARCHIVE_TYPE);
+ }
+
+ private void createCallLogEntry(String number, String postDialDigits, int presentation,
+ int type) {
+ Object[] values = getValues(number, postDialDigits, presentation, type);
+ mCursor.addRow(values);
+ }
+
+ private void createCallLogEntry(String number, String postDialDigits, String viaNumber,
+ int presentation, int type) {
+ Object[] values = getValues(number, postDialDigits, viaNumber, presentation, type);
+ mCursor.addRow(values);
+ }
+
+ private void createCallLogEntryWithCachedValues(boolean inject) {
+ createCallLogEntryWithCachedValues(
+ TEST_NUMBER,
+ NO_VALUE_SET,
+ TEST_CACHED_NAME_PRIMARY,
+ TEST_CACHED_NUMBER_TYPE,
+ TEST_CACHED_NUMBER_LABEL,
+ EMPTY_STRING,
+ inject);
+ }
+
+ private void createCallLogEntryWithCachedValues(
+ String cachedName, int cachedNumberType, String cachedNumberLabel) {
+ createCallLogEntryWithCachedValues(
+ TEST_NUMBER,
+ NO_VALUE_SET,
+ cachedName,
+ cachedNumberType,
+ cachedNumberLabel,
+ EMPTY_STRING,
+ false /* inject */);
+ }
+
+ /**
+ * Inserts a new call log entry
+ *
+ * It includes the values for the cached contact associated with the number.
+ *
+ * @param number The phone number.
+ * @param type Valid value of {@code Calls.TYPE}.
+ * @param cachedName The name of the contact with this number
+ * @param cachedNumberType The type of the number, from the contact with this number.
+ * @param cachedNumberLabel The label of the number, from the contact with this number.
+ * @param cachedFormattedNumber The formatted number, from the contact with this number.
+ * @param inject Whether to inject the contact info into the adapter's ContactInfoCache.
+ */
+ private void createCallLogEntryWithCachedValues(
+ String number,
+ int type,
+ String cachedName,
+ int cachedNumberType,
+ String cachedNumberLabel,
+ String cachedFormattedNumber,
+ boolean inject) {
+ Object[] values = getValues(number, EMPTY_STRING, NO_VALUE_SET, type);
+ values[CallLogQuery.CACHED_NAME] = cachedName;
+ values[CallLogQuery.CACHED_NUMBER_TYPE] = cachedNumberType;
+ values[CallLogQuery.CACHED_NUMBER_LABEL] = cachedNumberLabel;
+ values[CallLogQuery.CACHED_FORMATTED_NUMBER] = cachedFormattedNumber;
+
+ mCursor.addRow(values);
+
+ if (inject) {
+ ContactInfo contactInfo =
+ createContactInfo(cachedName, cachedName, cachedNumberType, cachedNumberLabel);
+ mAdapter.injectContactInfoForTest(number, TEST_COUNTRY_ISO, contactInfo);
+ }
+ }
+
+ /**
+ * @param number The phone number.
+ * @param postDialDigits The post dial digits dialed (if any)
+ * @param presentation Number representing display rules for "allowed",
+ * "payphone", "restricted", or "unknown".
+ * @param type The type of the call (outgoing/ingoing)
+ */
+ private Object[] getValues(
+ String number,
+ String postDialDigits,
+ int presentation,
+ int type) {
+ return getValues(number, postDialDigits, "", presentation, type);
+ }
+
+ /**
+ * @param number The phone number.
+ * @param postDialDigits The post dial digits dialed (if any)
+ * @param viaNumber The secondary number that the call was placed via
+ * @param presentation Number representing display rules for "allowed",
+ * "payphone", "restricted", or "unknown".
+ * @param type The type of the call (outgoing/ingoing)
+ */
+ private Object[] getValues(
+ String number,
+ String postDialDigits,
+ String viaNumber,
+ int presentation,
+ int type) {
+ Object[] values = CallLogQueryTestUtils.createTestValues();
+
+ values[CallLogQuery.ID] = mCursor.getCount();
+ values[CallLogQuery.COUNTRY_ISO] = TEST_COUNTRY_ISO;
+ values[CallLogQuery.DATE] = new Date().getTime();
+ values[CallLogQuery.DURATION] = mRandom.nextInt(10 * 60);
+
+ if (!TextUtils.isEmpty(number)) {
+ values[CallLogQuery.NUMBER] = number;
+ }
+ if (!TextUtils.isEmpty(postDialDigits) && CompatUtils.isNCompatible()) {
+ values[CallLogQuery.POST_DIAL_DIGITS] = postDialDigits;
+ }
+ if (!TextUtils.isEmpty(viaNumber) && CompatUtils.isNCompatible()) {
+ values[CallLogQuery.VIA_NUMBER] = viaNumber;
+ }
+ if (presentation != NO_VALUE_SET) {
+ values[CallLogQuery.NUMBER_PRESENTATION] = presentation;
+ }
+ if (type != NO_VALUE_SET) {
+ values[CallLogQuery.CALL_TYPE] = type;
+ }
+ if (type == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
+ values[CallLogQuery.VOICEMAIL_URI] = ContentUris.withAppendedId(
+ VoicemailContract.Voicemails.CONTENT_URI, mCursor.getCount());
+ }
+ if (type == ARCHIVE_TYPE) {
+ values[CallLogQuery.VOICEMAIL_URI] = ContentUris.withAppendedId(
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI, mCursor.getCount());
+ }
+
+ return values;
+ }
+
private ContactInfo createContactInfo() {
+ return createContactInfo(
+ TEST_CACHED_NAME_PRIMARY,
+ TEST_CACHED_NAME_ALTERNATIVE);
+ }
+
+ private ContactInfo createContactInfo(String namePrimary, String nameAlternative) {
+ return createContactInfo(
+ namePrimary,
+ nameAlternative,
+ TEST_CACHED_NUMBER_TYPE,
+ TEST_CACHED_NUMBER_LABEL);
+ }
+
+ /** Returns a contact info with default values. */
+ private ContactInfo createContactInfo(String namePrimary, String nameAlternative, int type, String label) {
ContactInfo info = new ContactInfo();
info.number = TEST_NUMBER;
- info.name = TEST_NAME;
- info.type = TEST_NUMBER_TYPE;
- info.label = TEST_NUMBER_LABEL;
+ info.name = namePrimary;
+ info.nameAlternative = nameAlternative;
+ info.type = type;
+ info.label = label;
+ info.formattedNumber = TEST_FORMATTED_NUMBER;
+ info.normalizedNumber = TEST_NUMBER;
+ info.lookupUri = TEST_LOOKUP_URI;
return info;
}
- /** Returns a call log entry without cached values. */
- private Object[] createCallLogEntry() {
- Object[] values = CallLogQueryTestUtils.createTestValues();
- values[CallLogQuery.NUMBER] = TEST_NUMBER;
- values[CallLogQuery.COUNTRY_ISO] = TEST_COUNTRY_ISO;
- return values;
+ // Asserts that the name text view is shown and contains the given text.
+ private void assertNameIs(CallLogListItemViewHolder viewHolder, String name) {
+ assertEquals(View.VISIBLE, viewHolder.phoneCallDetailsViews.nameView.getVisibility());
+ assertEquals(name, viewHolder.phoneCallDetailsViews.nameView.getText());
}
- /** Returns a call log entry with a cached values. */
- private Object[] createCallLogEntryWithCachedValues() {
- Object[] values = createCallLogEntry();
- values[CallLogQuery.CACHED_NAME] = TEST_NAME;
- values[CallLogQuery.CACHED_NUMBER_TYPE] = TEST_NUMBER_TYPE;
- values[CallLogQuery.CACHED_NUMBER_LABEL] = TEST_NUMBER_LABEL;
- return values;
+ // Asserts that the label text view contains the given text.
+ private void assertLabel(
+ CallLogListItemViewHolder viewHolder, CharSequence number, CharSequence label) {
+ if (label != null) {
+ assertTrue(viewHolder.phoneCallDetailsViews.callLocationAndDate.getText()
+ .toString().contains(label));
+ }
}
- /**
- * Subclass of {@link CallLogAdapter} used in tests to intercept certain calls.
- */
+ private void assertHasCallAction(CallLogListItemViewHolder viewHolder) {
+ assertHasCallActionToGivenNumber(viewHolder, TEST_NUMBER);
+ }
+
+ private void assertHasCallActionToGivenNumber(CallLogListItemViewHolder viewHolder,
+ String number) {
+ IntentProvider intentProvider =
+ (IntentProvider) viewHolder.primaryActionButtonView.getTag();
+ Intent intent = intentProvider.getIntent(getContext());
+ assertEquals(TestConstants.CALL_INTENT_ACTION, intent.getAction());
+ assertEquals(Uri.parse("tel:" + Uri.encode(number)), intent.getData());
+ }
+
+ /** Returns the label associated with a given phone type. */
+ private CharSequence getTypeLabel(int phoneType) {
+ return Phone.getTypeLabel(getContext().getResources(), phoneType, "");
+ }
+
+ private void setUpArchiveAdapter() {
+ // Use a call fetcher that does not do anything.
+ CallLogAdapter.CallFetcher fakeCallFetcher = new CallLogAdapter.CallFetcher() {
+ @Override
+ public void fetchCalls() {}
+ };
+
+ ContactInfoHelper fakeContactInfoHelper =
+ new ContactInfoHelper(getContext(), TEST_COUNTRY_ISO) {
+ @Override
+ public ContactInfo lookupNumber(String number, String countryIso) {
+ ContactInfo info = new ContactInfo();
+ info.number = number;
+ info.formattedNumber = number;
+ return info;
+ }
+ };
+
+ mAdapter = new TestCallLogAdapter(getContext(), fakeCallFetcher, fakeContactInfoHelper,
+ CallLogAdapter.ACTIVITY_TYPE_ARCHIVE);
+ }
+
+ /// Subclass of {@link CallLogAdapter} used in tests to intercept certain calls.
private static final class TestCallLogAdapter extends CallLogAdapter {
public TestCallLogAdapter(Context context, CallFetcher callFetcher,
- ContactInfoHelper contactInfoHelper) {
- super(context, callFetcher, contactInfoHelper, null, false);
+ ContactInfoHelper contactInfoHelper, int mActivity) {
+ super(context, callFetcher, contactInfoHelper, null,
+ mActivity);
mContactInfoCache = new TestContactInfoCache(
contactInfoHelper, mOnContactInfoChangedListener);
}
@@ -212,6 +856,10 @@ public class CallLogAdapterTest extends AndroidTestCase {
public TestContactInfoCache getContactInfoCache() {
return (TestContactInfoCache) mContactInfoCache;
}
+
+ public void showVoicemailPromoCard(boolean show) {
+ mShowVoicemailPromoCard = show;
+ }
}
private static final class TestContactInfoCache extends ContactInfoCache {
@@ -232,11 +880,35 @@ public class CallLogAdapterTest extends AndroidTestCase {
public final List<Request> requests = Lists.newArrayList();
+ /**
+ * Dummy contactInfo to return in the even that the getValue method has been mocked
+ */
+ private ContactInfo mContactInfo;
+
public TestContactInfoCache(
ContactInfoHelper contactInfoHelper, OnContactInfoChangedListener listener) {
super(contactInfoHelper, listener);
}
+ /**
+ * Sets the given value to be returned by all calls to
+ * {@link #getValue(String, String, ContactInfo)}
+ *
+ * @param contactInfo the contactInfo
+ */
+ public void mockGetValue(ContactInfo contactInfo) {
+ this.mContactInfo = contactInfo;
+ }
+
+ @Override
+ public ContactInfo getValue(String number, String countryIso,
+ ContactInfo cachedContactInfo) {
+ if (mContactInfo != null) {
+ return mContactInfo;
+ }
+ return super.getValue(number, countryIso, cachedContactInfo);
+ }
+
@Override
protected void enqueueRequest(String number, String countryIso, ContactInfo callLogInfo,
boolean immediate) {
diff --git a/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java b/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
deleted file mode 100644
index 6f4b68b82..000000000
--- a/tests/src/com/android/dialer/calllog/CallLogFragmentTest.java
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.dialer.calllog;
-
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.content.ComponentName;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.database.MatrixCursor;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
-import android.net.Uri;
-import android.provider.CallLog.Calls;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.VoicemailContract;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.test.suitebuilder.annotation.MediumTest;
-import android.util.Log;
-import android.view.View;
-import android.widget.FrameLayout;
-
-import com.android.contacts.common.test.FragmentTestActivity;
-import com.android.dialer.CallDetailActivity;
-import com.android.dialer.R;
-import com.android.dialer.util.TestConstants;
-
-import java.util.Date;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.Random;
-
-/**
- * Tests for the contact call list activity.
- *
- * Running all tests:
- *
- * runtest contacts
- * or
- * adb shell am instrument \
- * -w com.android.dialer.tests/android.test.InstrumentationTestRunner
- */
-@LargeTest
-public class CallLogFragmentTest extends ActivityInstrumentationTestCase2<FragmentTestActivity> {
- private static final int RAND_DURATION = -1;
- private static final long NOW = -1L;
-
- /** A test value for the URI of a contact. */
- private static final Uri TEST_LOOKUP_URI = Uri.parse("content://contacts/2");
- /** A test value for the country ISO of the phone number in the call log. */
- private static final String TEST_COUNTRY_ISO = "US";
- /** A phone number to be used in tests. */
- private static final String TEST_NUMBER = "12125551000";
- /** The formatted version of {@link #TEST_NUMBER}. */
- private static final String TEST_FORMATTED_NUMBER = "1 212-555-1000";
-
- private static final String TEST_DEFAULT_CUSTOM_LABEL = "myLabel";
-
- /** The activity in which we are hosting the fragment. */
- private FragmentTestActivity mActivity;
- private CallLogFragment mFragment;
- private FrameLayout mParentView;
- /**
- * The adapter used by the fragment to build the rows in the call log. We use it with our own in
- * memory database.
- */
- private CallLogAdapter mAdapter;
- private String mVoicemail;
-
- // In memory array to hold the rows corresponding to the 'calls' table.
- private MatrixCursor mCursor;
- private int mIndex; // Of the next row.
-
- private Random mRnd;
-
- // An item in the call list. All the methods performing checks use it.
- private CallLogListItemViewHolder mItem;
-
- // The list of view holderss representing the data in the DB, in reverse order from the DB.
- private CallLogListItemViewHolder[] mList;
-
- public CallLogFragmentTest() {
- super(FragmentTestActivity.class);
- mIndex = 1;
- mRnd = new Random();
- }
-
- @Override
- public void setUp() {
- mActivity = getActivity();
- // Needed by the CallLogFragment.
- mActivity.setTheme(R.style.DialtactsTheme);
-
- // Create the fragment and load it into the activity.
- mFragment = new CallLogFragment();
- FragmentManager fragmentManager = mActivity.getFragmentManager();
- FragmentTransaction transaction = fragmentManager.beginTransaction();
- transaction.add(FragmentTestActivity.LAYOUT_ID, mFragment);
- transaction.commitAllowingStateLoss();
- // Wait for the fragment to be loaded.
- getInstrumentation().waitForIdleSync();
-
- final TelephonyManager telephonyManager =
- (TelephonyManager) mActivity.getSystemService(Context.TELEPHONY_SERVICE);
- mVoicemail = telephonyManager.getVoiceMailNumber();
- mAdapter = mFragment.getAdapter();
- // Do not process requests for details during tests. This would start a background thread,
- // which makes the tests flaky.
- mAdapter.disableRequestProcessingForTest();
- mAdapter.pauseCache();
- mParentView = new FrameLayout(mActivity);
- mCursor = new MatrixCursor(CallLogQuery._PROJECTION);
-
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- mAdapter.changeCursor(mCursor);
- }
- });
- getInstrumentation().waitForIdleSync();
- }
-
- /**
- * Checks that the call icon is not visible for private and
- * unknown numbers.
- * Use 2 passes, one where new viewHolder are created and one where
- * half of the total viewHolder are updated and the other half created.
- */
- @MediumTest
- public void testCallViewIsNotVisibleForPrivateAndUnknownNumbers() {
- final int SIZE = 50;
- mList = new CallLogListItemViewHolder[SIZE];
-
- // Insert the first batch of entries.
- mCursor.moveToFirst();
- insertRandomEntries(SIZE / 2);
- int startOfSecondBatch = mCursor.getPosition();
-
- buildViewListFromDb();
- checkCallStatus();
-
- // Append the rest of the entries. We keep the first set of
- // viewHolder around so they get updated and not built from
- // scratch, this exposes some bugs that are not there when the
- // call log is launched for the 1st time but show up when the
- // call log gets updated afterwards.
- mCursor.move(startOfSecondBatch);
- insertRandomEntries(SIZE / 2);
-
- buildViewListFromDb();
- checkCallStatus();
- }
-
- @MediumTest
- public void testCallAndGroupviewHolder_GroupView() {
- mCursor.moveToFirst();
- insertPrivate(NOW, 0);
- insertPrivate(NOW, 0);
- insertPrivate(NOW, 0);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- mAdapter.onBindViewHolder(viewHolder, /* position */ 0);
- }
-
- @MediumTest
- public void testCallAndGroupviewHolder_StandAloneView() {
- mCursor.moveToFirst();
- insertPrivate(NOW, 0);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
- }
-
- @MediumTest
- public void testCallAndGroupviewHolder_ChildView() {
- mCursor.moveToFirst();
- insertPrivate(NOW, 0);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- mAdapter.onBindViewHolder(viewHolder, /* position */ 0);
- }
-
- @MediumTest
- public void testBindView_NumberOnlyNoCache() {
- mCursor.moveToFirst();
- insert(TEST_NUMBER, Calls.PRESENTATION_ALLOWED, NOW, 0, Calls.INCOMING_TYPE);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, TEST_NUMBER);
- }
-
- @MediumTest
- public void testBindView_NumberOnlyDbCachedFormattedNumber() {
- mCursor.moveToFirst();
- Object[] values = getValuesToInsert(TEST_NUMBER,
- Calls.PRESENTATION_ALLOWED, NOW, 0, Calls.INCOMING_TYPE);
- values[CallLogQuery.CACHED_FORMATTED_NUMBER] = TEST_FORMATTED_NUMBER;
- insertValues(values);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, TEST_FORMATTED_NUMBER);
- }
-
- @MediumTest
- public void testBindView_WithCachedName() {
- mCursor.moveToFirst();
- insertWithCachedValues(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE,
- "John Doe", Phone.TYPE_HOME, TEST_DEFAULT_CUSTOM_LABEL);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, "John Doe");
- assertLabel(viewHolder, TEST_FORMATTED_NUMBER, getTypeLabel(Phone.TYPE_HOME));
- }
-
- @MediumTest
- public void testBindView_UriNumber() {
- mCursor.moveToFirst();
- insertWithCachedValues("sip:johndoe@gmail.com", NOW, 0, Calls.INCOMING_TYPE,
- "John Doe", Phone.TYPE_HOME, TEST_DEFAULT_CUSTOM_LABEL);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, "John Doe");
- assertLabel(viewHolder, "sip:johndoe@gmail.com", "sip:johndoe@gmail.com");
- }
-
- @MediumTest
- public void testBindView_HomeLabel() {
- mCursor.moveToFirst();
- insertWithCachedValues(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE,
- "John Doe", Phone.TYPE_HOME, TEST_DEFAULT_CUSTOM_LABEL);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, "John Doe");
- assertLabel(viewHolder, TEST_FORMATTED_NUMBER, getTypeLabel(Phone.TYPE_HOME));
- }
-
- @MediumTest
- public void testBindView_WorkLabel() {
- mCursor.moveToFirst();
- insertWithCachedValues(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE,
- "John Doe", Phone.TYPE_WORK, TEST_DEFAULT_CUSTOM_LABEL);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, "John Doe");
- assertLabel(viewHolder, TEST_FORMATTED_NUMBER, getTypeLabel(Phone.TYPE_WORK));
- }
-
- @MediumTest
- public void testBindView_CustomLabel() {
- mCursor.moveToFirst();
- String numberLabel = "My label";
- insertWithCachedValues(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE,
- "John Doe", Phone.TYPE_CUSTOM, numberLabel);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertNameIs(viewHolder, "John Doe");
- assertLabel(viewHolder, TEST_FORMATTED_NUMBER, numberLabel);
- }
-
- @MediumTest
- public void testBindView_WithQuickContactBadge() {
- mCursor.moveToFirst();
- insertWithCachedValues(TEST_NUMBER, NOW, 0, Calls.INCOMING_TYPE,
- "John Doe", Phone.TYPE_HOME, "");
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertTrue(viewHolder.quickContactView.isEnabled());
- }
-
- @MediumTest
- public void testBindView_WithoutQuickContactBadge() {
- mCursor.moveToFirst();
- insert(TEST_NUMBER, Calls.PRESENTATION_ALLOWED, NOW, 0, Calls.INCOMING_TYPE);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertFalse(viewHolder.quickContactView.isEnabled());
- }
-
- @MediumTest
- public void testBindView_CallButton() {
- mCursor.moveToFirst();
- insert(TEST_NUMBER, Calls.PRESENTATION_ALLOWED, NOW, 0, Calls.INCOMING_TYPE);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- // The primaryActionView tag is set in the
- // {@link com.android.dialer.calllog.CallLogAdapter#bindView} method. If it is possible
- // to place a call to the phone number, a call intent will have been created for the
- // primaryActionView.
- IntentProvider intentProvider =
- (IntentProvider) viewHolder.primaryActionButtonView.getTag();
- Intent intent = intentProvider.getIntent(mActivity);
- // Starts a call.
- assertEquals(TestConstants.CALL_INTENT_ACTION, intent.getAction());
- // To the entry's number.
- assertEquals(Uri.parse("tel:" + TEST_NUMBER), intent.getData());
- }
-
- @MediumTest
- public void testBindView_VoicemailUri() {
- mCursor.moveToFirst();
- insertVoicemail(TEST_NUMBER, Calls.PRESENTATION_ALLOWED, NOW, 0);
- CallLogListItemViewHolder viewHolder = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* viewType */ 0);
- bindViewForTest(viewHolder);
-
- assertEquals(Uri.parse(viewHolder.voicemailUri),
- ContentUris.withAppendedId(VoicemailContract.Voicemails.CONTENT_URI, 1));
- }
-
- /** Returns the label associated with a given phone type. */
- private CharSequence getTypeLabel(int phoneType) {
- return Phone.getTypeLabel(getActivity().getResources(), phoneType, "");
- }
-
- //
- // HELPERS to check conditions on the DB/viewHolder
- //
- /**
- * Go over the viewHolder in the list and check to ensure that
- * callable numbers have an associated call intent, where numbers
- * which are not callable have a null intent.
- */
- private void checkCallStatus() {
- for (int i = 0; i < mList.length; i++) {
- if (null == mList[i]) {
- break;
- }
- mItem = (CallLogListItemViewHolder) mList[i];
- int presentation = getPhoneNumberPresentationForListEntry(i);
- if (presentation == Calls.PRESENTATION_RESTRICTED ||
- presentation == Calls.PRESENTATION_UNKNOWN) {
- //If number is not callable, the primary action view should have a null tag.
- assertNull(mItem.primaryActionButtonView.getTag());
- } else {
- //If the number is callable, the primary action view should have a non-null tag.
- assertNotNull(mItem.primaryActionButtonView.getTag());
-
- IntentProvider intentProvider =
- (IntentProvider) mItem.primaryActionButtonView.getTag();
- Intent callIntent = intentProvider.getIntent(mActivity);
-
- //The intent should be to make the call
- assertEquals(TestConstants.CALL_INTENT_ACTION, callIntent.getAction());
- }
- }
- }
-
-
- //
- // HELPERS to setup the tests.
- //
-
- /**
- * Get the Bitmap from the icons in the contacts package.
- */
- private Bitmap getBitmap(String resName) {
- Resources r = mActivity.getResources();
- int resid = r.getIdentifier(resName, "drawable",
- getInstrumentation().getTargetContext().getPackageName());
- BitmapDrawable d = (BitmapDrawable) r.getDrawable(resid);
- assertNotNull(d);
- return d.getBitmap();
- }
-
- //
- // HELPERS to build/update the call entries (viewHolder) from the DB.
- //
-
- /**
- * Read the DB and foreach call either update the existing view if
- * one exists already otherwise create one.
- * The list is build from a DESC view of the DB (last inserted entry is first).
- */
- private void buildViewListFromDb() {
- int i = 0;
- mCursor.moveToLast();
- while (!mCursor.isBeforeFirst()) {
- if (null == mList[i]) {
- mList[i] = (CallLogListItemViewHolder)
- mAdapter.onCreateViewHolder(mParentView, /* itemType */ 0);
- }
- // Bind to the proper position, despite iterating in reverse.
- bindViewForTest(mList[i], mCursor.getCount() - i - 1);
- mCursor.moveToPrevious();
- i++;
- }
- }
-
- /** Returns the number presentation associated with the given entry in {{@link #mList}. */
- private int getPhoneNumberPresentationForListEntry(int index) {
- // The entries are added backward, so count from the end of the cursor.
- mCursor.moveToPosition(mCursor.getCount() - index - 1);
- return mCursor.getInt(CallLogQuery.NUMBER_PRESENTATION);
- }
-
- //
- // HELPERS to insert numbers in the call log DB.
- //
-
- /**
- * Bind a call log entry view for testing purposes. Also inflates the action view stub so
- * unit tests can access the buttons contained within.
- *
- * @param view The current call log row.
- * @param position The position of the item.
- */
- private void bindViewForTest(final CallLogListItemViewHolder viewHolder, int position) {
- mAdapter.onBindViewHolder(viewHolder, position);
- getInstrumentation().runOnMainSync(new Runnable() {
- @Override
- public void run() {
- viewHolder.inflateActionViewStub();
- }
- });
- getInstrumentation().waitForIdleSync();
- }
-
- private void bindViewForTest(CallLogListItemViewHolder viewHolder) {
- bindViewForTest(viewHolder, /* position */ 0);
- }
-
- /**
- * Insert a certain number of random numbers in the DB. Makes sure
- * there is at least one private and one unknown number in the DB.
- * @param num Of entries to be inserted.
- */
- private void insertRandomEntries(int num) {
- if (num < 10) {
- throw new IllegalArgumentException("num should be >= 10");
- }
- boolean privateOrUnknownOrVm[];
- privateOrUnknownOrVm = insertRandomRange(0, num - 2);
-
- if (privateOrUnknownOrVm[0] && privateOrUnknownOrVm[1]) {
- insertRandomRange(num - 2, num);
- } else {
- insertPrivate(NOW, RAND_DURATION);
- insertUnknown(NOW, RAND_DURATION);
- }
- }
-
- /**
- * Insert a new call entry in the test DB.
- *
- * It includes the values for the cached contact associated with the number.
- *
- * @param number The phone number.
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- * @param type Either Call.OUTGOING_TYPE or Call.INCOMING_TYPE or Call.MISSED_TYPE.
- * @param cachedName the name of the contact with this number
- * @param cachedNumberType the type of the number, from the contact with this number
- * @param cachedNumberLabel the label of the number, from the contact with this number
- */
- private void insertWithCachedValues(String number, long date, int duration, int type,
- String cachedName, int cachedNumberType, String cachedNumberLabel) {
- insert(number, Calls.PRESENTATION_ALLOWED, date, duration, type);
- ContactInfo contactInfo = new ContactInfo();
- contactInfo.lookupUri = TEST_LOOKUP_URI;
- contactInfo.name = cachedName;
- contactInfo.type = cachedNumberType;
- contactInfo.label = cachedNumberLabel;
- String formattedNumber = PhoneNumberUtils.formatNumber(number, TEST_COUNTRY_ISO);
- if (formattedNumber == null) {
- formattedNumber = number;
- }
- contactInfo.formattedNumber = formattedNumber;
- contactInfo.normalizedNumber = number;
- contactInfo.photoId = 0;
- mAdapter.injectContactInfoForTest(number, TEST_COUNTRY_ISO, contactInfo);
- }
-
- /**
- * Insert a new call entry in the test DB.
- * @param number The phone number.
- * @param presentation Number representing display rules for "allowed",
- * "payphone", "restricted", or "unknown".
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- * @param type Either Call.OUTGOING_TYPE or Call.INCOMING_TYPE or Call.MISSED_TYPE.
- */
- private void insert(String number, int presentation, long date, int duration, int type) {
- insertValues(getValuesToInsert(number, presentation, date, duration, type));
- }
-
- /** Inserts the given values in the cursor. */
- private void insertValues(Object[] values) {
- mCursor.addRow(values);
- ++mIndex;
- }
-
- /**
- * Returns the values for a new call entry.
- *
- * @param number The phone number.
- * @param presentation Number representing display rules for "allowed",
- * "payphone", "restricted", or "unknown".
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- * @param type Either Call.OUTGOING_TYPE or Call.INCOMING_TYPE or Call.MISSED_TYPE.
- */
- private Object[] getValuesToInsert(String number, int presentation,
- long date, int duration, int type) {
- Object[] values = CallLogQueryTestUtils.createTestValues();
- values[CallLogQuery.ID] = mIndex;
- values[CallLogQuery.NUMBER] = number;
- values[CallLogQuery.NUMBER_PRESENTATION] = presentation;
- values[CallLogQuery.DATE] = date == NOW ? new Date().getTime() : date;
- values[CallLogQuery.DURATION] = duration < 0 ? mRnd.nextInt(10 * 60) : duration;
- if (mVoicemail != null && mVoicemail.equals(number)) {
- assertEquals(Calls.OUTGOING_TYPE, type);
- }
- values[CallLogQuery.CALL_TYPE] = type;
- values[CallLogQuery.COUNTRY_ISO] = TEST_COUNTRY_ISO;
- return values;
- }
-
- /**
- * Insert a new voicemail entry in the test DB.
- * @param number The phone number.
- * @param presentation Number representing display rules for "allowed",
- * "payphone", "restricted", or "unknown".
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- */
- private void insertVoicemail(String number, int presentation, long date, int duration) {
- Object[] values = getValuesToInsert(number, presentation, date, duration, Calls.VOICEMAIL_TYPE);
- // Must have the same index as the row.
- values[CallLogQuery.VOICEMAIL_URI] =
- ContentUris.withAppendedId(VoicemailContract.Voicemails.CONTENT_URI, mIndex);
- insertValues(values);
- }
-
- /**
- * Insert a new private call entry in the test DB.
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- */
- private void insertPrivate(long date, int duration) {
- insert("", Calls.PRESENTATION_RESTRICTED, date, duration, Calls.INCOMING_TYPE);
- }
-
- /**
- * Insert a new unknown call entry in the test DB.
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- */
- private void insertUnknown(long date, int duration) {
- insert("", Calls.PRESENTATION_UNKNOWN, date, duration, Calls.INCOMING_TYPE);
- }
-
- /**
- * Insert a new call to voicemail entry in the test DB.
- * @param date In millisec since epoch. Use NOW to use the current time.
- * @param duration In seconds of the call. Use RAND_DURATION to pick a random one.
- */
- private void insertCalltoVoicemail(long date, int duration) {
- // mVoicemail may be null
- if (mVoicemail != null) {
- insert(mVoicemail, Calls.PRESENTATION_ALLOWED, date, duration, Calls.OUTGOING_TYPE);
- }
- }
-
- /**
- * Insert a range [start, end) of random numbers in the DB. For
- * each row, there is a 1/10 probability that the number will be
- * marked as PRIVATE or UNKNOWN or VOICEMAIL. For regular numbers, a number is
- * inserted, its last 4 digits will be the number of the iteration
- * in the range.
- * @param start Of the range.
- * @param end Of the range (excluded).
- * @return An array with 2 booleans [0 = private number, 1 =
- * unknown number, 2 = voicemail] to indicate if at least one
- * private or unknown or voicemail number has been inserted. Since
- * the numbers are random some tests may want to enforce the
- * insertion of such numbers.
- */
- // TODO: Should insert numbers with contact entries too.
- private boolean[] insertRandomRange(int start, int end) {
- boolean[] privateOrUnknownOrVm = new boolean[] {false, false, false};
-
- for (int i = start; i < end; i++ ) {
- int type = mRnd.nextInt(10);
-
- if (0 == type) {
- insertPrivate(NOW, RAND_DURATION);
- privateOrUnknownOrVm[0] = true;
- } else if (1 == type) {
- insertUnknown(NOW, RAND_DURATION);
- privateOrUnknownOrVm[1] = true;
- } else if (2 == type) {
- insertCalltoVoicemail(NOW, RAND_DURATION);
- privateOrUnknownOrVm[2] = true;
- } else {
- int inout = mRnd.nextBoolean() ? Calls.OUTGOING_TYPE : Calls.INCOMING_TYPE;
- final Formatter formatter = new Formatter();
- String number = formatter.format("1800123%04d", i).toString();
- formatter.close();
- insert(number, Calls.PRESENTATION_ALLOWED, NOW, RAND_DURATION, inout);
- }
- }
- return privateOrUnknownOrVm;
- }
-
- /** Asserts that the name text view is shown and contains the given text. */
- private void assertNameIs(CallLogListItemViewHolder viewHolder, String name) {
- assertEquals(View.VISIBLE, viewHolder.phoneCallDetailsViews.nameView.getVisibility());
- assertEquals(name, viewHolder.phoneCallDetailsViews.nameView.getText().toString());
- }
-
- /** Asserts that the label text view contains the given text. */
- private void assertLabel(CallLogListItemViewHolder viewHolder, CharSequence number,
- CharSequence label) {
- if (label != null) {
- assertTrue(viewHolder.phoneCallDetailsViews.callLocationAndDate.getText()
- .toString().contains(label));
- }
- }
-}
diff --git a/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java b/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java
index 891f0686f..beb83b1ad 100644
--- a/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogGroupBuilderTest.java
@@ -19,10 +19,12 @@ package com.android.dialer.calllog;
import static com.google.common.collect.Lists.newArrayList;
import android.database.MatrixCursor;
-import android.provider.CallLog.Calls;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.util.AppCompatConstants;
+
import java.util.List;
/**
@@ -34,6 +36,8 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
private static final String TEST_NUMBER1 = "14125551234";
/** A phone number for testing. */
private static final String TEST_NUMBER2 = "14125555555";
+ /** A post-dial string for testing */
+ private static final String TEST_POST_DIAL_DIGITS = ";12435;0987";
/** The object under test. */
private CallLogGroupBuilder mBuilder;
@@ -64,94 +68,223 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
}
public void testAddGroups_OneCall() {
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
mBuilder.addGroups(mCursor);
- assertEquals(0, mFakeGroupCreator.groups.size());
+ assertEquals(1, mFakeGroupCreator.groups.size());
}
public void testAddGroups_TwoCallsNotMatching() {
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
- addCallLogEntry(TEST_NUMBER2, Calls.INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER2, AppCompatConstants.CALLS_INCOMING_TYPE);
mBuilder.addGroups(mCursor);
- assertEquals(0, mFakeGroupCreator.groups.size());
+ assertEquals(2, mFakeGroupCreator.groups.size());
}
public void testAddGroups_ThreeCallsMatching() {
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
mBuilder.addGroups(mCursor);
assertEquals(1, mFakeGroupCreator.groups.size());
- assertGroupIs(0, 3, false, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(0, 3, mFakeGroupCreator.groups.get(0));
+ }
+
+ public void testAddGroups_WithPostDialMatching() {
+ addCallLogEntryWithPostDialDigits(TEST_NUMBER1, TEST_POST_DIAL_DIGITS,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ addCallLogEntryWithPostDialDigits(TEST_NUMBER1, TEST_POST_DIAL_DIGITS,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ addCallLogEntryWithPostDialDigits(TEST_NUMBER1, "",
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+
+ mBuilder.addGroups(mCursor);
+
+ if (CompatUtils.isNCompatible()) {
+ assertEquals(2, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 2, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(2, 1, mFakeGroupCreator.groups.get(1));
+ } else {
+ assertEquals(1, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 3, mFakeGroupCreator.groups.get(0));
+ }
+ }
+
+ public void testAddGroups_WithViaNumberMatching() {
+ addCallLogEntryWithViaNumber(TEST_NUMBER1, TEST_NUMBER2,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ addCallLogEntryWithViaNumber(TEST_NUMBER1, TEST_NUMBER2,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ addCallLogEntryWithViaNumber(TEST_NUMBER1, "",
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+
+ mBuilder.addGroups(mCursor);
+
+ if (CompatUtils.isNCompatible()) {
+ assertEquals(2, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 2, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(2, 1, mFakeGroupCreator.groups.get(1));
+ } else {
+ assertEquals(1, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 3, mFakeGroupCreator.groups.get(0));
+ }
}
public void testAddGroups_MatchingIncomingAndOutgoing() {
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
- addCallLogEntry(TEST_NUMBER1, Calls.OUTGOING_TYPE);
- addCallLogEntry(TEST_NUMBER1, Calls.INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_OUTGOING_TYPE);
+ addCallLogEntry(TEST_NUMBER1, AppCompatConstants.CALLS_INCOMING_TYPE);
mBuilder.addGroups(mCursor);
assertEquals(1, mFakeGroupCreator.groups.size());
- assertGroupIs(0, 3, false, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(0, 3, mFakeGroupCreator.groups.get(0));
+ }
+
+ public void testGrouping_Voicemail() {
+ // Does not group with other types of calls, include voicemail themselves.
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
}
- public void testAddGroups_Voicemail() {
+ public void testGrouping_VoicemailArchive() {
// Does not group with other types of calls, include voicemail themselves.
- assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.MISSED_TYPE);
- //assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.MISSED_TYPE, Calls.MISSED_TYPE);
- assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.VOICEMAIL_TYPE);
- assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.INCOMING_TYPE);
- assertCallsAreNotGrouped(Calls.VOICEMAIL_TYPE, Calls.OUTGOING_TYPE);
+ assertVoicemailsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
+ assertVoicemailsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+ assertVoicemailsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertVoicemailsAreNotGrouped(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
}
- public void testAddGroups_Missed() {
+ public void testGrouping_Missed() {
// Groups with one or more missed calls.
- assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
- assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.MISSED_TYPE, Calls.MISSED_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE);
// Does not group with other types of calls.
- assertCallsAreNotGrouped(Calls.MISSED_TYPE, Calls.VOICEMAIL_TYPE);
- assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.INCOMING_TYPE);
- assertCallsAreGrouped(Calls.MISSED_TYPE, Calls.OUTGOING_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_MISSED_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
}
- public void testAddGroups_Incoming() {
+ public void testGrouping_Incoming() {
// Groups with one or more incoming or outgoing.
- assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.INCOMING_TYPE);
- assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
- assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
- assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE);
- assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.MISSED_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
// Does not group with voicemail and missed calls.
- assertCallsAreNotGrouped(Calls.INCOMING_TYPE, Calls.VOICEMAIL_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
}
- public void testAddGroups_Outgoing() {
+ public void testGrouping_Outgoing() {
// Groups with one or more incoming or outgoing.
- assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE);
- assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE);
- assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
- assertCallsAreGrouped(Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE, Calls.INCOMING_TYPE);
- assertCallsAreGrouped(Calls.INCOMING_TYPE, Calls.MISSED_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_OUTGOING_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_OUTGOING_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
// Does not group with voicemail and missed calls.
- assertCallsAreNotGrouped(Calls.INCOMING_TYPE, Calls.VOICEMAIL_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+ }
+
+ public void testGrouping_Blocked() {
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_BLOCKED_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_BLOCKED_TYPE, AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallsAreNotGrouped(
+ AppCompatConstants.CALLS_BLOCKED_TYPE, AppCompatConstants.CALLS_MISSED_TYPE);
+
+ }
+
+ public void testAddGroups_Separate() {
+ addMultipleCallLogEntries(TEST_NUMBER1,
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, // Group 1: 0
+ AppCompatConstants.CALLS_INCOMING_TYPE, // Group 2: 1
+ AppCompatConstants.CALLS_OUTGOING_TYPE, // Group 3: 2
+ AppCompatConstants.CALLS_MISSED_TYPE); // Group 4: 3
+ mBuilder.addVoicemailGroups(mCursor);
+
+ assertEquals(4, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 1, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(1, 1, mFakeGroupCreator.groups.get(1));
+ assertGroupIs(2, 1, mFakeGroupCreator.groups.get(2));
+ assertGroupIs(3, 1, mFakeGroupCreator.groups.get(3));
}
public void testAddGroups_Mixed() {
addMultipleCallLogEntries(TEST_NUMBER1,
- Calls.VOICEMAIL_TYPE, // Stand-alone
- Calls.INCOMING_TYPE, // Group 1: 1-4
- Calls.OUTGOING_TYPE,
- Calls.MISSED_TYPE,
- Calls.MISSED_TYPE,
- Calls.VOICEMAIL_TYPE, // Stand-alone
- Calls.INCOMING_TYPE, // Stand-alone
- Calls.VOICEMAIL_TYPE, // Stand-alone
- Calls.MISSED_TYPE, // Group 2: 8-10
- Calls.MISSED_TYPE,
- Calls.OUTGOING_TYPE);
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, // Group 1: 0
+ AppCompatConstants.CALLS_INCOMING_TYPE, // Group 2: 1-4
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, // Group 3: 5
+ AppCompatConstants.CALLS_INCOMING_TYPE, // Group 4: 6
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, // Group 5: 7
+ AppCompatConstants.CALLS_MISSED_TYPE, // Group 6: 8-10
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
mBuilder.addGroups(mCursor);
- assertEquals(2, mFakeGroupCreator.groups.size());
- assertGroupIs(1, 4, false, mFakeGroupCreator.groups.get(0));
- assertGroupIs(8, 3, false, mFakeGroupCreator.groups.get(1));
+
+ assertEquals(6, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 1, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(1, 4, mFakeGroupCreator.groups.get(1));
+ assertGroupIs(5, 1, mFakeGroupCreator.groups.get(2));
+ assertGroupIs(6, 1, mFakeGroupCreator.groups.get(3));
+ assertGroupIs(7, 1, mFakeGroupCreator.groups.get(4));
+ assertGroupIs(8, 3, mFakeGroupCreator.groups.get(5));
+ }
+
+ public void testAddGroups_Blocked() {
+ addMultipleCallLogEntries(TEST_NUMBER1,
+ AppCompatConstants.CALLS_INCOMING_TYPE, // Group 1: 0-1
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_BLOCKED_TYPE, // Group 2: 2
+ AppCompatConstants.CALLS_MISSED_TYPE, // Group 3: 3
+ AppCompatConstants.CALLS_BLOCKED_TYPE, // Group 4: 4-5
+ AppCompatConstants.CALLS_BLOCKED_TYPE);
+ mBuilder.addGroups(mCursor);
+
+ assertEquals(4, mFakeGroupCreator.groups.size());
+ assertGroupIs(0, 2, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(2, 1, mFakeGroupCreator.groups.get(1));
+ assertGroupIs(3, 1, mFakeGroupCreator.groups.get(2));
+ assertGroupIs(4, 2, mFakeGroupCreator.groups.get(3));
}
public void testEqualPhoneNumbers() {
@@ -228,7 +361,7 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
addMultipleCallLogEntries(TEST_NUMBER1, types);
mBuilder.addGroups(mCursor);
assertEquals(1, mFakeGroupCreator.groups.size());
- assertGroupIs(0, types.length, false, mFakeGroupCreator.groups.get(0));
+ assertGroupIs(0, types.length, mFakeGroupCreator.groups.get(0));
}
@@ -238,7 +371,16 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
clearFakeGroupCreator();
addMultipleCallLogEntries(TEST_NUMBER1, types);
mBuilder.addGroups(mCursor);
- assertEquals(0, mFakeGroupCreator.groups.size());
+ assertEquals(types.length, mFakeGroupCreator.groups.size());
+ }
+
+ /** Asserts that voicemails are not grouped together with other types at all. */
+ private void assertVoicemailsAreNotGrouped(int... types) {
+ createCursor();
+ clearFakeGroupCreator();
+ addMultipleCallLogEntries(TEST_NUMBER1, types);
+ mBuilder.addVoicemailGroups(mCursor);
+ assertEquals(types.length, mFakeGroupCreator.groups.size());
}
/** Adds a set of calls with the given types, all from the same number, in the old section. */
@@ -249,11 +391,32 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
}
/** Adds a call log entry with the given number and type to the cursor. */
private void addCallLogEntry(String number, int type) {
+ addCallLogEntryWithPostDialDigits(number, "", type);
+ }
+
+ /** Adds a call log entry with the given number, post-dial digits, and type to the cursor. */
+ private void addCallLogEntryWithPostDialDigits(String number, String postDialDigits, int type) {
+ mCursor.moveToNext();
+ Object[] values = CallLogQueryTestUtils.createTestValues();
+ values[CallLogQuery.ID] = mCursor.getPosition();
+ values[CallLogQuery.NUMBER] = number;
+ values[CallLogQuery.CALL_TYPE] = type;
+ if (CompatUtils.isNCompatible()) {
+ values[CallLogQuery.POST_DIAL_DIGITS] = postDialDigits;
+ }
+ mCursor.addRow(values);
+ }
+
+ /** Adds a call log entry with the given number, post-dial digits, and type to the cursor. */
+ private void addCallLogEntryWithViaNumber(String number, String viaNumber, int type) {
mCursor.moveToNext();
Object[] values = CallLogQueryTestUtils.createTestValues();
values[CallLogQuery.ID] = mCursor.getPosition();
values[CallLogQuery.NUMBER] = number;
values[CallLogQuery.CALL_TYPE] = type;
+ if (CompatUtils.isNCompatible()) {
+ values[CallLogQuery.VIA_NUMBER] = viaNumber;
+ }
mCursor.addRow(values);
}
@@ -266,10 +429,9 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
}
/** Asserts that the group matches the given values. */
- private void assertGroupIs(int cursorPosition, int size, boolean expanded, GroupSpec group) {
+ private void assertGroupIs(int cursorPosition, int size, GroupSpec group) {
assertEquals(cursorPosition, group.cursorPosition);
assertEquals(size, group.size);
- assertEquals(expanded, group.expanded);
}
/** Defines an added group. Used by the {@link FakeGroupCreator}. */
@@ -278,13 +440,10 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
public final int cursorPosition;
/** The number of elements in the group. */
public final int size;
- /** Whether the group should be initially expanded. */
- public final boolean expanded;
- public GroupSpec(int cursorPosition, int size, boolean expanded) {
+ public GroupSpec(int cursorPosition, int size) {
this.cursorPosition = cursorPosition;
this.size = size;
- this.expanded = expanded;
}
}
@@ -294,8 +453,8 @@ public class CallLogGroupBuilderTest extends AndroidTestCase {
public final List<GroupSpec> groups = newArrayList();
@Override
- public void addGroup(int cursorPosition, int size, boolean expanded) {
- groups.add(new GroupSpec(cursorPosition, size, expanded));
+ public void addGroup(int cursorPosition, int size) {
+ groups.add(new GroupSpec(cursorPosition, size));
}
@Override
diff --git a/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java b/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
index 8c2d8e443..daba42857 100644
--- a/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogListItemHelperTest.java
@@ -20,15 +20,19 @@ import android.content.Context;
import android.content.res.Resources;
import android.provider.CallLog.Calls;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
import android.view.View;
import com.android.contacts.common.CallUtil;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.R;
+import com.android.dialer.calllog.calllogcache.TestTelecomCallLogCache;
+import com.android.dialer.util.AppCompatConstants;
/**
* Unit tests for {@link CallLogListItemHelper}.
*/
+@MediumTest
public class CallLogListItemHelperTest extends AndroidTestCase {
/** A test phone number for phone calls. */
private static final String TEST_NUMBER = "14125555555";
@@ -60,7 +64,7 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
mContext = getContext();
mResources = mContext.getResources();
final TestTelecomCallLogCache phoneUtils =
- new TestTelecomCallLogCache(mContext, TEST_VOICEMAIL_NUMBER);
+ new TestTelecomCallLogCache(mContext, TEST_VOICEMAIL_NUMBER, "");
PhoneCallDetailsHelper phoneCallDetailsHelper =
new PhoneCallDetailsHelper(mContext, mResources, phoneUtils);
mHelper = new CallLogListItemHelper(phoneCallDetailsHelper, mResources, phoneUtils);
@@ -103,20 +107,22 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
}
public void testSetPhoneCallDetails_ReadVoicemail() {
- PhoneCallDetails details = getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE);
+ PhoneCallDetails details =
+ getPhoneCallDetailsWithTypes(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
mHelper.setPhoneCallDetails(mViewHolder, details);
assertEquals(View.VISIBLE, mViewHolder.voicemailPlaybackView.getVisibility());
}
public void testSetPhoneCallDetails_UnreadVoicemail() {
- PhoneCallDetails details = getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE);
+ PhoneCallDetails details =
+ getPhoneCallDetailsWithTypes(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
mHelper.setPhoneCallDetails(mViewHolder, details);
assertEquals(View.VISIBLE, mViewHolder.voicemailPlaybackView.getVisibility());
}
public void testSetPhoneCallDetails_VoicemailFromUnknown() {
setPhoneCallDetailsWithNumberAndType("", Calls.PRESENTATION_UNKNOWN,
- "", Calls.VOICEMAIL_TYPE);
+ "", AppCompatConstants.CALLS_VOICEMAIL_TYPE);
assertEquals(View.VISIBLE, mViewHolder.voicemailPlaybackView.getVisibility());
}
@@ -124,27 +130,18 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
* Test getCallDescriptionID method used to get the accessibility description for calls.
*/
public void testGetCallDescriptionID_Answered() {
- int[] callTypes = new int[]{ Calls.INCOMING_TYPE };
+ int[] callTypes = new int[] {AppCompatConstants.CALLS_INCOMING_TYPE};
assertEquals(R.string.description_incoming_answered_call,
- mHelper.getCallDescriptionStringID(callTypes));
+ mHelper.getCallDescriptionStringID(callTypes, true));
}
/**
* Test getCallDescriptionID method used to get the accessibility description for calls.
*/
public void testGetCallDescriptionID_Missed() {
- int[] callTypes = new int[]{ Calls.MISSED_TYPE };
- assertEquals(R.string.description_incoming_missed_call,
- mHelper.getCallDescriptionStringID(callTypes));
- }
-
- /**
- * Test getCallDescriptionID method used to get the accessibility description for calls.
- */
- public void testGetCallDescriptionID_Voicemail() {
- int[] callTypes = new int[]{ Calls.VOICEMAIL_TYPE };
+ int[] callTypes = new int[] {AppCompatConstants.CALLS_MISSED_TYPE};
assertEquals(R.string.description_incoming_missed_call,
- mHelper.getCallDescriptionStringID(callTypes));
+ mHelper.getCallDescriptionStringID(callTypes, true));
}
/**
@@ -153,9 +150,9 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
* only a single call for this caller.
*/
public void testGetCallDescriptionID_OutgoingSingle() {
- int[] callTypes = new int[]{ Calls.OUTGOING_TYPE };
+ int[] callTypes = new int[] {AppCompatConstants.CALLS_OUTGOING_TYPE};
assertEquals(R.string.description_outgoing_call,
- mHelper.getCallDescriptionStringID(callTypes));
+ mHelper.getCallDescriptionStringID(callTypes, true));
}
/**
@@ -164,57 +161,32 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
* many calls for this caller.
*/
public void testGetCallDescriptionID_OutgoingMultiple() {
- int[] callTypes = new int[]{ Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE };
+ int[] callTypes = new int[] {
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE
+ };
assertEquals(R.string.description_outgoing_call,
- mHelper.getCallDescriptionStringID(callTypes));
+ mHelper.getCallDescriptionStringID(callTypes, true));
}
/**
* Test getCallDescription method used to get the accessibility description for calls.
- * For outgoing calls, we should NOT have "New Voicemail" in the description.
+ * For read voicemail calls, we should have "Voicemail" in the description.
*/
- public void testGetCallDescription_NoVoicemailOutgoing() {
- PhoneCallDetails details =
- getPhoneCallDetailsWithTypes(Calls.OUTGOING_TYPE, Calls.OUTGOING_TYPE);
- CharSequence description = mHelper.getCallDescription(details);
- assertFalse(description.toString()
- .contains(this.mResources.getString(R.string.description_new_voicemail)));
- }
-
- /**
- * Test getCallDescription method used to get the accessibility description for calls.
- * For regular incoming calls, we should NOT have "New Voicemail" in the description.
- */
- public void testGetCallDescription_NoVoicemailIncoming() {
- PhoneCallDetails details =
- getPhoneCallDetailsWithTypes(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
- CharSequence description = mHelper.getCallDescription(details);
- assertFalse(description.toString()
- .contains(this.mResources.getString(R.string.description_new_voicemail)));
- }
-
- /**
- * Test getCallDescription method used to get the accessibility description for calls.
- * For regular missed calls, we should NOT have "New Voicemail" in the description.
- */
- public void testGetCallDescription_NoVoicemailMissed() {
- PhoneCallDetails details =
- getPhoneCallDetailsWithTypes(Calls.MISSED_TYPE, Calls.OUTGOING_TYPE);
- CharSequence description = mHelper.getCallDescription(details);
- assertFalse(description.toString()
- .contains(this.mResources.getString(R.string.description_new_voicemail)));
+ public void testGetCallDescriptionID_Voicemail() {
+ int[] callTypes = new int[] {AppCompatConstants.CALLS_VOICEMAIL_TYPE};
+ assertEquals(R.string.description_read_voicemail,
+ mHelper.getCallDescriptionStringID(callTypes, true));
}
/**
* Test getCallDescription method used to get the accessibility description for calls.
- * For voicemail calls, we should have "New Voicemail" in the description.
+ * For unread voicemail calls, we should have "Unread voicemail" in the description.
*/
- public void testGetCallDescription_Voicemail() {
- PhoneCallDetails details =
- getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE, Calls.OUTGOING_TYPE);
- CharSequence description = mHelper.getCallDescription(details);
- assertTrue(description.toString()
- .contains(this.mResources.getString(R.string.description_new_voicemail)));
+ public void testGetCallDescriptionID_UnreadVoicemail() {
+ int[] callTypes = new int[] {AppCompatConstants.CALLS_VOICEMAIL_TYPE};
+ assertEquals(R.string.description_unread_voicemail,
+ mHelper.getCallDescriptionStringID(callTypes, false));
}
/**
@@ -222,7 +194,8 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
* Test that the "X calls" message is not present if there is only a single call.
*/
public void testGetCallDescription_NumCallsSingle() {
- PhoneCallDetails details = getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE);
+ PhoneCallDetails details =
+ getPhoneCallDetailsWithTypes(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
CharSequence description = mHelper.getCallDescription(details);
// Rather than hard coding the "X calls" string message, we'll generate it with an empty
@@ -238,8 +211,8 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
* Test that the "X calls" message is present if there are many calls.
*/
public void testGetCallDescription_NumCallsMultiple() {
- PhoneCallDetails details =
- getPhoneCallDetailsWithTypes(Calls.VOICEMAIL_TYPE, Calls.INCOMING_TYPE);
+ PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+ AppCompatConstants.CALLS_VOICEMAIL_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
CharSequence description = mHelper.getCallDescription(details);
assertTrue(description.toString()
.contains(this.mResources.getString(R.string.description_num_calls, 2)));
@@ -250,8 +223,8 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
* Test that the "Video call." message is present if the call had video capability.
*/
public void testGetCallDescription_Video() {
- PhoneCallDetails details =
- getPhoneCallDetailsWithTypes(Calls.INCOMING_TYPE, Calls.INCOMING_TYPE);
+ PhoneCallDetails details = getPhoneCallDetailsWithTypes(
+ AppCompatConstants.CALLS_INCOMING_TYPE, AppCompatConstants.CALLS_INCOMING_TYPE);
details.features = Calls.FEATURES_VIDEO;
CharSequence description = mHelper.getCallDescription(details);
@@ -266,7 +239,7 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
/** Asserts that the primary action view does not have a call intent. */
private void assertNoCallIntent() {
- Object intentProvider = (IntentProvider)mViewHolder.primaryActionView.getTag();
+ Object intentProvider = mViewHolder.primaryActionView.getTag();
// The intent provider should be null as there is no ability to make a call.
assertNull(intentProvider);
}
@@ -274,26 +247,34 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
/** Sets the details of a phone call using the specified phone number. */
private void setPhoneCallDetailsWithNumber(String number,
int presentation, String formattedNumber) {
- setPhoneCallDetailsWithNumberAndType(number, presentation,
+ setPhoneCallDetailsWithNumberTypeAndPostDialDigits(number, "", presentation,
formattedNumber, Calls.INCOMING_TYPE);
}
/** Sets the details of a phone call using the specified phone number. */
private void setPhoneCallDetailsWithNumberAndType(String number,
int presentation, String formattedNumber, int callType) {
+ setPhoneCallDetailsWithNumberTypeAndPostDialDigits(number, "", presentation,
+ formattedNumber, callType);
+ }
+
+ /** Sets the details of a phone call using the specified phone number and post-dial digits. */
+ private void setPhoneCallDetailsWithNumberTypeAndPostDialDigits(String number,
+ String postDialDigits, int presentation, String formattedNumber, int callType) {
PhoneCallDetails details = getPhoneCallDetails(
- number, presentation, formattedNumber);
- details.callTypes = new int[]{ callType };
+ number, postDialDigits, presentation, formattedNumber);
+ details.callTypes = new int[] {callType};
mHelper.setPhoneCallDetails(mViewHolder, details);
}
private PhoneCallDetails getPhoneCallDetails(
- String number, int presentation, String formattedNumber) {
+ String number, String postDialDigits, int presentation, String formattedNumber) {
PhoneCallDetails details = new PhoneCallDetails(
mContext,
number,
presentation,
formattedNumber,
+ postDialDigits,
false /* isVoicemail */);
setDefaultDetails(details);
return details;
@@ -306,6 +287,7 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
TEST_NUMBER,
Calls.PRESENTATION_ALLOWED,
TEST_FORMATTED_NUMBER,
+ "",
false /* isVoicemail */);
setDefaultDetails(details);
details.callTypes = types;
@@ -313,7 +295,7 @@ public class CallLogListItemHelperTest extends AndroidTestCase {
}
private void setDefaultDetails(PhoneCallDetails details) {
- details.callTypes = new int[]{ Calls.INCOMING_TYPE };
+ details.callTypes = new int[] {Calls.INCOMING_TYPE};
details.countryIso = TEST_COUNTRY_ISO;
details.date = TEST_DATE;
details.duration = TEST_DURATION;
diff --git a/tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java b/tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java
new file mode 100644
index 000000000..b5950d8b8
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/CallLogNotificationsHelperTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.calllog;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.provider.CallLog;
+import android.test.AndroidTestCase;
+
+import com.android.dialer.R;
+
+/**
+ * Unit tests for {@link CallLogNotificationsHelper}.
+ */
+public class CallLogNotificationsHelperTest extends AndroidTestCase {
+ private static final String TEST_COUNTRY_ISO = "US";
+ private static final String TEST_VALID_NUMBER = "14125555555";
+ private static final String TEST_INVALID_NUMBER = "asdna128937123";
+ private static final String TEST_FORMATTED_NUMBER = "1 412-555-5555";
+ private static final String TEST_E164_NUMBER = "+14125555555";
+
+ private final ContactInfoHelper mContactInfoHelper = mock(ContactInfoHelper.class);
+
+ private CallLogNotificationsHelper mCallLogNotificationsHelper;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mCallLogNotificationsHelper = new CallLogNotificationsHelper(getContext(),
+ null, null, mContactInfoHelper, TEST_COUNTRY_ISO);
+ }
+
+ public void testGetContactInfo_ValidNumberValidPresentationValidIso() {
+ ContactInfo contactInfo = getContactInfo(
+ TEST_VALID_NUMBER, CallLog.Calls.PRESENTATION_UNKNOWN, TEST_COUNTRY_ISO);
+ assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+ assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+ assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_ValidNumberInvalidPresentationValidIso() {
+ ContactInfo contactInfo = getContactInfo(TEST_VALID_NUMBER, -1, TEST_COUNTRY_ISO);
+ assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+ assertEquals(TEST_FORMATTED_NUMBER, contactInfo.name);
+ assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_ValidNumberValidPresentationNullIso() {
+ ContactInfo contactInfo = getContactInfo(
+ TEST_VALID_NUMBER, CallLog.Calls.PRESENTATION_UNKNOWN, null);
+ assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+ assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+ assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_ValidNumberInvalidPresentationNullIso() {
+ ContactInfo contactInfo = getContactInfo(
+ TEST_VALID_NUMBER, -1, null);
+ assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+ assertEquals(TEST_FORMATTED_NUMBER, contactInfo.name);
+ assertEquals(TEST_E164_NUMBER, contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_NullNumberValidPresentationValidIso() {
+ ContactInfo contactInfo = getContactInfo(
+ null, CallLog.Calls.PRESENTATION_UNKNOWN, TEST_COUNTRY_ISO);
+ assertEquals("", contactInfo.number);
+ assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+ assertNull(contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_NullNumberInvalidPresentationValidIso() {
+ ContactInfo contactInfo = getContactInfo(null, -1, TEST_COUNTRY_ISO);
+ assertEquals("", contactInfo.number);
+ assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+ assertNull(contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_NullNumberValidPresentationNullIso() {
+ ContactInfo contactInfo = getContactInfo(null, CallLog.Calls.PRESENTATION_RESTRICTED, null);
+ assertEquals("", contactInfo.number);
+ assertEquals(mContext.getResources().getString(R.string.private_num), contactInfo.name);
+ assertNull(contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_NullNumberInValidPresentationNullIso() {
+ ContactInfo contactInfo = getContactInfo(null, -1, null);
+ assertEquals("", contactInfo.number);
+ assertEquals(mContext.getResources().getString(R.string.unknown), contactInfo.name);
+ assertNull(contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_InvalidNumberInValidPresentationNullIso() {
+ ContactInfo contactInfo = getContactInfo(TEST_INVALID_NUMBER, -1, null);
+ assertEquals(TEST_INVALID_NUMBER, contactInfo.name);
+ assertEquals(TEST_INVALID_NUMBER, contactInfo.formattedNumber);
+ assertEquals(null, contactInfo.normalizedNumber);
+ }
+
+ public void testGetContactInfo_NonNullCachedLookup() {
+ when(mContactInfoHelper.lookupNumber(anyString(), anyString())).thenReturn(null);
+ ContactInfo contactInfo = getContactInfo(TEST_VALID_NUMBER, -1, TEST_COUNTRY_ISO);
+ assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+ assertEquals(TEST_FORMATTED_NUMBER, contactInfo.formattedNumber);
+ }
+
+ public void testGetContactInfo_NullCachedLookup() {
+ ContactInfo cachedContactInfo = new ContactInfo();
+ cachedContactInfo.number = TEST_VALID_NUMBER;
+ cachedContactInfo.formattedNumber = TEST_FORMATTED_NUMBER;
+ when(mContactInfoHelper.lookupNumber(anyString(), anyString()))
+ .thenReturn(cachedContactInfo);
+ ContactInfo contactInfo = getContactInfo(TEST_VALID_NUMBER, -1, TEST_COUNTRY_ISO);
+ assertEquals(TEST_VALID_NUMBER, contactInfo.number);
+ assertEquals(TEST_FORMATTED_NUMBER, contactInfo.name);
+ }
+
+ private ContactInfo getContactInfo(String number, int presentation, String countryIso) {
+ return mCallLogNotificationsHelper.getContactInfo(number, presentation, countryIso);
+ }
+}
diff --git a/tests/src/com/android/dialer/calllog/CallLogQueryTestUtils.java b/tests/src/com/android/dialer/calllog/CallLogQueryTestUtils.java
index 5b4629318..c2cfedbac 100644
--- a/tests/src/com/android/dialer/calllog/CallLogQueryTestUtils.java
+++ b/tests/src/com/android/dialer/calllog/CallLogQueryTestUtils.java
@@ -20,17 +20,26 @@ import static junit.framework.Assert.assertEquals;
import android.provider.CallLog.Calls;
-import junit.framework.Assert;
+import com.android.contacts.common.compat.CompatUtils;
/**
* Helper class to create test values for {@link CallLogQuery}.
*/
public class CallLogQueryTestUtils {
public static Object[] createTestValues() {
- Object[] values = new Object[]{
- 0L, "", 0L, 0L, Calls.INCOMING_TYPE, "", "", "", null, 0, null, null, null, null,
- 0L, null, 0, Calls.PRESENTATION_ALLOWED, null, null, 0, null, null, null
- };
+ Object[] values;
+ if (CompatUtils.isNCompatible()) {
+ values = new Object[]{
+ 0L, "", 0L, 0L, Calls.INCOMING_TYPE, "", "", "", null, 0, null, null, null,
+ null, 0L, null, 0, Calls.PRESENTATION_ALLOWED, null, null, 0, null, null,
+ null, "", ""
+ };
+ } else {
+ values = new Object[]{
+ 0L, "", 0L, 0L, Calls.INCOMING_TYPE, "", "", "", null, 0, null, null, null,
+ null, 0L, null, 0, Calls.PRESENTATION_ALLOWED, null, null, 0, null, null, null
+ };
+ }
assertEquals(CallLogQuery._PROJECTION.length, values.length);
return values;
}
diff --git a/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java b/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java
new file mode 100644
index 000000000..e53eb7893
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.calllog;
+
+import android.net.Uri;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.PhoneLookup;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.common.test.mocks.ContactsMockContext;
+import com.android.contacts.common.test.mocks.MockContentProvider.Query;
+
+import junit.framework.Assert;
+
+@MediumTest
+public class ContactInfoHelperTest extends AndroidTestCase {
+
+ private static final String TEST_COUNTRY_ISO = "US";
+ private static final String TEST_DISPLAY_NAME = "Display Name";
+ private static final String TEST_DISPLAY_NAME_ALTERNATIVE = "Name, Display";
+ private static final String[] TEST_DISPLAY_NAME_ALTERNATIVE_ROW = new String[]{
+ TEST_DISPLAY_NAME_ALTERNATIVE};
+ private static final String TEST_LOOKUP_KEY = "lookupKey";
+ private static final String[] TEST_LOOKUP_ROW = new String[]{null, TEST_DISPLAY_NAME,
+ null, null, null, null, null, TEST_LOOKUP_KEY, null};
+
+ private Uri displayNameAlternativeUri;
+ private ContactsMockContext mContext;
+ private ContactInfo mContactInfo;
+ private ContactInfoHelper mContactInfoHelper;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ displayNameAlternativeUri = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI,
+ TEST_LOOKUP_KEY);
+ mContext = new ContactsMockContext(getContext());
+ mContactInfo = new ContactInfo();
+ mContactInfo.name = TEST_DISPLAY_NAME;
+ mContactInfo.nameAlternative = TEST_DISPLAY_NAME_ALTERNATIVE;
+ mContactInfoHelper = new ContactInfoHelper(mContext, TEST_COUNTRY_ISO);
+ }
+
+ public void testLookupContactFromUri_NullUri() {
+ Assert.assertNull(mContactInfoHelper.lookupContactFromUri(null, false));
+ }
+
+ public void testLookupContactFromUri_NoResults() {
+ setUpQueryExpectations(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+ PhoneQuery.getPhoneLookupProjection(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI));
+
+ Assert.assertEquals(ContactInfo.EMPTY, mContactInfoHelper.lookupContactFromUri(
+ PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, false));
+ mContext.verify();
+ }
+
+ public void testLookupContactFromUri_NoDisplayNameAlternative() {
+ setUpQueryExpectations(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+ PhoneQuery.getPhoneLookupProjection(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI),
+ TEST_LOOKUP_ROW);
+ setUpQueryExpectations(displayNameAlternativeUri,
+ PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION);
+
+ ContactInfo contactInfo = mContactInfoHelper.lookupContactFromUri(
+ PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, false);
+ Assert.assertEquals(TEST_DISPLAY_NAME, contactInfo.name);
+ Assert.assertNull(contactInfo.nameAlternative);
+ mContext.verify();
+ }
+
+ public void testLookupContactFromUri_HasDisplayNameAlternative() {
+ setUpQueryExpectations(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI,
+ PhoneQuery.getPhoneLookupProjection(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI),
+ TEST_LOOKUP_ROW);
+ setUpQueryExpectations(displayNameAlternativeUri,
+ PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION, TEST_DISPLAY_NAME_ALTERNATIVE_ROW);
+
+ ContactInfo contactInfo = mContactInfoHelper.lookupContactFromUri(
+ PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, false);
+ Assert.assertEquals(TEST_DISPLAY_NAME, contactInfo.name);
+ Assert.assertEquals(TEST_DISPLAY_NAME_ALTERNATIVE, contactInfo.nameAlternative);
+ mContext.verify();
+ }
+
+ public void testLookupDisplayNameAlternative_NullLookup() {
+ Assert.assertNull(mContactInfoHelper.lookUpDisplayNameAlternative(mContext, null,
+ ContactsUtils.USER_TYPE_CURRENT));
+ }
+
+ public void testLookupDisplayNameAlternative_NoResults() {
+ setUpQueryExpectations(displayNameAlternativeUri,
+ PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION);
+ Assert.assertNull(mContactInfoHelper.lookUpDisplayNameAlternative(mContext,
+ TEST_LOOKUP_KEY, ContactsUtils.USER_TYPE_CURRENT));
+ mContext.verify();
+ }
+
+ public void testLookupDisplayNameAlternative_HasDisplayNameAlternative() {
+ setUpQueryExpectations(displayNameAlternativeUri,
+ PhoneQuery.DISPLAY_NAME_ALTERNATIVE_PROJECTION, TEST_DISPLAY_NAME_ALTERNATIVE_ROW);
+ Assert.assertEquals(TEST_DISPLAY_NAME_ALTERNATIVE,
+ mContactInfoHelper.lookUpDisplayNameAlternative(mContext, TEST_LOOKUP_KEY
+ , ContactsUtils.USER_TYPE_CURRENT));
+ mContext.verify();
+ }
+
+ /*
+ * Sets up query expectations to return the given row for all queries for the given
+ * uri and projection. If row is null, an empty cursor is returned for query calls
+ */
+ private void setUpQueryExpectations(Uri uri, String[] projection, String...row) {
+ Query query = mContext.getContactsProvider().expectQuery(uri)
+ .withProjection(projection).withAnySelection().withAnySortOrder();
+ if (row == null || row.length == 0) {
+ query.returnEmptyCursor();
+ return;
+ }
+ query.returnRow(row);
+ }
+}
diff --git a/tests/src/com/android/dialer/calllog/GroupingListAdapterTests.java b/tests/src/com/android/dialer/calllog/GroupingListAdapterTests.java
index 53583e0a7..4d8cb9cc0 100644
--- a/tests/src/com/android/dialer/calllog/GroupingListAdapterTests.java
+++ b/tests/src/com/android/dialer/calllog/GroupingListAdapterTests.java
@@ -16,15 +16,12 @@
package com.android.dialer.calllog;
-import static com.android.dialer.calllog.GroupingListAdapter.ITEM_TYPE_GROUP_HEADER;
-import static com.android.dialer.calllog.GroupingListAdapter.ITEM_TYPE_IN_GROUP;
-import static com.android.dialer.calllog.GroupingListAdapter.ITEM_TYPE_STANDALONE;
-
import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.support.v7.widget.RecyclerView;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
@@ -37,6 +34,7 @@ import android.view.ViewGroup;
* adb shell am instrument -e class com.android.dialer.calllog.GroupingListAdapterTests \
* -w com.android.dialer.tests/android.test.InstrumentationTestRunner
*/
+@MediumTest
public class GroupingListAdapterTests extends AndroidTestCase {
static private final String[] PROJECTION = new String[] {
@@ -63,17 +61,17 @@ public class GroupingListAdapterTests extends AndroidTestCase {
if (TextUtils.equals(value, currentValue)) {
groupItemCount++;
} else {
- if (groupItemCount > 1) {
- addGroup(i - groupItemCount, groupItemCount, false);
- }
-
+ addGroup(i - groupItemCount, groupItemCount);
groupItemCount = 1;
currentValue = value;
}
}
- if (groupItemCount > 1) {
- addGroup(count - groupItemCount, groupItemCount, false);
- }
+ addGroup(count - groupItemCount, groupItemCount);
+ }
+
+ @Override
+ protected void addVoicemailGroups(Cursor c) {
+ // Do nothing.
}
@Override
@@ -92,7 +90,6 @@ public class GroupingListAdapterTests extends AndroidTestCase {
}
};
-
private void buildCursor(String... numbers) {
mCursor = new MatrixCursor(PROJECTION);
mNextId = 1;
@@ -107,170 +104,51 @@ public class GroupingListAdapterTests extends AndroidTestCase {
mAdapter.changeCursor(mCursor);
assertEquals(3, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 2);
+ assertMetadata(0, 1, "1");
+ assertMetadata(1, 1, "2");
+ assertMetadata(2, 1, "3");
}
- public void testGroupingWithCollapsedGroupAtTheBeginning() {
+ public void testGroupingWithGroupAtTheBeginning() {
buildCursor("1", "1", "2");
mAdapter.changeCursor(mCursor);
assertEquals(2, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_GROUP_HEADER, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 2);
- }
-
- public void testGroupingWithExpandedGroupAtTheBeginning() {
- buildCursor("1", "1", "2");
- mAdapter.changeCursor(mCursor);
- mAdapter.toggleGroup(0);
-
- assertEquals(4, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_GROUP_HEADER, true, 0);
- assertPositionMetadata(1, ITEM_TYPE_IN_GROUP, false, 0);
- assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1);
- assertPositionMetadata(3, ITEM_TYPE_STANDALONE, false, 2);
+ assertMetadata(0, 2, "1");
+ assertMetadata(1, 1, "2");
}
- public void testGroupingWithExpandCollapseCycleAtTheBeginning() {
- buildCursor("1", "1", "2");
- mAdapter.changeCursor(mCursor);
- mAdapter.toggleGroup(0);
- mAdapter.toggleGroup(0);
-
- assertEquals(2, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_GROUP_HEADER, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 2);
- }
-
- public void testGroupingWithCollapsedGroupInTheMiddle() {
+ public void testGroupingWithGroupInTheMiddle() {
buildCursor("1", "2", "2", "2", "3");
mAdapter.changeCursor(mCursor);
assertEquals(3, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 4);
- }
-
- public void testGroupingWithExpandedGroupInTheMiddle() {
- buildCursor("1", "2", "2", "2", "3");
- mAdapter.changeCursor(mCursor);
- mAdapter.toggleGroup(1);
-
- assertEquals(6, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1);
- assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1);
- assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2);
- assertPositionMetadata(4, ITEM_TYPE_IN_GROUP, false, 3);
- assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 4);
+ assertMetadata(0, 1, "1");
+ assertMetadata(1, 3, "2");
+ assertMetadata(2, 1, "3");
}
- public void testGroupingWithCollapsedGroupAtTheEnd() {
+ public void testGroupingWithGroupAtTheEnd() {
buildCursor("1", "2", "3", "3", "3");
mAdapter.changeCursor(mCursor);
assertEquals(3, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_GROUP_HEADER, false, 2);
+ assertMetadata(0, 1, "1");
+ assertMetadata(1, 1, "2");
+ assertMetadata(2, 3, "3");
}
- public void testGroupingWithExpandedGroupAtTheEnd() {
- buildCursor("1", "2", "3", "3", "3");
- mAdapter.changeCursor(mCursor);
- mAdapter.toggleGroup(2);
-
- assertEquals(6, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_STANDALONE, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_GROUP_HEADER, true, 2);
- assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2);
- assertPositionMetadata(4, ITEM_TYPE_IN_GROUP, false, 3);
- assertPositionMetadata(5, ITEM_TYPE_IN_GROUP, false, 4);
- }
-
- public void testGroupingWithMultipleCollapsedGroups() {
- buildCursor("1", "2", "2", "3", "4", "4", "5", "5", "6");
- mAdapter.changeCursor(mCursor);
-
- assertEquals(6, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 3);
- assertPositionMetadata(3, ITEM_TYPE_GROUP_HEADER, false, 4);
- assertPositionMetadata(4, ITEM_TYPE_GROUP_HEADER, false, 6);
- assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 8);
- }
-
- public void testGroupingWithMultipleExpandedGroups() {
+ public void testGroupingWithMultipleGroups() {
buildCursor("1", "2", "2", "3", "4", "4", "5", "5", "6");
mAdapter.changeCursor(mCursor);
- mAdapter.toggleGroup(1);
- // Note that expanding the group of 2's shifted the group of 5's down from the
- // 4th to the 6th position
- mAdapter.toggleGroup(6);
-
- assertEquals(10, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1);
- assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1);
- assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2);
- assertPositionMetadata(4, ITEM_TYPE_STANDALONE, false, 3);
- assertPositionMetadata(5, ITEM_TYPE_GROUP_HEADER, false, 4);
- assertPositionMetadata(6, ITEM_TYPE_GROUP_HEADER, true, 6);
- assertPositionMetadata(7, ITEM_TYPE_IN_GROUP, false, 6);
- assertPositionMetadata(8, ITEM_TYPE_IN_GROUP, false, 7);
- assertPositionMetadata(9, ITEM_TYPE_STANDALONE, false, 8);
- }
-
- public void testPositionCache() {
- buildCursor("1", "2", "2", "3", "4", "4", "5", "5", "6");
- mAdapter.changeCursor(mCursor);
-
- // First pass - building up cache
assertEquals(6, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 3);
- assertPositionMetadata(3, ITEM_TYPE_GROUP_HEADER, false, 4);
- assertPositionMetadata(4, ITEM_TYPE_GROUP_HEADER, false, 6);
- assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 8);
-
- // Second pass - using cache
- assertEquals(6, mAdapter.getItemCount());
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, false, 1);
- assertPositionMetadata(2, ITEM_TYPE_STANDALONE, false, 3);
- assertPositionMetadata(3, ITEM_TYPE_GROUP_HEADER, false, 4);
- assertPositionMetadata(4, ITEM_TYPE_GROUP_HEADER, false, 6);
- assertPositionMetadata(5, ITEM_TYPE_STANDALONE, false, 8);
-
- // Invalidate cache by expanding a group
- mAdapter.toggleGroup(1);
-
- // First pass - building up cache
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1);
- assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1);
- assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2);
- assertPositionMetadata(4, ITEM_TYPE_STANDALONE, false, 3);
- assertPositionMetadata(5, ITEM_TYPE_GROUP_HEADER, false, 4);
- assertPositionMetadata(6, ITEM_TYPE_GROUP_HEADER, false, 6);
- assertPositionMetadata(7, ITEM_TYPE_STANDALONE, false, 8);
-
- // Second pass - using cache
- assertPositionMetadata(0, ITEM_TYPE_STANDALONE, false, 0);
- assertPositionMetadata(1, ITEM_TYPE_GROUP_HEADER, true, 1);
- assertPositionMetadata(2, ITEM_TYPE_IN_GROUP, false, 1);
- assertPositionMetadata(3, ITEM_TYPE_IN_GROUP, false, 2);
- assertPositionMetadata(4, ITEM_TYPE_STANDALONE, false, 3);
- assertPositionMetadata(5, ITEM_TYPE_GROUP_HEADER, false, 4);
- assertPositionMetadata(6, ITEM_TYPE_GROUP_HEADER, false, 6);
- assertPositionMetadata(7, ITEM_TYPE_STANDALONE, false, 8);
+ assertMetadata(0, 1, "1");
+ assertMetadata(1, 2, "2");
+ assertMetadata(2, 1, "3");
+ assertMetadata(3, 2, "4");
+ assertMetadata(4, 2, "5");
+ assertMetadata(5, 1, "6");
}
public void testGroupDescriptorArrayGrowth() {
@@ -287,14 +165,9 @@ public class GroupingListAdapterTests extends AndroidTestCase {
assertEquals(250, mAdapter.getItemCount());
}
- private void assertPositionMetadata(int position, int itemType, boolean isExpanded,
- int cursorPosition) {
- GroupingListAdapter.PositionMetadata metadata = new GroupingListAdapter.PositionMetadata();
- mAdapter.obtainPositionMetadata(metadata, position);
- assertEquals(itemType, metadata.itemType);
- if (metadata.itemType == ITEM_TYPE_GROUP_HEADER) {
- assertEquals(isExpanded, metadata.isExpanded);
- }
- assertEquals(cursorPosition, metadata.cursorPosition);
+ private void assertMetadata(int listPosition, int groupSize, String objectValue) {
+ assertEquals(groupSize, mAdapter.getGroupSize(listPosition));
+ MatrixCursor cursor = (MatrixCursor) mAdapter.getItem(listPosition);
+ assertEquals(objectValue, cursor.getString(GROUPING_COLUMN_INDEX));
}
}
diff --git a/tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java b/tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java
new file mode 100644
index 000000000..f2d0856bd
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/PhoneAccountUtilsTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.calllog;
+
+import android.content.ComponentName;
+import android.telecom.PhoneAccountHandle;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+public class PhoneAccountUtilsTest extends AndroidTestCase {
+
+ private static final String VALID_COMPONENT_NAME =
+ "com.android.dialer.calllog/com.android.dialer.calllog.PhoneAccountUtilsTest";
+ private static final String VALID_ACCOUNT_ID = "Account1";
+
+ @SmallTest
+ public void testGetAccount_CorrectParams() {
+ ComponentName correctComponentName =
+ ComponentName.unflattenFromString(VALID_COMPONENT_NAME);
+ PhoneAccountHandle correctPhoneAccountHandle = new PhoneAccountHandle(correctComponentName,
+ VALID_ACCOUNT_ID);
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, VALID_ACCOUNT_ID);
+
+ assertTrue(correctPhoneAccountHandle.equals(testPhoneAccountHandle));
+ }
+
+ @SmallTest
+ public void testGetAccount_ComponentStringNoClassName() {
+ final String malformedComponentName = "com.android.dialer.calllog/";
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(malformedComponentName, VALID_ACCOUNT_ID);
+
+ assertNull(testPhoneAccountHandle);
+ }
+
+ @SmallTest
+ public void testGetAccount_ComponentStringInvalid() {
+ final String malformedComponentName = "com.android.dialer.calllog";
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(malformedComponentName, VALID_ACCOUNT_ID);
+
+ assertNull(testPhoneAccountHandle);
+ }
+
+ @SmallTest
+ public void testGetAccount_NoComponentName() {
+ final String blankComponentName = "";
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(blankComponentName, VALID_ACCOUNT_ID);
+
+ assertNull(testPhoneAccountHandle);
+ }
+
+ @SmallTest
+ public void testGetAccount_NoAccountId() {
+ final String blankAccountId = "";
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, blankAccountId);
+
+ assertNull(testPhoneAccountHandle);
+ }
+
+ @SmallTest
+ public void testGetAccount_NoAccountIdOrComponentName() {
+ final String blankComponentName = "";
+ final String blankAccountId = "";
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, blankAccountId);
+
+ assertNull(testPhoneAccountHandle);
+ }
+
+ @SmallTest
+ public void testGetAccount_NullAccountIdAndComponentName() {
+ final String blankComponentName = null;
+ final String blankAccountId = null;
+
+ PhoneAccountHandle testPhoneAccountHandle =
+ PhoneAccountUtils.getAccount(VALID_COMPONENT_NAME, blankAccountId);
+
+ assertNull(testPhoneAccountHandle);
+ }
+}
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
index 318250247..0c57fde3c 100644
--- a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
@@ -16,10 +16,13 @@
package com.android.dialer.calllog;
+import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
import android.provider.CallLog.Calls;
+import android.telecom.PhoneAccountHandle;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.MediumTest;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
@@ -27,20 +30,27 @@ import android.widget.TextView;
import com.android.dialer.PhoneCallDetails;
import com.android.dialer.R;
+import com.android.dialer.calllog.calllogcache.TestTelecomCallLogCache;
+import com.android.dialer.util.AppCompatConstants;
import com.android.dialer.util.LocaleTestUtils;
import java.util.GregorianCalendar;
import java.util.Locale;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
- * Unit tests for {@link PhoneCallDetailsHelper}.m
+ * Unit tests for {@link PhoneCallDetailsHelper}.
*/
+@MediumTest
public class PhoneCallDetailsHelperTest extends AndroidTestCase {
/** The number to be used to access the voicemail. */
private static final String TEST_VOICEMAIL_NUMBER = "125";
/** The date of the call log entry. */
private static final long TEST_DATE =
new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis();
+ private static final long INJECTED_CURRENT_DATE =
+ new GregorianCalendar(2011, 5, 4, 13, 0, 0).getTimeInMillis();
/** A test duration value for phone calls. */
private static final long TEST_DURATION = 62300;
/** The number of the caller/callee in the log entry. */
@@ -53,6 +63,12 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
private static final String TEST_GEOCODE = "United States";
/** Empty geocode label */
private static final String EMPTY_GEOCODE = "";
+ /** Empty post-dial digits label */
+ private static final String EMPTY_POSTDIAL = "";
+ /** The number that the call was received via */
+ private static final String TEST_VIA_NUMBER = "+16505551234";
+ /** The Phone Account name that the Call was received on */
+ private static final String TEST_ACCOUNT_LABEL = "T-Stationary";
/** The object under test. */
private PhoneCallDetailsHelper mHelper;
@@ -69,12 +85,10 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
super.setUp();
mContext = getContext();
Resources resources = mContext.getResources();
- mPhoneUtils = new TestTelecomCallLogCache(mContext, TEST_VOICEMAIL_NUMBER);
- final TestTelecomCallLogCache phoneUtils = new TestTelecomCallLogCache(
- mContext, TEST_VOICEMAIL_NUMBER);
- mHelper = new PhoneCallDetailsHelper(mContext, resources, phoneUtils);
- mHelper.setCurrentTimeForTest(
- new GregorianCalendar(2011, 5, 4, 13, 0, 0).getTimeInMillis());
+ mPhoneUtils = new TestTelecomCallLogCache(mContext, TEST_VOICEMAIL_NUMBER,
+ TEST_ACCOUNT_LABEL);
+ mHelper = new PhoneCallDetailsHelper(mContext, resources, mPhoneUtils);
+ mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
mViews = PhoneCallDetailsViews.createForTest(mContext);
mNameView = new TextView(mContext);
mLocaleTestUtils = new LocaleTestUtils(mContext);
@@ -111,10 +125,70 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
assertNameEqualsResource(R.string.voicemail);
}
- public void testSetPhoneCallDetails_Normal() {
- setPhoneCallDetailsWithNumber("14125551212",
- Calls.PRESENTATION_ALLOWED, "1-412-555-1212");
- assertTrue(mViews.callLocationAndDate.getText().toString().contains("Yesterday"));
+ public void testSetPhoneCallDetails_ViaNumber() {
+ setPhoneCallDetailsWithViaNumber(TEST_VIA_NUMBER);
+ assertViaNumberEquals(TEST_VIA_NUMBER);
+ }
+
+ public void testSetPhoneCallDetails_NoViaNumber() {
+ setDefaultPhoneCallDetailsNoViaNumber();
+ assertCallAccountInvisible();
+ }
+
+ public void testSetPhoneCallDetails_AccountLabel() {
+ setPhoneCallDetailsWithAccountHandle();
+ assertAccountLabelEquals(TEST_ACCOUNT_LABEL);
+ }
+
+ public void testSetPhoneCallDetails_AccountHandleViaNumber() {
+ setPhoneCallDetailsWithAccountLabelViaNumber(TEST_VIA_NUMBER);
+ assertAccountLabelEquals(TEST_VIA_NUMBER, TEST_ACCOUNT_LABEL);
+ }
+
+ // Voicemail date string has 3 different formats depending on how long ago the call was placed
+ public void testSetVoicemailPhoneCallDetails_Today() {
+ setVoicemailPhoneCallDetailsWithDate(System.currentTimeMillis());
+ assertLocationAndDateContains("Today at");
+ }
+
+ public void testSetVoicemailPhoneCallDetails_WithinCurrentYear() {
+ mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
+ String formattedTestDate = "Jun 3 at 1:00 PM";
+ setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
+ assertLocationAndDateContains(formattedTestDate);
+ }
+
+ public void testSetVoicemailPhoneCallDetails_OutsideCurrentYear() {
+ mHelper.setCurrentTimeForTest(INJECTED_CURRENT_DATE);
+ long testDate = new GregorianCalendar(2009, 5, 3, 13, 0, 0).getTimeInMillis();
+ String formattedTestDate = "Jun 3, 2009 at 1:00 PM";
+ setVoicemailPhoneCallDetailsWithDate(testDate);
+ assertLocationAndDateContains(formattedTestDate);
+ }
+
+ public void testVoicemailLocationNotShownWithDate() {
+ setVoicemailPhoneCallDetailsWithDate(TEST_DATE);
+ assertLocationAndDateExactEquals("Jun 3 at 1:00 PM • 99:20");
+ }
+
+ public void testVoicemailDuration() {
+ setVoicemailPhoneCallDetailsWithDuration(100);
+ assertDurationExactEquals("01:40");
+ }
+
+ public void testVoicemailDuration_Capped() {
+ setVoicemailPhoneCallDetailsWithDuration(TEST_DURATION);
+ assertDurationExactEquals("99:20");
+ }
+
+ public void testVoicemailDuration_Zero() {
+ setVoicemailPhoneCallDetailsWithDuration(0);
+ assertLocationAndDateExactEquals("Jun 3 at 1:00 PM");
+ }
+
+ public void testVoicemailDuration_EvenMinute() {
+ setVoicemailPhoneCallDetailsWithDuration(60);
+ assertDurationExactEquals("01:00");
}
/** Asserts that a char sequence is actually a Spanned corresponding to the expected HTML. */
@@ -133,33 +207,33 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 3, 13, 0, 0).getTimeInMillis());
- assertDateEquals("0 min. ago");
+ assertLocationAndDateContains("0 min. ago");
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 3, 12, 0, 0).getTimeInMillis());
- assertDateEquals("1 hr. ago");
+ assertLocationAndDateContains("1 hr. ago");
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 2, 13, 0, 0).getTimeInMillis());
- assertDateEquals("Yesterday");
+ assertLocationAndDateContains("Yesterday");
setPhoneCallDetailsWithDate(
new GregorianCalendar(2011, 5, 1, 13, 0, 0).getTimeInMillis());
- assertDateEquals("2 days ago");
+ assertLocationAndDateContains("2 days ago");
}
public void testSetPhoneCallDetails_CallTypeIcons() {
- setPhoneCallDetailsWithCallTypeIcons(Calls.INCOMING_TYPE);
- assertCallTypeIconsEquals(Calls.INCOMING_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_INCOMING_TYPE);
+ assertCallTypeIconsEquals(AppCompatConstants.CALLS_INCOMING_TYPE);
- setPhoneCallDetailsWithCallTypeIcons(Calls.OUTGOING_TYPE);
- assertCallTypeIconsEquals(Calls.OUTGOING_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallTypeIconsEquals(AppCompatConstants.CALLS_OUTGOING_TYPE);
- setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE);
- assertCallTypeIconsEquals(Calls.MISSED_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_MISSED_TYPE);
+ assertCallTypeIconsEquals(AppCompatConstants.CALLS_MISSED_TYPE);
- setPhoneCallDetailsWithCallTypeIcons(Calls.VOICEMAIL_TYPE);
- assertCallTypeIconsEquals(Calls.VOICEMAIL_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
+ assertCallTypeIconsEquals(AppCompatConstants.CALLS_VOICEMAIL_TYPE);
}
/**
@@ -185,41 +259,54 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
}
public void testSetPhoneCallDetails_MultipleCallTypeIcons() {
- setPhoneCallDetailsWithCallTypeIcons(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
- assertCallTypeIconsEquals(Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
+ assertCallTypeIconsEquals(
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
- setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
- assertCallTypeIconsEquals(Calls.MISSED_TYPE, Calls.MISSED_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE);
+ assertCallTypeIconsEquals(
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE);
}
public void testSetPhoneCallDetails_MultipleCallTypeIconsLastOneDropped() {
- setPhoneCallDetailsWithCallTypeIcons(Calls.MISSED_TYPE, Calls.MISSED_TYPE,
- Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE);
+ setPhoneCallDetailsWithCallTypeIcons(
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE);
assertCallTypeIconsEqualsPlusOverflow("(4)",
- Calls.MISSED_TYPE, Calls.MISSED_TYPE, Calls.INCOMING_TYPE);
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE);
}
public void testSetPhoneCallDetails_Geocode() {
setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "Pennsylvania");
assertNameEquals("1-412-555-5555"); // The phone number is shown as the name.
- assertLabelEquals("Pennsylvania"); // The geocode is shown as the label.
+ assertLocationAndDateContains("Pennsylvania"); // The geocode is shown as the label.
}
public void testSetPhoneCallDetails_NoGeocode() {
setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", null);
assertNameEquals("1-412-555-5555"); // The phone number is shown as the name.
- assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+ assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
}
public void testSetPhoneCallDetails_EmptyGeocode() {
setPhoneCallDetailsWithNumberAndGeocode("+14125555555", "1-412-555-5555", "");
assertNameEquals("1-412-555-5555"); // The phone number is shown as the name.
- assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+ assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
}
public void testSetPhoneCallDetails_NoGeocodeForVoicemail() {
setPhoneCallDetailsWithNumberAndGeocode(TEST_VOICEMAIL_NUMBER, "", "United States");
- assertLabelEquals(EMPTY_GEOCODE); // The empty geocode is shown as the label.
+ assertLocationAndDateContains(EMPTY_GEOCODE); // The empty geocode is shown as the label.
}
public void testSetPhoneCallDetails_Highlighted() {
@@ -267,6 +354,25 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
assertEquals("John Doe", mNameView.getText().toString());
}
+ public void testGetCallTypeOrLocation_Geocode() {
+ assertEquals(TEST_GEOCODE, mHelper.getCallTypeOrLocation(getPhoneCallDetails()));
+ }
+
+ public void testGetCallTypeOrLocation_CallType() {
+ PhoneCallDetails details = getPhoneCallDetails();
+ details.geocode = null;
+ details.numberType = Calls.INCOMING_TYPE;
+ mHelper.setPhoneTypeLabelForTest("mobile");
+ assertEquals("mobile", mHelper.getCallTypeOrLocation(details));
+ }
+
+ public void testGetCallTypeOrLocation_DisplayNumber() {
+ PhoneCallDetails details = getPhoneCallDetails("", Calls.PRESENTATION_ALLOWED,
+ TEST_FORMATTED_NUMBER);
+ details.namePrimary = "name";
+ assertEquals(TEST_FORMATTED_NUMBER, mHelper.getCallTypeOrLocation(details));
+ }
+
/** Asserts that the name text field contains the value of the given string resource. */
private void assertNameEqualsResource(int resId) {
assertNameEquals(getContext().getString(resId));
@@ -277,14 +383,46 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
assertEquals(text, mViews.nameView.getText().toString());
}
- /** Asserts that the label text field contains the given string value. */
- private void assertLabelEquals(String text) {
+ /** Asserts that the location and date text field contains the given string value. */
+ private void assertLocationAndDateContains(String text) {
assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
}
- /** Asserts that the date text field contains the given string value. */
- private void assertDateEquals(String text) {
- assertTrue(mViews.callLocationAndDate.getText().toString().contains(text));
+ /** Asserts that the location and date text field exactly equals the given string value. */
+ private void assertLocationAndDateExactEquals(String text) {
+ assertEquals(text, mViews.callLocationAndDate.getText());
+ }
+
+ /** Asserts that the via number is correct. */
+ private void assertViaNumberEquals(String text) {
+ final String callAccountText =
+ mContext.getResources().getString(R.string.description_via_number, text);
+ assertEquals(callAccountText, mViews.callAccountLabel.getText());
+ }
+
+ /** Asserts that the account label is correct. */
+ private void assertAccountLabelEquals(String text) {
+ assertEquals(text, mViews.callAccountLabel.getText());
+ }
+
+ /** Asserts that the account label is correct when also showing the via number. */
+ private void assertAccountLabelEquals(String viaNumber, String accountLabel) {
+ final String viaNumberText =
+ mContext.getResources().getString(R.string.description_via_number, viaNumber);
+ assertEquals(accountLabel + " " + viaNumberText, mViews.callAccountLabel.getText());
+ }
+
+ /** Asserts that the call account label is invisible. */
+ private void assertCallAccountInvisible() {
+ assertEquals(mViews.callAccountLabel.getVisibility(), View.GONE);
+ }
+
+ /** Asserts that the duration is exactly as included in the location and date text field. */
+ private void assertDurationExactEquals(String text) {
+ Matcher matcher = Pattern.compile("(.*) (\\u2022) (\\d{2}:\\d{2})").matcher(
+ mViews.callLocationAndDate.getText());
+ assertEquals(true, matcher.matches());
+ assertEquals(text, matcher.group(3));
}
/** Asserts that the video icon is shown. */
@@ -300,7 +438,6 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
assertEquals(id, mViews.callTypeIcons.getCallType(index));
}
assertEquals(View.VISIBLE, mViews.callTypeIcons.getVisibility());
- assertTrue(mViews.callLocationAndDate.getText().toString().contains("Yesterday"));
}
/**
@@ -322,7 +459,37 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
private void setPhoneCallDetailsWithNumber(String number, int presentation,
String formattedNumber) {
PhoneCallDetails details = getPhoneCallDetails(number, presentation, formattedNumber);
- details.callTypes = new int[]{ Calls.VOICEMAIL_TYPE };
+ details.callTypes = new int[]{ AppCompatConstants.CALLS_VOICEMAIL_TYPE };
+ mHelper.setPhoneCallDetails(mViews, details);
+ }
+
+ /** Sets the phone call details with default values and the given via number. */
+ private void setPhoneCallDetailsWithViaNumber(String viaNumber) {
+ PhoneCallDetails details = getPhoneCallDetails();
+ mPhoneUtils.setAccountLabel("");
+ details.viaNumber = viaNumber;
+ mHelper.setPhoneCallDetails(mViews, details);
+ }
+
+ /** Sets the phone call details with an account handle. */
+ private void setPhoneCallDetailsWithAccountHandle() {
+ PhoneCallDetails details = getPhoneCallDetails();
+ details.accountHandle = new PhoneAccountHandle(new ComponentName("",""), "");
+ mHelper.setPhoneCallDetails(mViews, details);
+ }
+
+ /** Sets the phone call details with an account handle and via number */
+ private void setPhoneCallDetailsWithAccountLabelViaNumber(String viaNumber) {
+ PhoneCallDetails details = getPhoneCallDetails();
+ details.viaNumber = viaNumber;
+ details.accountHandle = new PhoneAccountHandle(new ComponentName("",""), "");
+ mHelper.setPhoneCallDetails(mViews, details);
+ }
+
+ /** Populates the phone call details with the Defaults. */
+ private void setDefaultPhoneCallDetailsNoViaNumber() {
+ PhoneCallDetails details = getPhoneCallDetails();
+ mPhoneUtils.setAccountLabel("");
mHelper.setPhoneCallDetails(mViews, details);
}
@@ -342,6 +509,21 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
mHelper.setPhoneCallDetails(mViews, details);
}
+ private void setVoicemailPhoneCallDetailsWithDate(long date) {
+ PhoneCallDetails details = getPhoneCallDetails();
+ details.date = date;
+ details.callTypes = new int[] {Calls.VOICEMAIL_TYPE};
+ mHelper.setPhoneCallDetails(mViews, details);
+ }
+
+ /** Sets the voice mail details with default values and the given duration. */
+ private void setVoicemailPhoneCallDetailsWithDuration(long duration) {
+ PhoneCallDetails details = getPhoneCallDetails();
+ details.duration = duration;
+ details.callTypes = new int[] {Calls.VOICEMAIL_TYPE};
+ mHelper.setPhoneCallDetails(mViews, details);
+ }
+
/** Sets the phone call details with default values and the given call types using icons. */
private void setPhoneCallDetailsWithCallTypeIcons(int... callTypes) {
PhoneCallDetails details = getPhoneCallDetails();
@@ -356,7 +538,7 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
private void setCallDetailsHeader(String name) {
PhoneCallDetails details = getPhoneCallDetails();
- details.name = name;
+ details.namePrimary = name;
mHelper.setCallDetailsHeader(mNameView, details);
}
@@ -366,6 +548,7 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
TEST_NUMBER,
Calls.PRESENTATION_ALLOWED,
TEST_FORMATTED_NUMBER,
+ EMPTY_POSTDIAL,
false /* isVoicemail */);
setDefaultDetails(details);
return details;
@@ -378,13 +561,14 @@ public class PhoneCallDetailsHelperTest extends AndroidTestCase {
number,
presentation,
formattedNumber,
+ EMPTY_POSTDIAL,
isVoicemail(number));
setDefaultDetails(details);
return details;
}
private void setDefaultDetails(PhoneCallDetails details) {
- details.callTypes = new int[]{ Calls.INCOMING_TYPE };
+ details.callTypes = new int[]{ AppCompatConstants.CALLS_INCOMING_TYPE };
details.countryIso = TEST_COUNTRY_ISO;
details.date = TEST_DATE;
details.duration = TEST_DURATION;
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsTest.java
new file mode 100644
index 000000000..5c500d8bb
--- /dev/null
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsTest.java
@@ -0,0 +1,63 @@
+package com.android.dialer.calllog;
+
+import android.content.res.Resources;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.text.style.TtsSpan;
+
+import com.android.dialer.PhoneCallDetails;
+import com.android.dialer.R;
+import com.android.contacts.common.util.ContactDisplayUtils;
+
+/**
+ * Unit tests for {@link PhoneCallDetails}.
+ */
+public class PhoneCallDetailsTest extends AndroidTestCase {
+ private static final String VIA_NUMBER = "+16505551212";
+ private static final String PHONE_ACCOUNT_LABEL = "TEST";
+
+ private Resources mResources;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mResources = mContext.getResources();
+ }
+
+ @SmallTest
+ public void testCreateAccountLabelDescription_NoViaNumberNoAccountLabel() {
+ CharSequence result = PhoneCallDetails.createAccountLabelDescription(mResources, "","");
+ assertEquals("", result);
+ }
+
+ @SmallTest
+ public void testCreateAccountLabelDescription_ViaNumberAccountLabel() {
+ String msg = mResources.getString(R.string.description_via_number_phone_account,
+ PHONE_ACCOUNT_LABEL, VIA_NUMBER);
+ CharSequence accountNumberLabel = ContactDisplayUtils.getTelephoneTtsSpannable(msg,
+ VIA_NUMBER);
+ CharSequence result = PhoneCallDetails.createAccountLabelDescription(mResources, VIA_NUMBER,
+ PHONE_ACCOUNT_LABEL);
+ assertEquals(accountNumberLabel.toString(), result.toString());
+ }
+
+ @SmallTest
+ public void testCreateAccountLabelDescription_ViaNumber() {
+ CharSequence viaNumberLabel = ContactDisplayUtils.getTtsSpannedPhoneNumber(mResources,
+ R.string.description_via_number, VIA_NUMBER);
+ CharSequence result = PhoneCallDetails.createAccountLabelDescription(mResources, VIA_NUMBER,
+ "");
+ assertEquals(viaNumberLabel.toString(), result.toString());
+ }
+
+ @SmallTest
+ public void testCreateAccountLabelDescription_AccountLabel() {
+ CharSequence accountLabel = TextUtils.expandTemplate(
+ mResources.getString(R.string.description_phone_account), PHONE_ACCOUNT_LABEL);
+ CharSequence result = PhoneCallDetails.createAccountLabelDescription(mResources, "",
+ PHONE_ACCOUNT_LABEL);
+ assertEquals(accountLabel, result);
+ }
+}
diff --git a/tests/src/com/android/dialer/calllog/TestTelecomCallLogCache.java b/tests/src/com/android/dialer/calllog/calllogcache/TestTelecomCallLogCache.java
index 5475ec337..270019afd 100644
--- a/tests/src/com/android/dialer/calllog/TestTelecomCallLogCache.java
+++ b/tests/src/com/android/dialer/calllog/calllogcache/TestTelecomCallLogCache.java
@@ -14,25 +14,52 @@
* limitations under the License
*/
-package com.android.dialer.calllog;
+package com.android.dialer.calllog.calllogcache;
import android.content.Context;
+import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
/**
- * Modified version of {@link com.android.dialer.calllog.PhoneNumberDisplayHelper} to be used in
+ * Modified version of {@link com.android.dialer.calllog.calllogcache.CallLogCache} to be used in
* tests that allows injecting the voicemail number.
+ *
+ * NOTE: This tests the pre-LMR1 version because currently none of the tests involve multi-SIM,
+ * but...
+ * TODO: write tests to test multi-SIM functionality in TelecomCallLogCache.
*/
-public final class TestTelecomCallLogCache extends TelecomCallLogCache {
+public class TestTelecomCallLogCache extends CallLogCache {
private CharSequence mVoicemailNumber;
+ private String mAccountLabel;
- public TestTelecomCallLogCache(Context context, CharSequence voicemailNumber) {
+ public TestTelecomCallLogCache(Context context, CharSequence voicemailNumber,
+ String accountLabel) {
super(context);
mVoicemailNumber = voicemailNumber;
+ mAccountLabel = accountLabel;
}
@Override
public boolean isVoicemailNumber(PhoneAccountHandle accountHandle, CharSequence number) {
return mVoicemailNumber.equals(number);
}
+
+ @Override
+ public String getAccountLabel(PhoneAccountHandle accountHandle) {
+ return mAccountLabel;
+ }
+
+ public void setAccountLabel(String accountLabel) {
+ mAccountLabel = accountLabel;
+ }
+
+ @Override
+ public int getAccountColor(PhoneAccountHandle accountHandle) {
+ return PhoneAccount.NO_HIGHLIGHT_COLOR;
+ }
+
+ @Override
+ public boolean doesAccountSupportCallSubject(PhoneAccountHandle accountHandle) {
+ return false;
+ }
}
diff --git a/tests/src/com/android/dialer/compat/FilteredNumberCompatInstrumentationTest.java b/tests/src/com/android/dialer/compat/FilteredNumberCompatInstrumentationTest.java
new file mode 100644
index 000000000..8ceb25046
--- /dev/null
+++ b/tests/src/com/android/dialer/compat/FilteredNumberCompatInstrumentationTest.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.compat;
+
+import android.app.AlertDialog;
+import android.app.DialogFragment;
+import android.app.FragmentManager;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.DialogInterface;
+import android.provider.BlockedNumberContract.BlockedNumbers;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.DialtactsActivity;
+import com.android.dialer.R;
+
+/**
+ * UI tests for FilteredNumberCompat
+ */
+public class FilteredNumberCompatInstrumentationTest extends
+ ActivityInstrumentationTestCase2<DialtactsActivity> {
+
+ private static final String E164_NUMBER = "+16502530000";
+ private static final String NUMBER = "6502530000";
+ private static final String COUNTRY_ISO = "US";
+
+ private ContentResolver mContentResolver;
+ private FragmentManager mFragmentManager;
+
+ public FilteredNumberCompatInstrumentationTest() {
+ super(DialtactsActivity.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mContentResolver = getActivity().getContentResolver();
+ mFragmentManager = getActivity().getFragmentManager();
+ mContentResolver.delete(BlockedNumbersSdkCompat.CONTENT_URI,
+ BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?", new String[]{NUMBER});
+ }
+
+ public void testShowBlockNumberDialogFlow_AlreadyBlocked() throws InterruptedException {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+
+ ContentValues values = new ContentValues();
+ values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, NUMBER);
+ mContentResolver.insert(BlockedNumbers.CONTENT_URI, values);
+
+ FilteredNumberCompat.setHasMigratedToNewBlocking(false);
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ FilteredNumberCompat
+ .showBlockNumberDialogFlow(mContentResolver, null, NUMBER, COUNTRY_ISO,
+ E164_NUMBER, R.id.floating_action_button_container,
+ mFragmentManager, null);
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+
+ final DialogFragment migrateDialogFragment = (DialogFragment) mFragmentManager
+ .findFragmentByTag("MigrateBlockedNumbers");
+ assertTrue(migrateDialogFragment.getDialog().isShowing());
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ ((AlertDialog) migrateDialogFragment.getDialog())
+ .getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ assertNull(mFragmentManager.findFragmentByTag("BlockNumberDialog"));
+ }
+}
diff --git a/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
new file mode 100644
index 000000000..3572316db
--- /dev/null
+++ b/tests/src/com/android/dialer/compat/FilteredNumberCompatTest.java
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.compat;
+
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.UserManager;
+import android.provider.BlockedNumberContract.BlockedNumbers;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.DialerApplication;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
+import com.android.dialer.filterednumber.BlockedNumbersSettingsActivity;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Arrays;
+
+@SmallTest
+public class FilteredNumberCompatTest extends AndroidTestCase {
+
+ private static final String E164_NUMBER = "+16502530000";
+ private static final String NON_E164_NUMBER = "6502530000";
+ private static final String COUNTRY_ISO = "US";
+
+ private static final Uri EXPECTED_BASE_URI = CompatUtils.isNCompatible()
+ ? BlockedNumbers.CONTENT_URI : FilteredNumber.CONTENT_URI;
+
+ @Mock private Context mContext;
+ @Mock private SharedPreferences mSharedPreferences;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ DialerApplication.setContextForTest(mContext);
+ when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mSharedPreferences);
+ FilteredNumberCompat.setIsEnabledForTest(true);
+ }
+
+ public void testIsNewFilteringEnabled_TestValueFalse() {
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ assertFalse(FilteredNumberCompat.canUseNewFiltering());
+ }
+
+ public void testIsNewFilteringEnabled_TestValueTrue() {
+ FilteredNumberCompat.setIsEnabledForTest(true);
+ assertEquals(CompatUtils.isNCompatible(), FilteredNumberCompat.canUseNewFiltering());
+ }
+
+ public void testHasMigratedToNewBlocking_False() {
+ assertFalse(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+ public void testHasMigratedToNewBlocking_Migrated() {
+ when(mSharedPreferences
+ .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+ .thenReturn(true);
+ assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+ public void testGetContentUri_NullId() {
+ assertEquals(FilteredNumber.CONTENT_URI, FilteredNumberCompat.getContentUri(null));
+ }
+
+ public void testGetContentUri_NotMigrated() {
+ assertEquals(ContentUris.withAppendedId(FilteredNumber.CONTENT_URI, 1),
+ FilteredNumberCompat.getContentUri(1));
+ }
+
+ public void testGetContentUri_Migrated() {
+ when(mSharedPreferences
+ .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+ .thenReturn(true);
+ assertEquals(ContentUris.withAppendedId(EXPECTED_BASE_URI, 1),
+ FilteredNumberCompat.getContentUri(1));
+ }
+
+ public void testFilter_NullProjection() {
+ assertNull(FilteredNumberCompat.filter(null));
+ }
+
+ public void testFilter_NoNulls() {
+ assertArrayEquals(new String[] {"a", "b", "c"},
+ FilteredNumberCompat.filter(new String[] {"a", "b", "c"}));
+ }
+
+ public void testFilter_WithNulls() {
+ assertArrayEquals(new String[] {"a", "b"},
+ FilteredNumberCompat.filter(new String[] {"a", null, "b"}));
+ }
+
+ public void testNewBlockNumberContentValues_NullNumber() {
+ try {
+ FilteredNumberCompat.newBlockNumberContentValues(null, null, null);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testNewBlockNumberContentValues_N_NotMigrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(newExpectedContentValuesM(NON_E164_NUMBER, null, null),
+ FilteredNumberCompat.newBlockNumberContentValues(NON_E164_NUMBER, null, null));
+ }
+
+ public void testNewBlockNumberContentValues_N_Migrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, NON_E164_NUMBER);
+ when(mSharedPreferences
+ .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+ .thenReturn(true);
+ assertEquals(contentValues, FilteredNumberCompat.newBlockNumberContentValues(
+ NON_E164_NUMBER,
+ null, null));
+ }
+
+ public void testNewBlockNumberContentValues_N_Disabled() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ assertEquals(newExpectedContentValuesM(NON_E164_NUMBER, E164_NUMBER, COUNTRY_ISO),
+ FilteredNumberCompat.newBlockNumberContentValues(NON_E164_NUMBER, E164_NUMBER, COUNTRY_ISO));
+ }
+
+ public void testNewBlockNumberContentValues_M_NullE164() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(newExpectedContentValuesM(NON_E164_NUMBER, E164_NUMBER, COUNTRY_ISO),
+ FilteredNumberCompat.newBlockNumberContentValues(NON_E164_NUMBER, null, COUNTRY_ISO));
+ }
+
+ public void testNewBlockNumberContentValues_M_NullCountryIso() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(newExpectedContentValuesM(NON_E164_NUMBER, E164_NUMBER, null),
+ FilteredNumberCompat.newBlockNumberContentValues(NON_E164_NUMBER, E164_NUMBER, null));
+ }
+
+ public void testNewBlockNumberContentValues_M_NullE164AndCountryIso() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ // Number can't be formatted properly without country code
+ assertEquals(newExpectedContentValuesM(NON_E164_NUMBER, null, null),
+ FilteredNumberCompat.newBlockNumberContentValues(NON_E164_NUMBER, null, null));
+ }
+
+ public void testCreateManageBlockedNumbersIntent_NullContext() {
+ try {
+ FilteredNumberCompat.createManageBlockedNumbersIntent(null);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testCreateManageBlockedNumbersIntent_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(new ComponentName(getContext(), BlockedNumbersSettingsActivity.class),
+ FilteredNumberCompat.createManageBlockedNumbersIntent(getContext()).getComponent());
+ }
+
+ public void testCreateManageBlockedNumbersIntent_N_Disabled_NotMigrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ assertEquals(new ComponentName(getContext(), BlockedNumbersSettingsActivity.class),
+ FilteredNumberCompat.createManageBlockedNumbersIntent(getContext()).getComponent());
+ }
+
+ public void testCreateManageBlockedNumbersIntent_N_Enabled_NotMigrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(new ComponentName(getContext(), BlockedNumbersSettingsActivity.class),
+ FilteredNumberCompat.createManageBlockedNumbersIntent(getContext()).getComponent());
+ }
+
+ public void testCreateManageBlockedNumbersIntent_N_Enabled_Migrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ when(mSharedPreferences
+ .getBoolean(FilteredNumberCompat.HAS_MIGRATED_TO_NEW_BLOCKING_KEY, false))
+ .thenReturn(true);
+ assertFalse(new ComponentName(getContext(), BlockedNumbersSettingsActivity.class)
+ .equals(FilteredNumberCompat.createManageBlockedNumbersIntent(getContext())
+ .getComponent()));
+ }
+
+ public void testCanCurrentUserOpenBlockSettings_M_SecondaryUser() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ UserManager userManager = mock(UserManager.class);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+ when(userManager.isSystemUser()).thenReturn(false);
+ assertFalse(FilteredNumberCompat.canCurrentUserOpenBlockSettings(mContext));
+ verify(mContext).getSystemService(Context.USER_SERVICE);
+ verify(userManager).isSystemUser();
+ }
+
+ public void testCanCurrentUserOpenBlockSettings_M_PrimaryUser() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ UserManager userManager = mock(UserManager.class);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+ when(userManager.isSystemUser()).thenReturn(true);
+ assertTrue(FilteredNumberCompat.canCurrentUserOpenBlockSettings(mContext));
+ verify(mContext).getSystemService(Context.USER_SERVICE);
+ verify(userManager).isSystemUser();
+ }
+
+ public void testCanAttemptBlockOperations_M_SecondaryUser() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ UserManager userManager = mock(UserManager.class);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+ when(userManager.isSystemUser()).thenReturn(false);
+ assertFalse(FilteredNumberCompat.canAttemptBlockOperations(mContext));
+ verify(mContext).getSystemService(Context.USER_SERVICE);
+ verify(userManager).isSystemUser();
+ }
+
+ public void testCanAttemptBlockOperations_M_PrimaryUser() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ UserManager userManager = mock(UserManager.class);
+ when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(userManager);
+ when(userManager.isSystemUser()).thenReturn(true);
+ assertTrue(FilteredNumberCompat.canAttemptBlockOperations(mContext));
+ verify(mContext).getSystemService(Context.USER_SERVICE);
+ verify(userManager).isSystemUser();
+ }
+
+ private ContentValues newExpectedContentValuesM(String number, String e164Number,
+ String countryIso) {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(FilteredNumberColumns.NUMBER, number);
+ contentValues.put(FilteredNumberColumns.NORMALIZED_NUMBER, e164Number);
+ contentValues.put(FilteredNumberColumns.COUNTRY_ISO, countryIso);
+ contentValues.put(FilteredNumberColumns.TYPE, FilteredNumberTypes.BLOCKED_NUMBER);
+ contentValues.put(FilteredNumberColumns.SOURCE, FilteredNumberSources.USER);
+ return contentValues;
+ }
+
+ private void assertArrayEquals(String[] expected, String[] actual) {
+ assertEquals(Arrays.toString(expected), Arrays.toString(actual));
+ }
+}
diff --git a/tests/src/com/android/dialer/compat/UserManagerCompatTest.java b/tests/src/com/android/dialer/compat/UserManagerCompatTest.java
new file mode 100644
index 000000000..ff734a19d
--- /dev/null
+++ b/tests/src/com/android/dialer/compat/UserManagerCompatTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.compat;
+
+import android.test.AndroidTestCase;
+
+import com.android.contacts.common.compat.CompatUtils;
+
+public class UserManagerCompatTest extends AndroidTestCase {
+
+ public void testIsUserUnlocked_N_NullContext() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ try {
+ UserManagerCompat.isUserUnlocked(null);
+ fail("Expected NullPointerException but none was thrown");
+ } catch (NullPointerException e) {}
+ }
+
+ public void testIsUserUnlocked_M_NullContext() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertTrue(UserManagerCompat.isUserUnlocked(null));
+ }
+
+ public void testIsUserUnlocked() {
+ assertTrue(UserManagerCompat.isUserUnlocked(getContext()));
+ }
+}
diff --git a/tests/src/com/android/dialer/contactinfo/ContactPhotoLoaderTest.java b/tests/src/com/android/dialer/contactinfo/ContactPhotoLoaderTest.java
new file mode 100644
index 000000000..42a5ae966
--- /dev/null
+++ b/tests/src/com/android/dialer/contactinfo/ContactPhotoLoaderTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.contactinfo;
+
+import android.app.Instrumentation;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.support.test.InstrumentationRegistry;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.test.AndroidTestCase;
+import android.test.InstrumentationTestCase;
+import android.text.TextUtils;
+
+import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.lettertiles.LetterTileDrawable;
+import com.android.dialer.calllog.ContactInfo;
+import com.android.dialer.calllog.ContactInfoHelper;
+import com.android.dialer.tests.R;
+
+public class ContactPhotoLoaderTest extends InstrumentationTestCase {
+
+ private Context mContext;
+
+ @Override
+ public void setUp() {
+ mContext = getInstrumentation().getTargetContext();
+ }
+
+ public void testConstructor() {
+ ContactPhotoLoader loader = new ContactPhotoLoader(mContext, new ContactInfo());
+ }
+
+ public void testConstructor_NullContext() {
+ try {
+ ContactPhotoLoader loader = new ContactPhotoLoader(null, new ContactInfo());
+ fail();
+ } catch (NullPointerException e) {
+ //expected
+ }
+ }
+
+ public void testConstructor_NullContactInfo() {
+ try {
+ ContactPhotoLoader loader = new ContactPhotoLoader(mContext, null);
+ fail();
+ } catch (NullPointerException e) {
+ //expected
+ }
+ }
+
+ public void testGetIcon_Photo() {
+ ContactInfo info = getTestContactInfo();
+ info.photoUri = getResourceUri(R.drawable.phone_icon);
+ ContactPhotoLoader loader = new ContactPhotoLoader(mContext, info);
+ assertTrue(loader.getIcon() instanceof RoundedBitmapDrawable);
+ }
+
+ public void testGetIcon_Photo_Invalid() {
+ ContactInfo info = getTestContactInfo();
+ info.photoUri = Uri.parse("file://invalid/uri");
+ ContactPhotoLoader loader = new ContactPhotoLoader(mContext, info);
+ //Should fall back to LetterTileDrawable
+ assertTrue(loader.getIcon() instanceof LetterTileDrawable);
+ }
+
+ public void testGetIcon_LetterTile() {
+ ContactInfo info = getTestContactInfo();
+ ContactPhotoLoader loader = new ContactPhotoLoader(mContext, info);
+ assertTrue(loader.getIcon() instanceof LetterTileDrawable);
+ }
+
+ private Uri getResourceUri(int resId) {
+ Context testContext = getInstrumentation().getContext();
+ Resources resources = testContext.getResources();
+
+ assertNotNull(resources.getDrawable(resId));
+ return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
+ + testContext.getPackageName()
+ + '/' + resId);
+ }
+
+ private ContactInfo getTestContactInfo() {
+ ContactInfo info = new ContactInfo();
+ info.name = "foo";
+ info.lookupKey = "bar";
+ return info;
+ }
+} \ No newline at end of file
diff --git a/tests/src/com/android/dialer/database/DatabaseTestUtils.java b/tests/src/com/android/dialer/database/DatabaseTestUtils.java
new file mode 100644
index 000000000..19fff7f89
--- /dev/null
+++ b/tests/src/com/android/dialer/database/DatabaseTestUtils.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.database;
+
+import android.database.MatrixCursor;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Data;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.text.TextUtils;
+
+import com.android.dialer.database.DialerDatabaseHelper.ContactNumber;
+
+public class DatabaseTestUtils {
+ public static MatrixCursor constructNewNameCursor() {
+ final MatrixCursor cursor = new MatrixCursor(new String[]{
+ DialerDatabaseHelper.SmartDialDbColumns.DISPLAY_NAME_PRIMARY,
+ DialerDatabaseHelper.SmartDialDbColumns.CONTACT_ID});
+ return cursor;
+ }
+
+ public static MatrixCursor constructNewContactCursor() {
+ final MatrixCursor cursor = new MatrixCursor(new String[]{
+ Phone._ID, // 0
+ Phone.TYPE, // 1
+ Phone.LABEL, // 2
+ Phone.NUMBER, // 3
+ Phone.CONTACT_ID, // 4
+ Phone.LOOKUP_KEY, // 5
+ Phone.DISPLAY_NAME_PRIMARY, // 6
+ Phone.PHOTO_ID, // 7
+ Data.LAST_TIME_USED, // 8
+ Data.TIMES_USED, // 9
+ Contacts.STARRED, // 10
+ Data.IS_SUPER_PRIMARY, // 11
+ Contacts.IN_VISIBLE_GROUP, // 12
+ Data.IS_PRIMARY, // 13
+ Data.CARRIER_PRESENCE}); // 14
+ return cursor;
+ }
+
+ public static ContactNumber constructNewContactWithDummyIds(MatrixCursor contactCursor,
+ MatrixCursor nameCursor, String number, int id, String displayName) {
+ return constructNewContact(contactCursor, nameCursor, id, number, id, String.valueOf(id),
+ displayName, 0, 0, 0, 0, 0, 0, 0, 0);
+ }
+
+ public static ContactNumber constructNewContact(MatrixCursor contactCursor,
+ MatrixCursor nameCursor, int id, String number, int contactId, String lookupKey,
+ String displayName, int photoId, int lastTimeUsed, int timesUsed, int starred,
+ int isSuperPrimary, int inVisibleGroup, int isPrimary, int carrierPresence) {
+ if (contactCursor == null || nameCursor == null) {
+ throw new IllegalArgumentException("Provided MatrixCursors cannot be null");
+ }
+
+ if (TextUtils.isEmpty(number)) {
+ // Add a dummy number, otherwise DialerDatabaseHelper simply ignores the entire
+ // row if the number is empty
+ number = "0";
+ }
+
+ contactCursor.addRow(new Object[]{id, "", "", number, contactId, lookupKey, displayName,
+ photoId, lastTimeUsed, timesUsed, starred, isSuperPrimary, inVisibleGroup,
+ isPrimary, carrierPresence});
+ nameCursor.addRow(new Object[]{displayName, contactId});
+
+ return new ContactNumber(contactId, id, displayName, number, lookupKey, 0, 0);
+ }
+}
diff --git a/tests/src/com/android/dialer/database/DialerDatabaseHelperTest.java b/tests/src/com/android/dialer/database/DialerDatabaseHelperTest.java
new file mode 100644
index 000000000..a95a79e08
--- /dev/null
+++ b/tests/src/com/android/dialer/database/DialerDatabaseHelperTest.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.database;
+
+import static com.android.dialer.database.DatabaseTestUtils.*;
+
+import android.database.MatrixCursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.test.suitebuilder.annotation.Suppress;
+import android.test.AndroidTestCase;
+
+import com.android.dialer.database.DialerDatabaseHelper;
+import com.android.dialer.database.DialerDatabaseHelper.ContactNumber;
+import com.android.dialer.dialpad.SmartDialNameMatcher;
+import com.android.dialer.dialpad.SmartDialPrefix;
+
+import java.lang.Exception;
+import java.lang.Override;
+import java.util.ArrayList;
+
+/**
+ * Validates the behavior of the smart dial database helper with regards to contact updates and
+ * deletes.
+ * To run this test, use the command:
+ * adb shell am instrument -w -e class com.android.dialer.database.DialerDatabaseHelperTest /
+ * com.android.dialer.tests/android.test.InstrumentationTestRunner
+ */
+@SmallTest
+public class DialerDatabaseHelperTest extends AndroidTestCase {
+
+ private DialerDatabaseHelper mTestHelper;
+ private SQLiteDatabase mDb;
+
+ @Override
+ protected void setUp() {
+ mTestHelper = DialerDatabaseHelper.getNewInstanceForTest(getContext());
+ mDb = mTestHelper.getWritableDatabase();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ final SQLiteDatabase db = mTestHelper.getWritableDatabase();
+ mTestHelper.removeAllContacts(db);
+ super.tearDown();
+ }
+
+ /**
+ * Verifies that a new contact added into the database is a match after the update.
+ */
+ public void testForNewContacts() {
+ final MatrixCursor nameCursor = constructNewNameCursor();
+ final MatrixCursor contactCursor = constructNewContactCursor();
+
+ mTestHelper.insertUpdatedContactsAndNumberPrefix(mDb, contactCursor, 0L);
+ mTestHelper.insertNamePrefixes(mDb, nameCursor);
+ assertEquals(0, getMatchesFromDb("5105272357").size());
+
+ // Insert new contact
+ constructNewContactWithDummyIds(contactCursor, nameCursor,
+ "510-527-2357", 0, "James");
+ mTestHelper.insertUpdatedContactsAndNumberPrefix(mDb, contactCursor, 1L);
+ mTestHelper.insertNamePrefixes(mDb, nameCursor);
+ assertEquals(1, getMatchesFromDb("5105272357").size());
+ }
+
+ /**
+ * Verifies that a contact that has its phone number changed is a match after the update.
+ */
+ public void testForUpdatedContacts() {
+ final MatrixCursor nameCursor = constructNewNameCursor();
+ final MatrixCursor contactCursor = constructNewContactCursor();
+ constructNewContactWithDummyIds(contactCursor, nameCursor,
+ "510-527-2357", 0, "James");
+ mTestHelper.insertUpdatedContactsAndNumberPrefix(mDb, contactCursor, 0L);
+ mTestHelper.insertNamePrefixes(mDb, nameCursor);
+ assertEquals(1, getMatchesFromDb("5105272357").size());
+ assertEquals(0, getMatchesFromDb("6501234567").size());
+
+ // Update the database with the new contact information
+ final MatrixCursor nameCursor2 = constructNewNameCursor();
+ final MatrixCursor contactCursor2 = constructNewContactCursor();
+ constructNewContactWithDummyIds(contactCursor2, nameCursor2,
+ "650-123-4567", 0, "James");
+ mTestHelper.removeUpdatedContacts(mDb, contactCursor2);
+ mTestHelper.insertUpdatedContactsAndNumberPrefix(mDb, contactCursor2, 1L);
+ mTestHelper.insertNamePrefixes(mDb, nameCursor2);
+
+ // Now verify the matches are correct based on the new information
+ assertEquals(0, getMatchesFromDb("5105272357").size());
+ assertEquals(1, getMatchesFromDb("6501234567").size());
+ }
+
+ /**
+ * Verifies that a contact that is deleted from CP2 is similarly deleted from the database
+ */
+ public void testForDeletedContacts() {
+ final MatrixCursor nameCursor = constructNewNameCursor();
+ final MatrixCursor contactCursor = constructNewContactCursor();
+ constructNewContactWithDummyIds(contactCursor, nameCursor,
+ "510-527-2357", 0, "James");
+ mTestHelper.insertUpdatedContactsAndNumberPrefix(mDb, contactCursor, 0L);
+ mTestHelper.insertNamePrefixes(mDb, nameCursor);
+ assertEquals(1, getMatchesFromDb("5105272357").size());
+
+ // Delete the contact and update its projection.
+ final MatrixCursor deletedCursor =
+ new MatrixCursor(DialerDatabaseHelper.DeleteContactQuery.PROJECTION);
+ deletedCursor.addRow(new Object[] {0, 1L});
+ mTestHelper.removeDeletedContacts(mDb, deletedCursor);
+ assertEquals(0, getMatchesFromDb("5105272357").size());
+ }
+
+ /**
+ * Verifies that when a contact's number is deleted (but not the entire contact), the
+ * number is correctly deleted from the database.
+ */
+ public void testForDeletedNumber() {
+ final MatrixCursor nameCursor = constructNewNameCursor();
+ final MatrixCursor contactCursor = constructNewContactCursor();
+ constructNewContactWithDummyIds(contactCursor, nameCursor,
+ "510-527-2357", 0, "James");
+ mTestHelper.insertUpdatedContactsAndNumberPrefix(mDb, contactCursor, 0L);
+ mTestHelper.insertNamePrefixes(mDb, nameCursor);
+ assertEquals(1, getMatchesFromDb("5105272357").size());
+
+ // Match no longer exists after number was deleted from contact
+ final MatrixCursor updatedContactCursor =
+ new MatrixCursor(DialerDatabaseHelper.UpdatedContactQuery.PROJECTION);
+ updatedContactCursor.addRow(new Object[] {0});
+ mTestHelper.removeUpdatedContacts(mDb, updatedContactCursor);
+ assertEquals(0, getMatchesFromDb("5105272357").size());
+ }
+
+ private ArrayList<ContactNumber> getMatchesFromDb(String query) {
+ final SmartDialNameMatcher nameMatcher = new SmartDialNameMatcher(query,
+ SmartDialPrefix.getMap());
+ return mTestHelper.getLooseMatches(query, nameMatcher);
+ }
+}
diff --git a/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java b/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java
new file mode 100644
index 000000000..625f3fdb5
--- /dev/null
+++ b/tests/src/com/android/dialer/database/FilteredNumberAsyncQueryHandlerTest.java
@@ -0,0 +1,457 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.database;
+
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.net.Uri;
+import android.provider.BlockedNumberContract;
+import android.provider.BlockedNumberContract.BlockedNumbers;
+import android.test.InstrumentationTestCase;
+import android.test.mock.MockContentResolver;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.test.mocks.MockContentProvider;
+import com.android.contacts.common.test.mocks.MockContentProvider.Query;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnBlockNumberListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnCheckBlockedListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnUnblockNumberListener;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberSources;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberTypes;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+@SmallTest
+public class FilteredNumberAsyncQueryHandlerTest extends InstrumentationTestCase {
+
+ private static final String E164_NUMBER = "+16502530000";
+ private static final String NUMBER = "6502530000";
+ private static final String COUNTRY_ISO = "US";
+ private static final Integer ID = 1;
+ private static final Integer ID2 = 2;
+ private static final Uri BLOCKED_NUMBER_URI_N = CompatUtils.isNCompatible() ?
+ Uri.withAppendedPath(BlockedNumberContract.AUTHORITY_URI, "blocked") : null;
+ private static final Uri BLOCKED_NUMBER_URI_M =
+ Uri.withAppendedPath(FilteredNumberContract.AUTHORITY_URI, "filtered_numbers_table");
+ private static final Uri BLOCKED_NUMBER_URI = CompatUtils.isNCompatible() ? BLOCKED_NUMBER_URI_N
+ : BLOCKED_NUMBER_URI_M;
+ private static final Uri BLOCKED_NUMBER_URI_WITH_ID =
+ ContentUris.withAppendedId(BLOCKED_NUMBER_URI, ID);
+ private static final Uri EXPECTED_URI = Uri.fromParts("android", "google", "dialer");
+
+ private final MockContentResolver mContentResolver = new MockContentResolver();
+ private final MockContentProvider mContentProvider = new MockContentProvider();
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ FilteredNumberCompat.setIsEnabledForTest(true);
+ if (CompatUtils.isNCompatible()) {
+ mContentResolver.addProvider(BlockedNumberContract.AUTHORITY, mContentProvider);
+ } else {
+ mContentResolver.addProvider(FilteredNumberContract.AUTHORITY, mContentProvider);
+ }
+ }
+
+ public void testHasBlockedNumbers_Disabled() throws Throwable {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ final MockContentResolver resolver = new MockContentResolver();
+ MockContentProvider disabledProvider = new MockContentProvider();
+ resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
+
+ disabledProvider.expectQuery(BLOCKED_NUMBER_URI_M).withProjection(FilteredNumberColumns._ID)
+ .withSelection(FilteredNumberColumns.TYPE + "="
+ + FilteredNumberTypes.BLOCKED_NUMBER, null).returnRow(ID);
+ final HasBlockedNumbersListener listener = new HasBlockedNumbersListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(resolver).hasBlockedNumbers(listener);
+ }
+ });
+ assertTrue(listener.waitForCallback());
+ disabledProvider.verify();
+ }
+
+ public void testHasBlockedNumbers_NoResults() throws Throwable {
+ newHasBlockedNumbersExpectedQuery().returnEmptyCursor();
+ final HasBlockedNumbersListener listener = new HasBlockedNumbersListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver).hasBlockedNumbers(listener);
+ }
+ });
+ assertFalse(listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testHasBlockedNumbers() throws Throwable {
+ newHasBlockedNumbersExpectedQuery().returnRow(ID);
+ final HasBlockedNumbersListener listener = new HasBlockedNumbersListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver).hasBlockedNumbers(listener);
+ }
+ });
+ assertTrue(listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testIsBlockedNumber_Disabled() throws Throwable {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ final MockContentResolver resolver = new MockContentResolver();
+ MockContentProvider disabledProvider = new MockContentProvider();
+ resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
+ disabledProvider.expectQuery(BLOCKED_NUMBER_URI_M)
+ .withProjection(FilteredNumberColumns._ID, FilteredNumberColumns.TYPE)
+ .withSelection(FilteredNumberColumns.NORMALIZED_NUMBER + " = ?", E164_NUMBER)
+ .returnRow(ID, FilteredNumberTypes.BLOCKED_NUMBER);
+ final CheckBlockedListener listener = new CheckBlockedListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(resolver)
+ .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
+ }
+ });
+ assertEquals(ID, listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testIsBlockedNumber_NoResults() throws Throwable {
+ newIsBlockedNumberExpectedQuery().returnEmptyCursor();
+ final CheckBlockedListener listener = new CheckBlockedListener();
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver)
+ .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
+ }
+ });
+ assertNull(listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testIsBlockedNumber() throws Throwable {
+ if (CompatUtils.isNCompatible()) {
+ newIsBlockedNumberExpectedQuery().returnRow(ID);
+ } else {
+ newIsBlockedNumberExpectedQuery().returnRow(ID, FilteredNumberTypes.BLOCKED_NUMBER);
+ }
+ final CheckBlockedListener listener = new CheckBlockedListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver)
+ .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
+ }
+ });
+ assertEquals(ID, listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testIsBlockedNumber_MultipleResults() throws Throwable {
+ if (CompatUtils.isNCompatible()) {
+ newIsBlockedNumberExpectedQuery().returnRow(ID).returnRow(ID2);
+ } else {
+ newIsBlockedNumberExpectedQuery().returnRow(ID, FilteredNumberTypes.BLOCKED_NUMBER)
+ .returnRow(ID2, FilteredNumberTypes.BLOCKED_NUMBER);
+ }
+ final CheckBlockedListener listener = new CheckBlockedListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver)
+ .isBlockedNumber(listener, NUMBER, COUNTRY_ISO);
+ }
+ });
+ // When there are multiple matches, the first is returned
+ assertEquals(ID, listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testBlockNumber_Disabled() throws Throwable {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ final MockContentResolver resolver = new MockContentResolver();
+ MockContentProvider disabledProvider = new MockContentProvider();
+ resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
+
+ disabledProvider.expectInsert(BLOCKED_NUMBER_URI_M, newBlockNumberContentValuesM(),
+ EXPECTED_URI);
+ final BlockNumberListener listener = new BlockNumberListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(resolver).blockNumber(listener, E164_NUMBER,
+ NUMBER, COUNTRY_ISO);
+ }
+ });
+ assertSame(EXPECTED_URI, listener.waitForCallback());
+ disabledProvider.verify();
+ }
+
+ public void testBlockNumber() throws Throwable {
+ mContentProvider.expectInsert(BLOCKED_NUMBER_URI, newBlockNumberContentValues(),
+ EXPECTED_URI);
+ final BlockNumberListener listener = new BlockNumberListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver).blockNumber(listener,
+ E164_NUMBER, NUMBER, COUNTRY_ISO);
+ }
+ });
+ assertSame(EXPECTED_URI, listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testBlockNumber_NullNormalizedNumber() throws Throwable {
+ mContentProvider.expectInsert(BLOCKED_NUMBER_URI, newBlockNumberContentValues(),
+ EXPECTED_URI);
+ final BlockNumberListener listener = new BlockNumberListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver).blockNumber(listener,
+ NUMBER, COUNTRY_ISO);
+ }
+ });
+ assertSame(EXPECTED_URI, listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ public void testUnblockNumber_Disabled() throws Throwable {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ final MockContentResolver resolver = new MockContentResolver();
+ MockContentProvider disabledProvider = new MockContentProvider();
+ resolver.addProvider(FilteredNumberContract.AUTHORITY, disabledProvider);
+
+ Uri uriWithId = ContentUris.withAppendedId(BLOCKED_NUMBER_URI_M, ID);
+ disabledProvider.expectQuery(uriWithId)
+ .withProjection(null)
+ .withDefaultProjection(FilteredNumberCompat.getIdColumnName())
+ .withSelection(null, null)
+ .withSortOrder(null)
+ .returnRow(ID);
+ disabledProvider.expectDelete(uriWithId).returnRowsAffected(1);
+ final UnblockNumberListener listener = new UnblockNumberListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(resolver).unblock(listener, ID);
+ }
+ });
+ assertNotNull(listener.waitForCallback());
+ disabledProvider.verify();
+ }
+
+ public void testUnblockNumber_NullId() {
+ try {
+ new FilteredNumberAsyncQueryHandler(mContentResolver).unblock(null, (Integer) null);
+ fail();
+ } catch (IllegalArgumentException e) {}
+ }
+
+ public void testUnblockNumber() throws Throwable {
+ mContentProvider.expectQuery(BLOCKED_NUMBER_URI_WITH_ID)
+ .withProjection(null)
+ .withDefaultProjection(FilteredNumberCompat.getIdColumnName())
+ .withSelection(null, null)
+ .withSortOrder(null)
+ .returnRow(ID);
+ mContentProvider.expectDelete(BLOCKED_NUMBER_URI_WITH_ID).returnRowsAffected(1);
+ final UnblockNumberListener listener = new UnblockNumberListener();
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new FilteredNumberAsyncQueryHandler(mContentResolver).unblock(listener, ID);
+ }
+ });
+ assertNotNull(listener.waitForCallback());
+ mContentProvider.verify();
+ }
+
+ private Query newIsBlockedNumberExpectedQuery() {
+ if (CompatUtils.isNCompatible()) {
+ return newIsBlockedNumberExpectedQueryN();
+ }
+ return newIsBlockedNumberExpectedQueryM();
+ }
+
+ private Query newIsBlockedNumberExpectedQueryN() {
+ return mContentProvider.expectQuery(BLOCKED_NUMBER_URI)
+ .withProjection(BlockedNumbers.COLUMN_ID)
+ .withSelection(BlockedNumbers.COLUMN_E164_NUMBER + " = ?", E164_NUMBER);
+ }
+
+ private Query newIsBlockedNumberExpectedQueryM() {
+ return mContentProvider.expectQuery(BLOCKED_NUMBER_URI)
+ .withProjection(FilteredNumberColumns._ID, FilteredNumberColumns.TYPE)
+ .withSelection(FilteredNumberColumns.NORMALIZED_NUMBER + " = ?", E164_NUMBER);
+ }
+
+ private Query newHasBlockedNumbersExpectedQuery() {
+ if (CompatUtils.isNCompatible()) {
+ return newHasBlockedNumbersExpectedQueryN();
+ }
+ return newHasBlockedNumbersExpectedQueryM();
+ }
+
+ private Query newHasBlockedNumbersExpectedQueryN() {
+ return mContentProvider.expectQuery(BLOCKED_NUMBER_URI)
+ .withProjection(BlockedNumbers.COLUMN_ID)
+ .withSelection(null, null);
+ }
+
+ private Query newHasBlockedNumbersExpectedQueryM() {
+ return mContentProvider.expectQuery(BLOCKED_NUMBER_URI).withProjection(
+ FilteredNumberColumns._ID)
+ .withSelection(FilteredNumberColumns.TYPE + "="
+ + FilteredNumberTypes.BLOCKED_NUMBER, null);
+ }
+
+ private ContentValues newBlockNumberContentValues() {
+ if (CompatUtils.isNCompatible()) {
+ return newBlockNumberContentValuesN();
+ }
+ return newBlockNumberContentValuesM();
+ }
+
+ private ContentValues newBlockNumberContentValuesN() {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, NUMBER);
+ return contentValues;
+ }
+
+ private ContentValues newBlockNumberContentValuesM() {
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(FilteredNumberColumns.NORMALIZED_NUMBER, E164_NUMBER);
+ contentValues.put(FilteredNumberColumns.NUMBER, NUMBER);
+ contentValues.put(FilteredNumberColumns.COUNTRY_ISO, COUNTRY_ISO);
+ contentValues.put(FilteredNumberColumns.TYPE, FilteredNumberTypes.BLOCKED_NUMBER);
+ contentValues.put(FilteredNumberColumns.SOURCE, FilteredNumberSources.USER);
+ return contentValues;
+ }
+
+ private class CheckBlockedListener implements OnCheckBlockedListener {
+ public final CountDownLatch onCheckCompleteCalled;
+ public Integer id;
+
+ public CheckBlockedListener() {
+ onCheckCompleteCalled = new CountDownLatch(1);
+ }
+
+ @Override
+ public void onCheckComplete(Integer id) {
+ this.id = id;
+ onCheckCompleteCalled.countDown();
+ }
+
+ public Integer waitForCallback() throws InterruptedException {
+ if (!onCheckCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
+ throw new IllegalStateException("Waiting on callback timed out.");
+ }
+ return id;
+ }
+ }
+
+ private class HasBlockedNumbersListener implements OnHasBlockedNumbersListener {
+ public final CountDownLatch onHasBlockedNumbersCalled;
+ public boolean hasBlockedNumbers;
+
+ public HasBlockedNumbersListener() {
+ onHasBlockedNumbersCalled = new CountDownLatch(1);
+ }
+
+ @Override
+ public void onHasBlockedNumbers(boolean hasBlockedNumbers) {
+ this.hasBlockedNumbers = hasBlockedNumbers;
+ onHasBlockedNumbersCalled.countDown();
+ }
+
+ public boolean waitForCallback() throws InterruptedException {
+ if (!onHasBlockedNumbersCalled.await(5000, TimeUnit.MILLISECONDS)) {
+ throw new IllegalStateException("Waiting on callback timed out.");
+ }
+ return hasBlockedNumbers;
+ }
+ }
+
+ private class BlockNumberListener implements OnBlockNumberListener {
+ public final CountDownLatch onBlockCompleteCalled;
+ public Uri uri;
+
+ public BlockNumberListener() {
+ onBlockCompleteCalled = new CountDownLatch(1);
+ }
+
+ @Override
+ public void onBlockComplete(Uri uri) {
+ this.uri = uri;
+ onBlockCompleteCalled.countDown();
+ }
+
+ public Uri waitForCallback() throws InterruptedException {
+ if (!onBlockCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
+ throw new IllegalStateException("Waiting on callback timed out.");
+ }
+ return uri;
+ }
+ }
+
+ private class UnblockNumberListener implements OnUnblockNumberListener {
+ public final CountDownLatch onUnblockCompleteCalled;
+ public Integer result;
+
+ public UnblockNumberListener() {
+ onUnblockCompleteCalled = new CountDownLatch(1);
+ }
+
+ @Override
+ public void onUnblockComplete(int rows, ContentValues values) {
+ result = rows;
+ onUnblockCompleteCalled.countDown();
+ }
+
+ public Integer waitForCallback() throws InterruptedException {
+ if (!onUnblockCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
+ throw new IllegalStateException("Waiting on callback timed out.");
+ }
+ return result;
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java b/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java
new file mode 100644
index 000000000..1191560f5
--- /dev/null
+++ b/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.DatabaseUtils;
+import android.net.Uri;
+import android.test.ProviderTestCase2;
+import android.test.suitebuilder.annotation.MediumTest;
+
+@MediumTest
+public class FilteredNumberProviderTest extends
+ ProviderTestCase2<FilteredNumberProviderTest.TestFilteredNumberProvider> {
+ private ContentResolver mResolver;
+
+ private static final String TIME_ZONE_AMERICA_LOS_ANGELES = "America/Los_Angeles";
+ private static final String DEFAULT_TIMEZONE = TIME_ZONE_AMERICA_LOS_ANGELES;
+ private static final String DEFAULT_COUNTRY_ISO = "US";
+ private static final String TEST_NUMBER = "234567890";
+ private static final String TEST_NORMALIZED_NUMBER = "+1234567890";
+ private static final long TEST_TIME = 1439936706;
+
+ public FilteredNumberProviderTest () {
+ super(TestFilteredNumberProvider.class, FilteredNumberContract.AUTHORITY);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mResolver = getMockContentResolver();
+ }
+
+ public void testInsert() {
+ // Insert row
+ Uri uri = mResolver.insert(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI,
+ getTestValues(null));
+ assertNotNull(uri);
+ long id = ContentUris.parseId(uri);
+ assertTrue(id > 0);
+ }
+
+ public void testQuery() {
+ Cursor cursor = mResolver.query(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI, null, null, null, null);
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 0);
+ cursor.close();
+ }
+
+ public void testInsertAndQuery() {
+ // Insert row
+ ContentValues testValues = getTestValues(null);
+ Uri uri = mResolver.insert(FilteredNumberContract.FilteredNumber.CONTENT_URI, testValues);
+
+ // Query
+ Cursor cursor = mResolver.query(uri, null, null, null, null);
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 1);
+
+ cursor.moveToFirst();
+ assertCursorValues(cursor, testValues);
+ cursor.close();
+ }
+
+ public void testIllegalUri() {
+ try {
+ mResolver.query(
+ Uri.withAppendedPath(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI,
+ "ILLEGAL"), null, null, null, null);
+ fail("Expecting exception but none was thrown.");
+ } catch (IllegalArgumentException e) {
+ }
+ }
+
+ public void testQueryWithId() {
+ // Insert row
+ ContentValues testValues = getTestValues(null);
+ Uri uri = mResolver.insert(FilteredNumberContract.FilteredNumber.CONTENT_URI, testValues);
+ long id = ContentUris.parseId(uri);
+
+ // Query
+ Cursor cursor = mResolver.query(
+ ContentUris.withAppendedId(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI,
+ id), null, null, null, null);
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 1);
+
+ cursor.moveToFirst();
+ assertCursorValues(cursor, testValues);
+ cursor.close();
+ }
+
+ public void testDelete() {
+ // Insert row
+ Uri uri = mResolver.insert(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI,
+ getTestValues(null));
+ long id = ContentUris.parseId(uri);
+
+ // Delete row
+ int rows = mResolver.delete(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI,
+ FilteredNumberContract.FilteredNumberColumns._ID + " = ?",
+ new String[]{Long.toString(id)});
+ assertEquals(rows, 1);
+
+ // Query
+ Cursor cursor = mResolver.query(uri, null, null, null, null);
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 0);
+ cursor.close();
+ }
+
+ public void testUpdate() {
+ // Insert row
+ Uri uri = mResolver.insert(
+ FilteredNumberContract.FilteredNumber.CONTENT_URI,
+ getTestValues(null));
+
+ // Update row
+ ContentValues v = new ContentValues();
+ v.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 3);
+ v.put(FilteredNumberContract.FilteredNumberColumns.LAST_TIME_FILTERED, TEST_TIME);
+ int rows = mResolver.update(FilteredNumberContract.FilteredNumber.CONTENT_URI, v,
+ FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER + " = ?",
+ new String[]{TEST_NORMALIZED_NUMBER});
+ assertEquals(rows, 1);
+
+ ContentValues expected = getTestValues(TEST_TIME);
+ expected.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 3);
+ expected.put(FilteredNumberContract.FilteredNumberColumns.LAST_TIME_FILTERED, TEST_TIME);
+
+ // Re-query
+ Cursor cursor = mResolver.query(uri, null, null, null, null);
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 1);
+ cursor.moveToFirst();
+ assertCursorValues(cursor, expected);
+ cursor.close();
+ }
+
+ public void testInsertDefaultValues() {
+ // Insert row
+ ContentValues v = getTestValues(null);
+ Uri uri = mResolver.insert(FilteredNumberContract.FilteredNumber.CONTENT_URI, v);
+ assertNotNull(uri);
+ long id = ContentUris.parseId(uri);
+ assertTrue(id > 0);
+
+ // Query
+ Cursor cursor = mResolver.query(uri, null, null, null, null);
+ assertNotNull(cursor);
+ assertEquals(cursor.getCount(), 1);
+
+ int creationTimeIndex =
+ cursor.getColumnIndex(FilteredNumberContract.FilteredNumberColumns.CREATION_TIME);
+ cursor.moveToFirst();
+ assertEquals(cursor.getLong(creationTimeIndex), TEST_TIME);
+ cursor.close();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ getProvider().closeDb();
+ super.tearDown();
+ }
+
+ private ContentValues getTestValues(Long timeNow) {
+ ContentValues v = new ContentValues();
+ v.putNull(FilteredNumberContract.FilteredNumberColumns._ID);
+ v.put(FilteredNumberContract.FilteredNumberColumns.NORMALIZED_NUMBER,
+ TEST_NORMALIZED_NUMBER);
+ v.put(FilteredNumberContract.FilteredNumberColumns.NUMBER, TEST_NUMBER);
+ v.put(FilteredNumberContract.FilteredNumberColumns.COUNTRY_ISO, DEFAULT_COUNTRY_ISO);
+ v.put(FilteredNumberContract.FilteredNumberColumns.TIMES_FILTERED, 0);
+ v.putNull(FilteredNumberContract.FilteredNumberColumns.LAST_TIME_FILTERED);
+ v.put(FilteredNumberContract.FilteredNumberColumns.CREATION_TIME, timeNow);
+ v.put(FilteredNumberContract.FilteredNumberColumns.SOURCE, 1);
+ v.put(FilteredNumberContract.FilteredNumberColumns.TYPE, 1);
+ return v;
+ }
+
+ private void assertCursorValues(Cursor cursor, ContentValues expectedValues) {
+ ContentValues v = new ContentValues();
+ DatabaseUtils.cursorRowToContentValues(cursor, v);
+ v.remove(FilteredNumberContract.FilteredNumberColumns._ID);
+ expectedValues.remove(FilteredNumberContract.FilteredNumberColumns._ID);
+ assertEquals(v.toString(), expectedValues.toString());
+ }
+
+ public static class TestFilteredNumberProvider extends FilteredNumberProvider {
+ private DialerDatabaseHelper mDialerDatabaseHelper;
+
+ @Override
+ protected DialerDatabaseHelper getDatabaseHelper(Context context) {
+ if (mDialerDatabaseHelper == null) {
+ mDialerDatabaseHelper = DialerDatabaseHelper.getNewInstanceForTest(context);
+ }
+ return mDialerDatabaseHelper;
+ }
+
+ protected void closeDb() {
+ mDialerDatabaseHelper.close();
+ }
+
+ @Override
+ protected long getCurrentTimeMs() {
+ return TEST_TIME;
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/database/SmartDialPrefixTest.java b/tests/src/com/android/dialer/database/SmartDialPrefixTest.java
index 9cb842e56..78962e3f4 100644
--- a/tests/src/com/android/dialer/database/SmartDialPrefixTest.java
+++ b/tests/src/com/android/dialer/database/SmartDialPrefixTest.java
@@ -16,16 +16,12 @@
package com.android.dialer.database;
+import static com.android.dialer.database.DatabaseTestUtils.*;
+
import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.suitebuilder.annotation.SmallTest;
-import android.test.suitebuilder.annotation.Suppress;
import android.test.AndroidTestCase;
-import android.text.TextUtils;
-import android.util.Log;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Data;
import com.android.dialer.database.DialerDatabaseHelper;
import com.android.dialer.database.DialerDatabaseHelper.ContactNumber;
@@ -91,76 +87,6 @@ public class SmartDialPrefixTest extends AndroidTestCase {
super.tearDown();
}
- @Suppress
- public void testForNewContacts() {
- }
-
- @Suppress
- public void testForUpdatedContacts() {
- }
-
- @Suppress
- public void testForDeletedContacts() {
- }
-
- @Suppress
- public void testSize() {
- }
-
-
- private MatrixCursor constructNewNameCursor() {
- final MatrixCursor cursor = new MatrixCursor(new String[]{
- DialerDatabaseHelper.SmartDialDbColumns.DISPLAY_NAME_PRIMARY,
- DialerDatabaseHelper.SmartDialDbColumns.CONTACT_ID});
- return cursor;
- }
-
- private MatrixCursor constructNewContactCursor() {
- final MatrixCursor cursor = new MatrixCursor(new String[]{
- Phone._ID, // 0
- Phone.TYPE, // 1
- Phone.LABEL, // 2
- Phone.NUMBER, // 3
- Phone.CONTACT_ID, // 4
- Phone.LOOKUP_KEY, // 5
- Phone.DISPLAY_NAME_PRIMARY, // 6
- Phone.PHOTO_ID, // 7
- Data.LAST_TIME_USED, // 8
- Data.TIMES_USED, // 9
- Contacts.STARRED, // 10
- Data.IS_SUPER_PRIMARY, // 11
- Contacts.IN_VISIBLE_GROUP, // 12
- Data.IS_PRIMARY}); // 13
- return cursor;
- }
-
- private ContactNumber constructNewContactWithDummyIds(MatrixCursor contactCursor,
- MatrixCursor nameCursor, String number, int id, String displayName) {
- return constructNewContact(contactCursor, nameCursor, id, number, id, String.valueOf(id),
- displayName, 0, 0, 0, 0, 0, 0, 0);
- }
-
- private ContactNumber constructNewContact(MatrixCursor contactCursor, MatrixCursor nameCursor,
- int id, String number, int contactId, String lookupKey, String displayName, int photoId,
- int lastTimeUsed, int timesUsed, int starred, int isSuperPrimary, int inVisibleGroup,
- int isPrimary) {
- assertNotNull(contactCursor);
- assertNotNull(nameCursor);
-
- if (TextUtils.isEmpty(number)) {
- // Add a dummy number, otherwise DialerDatabaseHelper simply ignores the entire
- // row if the number is empty
- number = "0";
- }
-
- contactCursor.addRow(new Object[]{id, "", "", number, contactId, lookupKey, displayName,
- photoId, lastTimeUsed, timesUsed, starred, isSuperPrimary, inVisibleGroup,
- isPrimary});
- nameCursor.addRow(new Object[]{displayName, contactId});
-
- return new ContactNumber(contactId, id, displayName, number, lookupKey, 0);
- }
-
private ArrayList<ContactNumber> getLooseMatchesFromDb(String query) {
final SmartDialNameMatcher nameMatcher = new SmartDialNameMatcher(query,
SmartDialPrefix.getMap());
diff --git a/tests/src/com/android/dialer/database/VoicemailArchiveProviderTest.java b/tests/src/com/android/dialer/database/VoicemailArchiveProviderTest.java
new file mode 100644
index 000000000..abc2dc5b0
--- /dev/null
+++ b/tests/src/com/android/dialer/database/VoicemailArchiveProviderTest.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.database;
+
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.test.ProviderTestCase2;
+import android.test.mock.MockContentResolver;
+import com.android.dialer.database.VoicemailArchiveContract.VoicemailArchive;
+
+import java.io.File;
+import java.io.OutputStream;
+
+/**
+ * Tests for {@link VoicemailArchiveProvider}.
+ */
+public class VoicemailArchiveProviderTest extends
+ ProviderTestCase2<VoicemailArchiveProviderTest.TestVoicemailArchiveProvider> {
+ private static final String TEST_MIME_TYPE = "audio/mp3";
+ private static final String TEST_NUMBER = "+1412555555";
+ private static final int TEST_ARCHIVED = 1;
+ private static final String TEST_STRING = "TEST";
+
+ private MockContentResolver mResolver;
+ private Cursor mCursor;
+ private Uri mVoicemailUri;
+
+ public VoicemailArchiveProviderTest() {
+ super(TestVoicemailArchiveProvider.class, VoicemailArchiveContract.AUTHORITY);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mResolver = getMockContentResolver();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ if (mCursor != null) {
+ mCursor.close();
+ }
+ // Need to delete test.cache folder created by {@link android.test.ProviderTestCase2}
+ deleteRecursive(getContext().getCacheDir());
+ getProvider().closeDb();
+ super.tearDown();
+ }
+
+ public void testInsert() {
+ insertVoicemail();
+ assertNotNull(mVoicemailUri);
+ assertTrue(doesRowExist());
+ long id = ContentUris.parseId(mVoicemailUri);
+ assertTrue(id > 0);
+ }
+
+ public void testQuery_createFile() throws Exception {
+ insertVoicemail();
+ assertTrue(doesRowExist());
+ assertFalse(doesFileExist());
+ createFile();
+ assertTrue(doesFileExist());
+ }
+
+ public void testQuery_createFileMimeTypeIsAMR() throws Exception {
+ insertVoicemailWithMimeType("audio/amr");
+ assertTrue(doesRowExist());
+ assertFalse(doesFileExist());
+ createFile();
+ assertTrue(doesFileExist());
+ assertEquals("amr", getFileExtension(getFilePath()));
+ }
+
+ public void testQuery_createFileMimeTypeIsMP3() throws Exception {
+ insertVoicemailWithMimeType("audio/mpeg");
+ assertTrue(doesRowExist());
+ assertFalse(doesFileExist());
+ createFile();
+ assertTrue(doesFileExist());
+ assertEquals("mp3", getFileExtension(getFilePath()));
+ }
+
+ public void testQuery_createFileMimeTypeNotExists() throws Exception {
+ insertVoicemailWithMimeType(TEST_STRING);
+ assertTrue(doesRowExist());
+ assertFalse(doesFileExist());
+ createFile();
+ assertTrue(doesFileExist());
+ assertEquals("", getFileExtension(getFilePath()));
+ }
+
+ public void testQuery() {
+ insertVoicemail();
+ updateCursor();
+ assertCursorCount(1);
+ assertContentValues();
+ }
+
+ public void testQuery_correctValuesSelection() {
+ insertVoicemail();
+ updateCursorWithIdQuery();
+ assertCursorCount(1);
+ assertContentValues();
+ }
+
+ public void testQuery_illegalUri() {
+ try {
+ mResolver.query(Uri.withAppendedPath(VoicemailArchive.CONTENT_URI, TEST_STRING),
+ null, null, null, null);
+ fail("Expecting exception but none was thrown.");
+ } catch (IllegalArgumentException e) {}
+ }
+
+ public void testUpdate() throws Exception {
+ insertVoicemail();
+ assertTrue(doesRowExist());
+ ContentValues values = new ContentValues();
+ values.put(VoicemailArchive.MIME_TYPE, TEST_STRING);
+ values.put(VoicemailArchive.NUMBER, TEST_STRING);
+ values.put(VoicemailArchive.ARCHIVED, false);
+ mResolver.update(mVoicemailUri, values, null, null);
+ updateCursor();
+ assertEquals(TEST_STRING, mCursor.getString(mCursor.getColumnIndex(VoicemailArchive.MIME_TYPE)));
+ assertEquals(TEST_STRING, mCursor.getString(mCursor.getColumnIndex(VoicemailArchive.NUMBER)));
+ assertEquals(false, mCursor.getInt(
+ mCursor.getColumnIndex(VoicemailArchive.ARCHIVED)) == 1);
+ }
+
+ public void testUpdate_selection() throws Exception {
+ insertVoicemail();
+ assertTrue(doesRowExist());
+ ContentValues values = new ContentValues();
+ values.put(VoicemailArchive.MIME_TYPE, TEST_STRING);
+ values.put(VoicemailArchive.NUMBER, TEST_STRING);
+ values.put(VoicemailArchive.ARCHIVED, false);
+ mResolver.update(VoicemailArchive.CONTENT_URI, values, getIdQuery(), null);
+ updateCursor();
+ assertEquals(TEST_STRING, mCursor.getString(mCursor.getColumnIndex(VoicemailArchive.MIME_TYPE)));
+ assertEquals(TEST_STRING, mCursor.getString(mCursor.getColumnIndex(VoicemailArchive.NUMBER)));
+ assertEquals(false, mCursor.getInt(
+ mCursor.getColumnIndex(VoicemailArchive.ARCHIVED)) == 1);
+ }
+
+ public void testUpdate_illegalUri() {
+ try {
+ mResolver.update(Uri.withAppendedPath(VoicemailArchive.CONTENT_URI, TEST_STRING),
+ null, null, null);
+ fail("Expecting exception but none was thrown.");
+ } catch (IllegalArgumentException e) {}
+ }
+
+ public void testDelete() throws Exception {
+ insertVoicemail();
+ createFile();
+ assertTrue(doesRowExist());
+ assertTrue(doesFileExist());
+ mResolver.delete(mVoicemailUri, null, null);
+ assertFalse(doesRowExist());
+ assertFalse(doesFileExist());
+ }
+
+ public void testDelete_selection() throws Exception{
+ insertVoicemail();
+ createFile();
+ assertTrue(doesRowExist());
+ assertTrue(doesFileExist());
+ mResolver.delete(VoicemailArchive.CONTENT_URI, getIdQuery(), null);
+ assertFalse(doesRowExist());
+ assertFalse(doesFileExist());
+ }
+
+ public void testDelete_illegalUri() {
+ try {
+ mResolver.delete(Uri.withAppendedPath(VoicemailArchive.CONTENT_URI, TEST_STRING),
+ null, null);
+ fail("Expecting exception but none was thrown.");
+ } catch (IllegalArgumentException e) {}
+ }
+
+ private boolean doesRowExist() {
+ Cursor tempCursor = mResolver.query(mVoicemailUri, null, null, null, null);
+ boolean rowExists = tempCursor != null && tempCursor.getCount() > 0;
+ tempCursor.close();
+ return rowExists;
+ }
+
+ private boolean doesFileExist() {
+ File voicemailFile = new File(getFilePath());
+ return voicemailFile.exists();
+ }
+
+ private static String getFileExtension(String filePath) {
+ File file = new File(filePath);
+ String fileName = file.getName();
+ int index = fileName.lastIndexOf(".");
+ return index > 0 ? fileName.substring(index + 1) : "";
+ }
+
+ private void assertCursorCount(int count) {
+ assertEquals(count, mCursor.getCount());
+ }
+
+ private void assertContentValues() {
+ assertEquals(TEST_MIME_TYPE, mCursor
+ .getString(mCursor.getColumnIndex(VoicemailArchive.MIME_TYPE)));
+ assertEquals(TEST_NUMBER, mCursor
+ .getString(mCursor.getColumnIndex(VoicemailArchive.NUMBER)));
+ assertEquals(TEST_ARCHIVED, mCursor
+ .getInt(mCursor.getColumnIndex(VoicemailArchive.ARCHIVED)));
+ }
+
+ private void insertVoicemail() {
+ mVoicemailUri = mResolver.insert(VoicemailArchive.CONTENT_URI, getTestValues());
+ }
+
+ private void insertVoicemailWithMimeType(String mimeType) {
+ ContentValues values = getTestValues();
+ values.put(VoicemailArchive.MIME_TYPE, mimeType);
+ mVoicemailUri = mResolver.insert(VoicemailArchive.CONTENT_URI, values);
+ }
+
+ private void updateCursor() {
+ mCursor = mResolver.query(mVoicemailUri, null, null, null, null);
+ assertEquals(true, mCursor.getCount() > 0);
+ mCursor.moveToFirst();
+ }
+
+ private void updateCursorWithIdQuery() {
+ mCursor = mResolver.query(mVoicemailUri, null, getIdQuery(), null, null);
+ assertEquals(true, mCursor.getCount() > 0);
+ mCursor.moveToFirst();
+ }
+
+ private void createFile() throws Exception {
+ assertFalse(doesFileExist());
+ // Opening output stream and closing it should create the file
+ OutputStream outputStream = mResolver.openOutputStream(mVoicemailUri);
+ outputStream.close();
+ }
+
+ private String getIdQuery() {
+ return VoicemailArchive._ID + "=" + ContentUris.parseId(mVoicemailUri);
+ }
+
+ private String getFilePath() {
+ if (mCursor == null) {
+ updateCursor();
+ }
+ return mCursor.getString(mCursor.getColumnIndex(VoicemailArchive._DATA));
+ }
+
+ private static ContentValues getTestValues() {
+ ContentValues values = new ContentValues();
+ values.put(VoicemailArchive.NUMBER, TEST_NUMBER);
+ values.put(VoicemailArchive.MIME_TYPE, TEST_MIME_TYPE);
+ values.put(VoicemailArchive.ARCHIVED, TEST_ARCHIVED);
+ return values;
+ }
+
+ private void deleteRecursive(File fileOrDirectory) {
+ if (fileOrDirectory.isDirectory()) {
+ for (File child : fileOrDirectory.listFiles()) {
+ deleteRecursive(child);
+ }
+ }
+ fileOrDirectory.delete();
+ }
+
+ public static class TestVoicemailArchiveProvider extends VoicemailArchiveProvider {
+ private DialerDatabaseHelper mDialerDatabaseHelper;
+
+ @Override
+ protected File getFilesDir() {
+ return getContext().getCacheDir();
+ }
+
+ @Override
+ protected DialerDatabaseHelper getDatabaseHelper(Context context) {
+ if (mDialerDatabaseHelper == null) {
+ mDialerDatabaseHelper = DialerDatabaseHelper.getNewInstanceForTest(context);
+ }
+ return mDialerDatabaseHelper;
+ }
+
+ protected void closeDb() {
+ mDialerDatabaseHelper.close();
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/dialpad/DialpadFragmentInstrumentationTest.java b/tests/src/com/android/dialer/dialpad/DialpadFragmentInstrumentationTest.java
new file mode 100644
index 000000000..876c13ba1
--- /dev/null
+++ b/tests/src/com/android/dialer/dialpad/DialpadFragmentInstrumentationTest.java
@@ -0,0 +1,121 @@
+package com.android.dialer.dialpad;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.View;
+
+import com.android.dialer.DialtactsActivity;
+import com.android.dialer.R;
+
+/**
+ * Tests that rely on instrumenting an actual instance of a {@link DialpadFragment}.
+ */
+public class DialpadFragmentInstrumentationTest extends
+ ActivityInstrumentationTestCase2<DialtactsActivity> {
+ private DialtactsActivity mActivity;
+
+ public DialpadFragmentInstrumentationTest() {
+ super(DialtactsActivity.class);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mActivity = getActivity();
+ }
+
+ /**
+ * Simulates a long click event on the zero key with a prior onPressed callback.
+ *
+ */
+ public void testManualLongClickZero_DeletesPreviousCharacter() {
+ final DialpadFragment fragment = showDialpad();
+ pressAndReleaseKey(9, fragment);
+
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ final View zeroKey = findViewByDigit(0, fragment);
+ fragment.onPressed(zeroKey, true);
+ fragment.onLongClick(zeroKey);
+ }
+ });
+
+ assertEquals("9+", fragment.getDigitsWidget().getText().toString());
+ }
+
+ /**
+ * Simulates a long click event on the zero key without a prior onPressed
+ * callback.
+ */
+ public void testSystemLongClickZero_PreservesPreviousCharacter() {
+ final DialpadFragment fragment = showDialpad();
+ pressAndReleaseKey(9, fragment);
+
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ final View zeroKey = findViewByDigit(0, fragment);
+ fragment.onLongClick(zeroKey);
+ }
+ });
+
+ assertEquals("9+", fragment.getDigitsWidget().getText().toString());
+ }
+
+ private DialpadFragment showDialpad() {
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mActivity.showDialpad();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ return (DialpadFragment) mActivity.getFragmentManager().findFragmentByTag(
+ DialtactsActivity.TAG_DIALPAD_FRAGMENT);
+ }
+
+ private void pressAndReleaseKey(int digit, final DialpadFragment fragment) {
+ final View dialpadKey = findViewByDigit(digit, fragment);
+ final String digitsBefore = fragment.getDigitsWidget().getText().toString();
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ fragment.onPressed(dialpadKey, true);
+ fragment.onPressed(dialpadKey, false);
+ }
+ });
+ assertEquals(digitsBefore + String.valueOf(digit),
+ fragment.getDigitsWidget().getText().toString());
+ }
+
+ private View findViewByDigit(int digit, DialpadFragment fragment) {
+ return fragment.getView().findViewById(getViewIdByDigit(digit));
+ }
+
+ private int getViewIdByDigit(int digit) {
+ switch (digit) {
+ case 0:
+ return R.id.zero;
+ case 1:
+ return R.id.one;
+ case 2:
+ return R.id.two;
+ case 3:
+ return R.id.three;
+ case 4:
+ return R.id.four;
+ case 5:
+ return R.id.five;
+ case 6:
+ return R.id.six;
+ case 7:
+ return R.id.seven;
+ case 8:
+ return R.id.eight;
+ case 9:
+ return R.id.nine;
+ default:
+ return 0;
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java b/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java
index 6f18fe69a..3015e87ff 100644
--- a/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java
+++ b/tests/src/com/android/dialer/dialpad/DialpadFragmentTest.java
@@ -82,4 +82,30 @@ public class DialpadFragmentTest extends TestCase {
assertTrue(DialpadFragment.canAddDigit("55;55", 3, 3, ',')); // WAIT & PAUSE
assertTrue(DialpadFragment.canAddDigit("55,55", 3, 4, ';'));
}
+
+ public void testGetFormattedDigits_NoPostDialString() {
+ assertEquals("(510) 333-7596",
+ DialpadFragment.getFormattedDigits("5103337596", null, "US"));
+ assertEquals("(510) 333-7596",
+ DialpadFragment.getFormattedDigits("5103337596", "+15103337596", "US"));
+ }
+
+ public void testGetFormattedDigits_WithPostDialString() {
+ assertEquals("(510) 333-7596,1234",
+ DialpadFragment.getFormattedDigits("5103337596,1234", null, "US"));
+ assertEquals("(510) 333-7596;;1234",
+ DialpadFragment.getFormattedDigits("5103337596;;1234", null, "US"));
+ assertEquals("(510) 333-7596;123,,4",
+ DialpadFragment.getFormattedDigits("(510)3337596;123,,4", "+15103337596", "US"));
+ }
+
+ public void testGetFormattedDigits_PostDialStringOnly() {
+ assertEquals(",1234567", DialpadFragment.getFormattedDigits(",1234567", null, "US"));
+ assertEquals(";4321", DialpadFragment.getFormattedDigits(";4321", null, "US"));
+ }
+
+ public void testGetFormattedDigits_Invalid() {
+ assertEquals(null, DialpadFragment.getFormattedDigits(null, null, "US"));
+ assertEquals("", DialpadFragment.getFormattedDigits("", "+15104233335", "US"));
+ }
}
diff --git a/tests/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigratorTest.java b/tests/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigratorTest.java
new file mode 100644
index 000000000..505855528
--- /dev/null
+++ b/tests/src/com/android/dialer/filterednumber/BlockedNumbersAutoMigratorTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.test.AndroidTestCase;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler;
+import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+public class BlockedNumbersAutoMigratorTest extends AndroidTestCase {
+
+ private static final String HAS_CHECKED_AUTO_MIGRATE_KEY_FOR_TEST = "checkedAutoMigrateForTest";
+
+ @Mock
+ private FilteredNumberAsyncQueryHandler mockQueryHandler;
+
+ private SharedPreferences sharedPreferences;
+
+ private BlockedNumbersAutoMigrator blockedNumbersAutoMigrator;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ FilteredNumberCompat.setContextForTest(getContext());
+ FilteredNumberCompat.setHasMigratedToNewBlocking(false);
+
+ sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+ // SharedPreference state isn't cleaned up between each test automatically, clear it now
+ sharedPreferences.edit().clear().apply();
+
+ blockedNumbersAutoMigrator = new BlockedNumbersAutoMigrator(sharedPreferences,
+ mockQueryHandler);
+ }
+
+ public void testConstructor_NullSharedPreferences() {
+ try {
+ new BlockedNumbersAutoMigrator(null, mockQueryHandler);
+ fail();
+ } catch (NullPointerException e) {
+ }
+ }
+
+ public void testConstructor_NullQueryHandler() {
+ try {
+ new BlockedNumbersAutoMigrator(sharedPreferences, null);
+ fail();
+ } catch (NullPointerException e) {
+ }
+ }
+
+ public void testAutoMigrate_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler, never()).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ }
+
+ public void testAutoMigrate_AlreadyMigrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setHasMigratedToNewBlocking(true);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler, never()).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ }
+
+ public void testAutoMigrate_AlreadyChecked() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ sharedPreferences.edit()
+ .putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY_FOR_TEST, true)
+ .apply();
+
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler, never()).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ }
+
+ public void testAutoMigrate_HasNumbers() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ setupFilteredNumberHasBlockedNumbersExpectation(true);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ assertFalse(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+ public void testAutoMigrate_HasNumbers_MultipleCalls() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ setupFilteredNumberHasBlockedNumbersExpectation(true);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler, times(1))
+ .hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ assertFalse(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+ public void testAutoMigrate_NoNumbers() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ setupFilteredNumberHasBlockedNumbersExpectation(false);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+ public void testAutoMigrate_NoNumbers_MultipleCalls() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ setupFilteredNumberHasBlockedNumbersExpectation(false);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler, times(1))
+ .hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+
+ public void testAutoMigrate_SimulateClearingAppData() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ setupFilteredNumberHasBlockedNumbersExpectation(true);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ // Clearing app data removes the sharedPreferences and all of the blocked numbers
+ sharedPreferences.edit().clear().apply();
+ setupFilteredNumberHasBlockedNumbersExpectation(false);
+
+ blockedNumbersAutoMigrator.autoMigrate();
+
+ verify(mockQueryHandler, times(2))
+ .hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
+ }
+
+ /*
+ * Sets up the {@link #mockQueryHandler} to call the {@link OnHasBlockedNumbersListener} with
+ * the given hasBlockedNumbers value as the parameter, when
+ * {@link FilteredNumberAsyncQueryHandler#hasBlockedNumbers} is called.
+ */
+ private void setupFilteredNumberHasBlockedNumbersExpectation(final boolean hasBlockedNumbers) {
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) throws Throwable {
+ ((OnHasBlockedNumbersListener) invocation.getArguments()[0])
+ .onHasBlockedNumbers(hasBlockedNumbers);
+ return null;
+ }
+ }).when(mockQueryHandler).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class));
+ }
+}
diff --git a/tests/src/com/android/dialer/filterednumber/BlockedNumbersFragmentInstrumentationTest.java b/tests/src/com/android/dialer/filterednumber/BlockedNumbersFragmentInstrumentationTest.java
new file mode 100644
index 000000000..ea4c51e21
--- /dev/null
+++ b/tests/src/com/android/dialer/filterednumber/BlockedNumbersFragmentInstrumentationTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.verify;
+
+import android.test.ActivityInstrumentationTestCase2;
+import android.view.View;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.dialer.R;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.filterednumber.BlockedNumbersMigrator.Listener;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Instrumentation tests for {@link BlockedNumbersFragment}. Note for these tests to work properly,
+ * the device's screen must be on.
+ */
+public class BlockedNumbersFragmentInstrumentationTest extends
+ ActivityInstrumentationTestCase2<BlockedNumbersSettingsActivity> {
+
+ private static final String FRAGMENT_TAG = "blocked_management";
+
+ private BlockedNumbersFragment blockedNumbersFragment;
+ @Mock private BlockedNumbersMigrator blockedNumbersMigrator;
+
+ public BlockedNumbersFragmentInstrumentationTest() {
+ super(BlockedNumbersSettingsActivity.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ FilteredNumberCompat.setIsEnabledForTest(true);
+ blockedNumbersFragment = new BlockedNumbersFragment();
+ blockedNumbersFragment.setBlockedNumbersMigratorForTest(blockedNumbersMigrator);
+ getActivity().getFragmentManager().beginTransaction()
+ .replace(R.id.blocked_numbers_activity_container, blockedNumbersFragment, FRAGMENT_TAG)
+ .commit();
+ getInstrumentation().waitForIdleSync();
+ }
+
+ public void testMigrationPromo_NotShown_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(View.GONE, blockedNumbersFragment.migratePromoView.getVisibility());
+ }
+
+ public void testMigrationPromo_Shown_N() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertEquals(View.VISIBLE, blockedNumbersFragment.migratePromoView.getVisibility());
+ }
+
+ public void testOnClick_Migrate() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ blockedNumbersFragment.getListView().findViewById(R.id.migrate_promo_allow_button)
+ .performClick();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ assertFalse(blockedNumbersFragment.getListView().findViewById(R.id.migrate_promo_allow_button)
+ .isEnabled());
+ verify(blockedNumbersMigrator).migrate(any(Listener.class));
+ }
+}
diff --git a/tests/src/com/android/dialer/filterednumber/BlockedNumbersMigratorTest.java b/tests/src/com/android/dialer/filterednumber/BlockedNumbersMigratorTest.java
new file mode 100644
index 000000000..565c206d8
--- /dev/null
+++ b/tests/src/com/android/dialer/filterednumber/BlockedNumbersMigratorTest.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.provider.BlockedNumberContract;
+import android.provider.BlockedNumberContract.BlockedNumbers;
+import android.test.AndroidTestCase;
+import android.test.mock.MockContentResolver;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.test.mocks.MockContentProvider;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberContract;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class BlockedNumbersMigratorTest extends AndroidTestCase {
+
+ private static final String NUMBER = "6502530000";
+ private static final String NUMBER1 = "6502530001";
+ private static final String NUMBER2 = "6502530002";
+
+ @Mock private BlockedNumbersMigrator.Listener mListener;
+ private final MockContentResolver mContentResolver = new MockContentResolver();
+ private final MockContentProvider mContentProvider = new MockContentProvider();
+ private BlockedNumbersMigrator mMigrator;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ FilteredNumberCompat.setIsEnabledForTest(true);
+ mContentResolver.addProvider(FilteredNumberContract.AUTHORITY, mContentProvider);
+ mContentResolver.addProvider(BlockedNumberContract.AUTHORITY, mContentProvider);
+ mMigrator = new BlockedNumbersMigrator(mContentResolver);
+ }
+
+ public void testConstructor_NullContentResolver() {
+ try {
+ new BlockedNumbersMigrator(null);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testMigrate_M() {
+ if (CompatUtils.isNCompatible()) {
+ return;
+ }
+ assertFalse(mMigrator.migrate(mListener));
+ }
+
+ public void testMigrate_N_Disabled() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(false);
+ assertFalse(mMigrator.migrate(mListener));
+ }
+
+ public void testMigrate_N_NullListener() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ try {
+ mMigrator.migrate(null);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testMigrate_N() throws InterruptedException {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ mContentProvider.expectQuery(FilteredNumber.CONTENT_URI)
+ .withProjection(FilteredNumberColumns.NUMBER).returnRow(NUMBER).returnRow(NUMBER1)
+ .returnRow(NUMBER2);
+
+ setUpNewBlockedNumberExpectations(mContentProvider, NUMBER, 0);
+ setUpNewBlockedNumberExpectations(mContentProvider, NUMBER1, 1);
+ setUpNewBlockedNumberExpectations(mContentProvider, NUMBER2, 2);
+
+ MigrationListener listener = new MigrationListener();
+ assertTrue(mMigrator.migrate(listener));
+ listener.waitForCallback();
+ assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
+ mContentProvider.verify();
+ }
+
+ public void testMigrate_N_AlreadyBlocked() throws InterruptedException {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ mContentProvider.expectQuery(FilteredNumber.CONTENT_URI)
+ .withProjection(FilteredNumberColumns.NUMBER).returnRow(NUMBER);
+ mContentProvider.expectQuery(BlockedNumbers.CONTENT_URI)
+ .withProjection(BlockedNumbers.COLUMN_ID)
+ .withSelection(BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?", NUMBER).returnRow(0);
+ // No expectation for insert into BlockedNumbers.CONTENT_URI because it's already there
+
+ MigrationListener listener = new MigrationListener();
+ assertTrue(mMigrator.migrate(listener));
+ listener.waitForCallback();
+ assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking());
+ mContentProvider.verify();
+ }
+
+ private void setUpNewBlockedNumberExpectations(MockContentProvider contentProvider,
+ String number, int returnId) {
+ contentProvider.expectQuery(BlockedNumbers.CONTENT_URI)
+ .withProjection(BlockedNumbers.COLUMN_ID)
+ .withSelection(BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?", number).returnEmptyCursor();
+ contentProvider.expectInsert(BlockedNumbers.CONTENT_URI,
+ createBlockedNumberInsertValues(number),
+ ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, returnId));
+ }
+
+ private ContentValues createBlockedNumberInsertValues(String number) {
+ ContentValues values = new ContentValues();
+ values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number);
+ return values;
+ }
+
+ private static class MigrationListener implements BlockedNumbersMigrator.Listener {
+
+ private final CountDownLatch mOnCompleteCalled = new CountDownLatch(1);
+
+ @Override
+ public void onComplete() {
+ mOnCompleteCalled.countDown();
+ }
+
+ public void waitForCallback() throws InterruptedException {
+ if (!mOnCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) {
+ throw new IllegalStateException("Waiting on callback timed out.");
+ }
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/filterednumber/FilteredNumbersUtilTest.java b/tests/src/com/android/dialer/filterednumber/FilteredNumbersUtilTest.java
new file mode 100644
index 000000000..d496b1845
--- /dev/null
+++ b/tests/src/com/android/dialer/filterednumber/FilteredNumbersUtilTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.dialer.filterednumber;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.content.Context;
+import android.preference.PreferenceManager;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.contacts.common.compat.CompatUtils;
+import com.android.contacts.common.test.mocks.ContactsMockContext;
+import com.android.contacts.common.test.mocks.MockContentProvider.Query;
+import com.android.dialer.compat.FilteredNumberCompat;
+import com.android.dialer.database.FilteredNumberContract;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumber;
+import com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns;
+
+@SmallTest
+public class FilteredNumbersUtilTest extends AndroidTestCase {
+
+ private static final String COUNTRY_ISO = "US";
+
+ // Wed Nov 11 2015 15:00:00
+ private static final long EARLIER_TIME = 1447282800000L;
+
+ // Wed Nov 11 2015 15:01:40
+ private static final long LATER_TIME = 1447282900000L;
+
+ private static final String[] FILTERED_NUMBER_PROJECTION = new String[] {
+ FilteredNumberColumns.CREATION_TIME };
+
+ private static final String NORMALIZED_NUMBER = "+16503903411";
+
+ private static final long NULL_CREATION_TIME = -1;
+
+ private ContactsMockContext mContext;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mContext = new ContactsMockContext(getContext(), FilteredNumberContract.AUTHORITY);
+
+ // Reset whether an emergency number was dialed
+ PreferenceManager.getDefaultSharedPreferences(mContext)
+ .edit()
+ .putLong(FilteredNumbersUtil.LAST_EMERGENCY_CALL_MS_PREF_KEY, 0)
+ .apply();
+ }
+
+ public void testShouldBlockVoicemail_NotBlocked() {
+ setupShouldBlockVoicemailQuery(NULL_CREATION_TIME);
+ assertFalse(FilteredNumbersUtil.shouldBlockVoicemail(mContext, NORMALIZED_NUMBER,
+ COUNTRY_ISO, EARLIER_TIME));
+ }
+
+ public void testShouldBlockVoicemail_BlockedBeforeVoicemail() {
+ setupShouldBlockVoicemailQuery(EARLIER_TIME);
+ assertTrue(FilteredNumbersUtil.shouldBlockVoicemail(mContext, NORMALIZED_NUMBER,
+ COUNTRY_ISO, LATER_TIME));
+ }
+
+ public void testShouldBlockVoicemail_BlockedAfterVoicemail() {
+ setupShouldBlockVoicemailQuery(LATER_TIME);
+ assertFalse(FilteredNumbersUtil.shouldBlockVoicemail(mContext, NORMALIZED_NUMBER,
+ COUNTRY_ISO, EARLIER_TIME));
+ }
+
+ public void testShouldBlockVoicemail_BlockedSameTimeAsVoicemail() {
+ setupShouldBlockVoicemailQuery(EARLIER_TIME);
+ assertTrue(FilteredNumbersUtil.shouldBlockVoicemail(mContext, NORMALIZED_NUMBER,
+ COUNTRY_ISO, EARLIER_TIME));
+ }
+
+ public void testShouldBlockVoicemail_BlockedInSameMinuteAsVoicemail() {
+ setupShouldBlockVoicemailQuery(EARLIER_TIME);
+ assertTrue(FilteredNumbersUtil.shouldBlockVoicemail(mContext, NORMALIZED_NUMBER,
+ COUNTRY_ISO, EARLIER_TIME + 30000));
+ }
+
+ public void testShouldBlockVoicemail_AfterEmergencyCall() {
+ // Just called emergency services
+ PreferenceManager.getDefaultSharedPreferences(mContext)
+ .edit()
+ .putLong(FilteredNumbersUtil.LAST_EMERGENCY_CALL_MS_PREF_KEY,
+ System.currentTimeMillis())
+ .apply();
+ assertFalse(FilteredNumbersUtil.shouldBlockVoicemail(mContext, NORMALIZED_NUMBER,
+ COUNTRY_ISO, 0));
+ }
+
+ public void testMaybeNotifyCallBlockingDisabled_Migrated() {
+ if (!CompatUtils.isNCompatible()) {
+ return;
+ }
+ FilteredNumberCompat.setIsEnabledForTest(true);
+ FilteredNumberCompat.setHasMigratedToNewBlocking(true);
+ Context mockContext = mock(Context.class);
+
+ FilteredNumbersUtil.maybeNotifyCallBlockingDisabled(mockContext);
+ verifyZeroInteractions(mockContext);
+ }
+
+ private void setupShouldBlockVoicemailQuery(long creationTimeMs) {
+ Query query = mContext.getContactsProvider().expectQuery(FilteredNumber.CONTENT_URI)
+ .withProjection(FILTERED_NUMBER_PROJECTION)
+ .withAnySelection()
+ .withAnySortOrder();
+ if (creationTimeMs == NULL_CREATION_TIME) {
+ query.returnEmptyCursor();
+ return;
+ }
+ query.returnRow(creationTimeMs);
+ }
+}
diff --git a/tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentInstrumentationTest.java b/tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentInstrumentationTest.java
new file mode 100644
index 000000000..0bfa6bcb2
--- /dev/null
+++ b/tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentInstrumentationTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import android.app.AlertDialog;
+import android.app.DialogFragment;
+import android.content.ContentResolver;
+import android.content.DialogInterface;
+import android.test.ActivityInstrumentationTestCase2;
+
+import com.android.dialer.DialtactsActivity;
+import com.android.dialer.filterednumber.BlockedNumbersMigrator.Listener;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+/**
+ * Instrumentation tests for {@link MigrateBlockedNumbersDialogFragment}. Note for these tests to
+ * work properly, the device's screen must be on.
+ */
+public class MigrateBlockedNumbersDialogFragmentInstrumentationTest extends
+ ActivityInstrumentationTestCase2<DialtactsActivity> {
+
+ private static final String SHOW_TAG = "ShowTag";
+
+ private BlockedNumbersMigrator mBlockedNumbersMigrator;
+ @Mock private Listener mListener;
+ private DialogFragment mMigrateDialogFragment;
+
+ public MigrateBlockedNumbersDialogFragmentInstrumentationTest() {
+ super(DialtactsActivity.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ mBlockedNumbersMigrator = new SynchronousBlockedNumbersMigrator(
+ getActivity().getContentResolver());
+ mMigrateDialogFragment = MigrateBlockedNumbersDialogFragment
+ .newInstance(mBlockedNumbersMigrator, mListener);
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mMigrateDialogFragment.show(getActivity().getFragmentManager(), SHOW_TAG);
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ }
+
+ public void testDialogAppears() {
+ assertTrue(mMigrateDialogFragment.getDialog().isShowing());
+ }
+
+ public void testDialogPositiveButtonPress() {
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ ((AlertDialog) mMigrateDialogFragment.getDialog())
+ .getButton(DialogInterface.BUTTON_POSITIVE).performClick();
+ }
+ });
+ getInstrumentation().waitForIdleSync();
+ // Dialog was dismissed
+ assertNull(mMigrateDialogFragment.getDialog());
+ }
+
+ private static class SynchronousBlockedNumbersMigrator extends BlockedNumbersMigrator {
+ public SynchronousBlockedNumbersMigrator(ContentResolver contentResolver) {
+ super(contentResolver);
+ }
+
+ @Override
+ public boolean migrate(BlockedNumbersMigrator.Listener listener) {
+ listener.onComplete();
+ return true;
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentTest.java b/tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentTest.java
new file mode 100644
index 000000000..1b419cee8
--- /dev/null
+++ b/tests/src/com/android/dialer/filterednumber/MigrateBlockedNumbersDialogFragmentTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.filterednumber;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.dialer.filterednumber.BlockedNumbersMigrator.Listener;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+
+/**
+ * Unit tests for {@link MigrateBlockedNumbersDialogFragment}
+ */
+@SmallTest
+public class MigrateBlockedNumbersDialogFragmentTest extends AndroidTestCase {
+
+ @Mock private BlockedNumbersMigrator mBlockedNumbersMigrator;
+ @Mock private Listener mListener;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+ }
+
+ public void testNewInstance_NullMigrator() {
+ try {
+ MigrateBlockedNumbersDialogFragment.newInstance(null, mListener);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testNewInstance_NullListener() {
+ try {
+ MigrateBlockedNumbersDialogFragment.newInstance(mBlockedNumbersMigrator, null);
+ fail();
+ } catch (NullPointerException e) {}
+ }
+
+ public void testNewInstance_WithListener() {
+ assertNotNull(MigrateBlockedNumbersDialogFragment.newInstance(mBlockedNumbersMigrator,
+ mListener));
+ }
+}
diff --git a/tests/src/com/android/dialer/interactions/PhoneNumberInteractionTest.java b/tests/src/com/android/dialer/interactions/PhoneNumberInteractionTest.java
index 8d5b53eb2..f58e6cc6c 100644
--- a/tests/src/com/android/dialer/interactions/PhoneNumberInteractionTest.java
+++ b/tests/src/com/android/dialer/interactions/PhoneNumberInteractionTest.java
@@ -18,6 +18,7 @@ package com.android.dialer.interactions;
import android.content.ContentUris;
import android.content.Context;
+import android.content.CursorLoader;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.net.Uri;
@@ -36,6 +37,7 @@ import com.android.contacts.common.util.ContactDisplayUtils;
import com.android.dialer.interactions.PhoneNumberInteraction.PhoneItem;
import com.android.dialer.util.TestConstants;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@@ -59,6 +61,16 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
void showDisambiguationDialog(ArrayList<PhoneItem> phoneList) {
this.mPhoneList = phoneList;
}
+
+ public void waitForLoader() {
+ final CursorLoader loader = getLoader();
+ try {
+ final Method waitMethod = CursorLoader.class.getMethod("waitForLoader");
+ waitMethod.invoke(loader, null);
+ } catch(Exception e) {
+ // ignore
+ }
+ }
}
private ContactsMockContext mContext;
@@ -87,7 +99,7 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
mContext, ContactDisplayUtils.INTERACTION_SMS, null);
interaction.startInteraction(contactUri);
- interaction.getLoader().waitForLoader();
+ interaction.waitForLoader();
Intent intent = mContext.getIntentForStartActivity();
assertNotNull(intent);
@@ -106,7 +118,7 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
mContext, ContactDisplayUtils.INTERACTION_SMS, null);
interaction.startInteraction(dataUri);
- interaction.getLoader().waitForLoader();
+ interaction.waitForLoader();
Intent intent = mContext.getIntentForStartActivity();
assertNotNull(intent);
@@ -127,7 +139,7 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
mContext, ContactDisplayUtils.INTERACTION_SMS, null);
interaction.startInteraction(contactUri);
- interaction.getLoader().waitForLoader();
+ interaction.waitForLoader();
Intent intent = mContext.getIntentForStartActivity();
assertNotNull(intent);
@@ -168,7 +180,7 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
mContext, ContactDisplayUtils.INTERACTION_CALL, null);
interaction.startInteraction(contactUri);
- interaction.getLoader().waitForLoader();
+ interaction.waitForLoader();
Intent intent = mContext.getIntentForStartActivity();
assertNotNull(intent);
@@ -186,7 +198,7 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
mContext, ContactDisplayUtils.INTERACTION_CALL, null);
interaction.startInteraction(contactUri);
- interaction.getLoader().waitForLoader();
+ interaction.waitForLoader();
Intent intent = mContext.getIntentForStartActivity();
assertNotNull(intent);
@@ -207,7 +219,7 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
mContext, ContactDisplayUtils.INTERACTION_CALL, null);
interaction.startInteraction(contactUri);
- interaction.getLoader().waitForLoader();
+ interaction.waitForLoader();
List<PhoneItem> items = interaction.mPhoneList;
assertNotNull(items);
@@ -245,6 +257,6 @@ public class PhoneNumberInteractionTest extends InstrumentationTestCase {
Phone.MIMETYPE,
Phone.CONTACT_ID)
.withSelection("mimetype IN ('vnd.android.cursor.item/phone_v2',"
- + " 'vnd.android.cursor.item/sip_address') AND data1 NOT NULL");
+ + " 'vnd.android.cursor.item/sip_address') AND data1 NOT NULL", null);
}
}
diff --git a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
index c2069bda7..881938400 100644
--- a/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
+++ b/tests/src/com/android/dialer/list/PhoneFavoritesTileAdapterTest.java
@@ -1,20 +1,28 @@
package com.android.dialer.list;
+import com.google.common.collect.Lists;
+
+import android.content.Context;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.provider.ContactsContract.PinnedPositions;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.common.list.ContactEntry;
+import com.android.contacts.common.preference.ContactsPreferences;
import com.android.dialer.list.PhoneFavoritesTileAdapter.OnDataSetChangedForAnimationListener;
+import junit.framework.Assert;
+
import java.util.ArrayList;
+@SmallTest
public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
- private PhoneFavoritesTileAdapter mAdapter;
- private static final OnDataSetChangedForAnimationListener
- sOnDataSetChangedForAnimationListener = new OnDataSetChangedForAnimationListener() {
+
+ private static final OnDataSetChangedForAnimationListener NOOP_ANIMATION_LISTENER =
+ new OnDataSetChangedForAnimationListener() {
@Override
public void onDataSetChangedForAnimation(long... idsInPlace) {}
@@ -22,18 +30,161 @@ public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
public void cacheOffsetsForDatasetChange() {}
};
+ private PhoneFavoritesTileAdapter mAdapter;
+
+ @Override
+ public void setUp() {
+ this.mAdapter = new PhoneFavoritesTileAdapter(getContext(), null, NOOP_ANIMATION_LISTENER);
+ }
+
/**
- * TODO: Add tests
- *
- * Test cases (various combinations of):
- * No pinned contacts
- * One pinned contact
- * Multiple pinned contacts with differing pinned positions
- * Multiple pinned contacts with conflicting pinned positions
- * Pinned contacts with pinned positions at the start, middle, end, and outside the list
+ * For all arrangeContactsByPinnedPosition tests, the id for a particular ContactEntry
+ * represents the index at which it should be located after calling
+ * arrangeContactsByPinnedPosition
*/
- public void testArrangeContactsByPinnedPosition() {
+ public void testArrangeContactsByPinnedPosition_NoPinned() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(1), getTestContactEntry(2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_NoPinned_RemoveDemoted() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 2);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_Beginning() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1),
+ getTestContactEntry(0, 1), getTestContactEntry(2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_Middle() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(1, 2), getTestContactEntry(2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_End() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(2, 3), getTestContactEntry(1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_Outside() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0),
+ getTestContactEntry(2, 5), getTestContactEntry(1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_OnePinned_RemoveDemoted() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 2);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Split() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+ getTestContactEntry(1), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Adjacent() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedBefore() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0), getTestContactEntry(2, 2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_UnpinnedAfter() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 1),
+ getTestContactEntry(2), getTestContactEntry(1, 1));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_TwoPinned_Conflict_RemoveDemoted() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(-1, PinnedPositions.DEMOTED), getTestContactEntry(0, 2));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 2);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0, 1), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsFirst() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(1, 2),
+ getTestContactEntry(0, 2), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned_TwoConflicts_ConflictsLast() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(0, 2),
+ getTestContactEntry(1, 3), getTestContactEntry(2, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_AllPinned_AllConflicts() {
+ ArrayList<ContactEntry> toArrange = Lists.newArrayList(getTestContactEntry(2, 3),
+ getTestContactEntry(1, 3), getTestContactEntry(0, 3));
+ mAdapter.arrangeContactsByPinnedPosition(toArrange);
+
+ assertContactEntryListPositionsMatchId(toArrange, 3);
+ }
+
+ public void testArrangeContactsByPinnedPosition_All_Pinned_AllConflicts_SortNameAlternative() {
+ Context context = getContext();
+ context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit()
+ .putInt(ContactsPreferences.SORT_ORDER_KEY,
+ ContactsPreferences.SORT_ORDER_ALTERNATIVE)
+ .commit();
+ ArrayList<ContactEntry> actual = Lists.newArrayList(
+ getTestContactEntry(1, 3, "2", "1"),
+ getTestContactEntry(2, 3, "0", "2"),
+ getTestContactEntry(0, 3, "1", "0")
+ );
+ mAdapter.arrangeContactsByPinnedPosition(actual);
+
+ assertContactEntryListPositionsMatchId(actual, 3);
}
/**
@@ -53,6 +204,45 @@ public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
}
+ public void testSetContactCursor_DisplayNameOrder_Primary() {
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+ Cursor testCursor = getCursorForTest(1, 0);
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+ }
+
+ public void testSetContactCursor_DisplayNameOrder_Alternative() {
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+ Cursor testCursor = getCursorForTest(1, 0);
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+ }
+
+ public void testSetContactCursor_DisplayNameOrder_Changed() {
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+ Cursor testCursor = getCursorForTest(1, 0);
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_PRIMARY,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+
+ setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+ mAdapter.refreshContactsPreferences();
+ mAdapter.setContactCursor(testCursor);
+ Assert.assertEquals(1, mAdapter.mContactEntries.size());
+ Assert.assertEquals(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE,
+ mAdapter.mContactEntries.get(0).nameDisplayOrder);
+ }
+
+ private void setNameDisplayOrder(Context context, int displayOrder) {
+ context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit().putInt(
+ ContactsPreferences.DISPLAY_ORDER_KEY, displayOrder).commit();
+ }
+
/**
* Returns a cursor containing starred and frequent contacts for test purposes.
*
@@ -70,38 +260,42 @@ public class PhoneFavoritesTileAdapterTest extends AndroidTestCase {
// The only field that really matters for testing is the contact id.
for (int i = 0; i < numStarred; i++) {
c.addRow(new Object[] {countId, null, 1, null, null, 0, 0, null, 0,
- PinnedPositions.UNPINNED, countId});
+ PinnedPositions.UNPINNED, countId, null});
countId++;
}
// Add frequent contact entries. These entries have the starred field set to 0 (false).
for (int i = 0; i < numFrequents; i++) {
c.addRow(new Object[] {countId, null, 0, null, null, 0, 0, null, 0,
- PinnedPositions.UNPINNED, countId});
+ PinnedPositions.UNPINNED, countId, null});
countId++;
}
return c;
}
- /**
- * Returns a ContactEntry with test data corresponding to the provided contact Id
- *
- * @param id Non-negative id
- * @return ContactEntry item used for testing
- */
- private ContactEntry getTestContactEntry(int id, boolean isFavorite) {
+ private ContactEntry getTestContactEntry(int id) {
+ return getTestContactEntry(id, PinnedPositions.UNPINNED);
+ }
+
+ private ContactEntry getTestContactEntry(int id, int pinned) {
+ return getTestContactEntry(id, pinned, String.valueOf(id), String.valueOf(id));
+ }
+
+ private ContactEntry getTestContactEntry(int id, int pinned, String namePrimaryAppend,
+ String nameAlternativeAppend) {
ContactEntry contactEntry = new ContactEntry();
contactEntry.id = id;
- contactEntry.isFavorite = isFavorite;
+ contactEntry.pinned = pinned;
+ contactEntry.namePrimary = namePrimaryAppend;
+ contactEntry.nameAlternative = nameAlternativeAppend;
return contactEntry;
}
- private void assertContactEntryRowsEqual(ArrayList<ContactEntry> expected,
- ArrayList<ContactEntry> actual) {
- assertEquals(expected.size(), actual.size());
- for (int i = 0; i < actual.size(); i++) {
- assertEquals(expected.get(i).id, actual.get(i).id);
- assertEquals(expected.get(i).isFavorite, actual.get(i).isFavorite);
+ private void assertContactEntryListPositionsMatchId(ArrayList<ContactEntry> contactEntries,
+ int expectedSize) {
+ Assert.assertEquals(expectedSize, contactEntries.size());
+ for (int i = 0; i < expectedSize; ++i) {
+ Assert.assertEquals(i, contactEntries.get(i).id);
}
}
}
diff --git a/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java b/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java
index 2e90c4d33..da41dfce4 100644
--- a/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java
+++ b/tests/src/com/android/dialer/tests/calllog/FillCallLogTestActivity.java
@@ -23,18 +23,27 @@ import android.app.DialogFragment;
import android.app.LoaderManager;
import android.app.TimePickerDialog;
import android.content.ContentProviderClient;
+import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.provider.CallLog.Calls;
+import android.provider.VoicemailContract;
+import android.provider.VoicemailContract.Status;
+import android.provider.VoicemailContract.Voicemails;
+import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
-import android.telecom.TelecomManager;
+import android.text.Editable;
+import android.text.TextWatcher;
import android.text.format.DateFormat;
import android.util.Log;
+import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
@@ -46,7 +55,10 @@ import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
+import com.android.contacts.common.compat.telecom.TelecomManagerCompat;
import com.android.dialer.tests.R;
+import com.android.dialer.util.AppCompatConstants;
+import com.android.dialer.util.TelecomUtil;
import java.util.Calendar;
import java.util.List;
@@ -62,7 +74,9 @@ public class FillCallLogTestActivity extends Activity {
private static final Random RNG = new Random();
private static final int[] CALL_TYPES = new int[] {
- Calls.INCOMING_TYPE, Calls.OUTGOING_TYPE, Calls.MISSED_TYPE,
+ AppCompatConstants.CALLS_INCOMING_TYPE,
+ AppCompatConstants.CALLS_OUTGOING_TYPE,
+ AppCompatConstants.CALLS_MISSED_TYPE
};
private TextView mNumberTextView;
@@ -72,6 +86,9 @@ public class FillCallLogTestActivity extends Activity {
private RadioButton mCallTypeIncoming;
private RadioButton mCallTypeMissed;
private RadioButton mCallTypeOutgoing;
+ private RadioButton mCallTypeVoicemail;
+ private RadioButton mCallTypeCustom;
+ private EditText mCustomCallTypeTextView;
private CheckBox mCallTypeVideo;
private RadioButton mPresentationAllowed;
private RadioButton mPresentationRestricted;
@@ -125,6 +142,9 @@ public class FillCallLogTestActivity extends Activity {
mCallTypeIncoming = (RadioButton) findViewById(R.id.call_type_incoming);
mCallTypeMissed = (RadioButton) findViewById(R.id.call_type_missed);
mCallTypeOutgoing = (RadioButton) findViewById(R.id.call_type_outgoing);
+ mCallTypeVoicemail = (RadioButton) findViewById(R.id.call_type_voicemail);
+ mCallTypeCustom = (RadioButton) findViewById(R.id.call_type_custom);
+ mCustomCallTypeTextView = (EditText) findViewById(R.id.call_type_custom_text);
mCallTypeVideo = (CheckBox) findViewById(R.id.call_type_video);
mPresentationAllowed = (RadioButton) findViewById(R.id.presentation_allowed);
mPresentationPayphone = (RadioButton) findViewById(R.id.presentation_payphone);
@@ -137,6 +157,24 @@ public class FillCallLogTestActivity extends Activity {
mAccount0 = (RadioButton) findViewById(R.id.account0);
mAccount1 = (RadioButton) findViewById(R.id.account1);
+ mCustomCallTypeTextView.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ // Do nothing.
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ // Toggle the custom call type radio button if the text is changed/focused.
+ mCallTypeCustom.toggle();
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ // Do nothing.
+ }
+ });
+
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
mCallTimeHour = c.get(Calendar.HOUR_OF_DAY);
@@ -372,11 +410,15 @@ public class FillCallLogTestActivity extends Activity {
*/
private int getManualCallType() {
if (mCallTypeIncoming.isChecked()) {
- return Calls.INCOMING_TYPE;
+ return AppCompatConstants.CALLS_INCOMING_TYPE;
} else if (mCallTypeOutgoing.isChecked()) {
- return Calls.OUTGOING_TYPE;
+ return AppCompatConstants.CALLS_OUTGOING_TYPE;
+ } else if (mCallTypeVoicemail.isChecked()) {
+ return AppCompatConstants.CALLS_VOICEMAIL_TYPE;
+ } else if (mCallTypeCustom.isChecked()) {
+ return Integer.parseInt(mCustomCallTypeTextView.getText().toString());
} else {
- return Calls.MISSED_TYPE;
+ return AppCompatConstants.CALLS_MISSED_TYPE;
}
}
@@ -398,8 +440,8 @@ public class FillCallLogTestActivity extends Activity {
}
private PhoneAccountHandle getManualAccount() {
- TelecomManager telecomManager = TelecomManager.from(this);
- List <PhoneAccountHandle> accountHandles = telecomManager.getCallCapablePhoneAccounts();
+ List <PhoneAccountHandle> accountHandles = TelecomUtil.getCallCapablePhoneAccounts(this);
+ //TODO: hide the corresponding radio buttons if no accounts are available.
if (mAccount0.isChecked()) {
return accountHandles.get(0);
} else if (mAccount1.isChecked()){
@@ -497,9 +539,13 @@ public class FillCallLogTestActivity extends Activity {
dataUsage = (long) RNG.nextInt(52428800);
}
- Calls.addCall(null, this, mPhoneNumber.getText().toString(), getManualPresentation(),
- getManualCallType(), features, getManualAccount(),
- dateTime.getTimeInMillis(), RNG.nextInt(60 * 60), dataUsage);
+ if (getManualCallType() == AppCompatConstants.CALLS_VOICEMAIL_TYPE) {
+ addManualVoicemail(dateTime.getTimeInMillis());
+ } else {
+ addCall(mPhoneNumber.getText().toString(), getManualPresentation(),
+ getManualCallType(), features, getManualAccount(),
+ dateTime.getTimeInMillis(), RNG.nextInt(60 * 60), dataUsage);
+ }
// Subtract offset from the call date/time and store as new date/time
int offset = Integer.parseInt(mOffset.getText().toString());
@@ -513,4 +559,100 @@ public class FillCallLogTestActivity extends Activity {
setDisplayDate();
setDisplayTime();
}
+
+ // Copied and modified to compile unbundled from android.provider.CallLog
+ public Uri addCall(String number,
+ int presentation, int callType, int features, PhoneAccountHandle accountHandle,
+ long start, int duration, Long dataUsage) {
+ final ContentResolver resolver = getContentResolver();
+ int numberPresentation = Calls.PRESENTATION_ALLOWED;
+
+ String accountAddress = null;
+ if (accountHandle != null) {
+ PhoneAccount account = TelecomUtil.getPhoneAccount(this, accountHandle);
+ if (account != null) {
+ Uri address = account.getSubscriptionAddress();
+ if (address != null) {
+ accountAddress = address.getSchemeSpecificPart();
+ }
+ }
+ }
+
+ if (numberPresentation != Calls.PRESENTATION_ALLOWED) {
+ number = "";
+ }
+
+ // accountHandle information
+ String accountComponentString = null;
+ String accountId = null;
+ if (accountHandle != null) {
+ accountComponentString = accountHandle.getComponentName().flattenToString();
+ accountId = accountHandle.getId();
+ }
+
+ ContentValues values = new ContentValues(6);
+
+ values.put(Calls.NUMBER, number);
+ values.put(Calls.NUMBER_PRESENTATION, Integer.valueOf(numberPresentation));
+ values.put(Calls.TYPE, Integer.valueOf(callType));
+ values.put(Calls.FEATURES, features);
+ values.put(Calls.DATE, Long.valueOf(start));
+ values.put(Calls.DURATION, Long.valueOf(duration));
+ if (dataUsage != null) {
+ values.put(Calls.DATA_USAGE, dataUsage);
+ }
+ values.put(Calls.PHONE_ACCOUNT_COMPONENT_NAME, accountComponentString);
+ values.put(Calls.PHONE_ACCOUNT_ID, accountId);
+ // Calls.PHONE_ACCOUNT_ADDRESS
+ values.put("phone_account_address", accountAddress);
+ values.put(Calls.NEW, Integer.valueOf(1));
+
+ if (callType == AppCompatConstants.CALLS_MISSED_TYPE) {
+ values.put(Calls.IS_READ, 0);
+ }
+
+ return addEntryAndRemoveExpiredEntries(this, Calls.CONTENT_URI, values);
+ }
+
+ // Copied from android.provider.CallLog
+ private static Uri addEntryAndRemoveExpiredEntries(Context context, Uri uri,
+ ContentValues values) {
+ final ContentResolver resolver = context.getContentResolver();
+ Uri result = resolver.insert(uri, values);
+ resolver.delete(uri, "_id IN " +
+ "(SELECT _id FROM calls ORDER BY " + Calls.DEFAULT_SORT_ORDER
+ + " LIMIT -1 OFFSET 500)", null);
+ return result;
+ }
+
+ private void addManualVoicemail(Long time) {
+ final ContentValues contentValues = new ContentValues();
+ contentValues.put(Voicemails.DATE, time);
+ contentValues.put(Voicemails.NUMBER, mPhoneNumber.getText().toString());
+ contentValues.put(Voicemails.DURATION, 5000);
+ contentValues.put(Voicemails.SOURCE_PACKAGE, getPackageName());
+ contentValues.put(Voicemails.SOURCE_DATA, 500);
+ contentValues.put(Voicemails.IS_READ, 0);
+
+ getContentResolver().insert(VoicemailContract.Voicemails.buildSourceUri(getPackageName()),
+ contentValues);
+
+ updateVoicemailStatus();
+ }
+
+ private void updateVoicemailStatus() {
+ ContentResolver contentResolver = getContentResolver();
+ Uri statusUri = VoicemailContract.Status.buildSourceUri(getPackageName());
+ final PhoneAccountHandle accountHandle = getManualAccount();
+
+ ContentValues values = new ContentValues();
+ values.put(Status.PHONE_ACCOUNT_COMPONENT_NAME, getPackageName());
+ values.put(Status.PHONE_ACCOUNT_ID, "ACCOUNT_ID");
+ values.put(Status.CONFIGURATION_STATE, VoicemailContract.Status.CONFIGURATION_STATE_OK);
+ values.put(Status.DATA_CHANNEL_STATE, VoicemailContract.Status.DATA_CHANNEL_STATE_OK);
+ values.put(Status.NOTIFICATION_CHANNEL_STATE,
+ VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK);
+
+ contentResolver.insert(statusUri, values);
+ }
}
diff --git a/tests/src/com/android/dialer/voicemail/VoicemailActivityInstrumentationTestCase2.java b/tests/src/com/android/dialer/voicemail/VoicemailActivityInstrumentationTestCase2.java
new file mode 100644
index 000000000..cabaf6732
--- /dev/null
+++ b/tests/src/com/android/dialer/voicemail/VoicemailActivityInstrumentationTestCase2.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.voicemail;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.res.AssetManager;
+import android.net.Uri;
+import android.provider.VoicemailContract;
+import android.test.ActivityInstrumentationTestCase2;
+import android.test.suitebuilder.annotation.Suppress;
+import android.view.View;
+
+import com.android.dialer.R;
+import com.android.dialer.util.AsyncTaskExecutors;
+import com.android.dialer.util.FakeAsyncTaskExecutor;
+import com.android.dialer.util.LocaleTestUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Locale;
+
+import static com.android.dialer.voicemail.VoicemailPlaybackPresenter.Tasks.CHECK_FOR_CONTENT;
+
+/**
+ * Common methods and attributes between {@link VoicemailArchiveTest} and
+ * {@link VoicemailPlaybackTest}.
+ */
+public class VoicemailActivityInstrumentationTestCase2<T extends Activity>
+ extends ActivityInstrumentationTestCase2<T> {
+ protected static final String TEST_ASSET_NAME = "quick_test_recording.mp3";
+ protected static final String MIME_TYPE = "audio/mp3";
+ protected static final String CONTACT_NUMBER = "+1412555555";
+ protected static final String VOICEMAIL_FILE_LOCATION = "/sdcard/sadlfj893w4j23o9sfu.mp3";
+
+ private T mActivity;
+ protected VoicemailPlaybackPresenter mPresenter;
+ private VoicemailPlaybackLayout mLayout;
+
+ protected Uri mVoicemailUri;
+ private LocaleTestUtils mLocaleTestUtils;
+ protected FakeAsyncTaskExecutor mFakeAsyncTaskExecutor;
+
+ public VoicemailActivityInstrumentationTestCase2(Class<T> activityClass) {
+ super(activityClass);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ mFakeAsyncTaskExecutor = new FakeAsyncTaskExecutor(getInstrumentation());
+ AsyncTaskExecutors.setFactoryForTest(mFakeAsyncTaskExecutor.getFactory());
+
+ // Some of the tests rely on the text - safest to force a specific locale.
+ mLocaleTestUtils = new LocaleTestUtils(getInstrumentation().getTargetContext());
+ mLocaleTestUtils.setLocale(Locale.US);
+
+ mActivity = getActivity();
+ mLayout = new VoicemailPlaybackLayout(mActivity);
+ mLayout.onFinishInflate();
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ cleanUpVoicemailUri();
+
+ mLocaleTestUtils.restoreLocale();
+ mLocaleTestUtils = null;
+
+ mPresenter.clearInstance();
+ AsyncTaskExecutors.setFactoryForTest(null);
+
+ mActivity = null;
+ mPresenter = null;
+ mLayout = null;
+
+ super.tearDown();
+ }
+
+ @Suppress
+ public void testFetchingVoicemail() throws Throwable {
+ setUriForUnfetchedVoicemailEntry();
+ setPlaybackViewForPresenter();
+
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.resumePlayback();
+ assertStateTextContains("Loading voicemail");
+ }
+ });
+ }
+
+ @Suppress
+ public void testInvalidVoicemailShowsErrorMessage() throws Throwable {
+ setUriForInvalidVoicemailEntry();
+ setPlaybackViewForPresenter();
+
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.resumePlayback();
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
+ getInstrumentation().waitForIdleSync();
+
+ // The media player will have thrown an IOException since the file doesn't exist.
+ // This should have put a failed to play message on screen, buffering is gone.
+ assertStateTextContains("Couldn't play voicemail");
+ assertStateTextNotContains("Buffering");
+ }
+
+ public void testClickingSpeakerphoneButton() throws Throwable {
+ setUriForRealFileVoicemailEntry();
+ setPlaybackViewForPresenter();
+
+ // Check that the speakerphone is false to start.
+ assertFalse(mPresenter.isSpeakerphoneOn());
+
+ View speakerphoneButton = mLayout.findViewById(R.id.playback_speakerphone);
+ speakerphoneButton.performClick();
+ assertTrue(mPresenter.isSpeakerphoneOn());
+ }
+
+ protected void cleanUpVoicemailUri() {
+ if (mVoicemailUri != null) {
+ getContentResolver().delete(VoicemailContract.Voicemails.CONTENT_URI,
+ "_ID = ?", new String[] { String.valueOf(ContentUris.parseId(mVoicemailUri)) });
+ mVoicemailUri = null;
+ }
+ }
+
+ protected void setUriForRealFileVoicemailEntry() throws IOException {
+ assertNull(mVoicemailUri);
+ ContentValues values = new ContentValues();
+ values.put(VoicemailContract.Voicemails.DATE, String.valueOf(System.currentTimeMillis()));
+ values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
+ values.put(VoicemailContract.Voicemails.MIME_TYPE, MIME_TYPE);
+ values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1);
+ String packageName = getInstrumentation().getTargetContext().getPackageName();
+ mVoicemailUri = getContentResolver().insert(
+ VoicemailContract.Voicemails.buildSourceUri(packageName), values);
+ AssetManager assets = getAssets();
+ try (InputStream inputStream = assets.open(TEST_ASSET_NAME);
+ OutputStream outputStream = getContentResolver().openOutputStream(mVoicemailUri)) {
+ copyBetweenStreams(inputStream, outputStream);
+ }
+ }
+
+ protected void setUriForUnfetchedVoicemailEntry() {
+ assertNull(mVoicemailUri);
+ ContentValues values = new ContentValues();
+ values.put(VoicemailContract.Voicemails.DATE, String.valueOf(System.currentTimeMillis()));
+ values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
+ values.put(VoicemailContract.Voicemails.MIME_TYPE, MIME_TYPE);
+ values.put(VoicemailContract.Voicemails.HAS_CONTENT, 0);
+ String packageName = getInstrumentation().getTargetContext().getPackageName();
+ mVoicemailUri = getContentResolver().insert(
+ VoicemailContract.Voicemails.buildSourceUri(packageName), values);
+ }
+
+ protected void setUriForInvalidVoicemailEntry() {
+ assertNull(mVoicemailUri);
+ ContentResolver contentResolver = getContentResolver();
+ ContentValues values = new ContentValues();
+ values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
+ values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1);
+ // VoicemailContract.Voicemails._DATA
+ values.put("_data", VOICEMAIL_FILE_LOCATION);
+ mVoicemailUri = contentResolver.insert(VoicemailContract.Voicemails.CONTENT_URI, values);
+ }
+
+ protected void setPlaybackViewForPresenter() {
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.setPlaybackView(mLayout, mVoicemailUri, false);
+ }
+ });
+ }
+
+ protected void copyBetweenStreams(InputStream in, OutputStream out) throws IOException {
+ byte[] buffer = new byte[1024];
+ int bytesRead;
+ while ((bytesRead = in.read(buffer)) > 0) {
+ out.write(buffer, 0, bytesRead);
+ }
+ }
+
+ protected void assertStateTextContains(String text) {
+ assertNotNull(mLayout);
+ assertTrue(mLayout.getStateText().contains(text));
+ }
+
+ protected void assertStateTextNotContains(String text) {
+ assertNotNull(mLayout);
+ assertFalse(mLayout.getStateText().contains(text));
+ }
+
+ protected ContentResolver getContentResolver() {
+ return getInstrumentation().getTargetContext().getContentResolver();
+ }
+
+ protected AssetManager getAssets() {
+ return getInstrumentation().getContext().getAssets();
+ }
+
+}
diff --git a/tests/src/com/android/dialer/voicemail/VoicemailArchiveTest.java b/tests/src/com/android/dialer/voicemail/VoicemailArchiveTest.java
new file mode 100644
index 000000000..bbd5edc48
--- /dev/null
+++ b/tests/src/com/android/dialer/voicemail/VoicemailArchiveTest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.dialer.voicemail;
+
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.res.AssetManager;
+
+import com.android.dialer.database.VoicemailArchiveContract.VoicemailArchive;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Unit tests for {@link VoicemailArchiveActivity} and {@link VoicemailArchivePlaybackPresenter}.
+ */
+public class VoicemailArchiveTest
+ extends VoicemailActivityInstrumentationTestCase2<VoicemailArchiveActivity> {
+
+ public VoicemailArchiveTest() {
+ super(VoicemailArchiveActivity.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mPresenter = VoicemailArchivePlaybackPresenter.getInstance(getActivity(), null);
+ }
+
+ @Override
+ public void testFetchingVoicemail() throws Throwable {
+ setUriForRealFileVoicemailEntry();
+ setPlaybackViewForPresenter();
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.checkForContent(
+ new VoicemailPlaybackPresenter.OnContentCheckedListener() {
+ @Override
+ public void onContentChecked(boolean hasContent) {
+ mPresenter.resumePlayback();
+ assertEquals(true, mPresenter.isPlaying());
+ }
+ });
+ }
+ });
+ }
+
+ @Override
+ public void testInvalidVoicemailShowsErrorMessage() throws Throwable {
+ setUriForInvalidVoicemailEntry();
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.checkForContent(
+ new VoicemailPlaybackPresenter.OnContentCheckedListener() {
+ @Override
+ public void onContentChecked(boolean hasContent) {
+ assertStateTextContains("Couldn't play voicemail");
+ }
+ });
+ }
+ });
+ }
+
+ @Override
+ protected void setUriForInvalidVoicemailEntry() {
+ assertNull(mVoicemailUri);
+ ContentValues values = new ContentValues();
+ values.put(VoicemailArchive.NUMBER, CONTACT_NUMBER);
+ values.put(VoicemailArchive.DATE, String.valueOf(System.currentTimeMillis()));
+ values.put(VoicemailArchive.MIME_TYPE, MIME_TYPE);
+ values.put(VoicemailArchive._DATA, VOICEMAIL_FILE_LOCATION);
+ mVoicemailUri = getContentResolver().insert(VoicemailArchive.CONTENT_URI, values);
+ }
+
+ @Override
+ protected void setUriForRealFileVoicemailEntry() throws IOException {
+ assertNull(mVoicemailUri);
+ ContentValues values = new ContentValues();
+ values.put(VoicemailArchive.DATE, String.valueOf(System.currentTimeMillis()));
+ values.put(VoicemailArchive.NUMBER, CONTACT_NUMBER);
+ values.put(VoicemailArchive.MIME_TYPE, MIME_TYPE);
+ values.put(VoicemailArchive.DURATION, 0);
+ mVoicemailUri = getContentResolver().insert(VoicemailArchive.CONTENT_URI, values);
+ AssetManager assets = getAssets();
+ try (InputStream inputStream = assets.open(TEST_ASSET_NAME);
+ OutputStream outputStream = getContentResolver().openOutputStream(mVoicemailUri)) {
+ copyBetweenStreams(inputStream, outputStream);
+ }
+ }
+
+ @Override
+ protected void cleanUpVoicemailUri() {
+ if (mVoicemailUri != null) {
+ getContentResolver().delete(VoicemailArchive.CONTENT_URI,
+ "_ID = ?", new String[] { String.valueOf(ContentUris.parseId(mVoicemailUri)) });
+ mVoicemailUri = null;
+ }
+ }
+}
diff --git a/tests/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtilTest.java b/tests/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtilTest.java
new file mode 100644
index 000000000..d98d9fa59
--- /dev/null
+++ b/tests/src/com/android/dialer/voicemail/VoicemailAsyncTaskUtilTest.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.voicemail;
+
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.res.AssetFileDescriptor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
+import android.provider.CallLog;
+import android.provider.VoicemailContract;
+import android.test.InstrumentationTestCase;
+import android.test.mock.MockContentResolver;
+
+import com.android.contacts.common.test.mocks.MockContentProvider;
+import com.android.contacts.common.test.mocks.MockContentProvider.Query;
+import com.android.dialer.calllog.CallLogQuery;
+import com.android.dialer.database.VoicemailArchiveContract;
+import com.android.dialer.util.AsyncTaskExecutors;
+import com.android.dialer.util.FakeAsyncTaskExecutor;
+import com.android.dialer.voicemail.VoicemailAsyncTaskUtil.OnGetArchivedVoicemailFilePathListener;
+import com.android.dialer.voicemail.VoicemailAsyncTaskUtil.OnArchiveVoicemailListener;
+import com.android.dialer.voicemail.VoicemailAsyncTaskUtil.OnSetVoicemailArchiveStatusListener;
+
+import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
+import static org.mockito.Mockito.*;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+public class VoicemailAsyncTaskUtilTest extends InstrumentationTestCase {
+ private static final String TEST_MIME_TYPE = "audio/mp3";
+ private static final String TEST_NUMBER = "+1412555555";
+ private static final String TEST_FILE_PATH = "TEST_PATH";
+ private static final String TEST_TRANSCRIPTION = "TEST_TRANSCRIPTION";
+ private static final long TEST_DATE = 0;
+ private static final long TEST_DURATION = 0;
+ private static final int TEST_SERVER_ID = 1;
+ private static final int TEST_ID = 2;
+ private static final Uri ARCHIVED_VOICEMAIL_URI =
+ VoicemailArchiveContract.VoicemailArchive.buildWithId(TEST_ID);
+ private static final Uri VOICEMAIL_URI = VoicemailContract.Voicemails.CONTENT_URI
+ .buildUpon().appendPath(Integer.toString(TEST_SERVER_ID)).build();
+ private static final String[] CALLLOG_QUERY_PROJECTION = new String[] {
+ CallLog.Calls._ID,
+ CallLog.Calls.NUMBER,
+ CallLog.Calls.DATE,
+ CallLog.Calls.DURATION,
+ CallLog.Calls.TYPE,
+ CallLog.Calls.COUNTRY_ISO,
+ CallLog.Calls.VOICEMAIL_URI,
+ CallLog.Calls.GEOCODED_LOCATION,
+ CallLog.Calls.CACHED_NAME,
+ CallLog.Calls.CACHED_NUMBER_TYPE,
+ CallLog.Calls.CACHED_NUMBER_LABEL,
+ CallLog.Calls.CACHED_LOOKUP_URI,
+ CallLog.Calls.CACHED_MATCHED_NUMBER,
+ CallLog.Calls.CACHED_NORMALIZED_NUMBER,
+ CallLog.Calls.CACHED_PHOTO_ID,
+ CallLog.Calls.CACHED_FORMATTED_NUMBER,
+ CallLog.Calls.IS_READ,
+ CallLog.Calls.NUMBER_PRESENTATION,
+ CallLog.Calls.PHONE_ACCOUNT_COMPONENT_NAME,
+ CallLog.Calls.PHONE_ACCOUNT_ID,
+ CallLog.Calls.FEATURES,
+ CallLog.Calls.DATA_USAGE,
+ CallLog.Calls.TRANSCRIPTION,
+ CallLog.Calls.CACHED_PHOTO_URI
+ };
+ private static final String[] VOICEMAIL_PROJECTION = new String[] {
+ VoicemailContract.Voicemails._ID,
+ VoicemailContract.Voicemails.NUMBER,
+ VoicemailContract.Voicemails.DATE,
+ VoicemailContract.Voicemails.DURATION,
+ VoicemailContract.Voicemails.MIME_TYPE,
+ VoicemailContract.Voicemails.TRANSCRIPTION,
+ };
+
+ private final MockContentResolver mContentResolver = new MockContentResolver();
+ private final MockContentProvider mArchiveContentProvider = new TestVoicemailContentProvider();
+ private final MockContentProvider mVoicemailContentProvider =
+ new TestVoicemailContentProvider();
+ private final MockContentProvider mCallLogContentProvider = new MockContentProvider();
+ @Rule
+ private final TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+
+ private VoicemailAsyncTaskUtil mVoicemailAsyncTaskUtil;
+ private FakeAsyncTaskExecutor mFakeAsyncTaskExecutor;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ mFakeAsyncTaskExecutor = new FakeAsyncTaskExecutor(getInstrumentation());
+ AsyncTaskExecutors.setFactoryForTest(mFakeAsyncTaskExecutor.getFactory());
+ mContentResolver.addProvider(VoicemailArchiveContract.AUTHORITY, mArchiveContentProvider);
+ mContentResolver.addProvider(VoicemailContract.AUTHORITY, mVoicemailContentProvider);
+ mContentResolver.addProvider(CallLog.AUTHORITY, mCallLogContentProvider);
+ mVoicemailAsyncTaskUtil = new VoicemailAsyncTaskUtil(mContentResolver);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ AsyncTaskExecutors.setFactoryForTest(null);
+ super.tearDown();
+ }
+
+ public void testGetVoicemailFilePath_VoicemailExists() throws Throwable {
+ newVoicemailArchiveQuery().withAnyProjection()
+ .returnRow(getCombinedContentValuesWithData());
+ final OnGetArchivedVoicemailFilePathListener listener =
+ mock(OnGetArchivedVoicemailFilePathListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.getVoicemailFilePath(listener, ARCHIVED_VOICEMAIL_URI);
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.GET_VOICEMAIL_FILE_PATH);
+ verify(listener).onGetArchivedVoicemailFilePath(TEST_FILE_PATH);
+ verifyQueries();
+ }
+
+ public void testGetVoicemailFilePath_VoicemailNotExists() throws Throwable {
+ newVoicemailArchiveFakeQuery().withAnyProjection().returnEmptyCursor();
+ final OnGetArchivedVoicemailFilePathListener listener =
+ mock(OnGetArchivedVoicemailFilePathListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.getVoicemailFilePath(listener, getFakeVoicemailUri());
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.GET_VOICEMAIL_FILE_PATH);
+ verify(listener).onGetArchivedVoicemailFilePath(null);
+ verifyQueries();
+ }
+
+ public void testSetVoicemailArchiveStatus_VoicemailNotExists() throws Throwable {
+ newVoicemailArchiveNotExistsUpdateQuery(true);
+ final OnSetVoicemailArchiveStatusListener listener =
+ mock(OnSetVoicemailArchiveStatusListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.setVoicemailArchiveStatus(listener,
+ getFakeVoicemailUri(), true);
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.SET_VOICEMAIL_ARCHIVE_STATUS);
+ verify(listener).onSetVoicemailArchiveStatus(false);
+ verifyQueries();
+ }
+
+ public void testSetVoicemailArchiveStatus_VoicemailExists() throws Throwable {
+ newVoicemailArchiveExistsUpdateQuery(true);
+ final OnSetVoicemailArchiveStatusListener listener =
+ mock(OnSetVoicemailArchiveStatusListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.setVoicemailArchiveStatus(listener,
+ ARCHIVED_VOICEMAIL_URI, true);
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.SET_VOICEMAIL_ARCHIVE_STATUS);
+ verify(listener).onSetVoicemailArchiveStatus(true);
+ verifyQueries();
+ }
+
+ public void testArchiveVoicemailContent_ArchiveNotExists() throws Throwable {
+ newVoicemailArchiveExistsQuery().returnEmptyCursor();
+ newQueryCallLogInfo().returnRow(getCallLogContentValues());
+ newVoicemailQuery().returnRow(getVoicemailContentValues());
+ newVoicemailArchiveInsert();
+ final OnArchiveVoicemailListener listener = mock(OnArchiveVoicemailListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.archiveVoicemailContent(listener, VOICEMAIL_URI);
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT);
+ verify(listener).onArchiveVoicemail(ARCHIVED_VOICEMAIL_URI);
+ verifyQueries();
+ }
+
+ public void testArchiveVoicemailContent_ArchiveExists() throws Throwable {
+ newVoicemailArchiveExistsQuery().returnRow(getCombinedValuesWithId());
+ final OnArchiveVoicemailListener listener = mock(OnArchiveVoicemailListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.archiveVoicemailContent(listener, VOICEMAIL_URI);
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT);
+ verify(listener).onArchiveVoicemail(ARCHIVED_VOICEMAIL_URI);
+ verifyQueries();
+ }
+
+ public void testArchiveVoicemailContent_CallLogInfoNotExists() throws Throwable {
+ newVoicemailArchiveExistsQuery().returnEmptyCursor();
+ newQueryCallLogInfo().returnEmptyCursor();
+ newVoicemailQuery().returnEmptyCursor();
+ final OnArchiveVoicemailListener listener = mock(OnArchiveVoicemailListener.class);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mVoicemailAsyncTaskUtil.archiveVoicemailContent(listener, VOICEMAIL_URI);
+ }
+ });
+ mFakeAsyncTaskExecutor.runTask(VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT);
+ verify(listener).onArchiveVoicemail(null);
+ verifyQueries();
+ }
+
+ private Query newVoicemailArchiveQuery() {
+ return mArchiveContentProvider.expectQuery(ARCHIVED_VOICEMAIL_URI);
+ }
+
+ private Query newVoicemailArchiveFakeQuery() {
+ return mArchiveContentProvider.expectQuery(getFakeVoicemailUri());
+ }
+
+ private Query newQueryCallLogInfo() {
+ return mCallLogContentProvider.expectQuery(ContentUris.withAppendedId(
+ CallLog.Calls.CONTENT_URI_WITH_VOICEMAIL, ContentUris.parseId(VOICEMAIL_URI)))
+ .withProjection(CALLLOG_QUERY_PROJECTION);
+ }
+
+ private Query newVoicemailQuery() {
+ return mVoicemailContentProvider.expectQuery(VOICEMAIL_URI).withAnySelection()
+ .withProjection(VOICEMAIL_PROJECTION);
+ }
+
+ private Query newVoicemailArchiveExistsQuery() {
+ return mArchiveContentProvider.expectQuery(
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI)
+ .withSelection(VoicemailArchiveContract.VoicemailArchive.SERVER_ID + "="
+ + ContentUris.parseId(VOICEMAIL_URI), (String[]) null)
+ .withProjection(VoicemailArchiveContract.VoicemailArchive._ID);
+ }
+
+ private void newVoicemailArchiveInsert() {
+ mArchiveContentProvider.expectInsert(
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI, getCombinedContentValues(),
+ ARCHIVED_VOICEMAIL_URI);
+ }
+
+ private void newVoicemailArchiveNotExistsUpdateQuery(boolean status) {
+ mArchiveContentProvider.expectUpdate(getFakeVoicemailUri(),
+ getArchiveStatusUpdateValues(status), null, null).returnRowsAffected(0);
+ }
+
+ private void newVoicemailArchiveExistsUpdateQuery(boolean status) {
+ mArchiveContentProvider.expectUpdate(ARCHIVED_VOICEMAIL_URI,
+ getArchiveStatusUpdateValues(status), null, null).returnRowsAffected(1);
+ }
+
+ private static ContentValues getCallLogContentValues() {
+ ContentValues values = new ContentValues();
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.GEOCODED_LOCATION], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NAME], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.COUNTRY_ISO], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NUMBER_TYPE], 0);
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NUMBER_LABEL], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_LOOKUP_URI], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_MATCHED_NUMBER], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_NORMALIZED_NUMBER], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.CACHED_FORMATTED_NUMBER], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.NUMBER_PRESENTATION], 0);
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.ACCOUNT_COMPONENT_NAME], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.ACCOUNT_ID], "");
+ values.put(CALLLOG_QUERY_PROJECTION[CallLogQuery.FEATURES], 0);
+ values.put(CALLLOG_QUERY_PROJECTION[23], "");
+ return values;
+ }
+
+ private static ContentValues getVoicemailContentValues() {
+ ContentValues values = new ContentValues();
+ values.put(VoicemailContract.Voicemails.NUMBER, TEST_NUMBER);
+ values.put(VoicemailContract.Voicemails.DATE, TEST_DATE);
+ values.put(VoicemailContract.Voicemails.DURATION, TEST_DURATION);
+ values.put(VoicemailContract.Voicemails.MIME_TYPE, TEST_MIME_TYPE);
+ values.put(VoicemailContract.Voicemails._ID, TEST_SERVER_ID);
+ values.put(VoicemailContract.Voicemails.TRANSCRIPTION, TEST_TRANSCRIPTION);
+ values.put("_data", TEST_FILE_PATH); // VoicemailContract.Voicemails._DATA
+ return values;
+ }
+
+ private static ContentValues getCombinedContentValues() {
+ ContentValues values = new ContentValues();
+ // Call log info
+ values.put(VoicemailArchiveContract.VoicemailArchive.GEOCODED_LOCATION, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NAME, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NUMBER_TYPE, 0);
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NUMBER_LABEL, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_LOOKUP_URI, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_MATCHED_NUMBER, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_NORMALIZED_NUMBER, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_FORMATTED_NUMBER, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.NUMBER_PRESENTATION, 0);
+ values.put(VoicemailArchiveContract.VoicemailArchive.ACCOUNT_COMPONENT_NAME, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.ACCOUNT_ID, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.FEATURES, 0);
+ values.put(VoicemailArchiveContract.VoicemailArchive.CACHED_PHOTO_URI, "");
+ values.put(VoicemailArchiveContract.VoicemailArchive.COUNTRY_ISO, "");
+
+ // Voicemail content info
+ values.put(VoicemailArchiveContract.VoicemailArchive.NUMBER, TEST_NUMBER);
+ values.put(VoicemailArchiveContract.VoicemailArchive.DATE, TEST_DATE);
+ values.put(VoicemailArchiveContract.VoicemailArchive.DURATION, TEST_DURATION);
+ values.put(VoicemailArchiveContract.VoicemailArchive.MIME_TYPE, TEST_MIME_TYPE);
+ values.put(VoicemailArchiveContract.VoicemailArchive.SERVER_ID, TEST_SERVER_ID);
+ values.put(VoicemailArchiveContract.VoicemailArchive.TRANSCRIPTION, TEST_TRANSCRIPTION);
+
+ // Custom fields
+ values.put(VoicemailArchiveContract.VoicemailArchive.ARCHIVED, false);
+ return values;
+ }
+
+ private static ContentValues getCombinedContentValuesWithData() {
+ ContentValues values = getCombinedContentValues();
+ values.put(VoicemailArchiveContract.VoicemailArchive._DATA, TEST_FILE_PATH);
+ return values;
+ }
+
+ private static ContentValues getCombinedValuesWithId() {
+ ContentValues values = getCombinedContentValuesWithData();
+ values.put(VoicemailArchiveContract.VoicemailArchive._ID, TEST_ID);
+ return values;
+ }
+
+ private static ContentValues getArchiveStatusUpdateValues(boolean status) {
+ ContentValues values = new ContentValues();
+ values.put(VoicemailArchiveContract.VoicemailArchive.ARCHIVED, status);
+ return values;
+ }
+
+ private static Uri getFakeVoicemailUri() {
+ return VoicemailArchiveContract.VoicemailArchive.buildWithId(0);
+ }
+
+ private void verifyQueries() {
+ mArchiveContentProvider.verify();
+ mCallLogContentProvider.verify();
+ mVoicemailContentProvider.verify();
+ }
+
+ private class TestVoicemailContentProvider extends MockContentProvider {
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ int modeBits = ParcelFileDescriptor.parseMode(mode);
+ try {
+ return ParcelFileDescriptor.open(mTemporaryFolder.newFile(), modeBits);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ @Override
+ public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts) {
+ try {
+ return new AssetFileDescriptor(openFile(uri, "r"), 0,
+ AssetFileDescriptor.UNKNOWN_LENGTH);
+ } catch (FileNotFoundException e) {
+ return null;
+ }
+ }
+ }
+}
+
diff --git a/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java b/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java
index 58b4f558d..be9905edd 100644
--- a/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java
+++ b/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,54 +16,21 @@
package com.android.dialer.voicemail;
-import static com.android.dialer.voicemail.VoicemailPlaybackPresenter.Tasks.CHECK_FOR_CONTENT;
-
-import android.app.Activity;
-import android.content.ContentResolver;
import android.content.ContentUris;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.res.AssetManager;
+import android.database.Cursor;
import android.net.Uri;
-import android.provider.VoicemailContract;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.LargeTest;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.contacts.common.test.IntegrationTestUtils;
-import com.android.dialer.R;
+import android.test.suitebuilder.annotation.Suppress;
+
import com.android.dialer.calllog.CallLogActivity;
-import com.android.dialer.util.AsyncTaskExecutors;
-import com.android.dialer.util.FakeAsyncTaskExecutor;
-import com.android.dialer.util.LocaleTestUtils;
-import com.android.dialer.voicemail.VoicemailPlaybackLayout;
-import com.android.dialer.voicemail.VoicemailPlaybackPresenter;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-import java.util.Locale;
+import com.android.dialer.database.VoicemailArchiveContract;
+import static com.android.dialer.voicemail.VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT;
+import static com.android.dialer.voicemail.VoicemailPlaybackPresenter.Tasks.CHECK_FOR_CONTENT;
/**
- * Unit tests for the {@link VoicemailPlaybackPresenter} and {@link VoicemailPlaybackLayout}.
+ * Unit tests for {@link VoicemailPlaybackPresenter} and {@link VoicemailPlaybackLayout}.
*/
-@LargeTest
-public class VoicemailPlaybackTest extends ActivityInstrumentationTestCase2<CallLogActivity> {
- private static final String TEST_ASSET_NAME = "quick_test_recording.mp3";
- private static final String MIME_TYPE = "audio/mp3";
- private static final String CONTACT_NUMBER = "+1412555555";
- private static final String VOICEMAIL_FILE_LOCATION = "/sdcard/sadlfj893w4j23o9sfu.mp3";
-
- private Activity mActivity;
- private VoicemailPlaybackPresenter mPresenter;
- private VoicemailPlaybackLayout mLayout;
-
- private Uri mVoicemailUri;
- private IntegrationTestUtils mTestUtils;
- private LocaleTestUtils mLocaleTestUtils;
- private FakeAsyncTaskExecutor mFakeAsyncTaskExecutor;
+public class VoicemailPlaybackTest
+ extends VoicemailActivityInstrumentationTestCase2<CallLogActivity> {
public VoicemailPlaybackTest() {
super(CallLogActivity.class);
@@ -72,157 +39,107 @@ public class VoicemailPlaybackTest extends ActivityInstrumentationTestCase2<Call
@Override
public void setUp() throws Exception {
super.setUp();
-
- mFakeAsyncTaskExecutor = new FakeAsyncTaskExecutor(getInstrumentation());
- AsyncTaskExecutors.setFactoryForTest(mFakeAsyncTaskExecutor.getFactory());
- mTestUtils = new IntegrationTestUtils(getInstrumentation());
-
- // Some of the tests rely on the text - safest to force a specific locale.
- mLocaleTestUtils = new LocaleTestUtils(getInstrumentation().getTargetContext());
- mLocaleTestUtils.setLocale(Locale.US);
-
- mActivity = getActivity();
- mLayout = new VoicemailPlaybackLayout(mActivity);
- mLayout.onFinishInflate();
-
- mPresenter = VoicemailPlaybackPresenter.getInstance(mActivity, null);
+ mPresenter = VoicemailPlaybackPresenter.getInstance(getActivity(), null);
}
@Override
- protected void tearDown() throws Exception {
- cleanUpVoicemailUri();
-
- mLocaleTestUtils.restoreLocale();
- mLocaleTestUtils = null;
-
- mLayout = null;
- mPresenter = null;
- mTestUtils = null;
- AsyncTaskExecutors.setFactoryForTest(null);
-
+ public void tearDown() throws Exception {
+ cleanUpArchivedVoicemailUri();
super.tearDown();
}
- public void testFetchingVoicemail() throws Throwable {
- setUriForRealFileVoicemailEntry();
- setPlaybackViewForPresenter();
- assertHasOneTextViewContaining("Loading voicemail");
- }
-
+ @Suppress
public void testWhenCheckForContentCompletes() throws Throwable {
setUriForRealFileVoicemailEntry();
setPlaybackViewForPresenter();
- // There is a background check that is testing to see if we have the content available.
- // Once that task completes, we shouldn't be showing the fetching message.
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.resumePlayback();
+ }
+ });
mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
getInstrumentation().waitForIdleSync();
- assertHasOneTextViewContaining("Buffering");
- assertHasZeroTextViewsContaining("Loading voicemail");
+ assertStateTextContains("Loading voicemail");
}
- public void testInvalidVoicemailShowsErrorMessage() throws Throwable {
- setUriForInvalidVoicemailEntry();
+ public void testArchiveContent() throws Throwable {
+ setUriForRealFileVoicemailEntry();
setPlaybackViewForPresenter();
+ mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
+ getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mPresenter.archiveContent(mVoicemailUri, true);
+ }
+ });
mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
+ mFakeAsyncTaskExecutor.runTask(ARCHIVE_VOICEMAIL_CONTENT);
getInstrumentation().waitForIdleSync();
-
- // The media player will have thrown an IOException since the file doesn't exist.
- // This should have put a failed to play message on screen, buffering is gone.
- assertHasOneTextViewContaining("Couldn't play voicemail");
- assertHasZeroTextViewsContaining("Buffering");
+ assertVoicemailArchived();
}
- public void testClickingSpeakerphoneButton() throws Throwable {
+ public void testShareContent() throws Throwable {
setUriForRealFileVoicemailEntry();
setPlaybackViewForPresenter();
-
- // Wait for check for content to complete.
mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
- getInstrumentation().waitForIdleSync();
-
- // Force the speakerphone to false to start.
- mPresenter.setSpeakerphoneOn(false);
- assertFalse(mPresenter.isSpeakerphoneOn());
-
- View speakerphoneButton = mLayout.findViewById(R.id.playback_speakerphone);
- speakerphoneButton.performClick();
- assertTrue(mPresenter.isSpeakerphoneOn());
- }
-
- private void cleanUpVoicemailUri() {
- if (mVoicemailUri != null) {
- getContentResolver().delete(VoicemailContract.Voicemails.CONTENT_URI,
- "_ID = ?", new String[] { String.valueOf(ContentUris.parseId(mVoicemailUri)) });
- mVoicemailUri = null;
- }
- }
- private void setUriForRealFileVoicemailEntry() throws IOException {
- assertNull(mVoicemailUri);
- ContentValues values = new ContentValues();
- values.put(VoicemailContract.Voicemails.DATE, String.valueOf(System.currentTimeMillis()));
- values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
- values.put(VoicemailContract.Voicemails.MIME_TYPE, MIME_TYPE);
- values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1);
- String packageName = getInstrumentation().getTargetContext().getPackageName();
- mVoicemailUri = getContentResolver().insert(
- VoicemailContract.Voicemails.buildSourceUri(packageName), values);
- AssetManager assets = getAssets();
- try (InputStream inputStream = assets.open(TEST_ASSET_NAME);
- OutputStream outputStream = getContentResolver().openOutputStream(mVoicemailUri)) {
- copyBetweenStreams(inputStream, outputStream);
- }
- }
-
- private void setUriForInvalidVoicemailEntry() {
- assertNull(mVoicemailUri);
- ContentResolver contentResolver = getContentResolver();
- ContentValues values = new ContentValues();
- values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER);
- values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1);
- values.put(VoicemailContract.Voicemails._DATA, VOICEMAIL_FILE_LOCATION);
- mVoicemailUri = contentResolver.insert(VoicemailContract.Voicemails.CONTENT_URI, values);
- }
-
- private void setPlaybackViewForPresenter() {
getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
- mPresenter.setPlaybackView(mLayout, mVoicemailUri, false);
+ mPresenter.archiveContent(mVoicemailUri, false);
}
});
+ mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
+ mFakeAsyncTaskExecutor.runTask(ARCHIVE_VOICEMAIL_CONTENT);
+ getInstrumentation().waitForIdleSync();
+ assertVoicemailArchived();
}
- public void copyBetweenStreams(InputStream in, OutputStream out) throws IOException {
- byte[] buffer = new byte[1024];
- int bytesRead;
- while ((bytesRead = in.read(buffer)) > 0) {
- out.write(buffer, 0, bytesRead);
+ private void assertVoicemailArchived() {
+ try (Cursor cursor = getArchivedVoicemailCursor()) {
+ assertTrue(hasContent(cursor));
+ assertEquals(ContentUris.parseId(mVoicemailUri), getRowServerId(cursor));
+ } catch (Exception e) {
+ fail("Voicemail was not archived: " + e.toString());
+ }
+ }
+
+ private void cleanUpArchivedVoicemailUri() {
+ try (Cursor cursor = getArchivedVoicemailCursor()) {
+ if (hasContent(cursor)) {
+ getContentResolver().delete(getRowUri(cursor), null, null);
+ }
}
}
- private void assertHasOneTextViewContaining(String text) throws Throwable {
- assertNotNull(mLayout);
- List<TextView> views = mTestUtils.getTextViewsWithString(mLayout, text);
- assertEquals("There should have been one TextView with text '" + text + "' but found "
- + views, 1, views.size());
+ private Cursor getArchivedVoicemailCursor() {
+ return getContentResolver().query(
+ VoicemailArchiveContract.VoicemailArchive.CONTENT_URI,
+ new String[] {
+ VoicemailArchiveContract.VoicemailArchive._ID,
+ VoicemailArchiveContract.VoicemailArchive.SERVER_ID
+ },
+ VoicemailArchiveContract.VoicemailArchive.SERVER_ID + "="
+ + ContentUris.parseId(mVoicemailUri),
+ null,
+ null);
}
- private void assertHasZeroTextViewsContaining(String text) throws Throwable {
- assertNotNull(mLayout);
- List<TextView> views = mTestUtils.getTextViewsWithString(mLayout, text);
- assertEquals("There should have been no TextViews with text '" + text + "' but found "
- + views, 0, views.size());
+ private int getRowServerId(Cursor cursor) {
+ return cursor
+ .getInt(cursor.getColumnIndex(VoicemailArchiveContract.VoicemailArchive.SERVER_ID));
}
- private ContentResolver getContentResolver() {
- return getInstrumentation().getTargetContext().getContentResolver();
+ private Uri getRowUri(Cursor cursor) {
+ return VoicemailArchiveContract.VoicemailArchive.buildWithId(cursor.getInt(
+ cursor.getColumnIndex(VoicemailArchiveContract.VoicemailArchive._ID)));
}
- private AssetManager getAssets() {
- return getInstrumentation().getContext().getAssets();
+ private boolean hasContent(Cursor cursor) {
+ return cursor != null && cursor.moveToFirst();
}
-}
+} \ No newline at end of file
diff --git a/tools/gradle/android.properties b/tools/gradle/android.properties
new file mode 100644
index 000000000..fd1f7218d
--- /dev/null
+++ b/tools/gradle/android.properties
@@ -0,0 +1,2 @@
+compileSdkVersion 24
+buildToolsVersion = '24.0.0'
diff --git a/tools/gradle/gradlew b/tools/gradle/gradlew
new file mode 100755
index 000000000..7f33f9d53
--- /dev/null
+++ b/tools/gradle/gradlew
@@ -0,0 +1,204 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+# TODO(jpd): b/15773596 - This is broken because we symlinked
+# gradlew and the build server can't clean it up. Don't resolve
+# links.
+#while [ -h "$PRG" ] ; do
+# ls=`ls -ld "$PRG"`
+# link=`expr "$ls" : '.*-> \(.*\)$'`
+# if expr "$link" : '/.*' > /dev/null; then
+# PRG="$link"
+# else
+# PRG=`dirname "$PRG"`"/$link"
+# fi
+#done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+if [ $(basename `pwd`) == "gradle" ]; then
+ echo "This cannot be run here. It should be copied to the root of the platform."
+ exit
+else
+ CLASSPATH=./gradle/wrapper/gradle-wrapper.jar
+fi
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+# For reproducible builds, always use the SDKs stored in source control
+if $darwin; then
+ ANDROID_HOME="$APP_HOME/prebuilts/fullsdk/darwin"
+else
+ ANDROID_HOME="$APP_HOME/prebuilts/fullsdk/linux"
+fi
+export ANDROID_HOME
+
+# Change the project's .gradle to the android out dir.
+ANDROID_OUT_ROOT="$APP_HOME/out"
+if [[ -n "$OUT_DIR" ]]; then
+ ANDROID_OUT_ROOT="$OUT_DIR"
+fi
+
+ANDROID_CACHE_DIR="$ANDROID_OUT_ROOT/gradle/.gradle"
+
+# Prevent excess parallelization on the build servers, as it slows the
+# build to a crawl
+if [[ "$1" == --parallel-threads=* ]] && [[ "$2" == buildForBuildServer* ]]; then
+ set -- "--parallel-threads=4" "$2"
+fi
+
+# Change the local user directories to be under the android out dir
+export GRADLE_USER_HOME="$ANDROID_OUT_ROOT/gradle/.gradle"
+export M2_HOME="$ANDROID_OUT_ROOT/gradle/.m2"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ --project-cache-dir=$ANDROID_CACHE_DIR \
+ -Dorg.gradle.jvmargs="-Xmx4096m -XX:MaxPermSize=1024m" \
+ --configure-on-demand \
+ "$@"
diff --git a/tools/gradle/repositories.properties b/tools/gradle/repositories.properties
new file mode 100644
index 000000000..ffdd0d29e
--- /dev/null
+++ b/tools/gradle/repositories.properties
@@ -0,0 +1 @@
+// Empty for now
diff --git a/tools/gradle/settings.gradle b/tools/gradle/settings.gradle
new file mode 100644
index 000000000..fdccfb515
--- /dev/null
+++ b/tools/gradle/settings.gradle
@@ -0,0 +1,63 @@
+include 'android-common'
+project(':android-common').projectDir = new File(rootDir, 'frameworks/ex/common')
+
+include 'aplos'
+project(':aplos').projectDir = new File(rootDir, 'vendor/unbundled_google/libs/aplos')
+project(':aplos').buildFileName = 'build-split.gradle'
+
+include 'bind'
+project(':bind').projectDir = new File(rootDir, 'vendor/unbundled_google/libraries/bind')
+
+include 'gdata'
+project(':gdata').projectDir = new File(rootDir, 'vendor/unbundled_google/libraries/gdata')
+
+include 'golly'
+project(':golly').projectDir = new File(rootDir, 'vendor/unbundled_google/libraries/golly')
+
+include 'gsf-client'
+project(':gsf-client').projectDir = new File(rootDir, 'vendor/unbundled_google/libraries/gsfclient')
+
+include 'jsr305'
+project(':jsr305').projectDir = new File(rootDir, 'external/jsr305')
+
+include 'guava'
+project(':guava').projectDir = new File(rootDir, 'external/guava')
+
+include 'libphonenumber'
+project(':libphonenumber').projectDir = new File(rootDir, 'external/libphonenumber')
+project(':libphonenumber').buildFileName = 'build-full.gradle'
+
+include 'libprotobuf'
+project(':libprotobuf').projectDir = new File(rootDir, 'external/protobuf')
+
+include 'pseudonymous-http'
+project(':pseudonymous-http').projectDir = new File(rootDir, 'vendor/unbundled_google/libraries/pseudonymous_http')
+
+include 's2utils'
+project(':s2utils').projectDir = new File(rootDir, 'external/s2utils')
+
+include 'smslib_pduutils'
+project(':smslib_pduutils').projectDir = new File(rootDir, 'external/smslib_pduutils')
+
+include 'volley'
+project(':volley').projectDir = new File(rootDir, 'frameworks/volley')
+project(':volley').buildFileName = 'rules.gradle'
+
+include 'vcard'
+project(':vcard').projectDir = new File(rootDir, 'frameworks/opt/vcard')
+
+include 'phonecommon'
+project(':phonecommon').projectDir = new File(rootDir, 'packages/apps/PhoneCommon')
+
+include 'contactscommon'
+project(':contactscommon').projectDir = new File(rootDir, 'packages/apps/ContactsCommon')
+
+include 'incallui'
+project(':incallui').projectDir = new File(rootDir, 'packages/apps/Dialer/InCallUI')
+
+include 'dialer'
+project(':dialer').projectDir = new File(rootDir, 'packages/apps/Dialer')
+project(':dialer').buildFileName = 'build-library.gradle'
+
+include 'googledialer'
+project(':googledialer').projectDir = new File(rootDir, 'vendor/unbundled_google/packages/GoogleDialer') \ No newline at end of file